[
  {
    "path": ".eslintrc",
    "content": "{\n  \"extends\": \"airbnb\",\n  \"parser\": \"babel-eslint\",\n  \"rules\": {\n    \"object-curly-spacing\": [2, \"never\"],\n    \"space-before-function-paren\": [2, \"always\"],\n    \"comma-dangle\": [2, \"never\"],\n    'max-len': [1, 115, 2, {\n      'ignoreUrls': true,\n      'ignoreComments': false\n    }],\n    \"no-unused-expressions\": [2, { allowShortCircuit: true }],\n    \"no-use-before-define\": [2, { \"functions\": false, \"classes\": true }],\n    \"no-param-reassign\": [2, {\"props\": false}],\n    'react/prefer-stateless-function': 0,\n    \"consistent-return\": 0,\n    new-cap: [2, {\"capIsNewExceptions\": [\"ObjectId\"]}],\n    \"jsx-quotes\": 0,\n    'react/jsx-no-bind': [2, {\n      'ignoreRefs': true,\n      'allowArrowFunctions': false,\n      'allowBind': false,\n    }],\n    \"react/sort-comp\": [2, {         // https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/sort-comp.md\n      \"order\": [\n        'lifecycle',\n        'everything-else',\n        'renderstuff'\n      ],\n      \"groups\": {\n        lifecycle: [\n          \"displayName\",\n          \"fragments\",\n          \"panelSettings\",\n          \"propTypes\",\n          \"contextTypes\",\n          \"childContextTypes\",\n          \"mixins\",\n          \"statics\",\n          \"defaultProps\",\n          \"defaultChildren\",\n          \"propsSchema\",\n          \"settings\",\n          \"style\",\n          \"constructor\",\n          \"getDefaultProps\",\n          \"getInitState\",\n          \"getChildContext\",\n          \"componentWillMount\",\n          \"componentDidMount\",\n          \"componentWillReceiveProps\",\n          \"shouldComponentUpdate\",\n          \"componentWillUpdate\",\n          \"componentDidUpdate\",\n          \"componentWillUnmount\"\n        ],\n        renderstuff: [\n          \"render\",\n          \"/^render.+$/\"\n        ]\n      }\n    }]\n  }\n}\n"
  },
  {
    "path": ".gitignore",
    "content": "# Config\n.relaxrc\n\n# Logs\nlogs\n*.log\n\n# Runtime data\npids\n*.pid\n*.seed\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# Compiled binary addons (http://nodejs.org/api/addons.html)\nbuild\nbuild/Release\n\n# Dependency directory\n# Commenting this out is preferred by some people, see\n# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-\nnode_modules\n\n#Webstorm Config\n.idea\n\n# Users Environment Variables\n.lock-wscript\n\n/public/\ndist/\n"
  },
  {
    "path": ".npmignore",
    "content": ".relaxrc\nlib/\nuploads/\nbuild/\npackage.json.tmp\n"
  },
  {
    "path": ".relaxrc.sample",
    "content": "{\n  \"port\": 8080,\n  \"devPort\": 8181,\n  \"db\": {\n    \"uri\": \"mongodb://localhost/relax\"\n  }\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "![Relax CMS](https://raw.githubusercontent.com/relax/relax/gh-pages/assets/images/logo_small.png \"Relax logo\")\n====================================\n[![Slack Status](http://slack-relax.herokuapp.com/badge.svg)](http://slack-relax.herokuapp.com/)\n\n**IMPORTANT NOTE:** Relax isn't yet ready for production, stay tuned for releases, beta version will come soon\n\nSupport our work and help us make this the best open source CMS, be our [patreon](http://patreon.com/relax)!\n\nRelax is a powerful new generation CMS on top of\n[React](https://facebook.github.io/react/) and [Node.js](https://nodejs.org/en/)\nwhich aims for a better way of building websites.\n\nIt features a live page builder based on components and a smart and easy way of\nbinding dynamic data to them.\n\nWe're currently working on releasing the beta version which should come up early 2016. If you want to collaborate in the meantime or just say anything join us at [Relax Slack](http://slack-relax.herokuapp.com/)\n\n**You can check the demo [here](http://demo.getrelax.io/admin)**\n\nDemo credentials:\n - user: demo\n - pass: demo\n\nNew design for beta release\n------------\n\n(taken from using version in master branch, demo is outdated as master isn't yet stable)\n\n![Pages](https://raw.githubusercontent.com/relax/relax/gh-pages/assets/images/pages.png)\n\n![Media](https://raw.githubusercontent.com/relax/relax/gh-pages/assets/images/media.png)\n\n![Colors](https://raw.githubusercontent.com/relax/relax/gh-pages/assets/images/colors.png)\n\n![New Schema](https://raw.githubusercontent.com/relax/relax/gh-pages/assets/images/newschema.png)\n\nInstallation\n------------\n\n### Dependencies\n\nRelax uses [sharp](https://github.com/lovell/sharp) to resize images.\nIf you're using OS X, you'll need to install its libvips dependency via `brew install homebrew/science/vips`.\nFull installation instructions are available [here](http://sharp.dimens.io/en/stable/install/).\n\nYou'll also need [MongoDB](https://www.mongodb.org/).\n\n### How to Relax\n\nSince we are yet to tag our first release, git clone this repository and run\n`npm install` followed by `npm start`.\n\nBy default the application runs at port `8080`. Go ahead and visit\n`http://localhost:8080/admin/init`, here you can setup the first user and you're ready to relax.\n\n\nConfiguration\n-------------\n\nTo configure the application you can use a `.relaxrc` file. You can place it\nnext to the application, on any parent folder, in your `HOME` folder, etc.\n\nYou can find a sample with the default values [here](.relaxrc.sample).\n\n\nContributing\n------------\n\n### Build and start\n\n#### Development\n\nWhile in development it's convenient to keep your application running while\nwatching for changes, for that you can run `npm run dev`.\n\nThe application will automatically restart when needed and keep your bundles\nup to date.\n\n#### Production\n\nTo build your assets ready to go for production run `npm run build` and `npm start` to start the application.\n\n\nLicense\n-------\n\nRelax is [GPL-3 licensed](LICENSE).\n\n\nTroubleshooting\n---------------\n\nPlease create [an issue](https://github.com/relax/relax/issues/new).\n"
  },
  {
    "path": "ROADMAP.md",
    "content": "Roadmap\n=======\n\nv1.0.0-Beta (Spring 2016)\n-------------------------\n\nSince the start of the project we've been through some major refactors in\norder to achieve the desired stack and experience to finally have a first stable\nrelease.\n\nWe've changed from a RESTful API into a GraphQL API, while also changing the data\narchitecture in the front end to include Redux.\n\nOur first dashboard was also not designed at all because our focus was mainly on\nthe page builder. We're now finally tuning up the entire admin experience\nso that we can make it as relaxed as possible.\n\nBelow you can find the major things that are still in the road we're going through to\nreach the beta release, there are of course other minor issues that can be found\n[here](https://github.com/relax/relax/milestones/1.0.0-Beta).\n\n**What must be done:**\n- [ ] Dashboard (*ongoing*) (#214)\n  - [ ] Settings\n  - [ ] Pages\n  - [ ] Menus\n  - [ ] Schemas\n  - [ ] Fonts\n  - [ ] Users\n  - [ ] Media\n  - [ ] Symbols\n- [ ] Link Element\n  - [ ] Allow to navigate to another page\n  - [ ] Allow to go an absolute URL\n  - [ ] Allow anchoring (with sections)\n- [ ] Forms\n  - [ ] Compose e-mail and set where the e-mail should be sent to\n- [ ] Symbols Management\n  - [x] Manage through context menu (#208)\n  - [ ] Edit symbol content (#209)\n  - [ ] Delete symbol through context menu\n- [ ] Page Templates (#133)\n  - [ ] Save page as template\n  - [ ] Use template as a schema *single* template\n  - [ ] Use template as a starting point to a page\n- [ ] Input option types (#158)\n- [ ] Schema entry *singles* (#127)\n- [ ] Import/export database\n  - [ ] Export theme (#56)\n  - [ ] Export data\n  - [ ] Export all\n- [ ] Users\n  - [ ] Recover password\n  - [ ] Change password\n  - [ ] Edit basic info\n- [ ] Third party elements API (#55)\n- [ ] Developer API Documentation (#53)\n\n**If we have time:**\n- [ ] Link forms to schemas (#124)\n- [ ] User account activation\n- [ ] User roles management\n- [ ] Schema entry single override template (#128)\n- [ ] Docker image (#213)\n\nThere are no optional issues, we really want to have everything as polished as\npossible for the first release.\n\nFeel free to create missing issues or discuss some of the features in the issues\nsection or with us over Slack. All help and feedback is welcome.\n"
  },
  {
    "path": "app.js",
    "content": "import 'babel-polyfill';\n\nimport mongoose from 'mongoose';\n\nimport app from './lib/server';\nimport config from './config';\nimport logger from './lib/server/logger';\nimport migrate from './lib/server/migrate';\n\n// Connect mongoose\nif (!config.db) {\n  throw new Error('Configuration to MongoDB required');\n}\nmongoose.connect(config.db.uri, config.db);\n\n// Run migrations\nmigrate()\n  .then(() => {\n    // Start server\n    var server = app.listen(config.port, () => {\n      var port = server.address().port;\n      logger.debug('Listening at port', port);\n    });\n  })\n  .done();\n"
  },
  {
    "path": "config.js",
    "content": "var rc = require('rc');\n\nmodule.exports = rc('relax', {\n  port: 8080,\n  devPort: 8181,\n  db: {\n    uri: 'mongodb://localhost/relax'\n  }\n});\n"
  },
  {
    "path": "lib/client/admin.js",
    "content": "import 'babel-polyfill';\n\nimport routes from 'routers/admin';\n\nimport renderRoutes from './helpers/render-routes';\n\nrenderRoutes(routes);\n"
  },
  {
    "path": "lib/client/auth.js",
    "content": "import routes from 'routers/auth';\n\nimport renderRoutes from './helpers/render-routes';\n\nrenderRoutes(routes);\n"
  },
  {
    "path": "lib/client/helpers/render-routes.js",
    "content": "import configureStore from 'helpers/configure-store';\nimport createHistory from 'history/lib/createBrowserHistory';\nimport React from 'react';\nimport {render} from 'react-dom';\nimport {Provider} from 'react-redux';\nimport {reduxReactRouter, ReduxRouter} from 'redux-router';\n\nexport default function renderRoutes (routes) {\n  const state = window.__initialState;\n  state.router = undefined;\n  const store = configureStore(\n    reduxReactRouter({createHistory, routes}),\n    state\n  );\n\n  render(\n    <Provider store={store}>\n      <ReduxRouter routes={routes} />\n    </Provider>,\n    document.getElementById('view')\n  );\n}\n"
  },
  {
    "path": "lib/client/public.js",
    "content": "import routes from 'routers/public';\n\nimport renderRoutes from './helpers/render-routes';\n\nrenderRoutes(routes);\n"
  },
  {
    "path": "lib/server/graphql/authorize.js",
    "content": "export default function authorize (root) {\n  if (!root.user) {\n    throw new Error('Unauthorized');\n  }\n}\n"
  },
  {
    "path": "lib/server/graphql/mutations/color/add.js",
    "content": "import {\n  GraphQLNonNull\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport colorInputType from '../../types/color-input';\nimport colorType from '../../types/color';\nimport ColorModel from '../../../models/color';\n\nexport default {\n  type: colorType,\n  args: {\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(colorInputType)\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    const colorModel = new ColorModel(params.data);\n    const color = await colorModel.save();\n\n    if (!color) {\n      throw new Error('Error adding new color');\n    }\n\n    return color;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/color/duplicate.js",
    "content": "import {\n  GraphQLNonNull,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport colorType from '../../types/color';\nimport ColorModel from '../../../models/color';\n\nexport default {\n  type: colorType,\n  args: {\n    id: {\n      name: 'id',\n      type: new GraphQLNonNull(GraphQLID)\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    const colorToDuplicate = await ColorModel.findById(params.id).select('-_id label value').exec();\n\n    if (!colorToDuplicate) {\n      throw new Error('Color to duplicate could not be found!');\n    }\n\n    const color = new ColorModel(colorToDuplicate.toJSON());\n    const newColor = await color.save();\n\n    if (!newColor) {\n      throw new Error('Error adding new duplicate color');\n    }\n\n    return newColor;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/color/index.js",
    "content": "import addColor from './add';\nimport duplicateColor from './duplicate';\nimport removeColor from './remove';\nimport updateColor from './update';\n\nexport default {\n  addColor,\n  removeColor,\n  updateColor,\n  duplicateColor\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/color/remove.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLNonNull,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport colorType from '../../types/color';\nimport ColorModel from '../../../models/color';\n\nexport default {\n  type: colorType,\n  args: {\n    id: {\n      name: 'id',\n      type: new GraphQLNonNull(GraphQLID)\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const removedColor = await ColorModel\n      .findByIdAndRemove(params.id, {\n        select: getProjection(options.fieldASTs[0])\n      })\n      .exec();\n\n    if (!removedColor) {\n      throw new Error('Color not found');\n    }\n\n    return removedColor;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/color/update.js",
    "content": "import {\n  GraphQLNonNull\n} from 'graphql';\nimport getProjection from 'helpers/get-projection';\n\nimport authorize from '../../authorize';\nimport colorInputType from '../../types/color-input';\nimport colorType from '../../types/color';\nimport ColorModel from '../../../models/color';\n\nexport default {\n  type: colorType,\n  args: {\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(colorInputType)\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const resultColor = await ColorModel\n      .findByIdAndUpdate(params.data._id, params.data, {\n        upsert: true,\n        new: true,\n        select: getProjection(options.fieldASTs[0])\n      })\n      .exec();\n\n    if (!resultColor) {\n      throw new Error('Color not found');\n    }\n\n    return resultColor;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/draft/drop.js",
    "content": "import {\n  GraphQLNonNull,\n  GraphQLString\n} from 'graphql';\nimport {Types} from 'mongoose';\nimport getProjection from 'helpers/get-projection';\n\nimport authorize from '../../authorize';\nimport draftType from '../../types/draft';\nimport DraftModel from '../../../models/draft';\nimport PageModel from '../../../models/page';\n\nexport default {\n  type: draftType,\n  args: {\n    id: {\n      name: 'id',\n      type: new GraphQLNonNull(GraphQLString)\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const projection = getProjection(options.fieldASTs[0]);\n    const _id = new Types.ObjectId(params.id);\n    const _userId = root.user._id;\n\n    const page = await PageModel.findById(_id);\n\n    const data = {\n      data: page.data,\n      actions: [],\n      __v: page.__v\n    };\n\n    const resultDraft = await DraftModel\n      .findByIdAndUpdate(\n        {_id, _userId},\n        data,\n        {upsert: true, new: true}\n      )\n      .select(projection)\n      .exec();\n\n    if (!resultDraft) {\n      throw new Error('Draft not found');\n    }\n    return resultDraft;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/draft/index.js",
    "content": "import dropDraft from './drop';\nimport updateDraft from './update';\n\nexport default {\n  dropDraft,\n  updateDraft\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/draft/update.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLNonNull,\n  GraphQLID\n} from 'graphql';\nimport {Types} from 'mongoose';\n\nimport authorize from '../../authorize';\nimport draftInputType from '../../types/draft-input';\nimport draftType from '../../types/draft';\nimport DraftModel from '../../../models/draft';\n\nexport default {\n  type: draftType,\n  args: {\n    id: {\n      name: 'id',\n      type: new GraphQLNonNull(GraphQLID)\n    },\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(draftInputType)\n    }\n  },\n  resolve (root, params, options) {\n    authorize(root);\n\n    const projection = getProjection(options.fieldASTs[0]);\n    const _id = new Types.ObjectId(params.id);\n    const _userId = root.user._id;\n\n    const data = Object.assign({}, params.data, {\n      data: JSON.parse(params.data.data),\n      actions: JSON.parse(params.data.actions)\n    });\n    delete data._id;\n\n    return DraftModel\n      .findByIdAndUpdate(\n        {_id, _userId},\n        data,\n        {upsert: true, new: true}\n      )\n      .select(projection)\n      .exec()\n      .then((resultDraft) => {\n        if (!resultDraft) {\n          throw new Error('Draft not found');\n        }\n        return resultDraft;\n      });\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/fonts/index.js",
    "content": "import removeCustomFont from './remove-custom';\nimport submitCustomFont from './submit-custom';\nimport uploadFont from './upload';\n\nexport default {\n  removeCustomFont,\n  submitCustomFont,\n  uploadFont\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/fonts/remove-custom.js",
    "content": "import path from 'path';\nimport rmdir from 'rimraf';\nimport Q from 'q';\nimport {\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLObjectType\n} from 'graphql';\n\nimport authorize from '../../authorize';\n\nexport default {\n  type: new GraphQLObjectType({\n    name: 'removeCustomFont',\n    fields: {\n      id: {type: new GraphQLNonNull(GraphQLString)}\n    }\n  }),\n  args: {\n    id: {\n      name: 'id',\n      type: new GraphQLNonNull(GraphQLString)\n    }\n  },\n  resolve (root, params) {\n    authorize(root);\n\n    const id = params.id;\n    const fontsFolder = path.join(__dirname, '../../../../..', 'public/fonts', id);\n\n    return Q\n      .nfcall(rmdir, fontsFolder)\n      .then(() => ({\n        id\n      }))\n      .catch(() => {\n        throw new Error('Error removing custom fonts folder');\n      });\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/fonts/submit-custom.js",
    "content": "import forEach from 'lodash.foreach';\nimport fs from 'fs';\nimport mkdirp from 'mkdirp';\nimport mongoose from 'mongoose';\nimport path from 'path';\nimport Q from 'q';\nimport {\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLList\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport customFontType from '../../types/custom-font';\nimport uploadedInputType from '../../types/uploaded-input';\n\nexport default {\n  type: customFontType,\n  args: {\n    name: {\n      name: 'name',\n      type: new GraphQLNonNull(GraphQLString)\n    },\n    files: {\n      name: 'files',\n      type: new GraphQLNonNull(new GraphQLList(uploadedInputType))\n    },\n    types: {\n      name: 'types',\n      type: new GraphQLNonNull(new GraphQLList(GraphQLString))\n    }\n  },\n  resolve (root, params) {\n    authorize(root);\n\n    const files = params.files;\n    const types = params.types;\n    const id = mongoose.Types.ObjectId().toString();\n    const rootFolder = path.join(__dirname, '../../../../..');\n    const fontsFolder = path.join(rootFolder, 'public/fonts', id);\n\n    return Q\n      .nfcall(mkdirp, fontsFolder)\n      .then(() => {\n        const promises = [];\n\n        forEach(files, (file) => {\n          promises.push(\n            Q.ninvoke(\n              fs,\n              'rename',\n              path.join(rootFolder, file.path),\n              path.join(fontsFolder, file.originalname)\n            )\n          );\n        });\n\n        return Q.all(promises);\n      })\n      .then(() => {\n        // map types to file\n        const map = {};\n        for (let a = 0; a < files.length; a++) {\n          map[types[a]] = files[a].originalname;\n        }\n\n        return {\n          family: params.name,\n          id,\n          files: map\n        };\n      })\n      .catch(() => {\n        throw new Error('Error submiting custom fonts');\n      });\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/fonts/upload.js",
    "content": "import authorize from '../../authorize';\nimport uploadedType from '../../types/uploaded';\n\nexport default {\n  type: uploadedType,\n  resolve (root) {\n    authorize(root);\n    return root.file;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/index.js",
    "content": "import color from './color';\nimport draft from './draft';\nimport fonts from './fonts';\nimport media from './media';\nimport menu from './menu';\nimport page from './page';\nimport schema from './schemas';\nimport schemaEntry from './schema-entry';\nimport settings from './settings';\nimport style from './style';\nimport symbol from './symbol';\nimport tab from './tab';\nimport user from './user';\n\nexport default {\n  ...color,\n  ...draft,\n  ...fonts,\n  ...media,\n  ...menu,\n  ...page,\n  ...schemaEntry,\n  ...schema,\n  ...settings,\n  ...style,\n  ...symbol,\n  ...tab,\n  ...user\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/media/add.js",
    "content": "import createImageThumbnail from 'helpers/create-image-thumbnail';\nimport fileMimetype from 'helpers/file-mimetype';\nimport filesize from 'file-size';\nimport mongoose from 'mongoose';\nimport path from 'path';\nimport writeFile from 'helpers/write-file';\nimport {\n  GraphQLNonNull\n} from 'graphql';\nimport {getMediaType} from 'helpers/mime-types';\n\nimport authorize from '../../authorize';\nimport mediaInputType from '../../types/media-input';\nimport mediaType from '../../types/media';\nimport MediaModel from '../../../models/media';\n\nexport default {\n  type: mediaType,\n  args: {\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(mediaInputType)\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    const mediaModel = {};\n\n    const id = mongoose.Types.ObjectId();\n    const idStr = id.toString();\n\n    let file = params.data.file;\n\n    const mimetype = fileMimetype(file);\n    const relativePath = path.join('media', idStr);\n    const filePath = path.join('.', 'public', relativePath);\n    file = await writeFile(file, filePath);\n\n    // Image Upload\n    if (getMediaType(mimetype) === 'image') {\n      const {thumbnailPath, metadata} = await createImageThumbnail(\n        file.destPath,\n        filePath,\n        {\n          width: 100,\n          height: 100,\n          quality: 100\n        }\n      );\n\n      Object.assign(mediaModel, {\n        dimension: {\n          width: metadata.width,\n          height: metadata.height\n        },\n        thumbnail: path.join(relativePath, thumbnailPath)\n      });\n    }\n\n    // Create and save a new `MediaModel`\n    const media = new MediaModel(Object.assign(mediaModel, {\n      _id: id,\n      name: file.filename,\n      fileName: file.filename,\n      type: mimetype,\n      size: filesize(file.size).human(),\n      filesize: file.size,\n      absoluteUrl: file.destPath,\n      url: path.join(relativePath, file.filename)\n    }));\n\n    const newMedia = await media.save();\n\n    if (!newMedia) {\n      throw new Error('Error adding new media');\n    }\n\n    return newMedia;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/media/index.js",
    "content": "import addMedia from './add';\nimport removeMedia, {removeMediaItem} from './remove';\n\nexport default {\n  addMedia,\n  removeMedia,\n  removeMediaItem\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/media/remove.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport path from 'path';\nimport rmdir from 'rimraf';\nimport {\n  GraphQLNonNull,\n  GraphQLID,\n  GraphQLList\n} from 'graphql';\nimport {all, nfcall} from 'q';\n\nimport authorize from '../../authorize';\nimport mediaType from '../../types/media';\nimport MediaModel from '../../../models/media';\n\nconst mediaPath = './public/media';\n\nexport default {\n  type: new GraphQLList(mediaType),\n  args: {\n    ids: {\n      name: 'ids',\n      type: new GraphQLList(new GraphQLNonNull(GraphQLID))\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    const {ids} = params;\n    const promises = [];\n\n    ids.forEach((id) => {\n      if (id) {\n        promises.push(nfcall(rmdir, path.join(mediaPath, id)));\n      }\n    });\n\n    await all(promises);\n\n    const removedMedia = await MediaModel.remove({\n      _id: {\n        $in: ids\n      }\n    });\n\n    return removedMedia.result.ok && ids.map(_id => ({_id})) || [];\n  }\n};\n\nexport const removeMediaItem = {\n  type: mediaType,\n  args: {\n    id: {\n      name: 'id',\n      type: new GraphQLNonNull(GraphQLID)\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const {id} = params;\n    const projection = getProjection(options.fieldASTs[0]);\n\n    await nfcall(rmdir, path.join(mediaPath, id));\n\n    const removedMedia = await MediaModel\n      .findByIdAndRemove(id)\n      .select(projection)\n      .exec();\n\n    return removedMedia;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/menu/add.js",
    "content": "import {\n  GraphQLNonNull\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport menuInputType from '../../types/menu-input';\nimport menuType from '../../types/menu';\nimport MenuModel from '../../../models/menu';\n\nexport default {\n  type: menuType,\n  args: {\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(menuInputType)\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    const data = Object.assign(\n      {\n        data: {}\n      },\n      params.data\n    );\n\n    const menuModel = new MenuModel(data);\n    const menu = await menuModel.save();\n\n    if (!menu) {\n      throw new Error('Error adding menu');\n    }\n    return menu;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/menu/index.js",
    "content": "import addMenu from './add';\nimport removeMenu from './remove';\nimport updateMenu from './update';\n\nexport default {\n  addMenu,\n  removeMenu,\n  updateMenu\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/menu/remove.js",
    "content": "import {\n  GraphQLNonNull,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport menuType from '../../types/menu';\nimport MenuModel from '../../../models/menu';\n\nexport default {\n  type: menuType,\n  args: {\n    id: {\n      name: 'id',\n      type: new GraphQLNonNull(GraphQLID)\n    }\n  },\n  resolve (root, params) {\n    authorize(root);\n\n    return MenuModel\n      .findByIdAndRemove(params.id)\n      .exec()\n      .then((removedMenu) => {\n        if (!removedMenu) {\n          throw new Error('Error removing menu');\n        }\n        return removedMenu;\n      });\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/menu/update.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLNonNull\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport menuInputType from '../../types/menu-input';\nimport menuType from '../../types/menu';\nimport MenuModel from '../../../models/menu';\n\nexport default {\n  type: menuType,\n  args: {\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(menuInputType)\n    }\n  },\n  resolve (root, params, options) {\n    authorize(root);\n\n    const projection = getProjection(options.fieldASTs[0]);\n\n    const menuChanges = Object.assign({}, params.data);\n    const id = params.data._id;\n\n    // data hidrate\n    if (params.data.data && typeof params.data.data === 'string') {\n      menuChanges.data = JSON.parse(params.data.data);\n    }\n\n    return MenuModel\n      .findByIdAndUpdate(\n        id,\n        menuChanges,\n        {upsert: true, new: true}\n      )\n      .select(projection)\n      .exec()\n      .then((resultMenu) => {\n        if (!resultMenu) {\n          throw new Error('Menu not found');\n        }\n        return resultMenu;\n      });\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/page/add.js",
    "content": "import getUniqueSlug from 'helpers/get-unique-slug';\nimport {\n  GraphQLNonNull\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport pageInputType from '../../types/page-input';\nimport pageType from '../../types/page';\nimport PageModel from '../../../models/page';\n\nexport default {\n  type: pageType,\n  args: {\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(pageInputType)\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    const pageData = Object.assign({}, params.data);\n\n    // Generate slug if needed\n    if (!pageData.slug) {\n      pageData.slug = await getUniqueSlug(PageModel, pageData.title);\n    }\n\n    // Add user info\n    pageData.createdBy = root.user._id;\n    pageData.updatedBy = root.user._id;\n\n    const pageModel = new PageModel(pageData);\n    const page = await pageModel.save();\n\n    if (!page) {\n      throw new Error('Error creating page');\n    }\n\n    return page;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/page/duplicate.js",
    "content": "import {\n  GraphQLNonNull,\n  GraphQLString\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport pageType from '../../types/page';\nimport PageModel from '../../../models/page';\n\nfunction getUniqueSlug (slug, it) {\n  const sufix = it > 0 ? `-${it}` : '';\n  const resultSlug = `${slug}${sufix}`;\n  return PageModel\n    .findOne({slug: resultSlug})\n    .exec()\n    .then((response) => {\n      let result;\n      if (!response) {\n        result = resultSlug;\n      } else {\n        result = getUniqueSlug(slug, it + 1);\n      }\n      return result;\n    });\n}\n\nexport default {\n  type: pageType,\n  args: {\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(GraphQLString)\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    let page = await PageModel.findById(params.data);\n\n    if (!page) {\n      throw new Error('Page to duplicate not found');\n    }\n\n    page = page.toJSON();\n\n    const slug = await getUniqueSlug(`${page.slug}-copy`, 0);\n\n    page.slug = slug;\n    page.title += ' (copy)';\n    page.state = 'draft';\n    delete page._id;\n    delete page.date;\n    delete page.actions;\n    const pageModel = new PageModel(page);\n\n    const newPage = await pageModel.save();\n\n    if (!newPage) {\n      throw new Error('Error duplicating page');\n    }\n    return newPage;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/page/index.js",
    "content": "import addPage from './add';\nimport duplicatePage from './duplicate';\nimport removePage from './remove';\nimport restorePage from './restore';\nimport updatePage from './update';\n\nexport default {\n  addPage,\n  duplicatePage,\n  removePage,\n  restorePage,\n  updatePage\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/page/remove.js",
    "content": "import {\n  GraphQLNonNull,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport pageType from '../../types/page';\nimport PageModel from '../../../models/page';\nimport RevisionModel from '../../../models/revision';\nimport TabModel from '../../../models/tab';\n\nexport default {\n  type: pageType,\n  args: {\n    id: {\n      name: 'id',\n      type: new GraphQLNonNull(GraphQLID)\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    const removedPage = await PageModel.findByIdAndRemove(params.id).exec();\n\n    if (!removedPage) {\n      throw new Error('Page not found');\n    }\n\n    await TabModel.find({'_id._id': params.id}).remove().exec();\n    await RevisionModel.find({'_id._id': params.id}).remove().exec();\n\n    return removedPage;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/page/restore.js",
    "content": "import {\n  GraphQLNonNull,\n  GraphQLID,\n  GraphQLInt\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport pageType from '../../types/page';\nimport updatePageMutation from './update';\nimport RevisionModel from '../../../models/revision';\n\nexport default {\n  type: pageType,\n  args: {\n    pageId: {\n      name: 'pageId',\n      type: new GraphQLNonNull(GraphQLID)\n    },\n    version: {\n      name: 'version',\n      type: new GraphQLNonNull(GraphQLInt)\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const {pageId: _id, version: __v} = params;\n\n    const revision = await RevisionModel.findOne({\n      '_id._id': _id,\n      '_id.__v': __v\n    }).exec();\n\n    return await updatePageMutation.resolve(root, {data: revision.doc}, options);\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/page/update.js",
    "content": "import {\n  GraphQLNonNull\n} from 'graphql';\nimport getProjection from 'helpers/get-projection';\n\nimport authorize from '../../authorize';\nimport pageInputType from '../../types/page-input';\nimport pageType from '../../types/page';\nimport PageModel from '../../../models/page';\nimport RevisionModel from '../../../models/revision';\n\nexport default {\n  type: pageType,\n  args: {\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(pageInputType)\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const projection = getProjection(options.fieldASTs[0]);\n\n    const page = await PageModel.findById(params.data._id);\n\n    const revision = new RevisionModel({\n      _id: {\n        _id: page._id,\n        __v: page.__v\n      },\n      date: page.updatedDate,\n      user: page.updatedBy,\n      doc: page\n    });\n\n    await revision.save();\n\n    const pageChanges = Object.assign({}, params.data, {\n      __v: page.__v + 1,\n      updatedDate: new Date()\n    });\n\n    if (params.data.data && typeof params.data.data === 'string') {\n      pageChanges.data = JSON.parse(params.data.data);\n    }\n\n    const resultPage = await PageModel.findByIdAndUpdate(\n      params.data._id,\n      pageChanges,\n      {upsert: true, new: true}\n    ).select(projection).exec();\n\n    if (!resultPage) {\n      throw new Error('Error updating page');\n    }\n    return resultPage;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/schema-entry/add.js",
    "content": "import getUniqueSlug from 'helpers/get-unique-slug';\nimport parseFields from 'helpers/parse-fields';\nimport {\n  GraphQLNonNull,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport schemaEntryInputType from '../../types/schema-entry-input';\nimport schemaEntryModel from '../../../models/schema-entry';\nimport schemaEntryType from '../../types/schema-entry';\n\nconst parsableFields = ['data', 'properties'];\n\nexport default {\n  type: schemaEntryType,\n  args: {\n    schemaId: {\n      name: 'schemaId',\n      type: GraphQLID\n    },\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(schemaEntryInputType)\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    const Model = await schemaEntryModel(params.schemaId);\n    const data = parseFields(Object.assign({}, params.data), parsableFields);\n\n    // generate slug\n    if (!data.slug) {\n      data.slug = await getUniqueSlug(Model, data.title);\n    }\n\n    const schemaEntry = new Model(data);\n    const newSchemaEntry = await schemaEntry.save();\n\n    if (!newSchemaEntry) {\n      throw new Error('Error creating schema entry');\n    }\n    return newSchemaEntry;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/schema-entry/index.js",
    "content": "import addSchemaEntry from './add';\nimport removeSchemaEntry from './remove';\nimport restoreSchemaEntry from './restore';\nimport updateSchemaEntry from './update';\n\nexport default {\n  addSchemaEntry,\n  removeSchemaEntry,\n  restoreSchemaEntry,\n  updateSchemaEntry\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/schema-entry/remove.js",
    "content": "import {\n  GraphQLNonNull,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport schemaEntryModel from '../../../models/schema-entry';\nimport schemaEntryType from '../../types/schema-entry';\n\nexport default {\n  type: schemaEntryType,\n  args: {\n    schemaId: {\n      name: 'schemaId',\n      type: GraphQLID\n    },\n    id: {\n      name: 'id',\n      type: new GraphQLNonNull(GraphQLID)\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    const Model = await schemaEntryModel(params.schemaId);\n    const removedSchemaEntry = await Model.findByIdAndRemove(params.id).exec();\n\n    if (!removedSchemaEntry) {\n      throw new Error('Schema entry not found');\n    }\n    return removedSchemaEntry;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/schema-entry/restore.js",
    "content": "import {\n  GraphQLNonNull,\n  GraphQLID,\n  GraphQLInt\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport schemaEntryType from '../../types/schema-entry';\nimport updateSchemaEntryMutation from './update';\nimport RevisionModel from '../../../models/revision';\n\nexport default {\n  type: schemaEntryType,\n  args: {\n    schemaId: {\n      name: 'schemaId',\n      type: GraphQLID\n    },\n    schemaEntryId: {\n      name: 'schemaEntryId',\n      type: new GraphQLNonNull(GraphQLID)\n    },\n    version: {\n      name: 'version',\n      type: new GraphQLNonNull(GraphQLInt)\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const {schemaEntryId: _id, version: __v} = params;\n\n    const revision = await RevisionModel.findOne({\n      '_id._id': _id,\n      '_id.__v': __v\n    }).exec();\n\n    return await updateSchemaEntryMutation.resolve(\n      root,\n      {schemaId: params.schemaId, data: revision.doc},\n      options\n    );\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/schema-entry/update.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport parseFields from 'helpers/parse-fields';\nimport {\n  GraphQLNonNull,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport schemaEntryInputType from '../../types/schema-entry-input';\nimport schemaEntryModel from '../../../models/schema-entry';\nimport schemaEntryType from '../../types/schema-entry';\nimport RevisionModel from '../../../models/revision';\n\nconst parsableFields = ['data', 'properties'];\n\nexport default {\n  type: schemaEntryType,\n  args: {\n    schemaId: {\n      name: 'schemaId',\n      type: GraphQLID\n    },\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(schemaEntryInputType)\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const projection = getProjection(options.fieldASTs[0]);\n    const Model = await schemaEntryModel(params.schemaId);\n    const schemaEntry = await Model.findById(params.data._id);\n\n    const revision = new RevisionModel({\n      _id: {\n        _id: schemaEntry._id,\n        __v: schemaEntry.__v\n      },\n      date: schemaEntry.updatedDate,\n      user: schemaEntry.updatedBy,\n      doc: schemaEntry\n    });\n\n    await revision.save();\n\n    const schemaEntryChanges = parseFields(Object.assign({}, params.data, {\n      __v: schemaEntry.__v + 1,\n      updatedDate: new Date()\n    }), parsableFields);\n\n    const resultSchemaEntry = await Model.findByIdAndUpdate(\n      params.data._id,\n      schemaEntryChanges,\n      {upsert: true, new: true}\n    ).select(projection).exec();\n\n    if (!resultSchemaEntry) {\n      throw new Error('Error updating schemaEntry');\n    }\n    return resultSchemaEntry;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/schemas/add.js",
    "content": "import getUniqueSlug from 'helpers/get-unique-slug';\nimport {\n  GraphQLNonNull\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport schemaInputType from '../../types/schema-input';\nimport schemaType from '../../types/schema';\nimport SchemaModel from '../../../models/schema';\n\nexport default {\n  type: schemaType,\n  args: {\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(schemaInputType)\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    const data = Object.assign({}, params.data, {\n      properties: JSON.parse(params.data.properties)\n    });\n\n    // generate slug\n    if (!data.slug) {\n      data.slug = await getUniqueSlug(SchemaModel, data.title);\n    }\n\n    const schema = new SchemaModel(data);\n\n    const newSchema = await schema.save();\n\n    if (!newSchema) {\n      throw new Error('Error adding schema');\n    }\n    return newSchema;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/schemas/index.js",
    "content": "import addSchema from './add';\nimport removeSchema from './remove';\nimport restoreSchema from './restore';\nimport updateSchema from './update';\n\nexport default {\n  addSchema,\n  removeSchema,\n  restoreSchema,\n  updateSchema\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/schemas/remove.js",
    "content": "import {\n  GraphQLNonNull,\n  GraphQLString\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport schemaType from '../../types/schema';\nimport SchemaModel from '../../../models/schema';\n\nexport default {\n  type: schemaType,\n  args: {\n    id: {\n      name: 'id',\n      type: new GraphQLNonNull(GraphQLString)\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    const removedSchema = await SchemaModel.findByIdAndRemove(params.id);\n\n    if (!removedSchema) {\n      throw new Error('Schema not found');\n    }\n    return removedSchema;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/schemas/restore.js",
    "content": "import {\n  GraphQLNonNull,\n  GraphQLID,\n  GraphQLInt\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport schemaType from '../../types/schema';\nimport updateSchemaMutation from './update';\nimport RevisionModel from '../../../models/revision';\n\nexport default {\n  type: schemaType,\n  args: {\n    schemaId: {\n      name: 'schemaId',\n      type: new GraphQLNonNull(GraphQLID)\n    },\n    version: {\n      name: 'version',\n      type: new GraphQLNonNull(GraphQLInt)\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const {schemaId: _id, version: __v} = params;\n\n    const revision = await RevisionModel.findOne({\n      '_id._id': _id,\n      '_id.__v': __v\n    }).exec();\n\n    return await updateSchemaMutation.resolve(root, {data: revision.doc}, options);\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/schemas/update.js",
    "content": "import {\n  GraphQLNonNull\n} from 'graphql';\nimport getProjection from 'helpers/get-projection';\n\nimport authorize from '../../authorize';\nimport schemaInputType from '../../types/schema-input';\nimport schemaType from '../../types/schema';\nimport RevisionModel from '../../../models/revision';\nimport SchemaModel from '../../../models/schema';\n\nexport default {\n  type: schemaType,\n  args: {\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(schemaInputType)\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const projection = getProjection(options.fieldASTs[0]);\n\n    const schema = await SchemaModel.findById(params.data._id);\n\n    const revision = new RevisionModel({\n      _id: {\n        _id: schema._id,\n        __v: schema.__v\n      },\n      date: schema.updatedDate,\n      user: schema.updatedBy,\n      doc: schema\n    });\n\n    await revision.save();\n\n    const schemaChanges = Object.assign({}, params.data, {\n      __v: schema.__v + 1,\n      updatedDate: new Date()\n    });\n\n    if (params.data.data && typeof params.data.data === 'string') {\n      schemaChanges.data = JSON.parse(params.data.data);\n    }\n    if (params.data.properties && typeof params.data.properties === 'string') {\n      schemaChanges.properties = JSON.parse(params.data.properties);\n    }\n\n    const resultSchema = await SchemaModel.findByIdAndUpdate(\n      params.data._id,\n      schemaChanges,\n      {upsert: true, new: true}\n    ).select(projection).exec();\n\n    if (!resultSchema) {\n      throw new Error('Error updating schema');\n    }\n    return resultSchema;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/settings/index.js",
    "content": "import saveSettings from './save';\n\nexport default {\n  saveSettings\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/settings/save.js",
    "content": "import forEach from 'lodash.foreach';\nimport getProjection from 'helpers/get-projection';\nimport Q from 'q';\nimport {\n  GraphQLNonNull,\n  GraphQLList\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport settingInputType from '../../types/setting-input';\nimport settingType from '../../types/setting';\nimport SettingModel from '../../../models/setting';\n\nexport default {\n  type: new GraphQLList(settingType),\n  args: {\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(\n        new GraphQLList(settingInputType)\n      )\n    }\n  },\n  resolve (root, params, options) {\n    authorize(root);\n\n    const projection = getProjection(options.fieldASTs[0]);\n    const promises = [];\n\n    forEach(params.data, (setting) => {\n      promises.push(\n        SettingModel.findByIdAndUpdate(setting._id, setting, {upsert: true, new: true}).select(projection)\n      );\n    });\n\n    return Q\n      .all(promises)\n      .spread((...settings) => settings);\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/style/add.js",
    "content": "import parseFields from 'helpers/parse-fields';\nimport {\n  GraphQLNonNull\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport parsableFields from './parsable-fields';\nimport styleInputType from '../../types/style-input';\nimport styleType from '../../types/style';\nimport StyleModel from '../../../models/style';\n\nexport default {\n  type: styleType,\n  args: {\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(styleInputType)\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    const data = parseFields(params.data, parsableFields);\n    const styleModel = new StyleModel(data);\n\n    const style = await styleModel.save();\n\n    if (!style) {\n      throw new Error('Style not found');\n    }\n    return style;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/style/index.js",
    "content": "import addStyle from './add';\nimport removeStyle from './remove';\nimport updateStyle from './update';\n\nexport default {\n  addStyle,\n  removeStyle,\n  updateStyle\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/style/parsable-fields.js",
    "content": "export default ['options', 'displayOptions'];\n"
  },
  {
    "path": "lib/server/graphql/mutations/style/remove.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLNonNull,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport styleType from '../../types/style';\nimport StyleModel from '../../../models/style';\n\nexport default {\n  type: styleType,\n  args: {\n    _id: {\n      name: '_id',\n      type: new GraphQLNonNull(GraphQLID)\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const removedStyle = await StyleModel\n      .findByIdAndRemove(params._id, {\n        select: getProjection(options.fieldASTs[0])\n      })\n      .exec();\n\n    if (!removedStyle) {\n      throw new Error('Style not found');\n    }\n\n    return removedStyle;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/style/update.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport parseFields from 'helpers/parse-fields';\nimport {\n  GraphQLNonNull\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport parsableFields from './parsable-fields';\nimport styleInputType from '../../types/style-input';\nimport styleType from '../../types/style';\nimport StyleModel from '../../../models/style';\n\nexport default {\n  type: styleType,\n  args: {\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(styleInputType)\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const data = parseFields(params.data, parsableFields);\n    const resultStyle = await StyleModel\n      .findByIdAndUpdate(data._id, data, {\n        upsert: true,\n        new: true,\n        select: getProjection(options.fieldASTs[0])\n      })\n      .exec();\n\n    if (!resultStyle) {\n      throw new Error('Style not found');\n    }\n\n    return resultStyle;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/symbol/add.js",
    "content": "import {\n  GraphQLNonNull\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport symbolInputType from '../../types/symbol-input';\nimport symbolType from '../../types/symbol';\nimport SymbolModel from '../../../models/symbol';\n\nexport default {\n  type: symbolType,\n  args: {\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(symbolInputType)\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    const data = Object.assign({}, params.data, {\n      data: JSON.parse(params.data.data)\n    });\n\n    const symbolModel = new SymbolModel(data);\n    const newSymbol = await symbolModel.save();\n\n    if (!newSymbol) {\n      throw new Error('Error adding symbol');\n    }\n    return newSymbol;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/symbol/index.js",
    "content": "import addSymbol from './add';\n\nexport default {\n  addSymbol\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/tab/add.js",
    "content": "import {\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport tabType from '../../types/tab';\nimport TabModel from '../../../models/tab';\n\nexport default {\n  type: tabType,\n  args: {\n    type: {\n      name: 'type',\n      type: new GraphQLNonNull(GraphQLString)\n    },\n    id: {\n      name: 'id',\n      type: new GraphQLNonNull(GraphQLID)\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    const _userId = root.user._id;\n    const item = params.id;\n    const type = params.type;\n\n    let tab = await TabModel.findOne({_userId, item}).exec();\n\n    if (!tab) {\n      const tabModel = new TabModel({\n        _userId,\n        type,\n        item\n      });\n      tab = await tabModel.save();\n\n      if (!tab) {\n        throw new Error('Error creating tab');\n      }\n    } else {\n      tab = null;\n    }\n\n    return tab;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/tab/index.js",
    "content": "import addTab from './add';\nimport removeTab from './remove';\n\nexport default {\n  removeTab,\n  addTab\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/tab/remove.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLNonNull,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport tabType from '../../types/tab';\nimport TabModel from '../../../models/tab';\n\nexport default {\n  type: tabType,\n  args: {\n    id: {\n      name: 'id',\n      type: new GraphQLNonNull(GraphQLID)\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const removedTab = await TabModel\n      .findByIdAndRemove(params.id, {\n        select: getProjection(options.fieldASTs[0])\n      })\n      .exec();\n\n    if (!removedTab) {\n      throw new Error('Tab not found');\n    }\n\n    return removedTab;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/user/add.js",
    "content": "import {\n  GraphQLNonNull\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport userInputType from '../../types/user-input';\nimport userType from '../../types/user';\nimport UserModel from '../../../models/user';\n\nasync function registerUser (user, password) {\n  return new Promise((resolve, reject) => {\n    UserModel.register(user, password, (err) => {\n      if (err) {\n        reject(err);\n      }\n      resolve();\n    });\n  });\n}\n\nexport default {\n  type: userType,\n  args: {\n    data: {\n      name: 'data',\n      type: new GraphQLNonNull(userInputType)\n    }\n  },\n  async resolve (root, params) {\n    const {username, name, email, password} = params.data;\n    const user = new UserModel({\n      username,\n      name,\n      email\n    });\n\n    const count = await UserModel.count();\n\n    if (count > 0) {\n      authorize(root);\n    }\n\n    await registerUser(user, password);\n\n    return user;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/user/index.js",
    "content": "import addUser from './add';\nimport removeUser from './remove';\n\nexport default {\n  addUser,\n  removeUser\n};\n"
  },
  {
    "path": "lib/server/graphql/mutations/user/remove.js",
    "content": "import {\n  GraphQLNonNull,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport config from '../../../../../config';\nimport userType from '../../types/user';\nimport UserModel from '../../../models/user';\n\nexport default {\n  type: userType,\n  args: {\n    id: {\n      name: 'id',\n      type: new GraphQLNonNull(GraphQLID)\n    }\n  },\n  resolve (root, params) {\n    authorize(root);\n\n    if (config.demo) {\n      throw new Error('Remove user is disabled on the demo');\n    }\n\n    return UserModel\n      .findByIdAndRemove(params.id)\n      .exec()\n      .then((removedUser) => {\n        if (!removedUser) {\n          throw new Error('Error removing user');\n        }\n        return removedUser;\n      });\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/color/colors.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLList\n} from 'graphql';\n\nimport colorType from '../../types/color';\nimport ColorModel from '../../../models/color';\n\nexport default {\n  type: new GraphQLList(colorType),\n  args: {},\n  resolve (root, params, options) {\n    const projection = getProjection(options.fieldASTs[0]);\n    return ColorModel.find().select(projection).exec();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/color/index.js",
    "content": "import colors from './colors';\n\nexport default {\n  colors\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/draft/draft.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLID\n} from 'graphql';\nimport {Types} from 'mongoose';\n\nimport authorize from '../../authorize';\nimport draftType from '../../types/draft';\nimport DraftModel from '../../../models/draft';\nimport PageModel from '../../../models/page';\n\nexport default {\n  type: draftType,\n  args: {\n    id: {\n      name: 'id',\n      type: GraphQLID\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n    const projection = getProjection(options.fieldASTs[0]);\n    const _id = new Types.ObjectId(params.id);\n    const _userId = root.user._id;\n\n    let result = await DraftModel.findById({_id, _userId}).select(projection).exec();\n\n    if (!result) {\n      const page = await PageModel.findById(_id).exec();\n      const draft = new DraftModel({\n        _id: {\n          _id,\n          _userId\n        },\n        __v: page.__v,\n        data: page.data\n      });\n      result = await draft.save();\n    }\n\n    return result;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/draft/index.js",
    "content": "import draft from './draft';\n\nexport default {\n  draft\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/generators/schema-list-count.js",
    "content": "import authorize from '../../authorize';\nimport countType from '../../types/count';\nimport schemaEntryModel from '../../../models/schema-entry';\n\nexport default (type, schema) => ({\n  type: countType,\n  args: {},\n  async resolve (root) {\n    authorize(root);\n\n    const Model = schemaEntryModel(schema);\n\n    const count = await Model.count({}).exec();\n    return {count};\n  }\n});\n"
  },
  {
    "path": "lib/server/graphql/queries/generators/schema-list.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLList\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport schemaEntryModel from '../../../models/schema-entry';\nimport {paginationQueryArgs, paginateQuery, searchQuery} from '../../query-pagination';\n\nexport default (type, schema) => ({\n  type: new GraphQLList(type),\n  args: {\n    ...paginationQueryArgs\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const Model = schemaEntryModel(schema);\n\n    const projection = getProjection(options.fieldASTs[0]);\n    const query = Model.find(searchQuery({}, params));\n\n    paginateQuery(query, params);\n\n    return await query.select(projection).exec();\n  }\n});\n"
  },
  {
    "path": "lib/server/graphql/queries/index.js",
    "content": "import color from './color';\nimport draft from './draft';\nimport media from './media';\nimport menu from './menu';\nimport page from './page';\nimport revision from './revision';\nimport schema from './schemas';\nimport schemaEntry from './schema-entry';\nimport settings from './settings';\nimport style from './style';\nimport symbol from './symbol';\nimport tab from './tab';\nimport user from './user';\n\nexport default {\n  ...color,\n  ...draft,\n  ...media,\n  ...menu,\n  ...page,\n  ...revision,\n  ...schemaEntry,\n  ...schema,\n  ...settings,\n  ...style,\n  ...symbol,\n  ...tab,\n  ...user\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/media/index.js",
    "content": "import mediaCount from './media-count';\nimport media, {mediaItem} from './media';\n\nexport default {\n  media,\n  mediaItem,\n  mediaCount\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/media/media-count.js",
    "content": "import {GraphQLInt} from 'graphql';\n\nimport authorize from '../../authorize';\nimport MediaModel from '../../../models/media';\n\nexport default {\n  type: GraphQLInt,\n  args: {},\n  async resolve (root) {\n    authorize(root);\n    return await MediaModel.count();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/media/media.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLList,\n  GraphQLNonNull,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport mediaType from '../../types/media';\nimport MediaModel from '../../../models/media';\nimport {paginationQueryArgs, paginateQuery, searchQuery} from '../../query-pagination';\n\nexport default {\n  type: new GraphQLList(mediaType),\n  args: {\n    ...paginationQueryArgs\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const projection = getProjection(options.fieldASTs[0]);\n    const query = MediaModel.find(searchQuery({}, params));\n\n    paginateQuery(query, params);\n\n    return query.select(projection).exec();\n  }\n};\n\nexport const mediaItem = {\n  type: mediaType,\n  args: {\n    id: {\n      name: 'id',\n      type: new GraphQLNonNull(GraphQLID)\n    }\n  },\n  async resolve (root, params, options) {\n    const projection = getProjection(options.fieldASTs[0]);\n    const query = MediaModel.findById(params.id);\n\n    return query.select(projection).exec();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/menu/index.js",
    "content": "import menus from './menus';\nimport menusCount from './menus-count';\nimport menu, {validateMenuSlug} from './menu';\n\nexport default {\n  menus,\n  menusCount,\n  menu,\n  validateMenuSlug\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/menu/menu.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLString,\n  GraphQLID,\n  GraphQLNonNull,\n  GraphQLBoolean\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport menuType from '../../types/menu';\nimport MenuModel from '../../../models/menu';\n\nexport default {\n  type: menuType,\n  args: {\n    _id: {\n      name: '_id',\n      type: GraphQLID\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const projection = getProjection(options.fieldASTs[0]);\n    return await MenuModel.findById(params._id).select(projection).exec();\n  }\n};\n\nexport const validateMenuSlug = {\n  type: GraphQLBoolean,\n  args: {\n    slug: {\n      name: 'slug',\n      type: new GraphQLNonNull(GraphQLString)\n    },\n    menuId: {\n      name: 'menuId',\n      type: GraphQLID\n    }\n  },\n  async resolve (root, {slug, menuId}) {\n    authorize(root);\n\n    return await MenuModel.count({\n      slug,\n      _id: {\n        $ne: menuId\n      }\n    }) === 0;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/menu/menus-count.js",
    "content": "import {GraphQLInt} from 'graphql';\n\nimport authorize from '../../authorize';\nimport MenuModel from '../../../models/menu';\n\nexport default {\n  type: GraphQLInt,\n  args: {},\n  async resolve (root) {\n    authorize(root);\n    return await MenuModel.count();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/menu/menus.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLList\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport menuType from '../../types/menu';\nimport MenuModel from '../../../models/menu';\nimport {paginationQueryArgs, paginateQuery, searchQuery} from '../../query-pagination';\n\nexport default {\n  type: new GraphQLList(menuType),\n  args: {\n    ...paginationQueryArgs\n  },\n  resolve: (root, params, options) => {\n    authorize(root);\n\n    const projection = getProjection(options.fieldASTs[0]);\n    const query = MenuModel.find(searchQuery({}, params));\n\n    paginateQuery(query, params);\n\n    return query.select(projection).exec();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/page/index.js",
    "content": "import pages from './pages';\nimport pagesCount from './pages-count';\nimport page, {validatePageSlug} from './page';\n\nexport default {\n  pages,\n  pagesCount,\n  page,\n  validatePageSlug\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/page/page.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLString,\n  GraphQLBoolean,\n  GraphQLNonNull,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport pageType from '../../types/page';\nimport PageModel from '../../../models/page';\nimport SettingModel from '../../../models/setting';\n\nexport default {\n  type: pageType,\n  args: {\n    _id: {\n      name: '_id',\n      type: GraphQLID\n    },\n    slug: {\n      name: 'slug',\n      type: GraphQLString\n    }\n  },\n  async resolve (root, params, options) {\n    const projection = getProjection(options.fieldASTs[0]);\n    let result = false;\n\n    if (params.slug || params._id) {\n      result = await PageModel.findOne(params).select(projection).exec();\n    } else {\n      const frontpage = await SettingModel.findById('frontpage').exec();\n      if (!frontpage) {\n        throw new Error('Frontpage not defined');\n      }\n      result = await PageModel.findById(frontpage.value).select(projection).exec();\n    }\n    return result;\n  }\n};\n\nexport const validatePageSlug = {\n  type: GraphQLBoolean,\n  args: {\n    slug: {\n      name: 'slug',\n      type: new GraphQLNonNull(GraphQLString)\n    },\n    pageId: {\n      name: 'pageId',\n      type: GraphQLID\n    }\n  },\n  async resolve (root, {slug, pageId}) {\n    authorize(root);\n\n    return await PageModel.count({\n      slug,\n      _id: {\n        $ne: pageId\n      }\n    }) === 0;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/page/pages-count.js",
    "content": "import {GraphQLInt} from 'graphql';\n\nimport PageModel from '../../../models/page';\n\nexport default {\n  type: GraphQLInt,\n  args: {},\n  async resolve () {\n    const count = PageModel.count();\n    return count;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/page/pages.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLList\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport pageType from '../../types/page';\nimport PageModel from '../../../models/page';\nimport {paginationQueryArgs, paginateQuery, searchQuery} from '../../query-pagination';\n\nexport default {\n  type: new GraphQLList(pageType),\n  args: {\n    ...paginationQueryArgs\n  },\n  resolve (root, params, options) {\n    authorize(root);\n\n    const projection = getProjection(options.fieldASTs[0]);\n    const query = PageModel.find(searchQuery({}, params));\n\n    paginateQuery(query, params);\n\n    return query.select(projection).exec();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/revision/index.js",
    "content": "import revisions from './revisions';\n\nexport default {\n  revisions\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/revision/revisions.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLList,\n  GraphQLString\n} from 'graphql';\nimport {Types} from 'mongoose';\n\nimport authorize from '../../authorize';\nimport revisionType from '../../types/revision';\nimport RevisionModel from '../../../models/revision';\n\nexport default {\n  type: new GraphQLList(revisionType),\n  args: {\n    id: {\n      name: 'id',\n      type: GraphQLString\n    }\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const id = new Types.ObjectId(params.id);\n    const projection = getProjection(options.fieldASTs[0]);\n\n    return await RevisionModel\n      .find({\n        '_id._id': id\n      })\n      .sort({'_id.__v': -1})\n      .select(projection)\n      .exec();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/schema-entry/index.js",
    "content": "import schemaList from './schema-list';\nimport schemaListCount from './schema-list-count';\nimport schemaEntry, {validateSchemaEntrySlug} from './schema-entry';\n\nexport default {\n  schemaEntry,\n  validateSchemaEntrySlug,\n  schemaList,\n  schemaListCount\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/schema-entry/schema-entry.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLString,\n  GraphQLBoolean,\n  GraphQLNonNull,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport schemaEntryModel from '../../../models/schema-entry';\nimport schemaEntryType from '../../types/schema-entry';\n\nexport default {\n  type: schemaEntryType,\n  args: {\n    id: {\n      name: 'id',\n      type: GraphQLID\n    },\n    schemaId: {\n      name: 'schemaId',\n      type: GraphQLID\n    }\n  },\n  async resolve (root, {schemaId, id}, options) {\n    const Model = await schemaEntryModel(schemaId);\n\n    const projection = getProjection(options.fieldASTs[0]);\n    return await Model.findById(id).select(projection).exec();\n  }\n};\n\nexport const validateSchemaEntrySlug = {\n  type: GraphQLBoolean,\n  args: {\n    slug: {\n      name: 'slug',\n      type: new GraphQLNonNull(GraphQLString)\n    },\n    schemaId: {\n      name: 'schemaId',\n      type: GraphQLID\n    },\n    schemaEntryId: {\n      name: 'schemaEntryId',\n      type: GraphQLID\n    }\n  },\n  async resolve (root, {slug, schemaId, schemaEntryId}) {\n    authorize(root);\n\n    const Model = await schemaEntryModel(schemaId);\n\n    return await Model.count({\n      slug,\n      _id: {\n        $ne: schemaEntryId\n      }\n    }) === 0;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/schema-entry/schema-list-count.js",
    "content": "import {\n  GraphQLID,\n  GraphQLInt\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport schemaEntryModel from '../../../models/schema-entry';\n\nexport default {\n  type: GraphQLInt,\n  args: {\n    schemaId: {\n      name: 'schemaId',\n      type: GraphQLID\n    }\n  },\n  async resolve (root, params) {\n    authorize(root);\n\n    const Model = await schemaEntryModel(params.schemaId);\n\n    return await Model.count().exec();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/schema-entry/schema-list.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLList,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport schemaEntryModel from '../../../models/schema-entry';\nimport schemaEntryType from '../../types/schema-entry';\nimport {paginationQueryArgs, paginateQuery, searchQuery} from '../../query-pagination';\n\nexport default {\n  type: new GraphQLList(schemaEntryType),\n  args: {\n    schemaId: {\n      name: 'schemaId',\n      type: GraphQLID\n    },\n    ...paginationQueryArgs\n  },\n  async resolve (root, params, options) {\n    authorize(root);\n\n    const Model = await schemaEntryModel(params.schemaId);\n\n    const projection = getProjection(options.fieldASTs[0]);\n    const query = Model.find(searchQuery({}, params));\n\n    paginateQuery(query, params);\n\n    return await query.select(projection).exec();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/schemas/index.js",
    "content": "import schemas from './schemas';\nimport schemasCount from './schemas-count';\nimport schema, {validateSchemaSlug} from './schema';\n\nexport default {\n  schemas,\n  schemasCount,\n  schema,\n  validateSchemaSlug\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/schemas/schema.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLString,\n  GraphQLBoolean,\n  GraphQLNonNull,\n  GraphQLID\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport schemaType from '../../types/schema';\nimport SchemaModel from '../../../models/schema';\n\nexport default {\n  type: schemaType,\n  args: {\n    _id: {\n      name: '_id',\n      type: GraphQLID\n    },\n    slug: {\n      name: 'slug',\n      type: GraphQLString\n    }\n  },\n  async resolve (root, params, options) {\n    const projection = getProjection(options.fieldASTs[0]);\n    return await SchemaModel.findOne(params).select(projection).exec();\n  }\n};\n\nexport const validateSchemaSlug = {\n  type: GraphQLBoolean,\n  args: {\n    slug: {\n      name: 'slug',\n      type: new GraphQLNonNull(GraphQLString)\n    },\n    schemaId: {\n      name: 'schemaId',\n      type: GraphQLID\n    }\n  },\n  async resolve (root, {slug, schemaId}) {\n    authorize(root);\n\n    return await SchemaModel.count({\n      slug,\n      _id: {\n        $ne: schemaId\n      }\n    }) === 0;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/schemas/schemas-count.js",
    "content": "import {GraphQLInt} from 'graphql';\n\nimport authorize from '../../authorize';\nimport SchemaModel from '../../../models/schema';\n\nexport default {\n  type: GraphQLInt,\n  args: {},\n  async resolve (root) {\n    authorize(root);\n    return await SchemaModel.count();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/schemas/schemas.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLList\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport schemaType from '../../types/schema';\nimport SchemaModel from '../../../models/schema';\nimport {paginationQueryArgs, paginateQuery, searchQuery} from '../../query-pagination';\n\nexport default {\n  type: new GraphQLList(schemaType),\n  args: {\n    ...paginationQueryArgs\n  },\n  resolve (root, params, options) {\n    authorize(root);\n\n    const projection = getProjection(options.fieldASTs[0]);\n    const query = SchemaModel.find(searchQuery({}, params));\n\n    paginateQuery(query, params);\n\n    return query.select(projection).exec();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/settings/index.js",
    "content": "import settings from './settings';\n\nexport default {\n  settings\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/settings/settings.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLList,\n  GraphQLString\n} from 'graphql';\n\nimport authorize from '../../authorize';\nimport settingType from '../../types/setting';\nimport SettingModel from '../../../models/setting';\n\nexport default {\n  type: new GraphQLList(settingType),\n  args: {\n    ids: {\n      name: 'ids',\n      type: new GraphQLList(GraphQLString)\n    }\n  },\n  resolve: (root, params, options) => {\n    authorize(root);\n\n    const projection = getProjection(options.fieldASTs[0]);\n\n    return SettingModel\n      .find({\n        _id: {$in: params.ids}\n      })\n      .select(projection)\n      .exec();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/style/index.js",
    "content": "import styles from './styles';\n\nexport default {\n  styles\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/style/styles.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLList\n} from 'graphql';\n\nimport styleType from '../../types/style';\nimport StyleModel from '../../../models/style';\n\nexport default {\n  type: new GraphQLList(styleType),\n  args: {},\n  resolve (root, params, options) {\n    const projection = getProjection(options.fieldASTs[0]);\n    return StyleModel.find().select(projection).exec();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/symbol/index.js",
    "content": "import symbol from './symbol';\nimport symbols from './symbols';\n\nexport default {\n  symbol,\n  symbols\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/symbol/symbol.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {GraphQLID} from 'graphql';\nimport {Types} from 'mongoose';\n\nimport symbolType from '../../types/symbol';\nimport SymbolModel from '../../../models/symbol';\n\nexport default {\n  type: symbolType,\n  args: {\n    id: {\n      name: 'id',\n      type: GraphQLID\n    }\n  },\n  resolve (root, params, options) {\n    const projection = getProjection(options.fieldASTs[0]);\n    const _id = new Types.ObjectId(params.id);\n\n    return SymbolModel.findById(_id).select(projection).exec();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/symbol/symbols.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {GraphQLList} from 'graphql';\n\nimport symbolType from '../../types/symbol';\nimport SymbolModel from '../../../models/symbol';\n\nexport default {\n  type: new GraphQLList(symbolType),\n  args: {},\n  resolve (root, params, options) {\n    const projection = getProjection(options.fieldASTs[0]);\n    return SymbolModel.find().select(projection).exec();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/tab/index.js",
    "content": "import tabs from './tabs';\n\nexport default {\n  tabs\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/tab/tabs.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {GraphQLList} from 'graphql';\n\nimport authorize from '../../authorize';\nimport tabType from '../../types/tab';\nimport TabModel from '../../../models/tab';\n\nexport default {\n  type: new GraphQLList(tabType),\n  args: {},\n  resolve (root, params, options) {\n    authorize(root);\n    const _userId = root.user._id;\n    const projection = getProjection(options.fieldASTs[0]);\n\n    return TabModel\n      .find({_userId})\n      .select(projection)\n      .exec();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/user/index.js",
    "content": "import session from './session';\nimport user from './user';\nimport users from './users';\nimport usersCount from './users-count';\n\nexport default {\n  user,\n  users,\n  usersCount,\n  session\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/user/session.js",
    "content": "import {GraphQLBoolean} from 'graphql';\n\nexport default {\n  type: GraphQLBoolean,\n  resolve (root) {\n    return root.isAuthenticated;\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/user/user.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {GraphQLID} from 'graphql';\n\nimport authorize from '../../authorize';\nimport userType from '../../types/user';\nimport UserModel from '../../../models/user';\n\nexport default {\n  type: userType,\n  args: {\n    id: {\n      name: 'username',\n      type: GraphQLID\n    }\n  },\n  resolve (root, params, options) {\n    authorize(root);\n    const projection = getProjection(options.fieldASTs[0]);\n\n    let id = params.id;\n    if (!id) {\n      id = root.user._id;\n    }\n\n    return UserModel\n      .findById(id)\n      .select(projection)\n      .exec();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/user/users-count.js",
    "content": "import {GraphQLInt} from 'graphql';\n\nimport authorize from '../../authorize';\nimport UserModel from '../../../models/user';\n\nexport default {\n  type: GraphQLInt,\n  args: {},\n  async resolve (root) {\n    authorize(root);\n    return await UserModel.count();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/queries/user/users.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {GraphQLList} from 'graphql';\n\nimport authorize from '../../authorize';\nimport userType from '../../types/user';\nimport UserModel from '../../../models/user';\nimport {paginationQueryArgs, paginateQuery, searchQuery} from '../../query-pagination';\n\nexport default {\n  type: new GraphQLList(userType),\n  args: {\n    ...paginationQueryArgs\n  },\n  resolve (root, params, options) {\n    authorize(root);\n\n    const projection = getProjection(options.fieldASTs[0]);\n    const query = UserModel.find(searchQuery({}, params));\n\n    paginateQuery(query, params);\n\n    return query.select(projection).exec();\n  }\n};\n"
  },
  {
    "path": "lib/server/graphql/query-pagination.js",
    "content": "import forEach from 'lodash.foreach';\nimport {\n  GraphQLString,\n  GraphQLInt,\n  GraphQLList\n} from 'graphql';\n\nimport filterType from './types/filter';\n\nexport const paginationQueryArgs = {\n  sort: {\n    name: 'sort',\n    type: GraphQLString\n  },\n  order: {\n    name: 'order',\n    type: GraphQLString\n  },\n  limit: {\n    name: 'limit',\n    type: GraphQLInt\n  },\n  filters: {\n    name: 'filters',\n    type: new GraphQLList(filterType)\n  },\n  page: {\n    name: 'page',\n    type: GraphQLInt\n  },\n  search: {\n    name: 'search',\n    type: GraphQLString\n  },\n  s: {\n    name: 's',\n    type: GraphQLString\n  }\n};\n\nfunction parseFilterOperation (op) {\n  const result = {};\n  forEach(op, (value, key) => {\n    result[`$${key}`] = value;\n  });\n  return result;\n}\n\nexport function searchQuery (find, params) {\n  const and = [];\n\n  // Search\n  if (params.search && params.s) {\n    and.push({\n      [params.search]: new RegExp(`.*${params.s}`, 'i')\n    });\n  }\n\n  // Filters\n  if (params.filters && params.filters.constructor === Array) {\n    forEach(params.filters, (filter) => {\n      and.push({\n        [filter.property]: parseFilterOperation(filter.op)\n      });\n    });\n  }\n\n  // apply and operator with all the filters\n  if (and.length > 0) {\n    Object.assign(find, {\n      $and: and\n    });\n  }\n\n  return find;\n}\n\nexport function paginateQuery (query, params) {\n  if (params.sort) {\n    query.sort({\n      [params.sort]: params.order || 'asc'\n    });\n  }\n  if (params.page && params.limit) {\n    query.skip((params.page - 1) * params.limit);\n  }\n  if (params.limit) {\n    query.limit(params.limit);\n  }\n}\n"
  },
  {
    "path": "lib/server/graphql/types/color-input.js",
    "content": "import {\n  GraphQLInputObjectType,\n  GraphQLString,\n  GraphQLID\n} from 'graphql';\n\nconst colorInputType = new GraphQLInputObjectType({\n  name: 'ColorInput',\n  fields: {\n    _id: {type: GraphQLID},\n    label: {type: GraphQLString},\n    value: {type: GraphQLString}\n  }\n});\n\nexport default colorInputType;\n"
  },
  {
    "path": "lib/server/graphql/types/color.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLID\n} from 'graphql';\n\nconst colorType = new GraphQLObjectType({\n  name: 'Color',\n  fields: {\n    _id: {type: new GraphQLNonNull(GraphQLID)},\n    label: {type: GraphQLString},\n    value: {type: GraphQLString}\n  }\n});\n\nexport default colorType;\n"
  },
  {
    "path": "lib/server/graphql/types/count.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLInt\n} from 'graphql';\n\nconst countType = new GraphQLObjectType({\n  name: 'Count',\n  fields: {\n    count: {type: GraphQLInt}\n  }\n});\n\nexport default countType;\n"
  },
  {
    "path": "lib/server/graphql/types/custom-font.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLString,\n  GraphQLNonNull\n} from 'graphql';\n\nconst customFontType = new GraphQLObjectType({\n  name: 'CustomFont',\n  fields: {\n    family: {\n      type: new GraphQLNonNull(GraphQLString)\n    },\n    id: {\n      type: new GraphQLNonNull(GraphQLString)\n    },\n    files: {\n      type: new GraphQLObjectType({\n        name: 'CustomFontFiles',\n        fields: {\n          eot: {type: new GraphQLNonNull(GraphQLString)},\n          woff2: {type: GraphQLString},\n          woff: {type: new GraphQLNonNull(GraphQLString)},\n          ttf: {type: new GraphQLNonNull(GraphQLString)}\n        }\n      })\n    }\n  }\n});\n\nexport default customFontType;\n"
  },
  {
    "path": "lib/server/graphql/types/draft-id-input.js",
    "content": "import {\n  GraphQLInputObjectType,\n  GraphQLString\n} from 'graphql';\n\nexport default new GraphQLInputObjectType({\n  name: 'DraftIdInput',\n  fields: {\n    _id: {\n      type: GraphQLString\n    },\n    _userId: {\n      type: GraphQLString\n    }\n  }\n});\n"
  },
  {
    "path": "lib/server/graphql/types/draft-id.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLString\n} from 'graphql';\n\nexport default new GraphQLObjectType({\n  name: 'DraftId',\n  fields: {\n    _id: {\n      type: new GraphQLNonNull(GraphQLString)\n    },\n    _userId: {\n      type: new GraphQLNonNull(GraphQLString)\n    }\n  }\n});\n"
  },
  {
    "path": "lib/server/graphql/types/draft-input.js",
    "content": "import {\n  GraphQLInputObjectType,\n  GraphQLString,\n  GraphQLInt\n} from 'graphql';\n\nimport draftIdInputType from './draft-id-input';\n\nconst draftInputType = new GraphQLInputObjectType({\n  name: 'DraftInput',\n  fields: {\n    _id: {\n      type: draftIdInputType\n    },\n    __v: {\n      type: GraphQLInt\n    },\n    data: {\n      type: GraphQLString\n    },\n    actions: {\n      type: GraphQLString\n    },\n    schemaLinks: {\n      type: GraphQLString\n    }\n  }\n});\n\nexport default draftInputType;\n"
  },
  {
    "path": "lib/server/graphql/types/draft.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLInt\n} from 'graphql';\n\nimport draftIdType from './draft-id';\n\nexport default new GraphQLObjectType({\n  name: 'Draft',\n  fields: {\n    _id: {\n      type: new GraphQLNonNull(draftIdType)\n    },\n    __v: {\n      type: GraphQLInt\n    },\n    data: {\n      type: GraphQLString,\n      resolve: (draft) => JSON.stringify(draft.data)\n    },\n    actions: {\n      type: GraphQLString,\n      resolve: (draft) => JSON.stringify(draft.actions)\n    },\n    schemaLinks: {\n      type: GraphQLString,\n      resolve: (draft) => JSON.stringify(draft.schemaLinks)\n    }\n  }\n});\n"
  },
  {
    "path": "lib/server/graphql/types/filter.js",
    "content": "import {\n  GraphQLInputObjectType,\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLList\n} from 'graphql';\n\nconst filterType = new GraphQLInputObjectType({\n  name: 'Filter',\n  fields: {\n    property: {\n      type: new GraphQLNonNull(GraphQLString)\n    },\n    op: {\n      type: new GraphQLInputObjectType({\n        name: 'FilterOp',\n        fields: {\n          eq: {type: GraphQLString},\n          in: {type: new GraphQLList(GraphQLString)}\n        }\n      })\n    }\n  }\n});\n\nexport default filterType;\n"
  },
  {
    "path": "lib/server/graphql/types/generators/schema-entry-input.js",
    "content": "import forEach from 'lodash.foreach';\nimport {\n  GraphQLInputObjectType,\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLInt,\n  GraphQLID\n} from 'graphql';\nimport {TypesNativeGraphQL} from 'helpers/data-types/native';\n\nexport default (schema) => {\n  const propertiesFields = {};\n  forEach(schema.properties, (property) => {\n    if (TypesNativeGraphQL[property.type]) {\n      const native = TypesNativeGraphQL[property.type];\n      propertiesFields[property.id] = Object.assign({}, native);\n    }\n  });\n\n  return new GraphQLInputObjectType({\n    name: `rlx_${schema.slug}_input`,\n    fields: {\n      _id: {type: new GraphQLNonNull(GraphQLID)},\n      title: {type: GraphQLString},\n      slug: {type: GraphQLString},\n      __v: {type: GraphQLInt},\n      state: {type: GraphQLString},\n      date: {\n        type: GraphQLInt,\n        resolve: () => Date.now()\n      },\n      updatedDate: {\n        type: GraphQLInt,\n        resolve: () => Date.now()\n      },\n      updatedBy: {type: GraphQLID},\n      createdBy: {type: GraphQLID},\n      data: {type: GraphQLString},\n      ...propertiesFields\n    }\n  });\n};\n"
  },
  {
    "path": "lib/server/graphql/types/generators/schema-entry.js",
    "content": "import forEach from 'lodash.foreach';\nimport {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLInt,\n  GraphQLID\n} from 'graphql';\nimport {TypesNativeGraphQL} from 'helpers/data-types/native';\n\nimport userType from '../user';\nimport UserModel from '../../../models/user';\n\nexport default (schema) => {\n  const propertiesFields = {};\n  forEach(schema.properties, (property) => {\n    if (TypesNativeGraphQL[property.type]) {\n      const native = TypesNativeGraphQL[property.type];\n      propertiesFields[property.id] = Object.assign({}, native);\n    }\n  });\n\n  return new GraphQLObjectType({\n    name: `rlx_${schema.slug}`,\n    fields: {\n      _id: {type: new GraphQLNonNull(GraphQLID)},\n      title: {type: GraphQLString},\n      slug: {type: new GraphQLNonNull(GraphQLString)},\n      __v: {type: GraphQLInt},\n      state: {type: GraphQLString},\n      date: {\n        type: GraphQLInt,\n        resolve ({date}) {\n          return date && date.getTime();\n        }\n      },\n      updatedDate: {\n        type: GraphQLInt,\n        resolve ({updatedDate}) {\n          return updatedDate && updatedDate.getTime();\n        }\n      },\n      updatedBy: {\n        type: userType,\n        async resolve (schemaEntry) {\n          return await UserModel.findById(schemaEntry.updatedBy).exec();\n        }\n      },\n      createdBy: {\n        type: userType,\n        async resolve (schemaEntry) {\n          return await UserModel.findById(schemaEntry.createdBy).exec();\n        }\n      },\n      data: {\n        type: GraphQLString,\n        resolve (schemaEntry) {\n          return JSON.stringify(schemaEntry.data);\n        }\n      },\n      ...propertiesFields\n    }\n  });\n};\n"
  },
  {
    "path": "lib/server/graphql/types/media-input.js",
    "content": "import {\n  GraphQLInputObjectType,\n  GraphQLString,\n  GraphQLNonNull\n} from 'graphql';\n\nconst mediaInputType = new GraphQLInputObjectType({\n  name: 'MediaInput',\n  fields: {\n    file: {\n      type: new GraphQLInputObjectType({\n        name: 'MediaInputFile',\n        fields: {\n          file: {type: new GraphQLNonNull(GraphQLString)},\n          filename: {type: new GraphQLNonNull(GraphQLString)}\n        }\n      })\n    }\n  }\n});\n\nexport default mediaInputType;\n"
  },
  {
    "path": "lib/server/graphql/types/media.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLInt,\n  GraphQLFloat,\n  GraphQLID\n} from 'graphql';\n\nconst mediaType = new GraphQLObjectType({\n  name: 'Media',\n  fields: {\n    _id: {type: new GraphQLNonNull(GraphQLID)},\n    name: {type: new GraphQLNonNull(GraphQLString)},\n    fileName: {type: new GraphQLNonNull(GraphQLString)},\n    type: {type: new GraphQLNonNull(GraphQLString)},\n    size: {type: new GraphQLNonNull(GraphQLString)},\n    filesize: {type: new GraphQLNonNull(GraphQLString)},\n    dimension: {\n      type: new GraphQLObjectType({\n        name: 'MediaDimension',\n        fields: {\n          width: {type: GraphQLInt},\n          height: {type: GraphQLInt}\n        }\n      })\n    },\n    url: {type: new GraphQLNonNull(GraphQLString)},\n    absoluteUrl: {type: new GraphQLNonNull(GraphQLString)},\n    date: {\n      type: GraphQLFloat,\n      resolve: ({date}) => (date && date.getTime())\n    },\n    thumbnail: {type: GraphQLString},\n    variations: {\n      type: GraphQLString,\n      resolve (media) {\n        return JSON.stringify(media.variations);\n      }\n    }\n  }\n});\n\nexport default mediaType;\n"
  },
  {
    "path": "lib/server/graphql/types/menu-data.js",
    "content": "import getProjection from 'helpers/get-projection';\nimport {\n  GraphQLObjectType,\n  GraphQLString,\n  GraphQLID,\n  GraphQLList\n} from 'graphql';\n\nimport pageType from './page';\nimport PageModel from '../../models/page';\n\nconst menuDataType = new GraphQLObjectType({\n  name: 'MenuData',\n  fields: () => ({\n    id: {type: GraphQLID},\n    type: {type: GraphQLString},\n    page: {\n      type: pageType,\n      resolve (menuData, params, options) {\n        const projection = getProjection(options.fieldASTs[0]);\n\n        return PageModel\n          .findById(menuData.page)\n          .select(projection)\n          .exec();\n      }\n    },\n    link: {\n      type: new GraphQLObjectType({\n        name: 'MenuDataLink',\n        fields: {\n          url: {type: GraphQLString},\n          label: {type: GraphQLString}\n        }\n      })\n    },\n    children: {\n      type: new GraphQLList(menuDataType)\n    }\n  })\n});\n\nexport default menuDataType;\n"
  },
  {
    "path": "lib/server/graphql/types/menu-input.js",
    "content": "import {\n  GraphQLInputObjectType,\n  GraphQLString,\n  GraphQLFloat,\n  GraphQLID\n} from 'graphql';\n\nconst menuInputType = new GraphQLInputObjectType({\n  name: 'MenuInput',\n  fields: {\n    _id: {type: GraphQLID},\n    title: {type: GraphQLString},\n    date: {\n      type: GraphQLFloat,\n      resolve: () => Date.now()\n    },\n    updatedDate: {\n      type: GraphQLFloat,\n      resolve: () => Date.now()\n    },\n    updatedBy: {type: GraphQLString},\n    createdBy: {type: GraphQLString},\n    data: {type: GraphQLString}\n  }\n});\n\nexport default menuInputType;\n"
  },
  {
    "path": "lib/server/graphql/types/menu.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLFloat,\n  GraphQLID\n} from 'graphql';\n\nimport userType from './user';\nimport UserModel from '../../models/user';\n\nconst menuType = new GraphQLObjectType({\n  name: 'Menu',\n  fields: {\n    _id: {type: new GraphQLNonNull(GraphQLID)},\n    title: {type: GraphQLString},\n    date: {\n      type: GraphQLFloat,\n      resolve ({date}) {\n        return date && date.getTime();\n      }\n    },\n    updatedDate: {\n      type: GraphQLFloat,\n      resolve ({updatedDate}) {\n        return updatedDate && updatedDate.getTime();\n      }\n    },\n    updatedBy: {\n      type: userType,\n      resolve (menu) {\n        return UserModel.findById(menu.updatedBy).exec();\n      }\n    },\n    createdBy: {\n      type: userType,\n      resolve (menu) {\n        return UserModel.findById(menu.createdBy).exec();\n      }\n    },\n    data: {\n      type: GraphQLString,\n      resolve ({data}) {\n        // TODO fetch needed data from nodes\n        return JSON.stringify(data);\n      }\n    }\n  }\n});\n\nexport default menuType;\n"
  },
  {
    "path": "lib/server/graphql/types/page-input.js",
    "content": "import {\n  GraphQLInputObjectType,\n  GraphQLString,\n  GraphQLInt,\n  GraphQLFloat,\n  GraphQLID\n} from 'graphql';\n\nconst pageInputType = new GraphQLInputObjectType({\n  name: 'PageInput',\n  fields: {\n    _id: {type: GraphQLID},\n    slug: {type: GraphQLString},\n    __v: {type: GraphQLInt},\n    state: {type: GraphQLString},\n    date: {\n      type: GraphQLFloat,\n      resolve: () => Date.now()\n    },\n    updatedDate: {\n      type: GraphQLFloat,\n      resolve: () => Date.now()\n    },\n    title: {type: GraphQLString},\n    data: {type: GraphQLString},\n    updatedBy: {type: GraphQLID},\n    createdBy: {type: GraphQLID}\n  }\n});\n\nexport default pageInputType;\n"
  },
  {
    "path": "lib/server/graphql/types/page.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLInt,\n  GraphQLFloat,\n  GraphQLID\n} from 'graphql';\n\nimport userType from './user';\nimport UserModel from '../../models/user';\n\nconst pageType = new GraphQLObjectType({\n  name: 'Page',\n  fields: {\n    _id: {type: new GraphQLNonNull(GraphQLID)},\n    slug: {type: new GraphQLNonNull(GraphQLString)},\n    __v: {type: GraphQLInt},\n    state: {type: GraphQLString},\n    date: {\n      type: GraphQLFloat,\n      resolve ({date}) {\n        return date && date.getTime();\n      }\n    },\n    updatedDate: {\n      type: GraphQLFloat,\n      resolve ({updatedDate}) {\n        return updatedDate && updatedDate.getTime();\n      }\n    },\n    title: {type: GraphQLString},\n    data: {\n      type: GraphQLString,\n      resolve (page) {\n        return JSON.stringify(page.data);\n      }\n    },\n    updatedBy: {\n      type: userType,\n      async resolve (page) {\n        return await UserModel.findById(page.updatedBy).exec();\n      }\n    },\n    createdBy: {\n      type: userType,\n      async resolve (page) {\n        return await UserModel.findById(page.createdBy).exec();\n      }\n    }\n  }\n});\n\nexport default pageType;\n"
  },
  {
    "path": "lib/server/graphql/types/revision.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLInt,\n  GraphQLFloat,\n  GraphQLID\n} from 'graphql';\n\nimport userType from './user';\nimport UserModel from '../../models/user';\n\nconst revisionType = new GraphQLObjectType({\n  name: 'Revision',\n  fields: {\n    _id: {\n      type: new GraphQLObjectType({\n        name: 'RevisionId',\n        fields: {\n          _id: {type: new GraphQLNonNull(GraphQLID)},\n          __v: {type: new GraphQLNonNull(GraphQLInt)}\n        }\n      })\n    },\n    date: {\n      type: GraphQLFloat,\n      resolve ({date}) {\n        return date && date.getTime();\n      }\n    },\n    doc: {\n      type: new GraphQLNonNull(GraphQLString),\n      resolve (revision) {\n        return JSON.stringify(revision.doc);\n      }\n    },\n    user: {\n      type: userType,\n      async resolve (revision) {\n        return await UserModel.findById(revision.user).exec();\n      }\n    }\n  }\n});\n\nexport default revisionType;\n"
  },
  {
    "path": "lib/server/graphql/types/schema-entry-input.js",
    "content": "import {\n  GraphQLInputObjectType,\n  GraphQLString,\n  GraphQLInt,\n  GraphQLFloat,\n  GraphQLID\n} from 'graphql';\n\nexport default new GraphQLInputObjectType({\n  name: 'SchemaEntryInput',\n  fields: {\n    _id: {type: GraphQLID},\n    title: {type: GraphQLString},\n    slug: {type: GraphQLString},\n    __v: {type: GraphQLInt},\n    state: {type: GraphQLString},\n    date: {\n      type: GraphQLFloat,\n      resolve: () => Date.now()\n    },\n    updatedDate: {\n      type: GraphQLFloat,\n      resolve: () => Date.now()\n    },\n    updatedBy: {type: GraphQLID},\n    createdBy: {type: GraphQLID},\n    data: {type: GraphQLString},\n    properties: {type: GraphQLString}\n  }\n});\n"
  },
  {
    "path": "lib/server/graphql/types/schema-entry.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLInt,\n  GraphQLFloat,\n  GraphQLID\n} from 'graphql';\n\nimport userType from './user';\nimport UserModel from '../../models/user';\n\nexport default new GraphQLObjectType({\n  name: 'SchemaEntry',\n  fields: {\n    _id: {type: new GraphQLNonNull(GraphQLID)},\n    title: {type: GraphQLString},\n    slug: {type: new GraphQLNonNull(GraphQLString)},\n    __v: {type: GraphQLInt},\n    state: {type: GraphQLString},\n    date: {\n      type: GraphQLFloat,\n      resolve ({date}) {\n        return date && date.getTime();\n      }\n    },\n    publishedDate: {\n      type: GraphQLFloat,\n      resolve ({publishedDate}) {\n        return publishedDate && publishedDate.getTime();\n      }\n    },\n    updatedDate: {\n      type: GraphQLFloat,\n      resolve ({updatedDate}) {\n        return updatedDate && updatedDate.getTime();\n      }\n    },\n    updatedBy: {\n      type: userType,\n      async resolve (schemaEntry) {\n        return await UserModel.findById(schemaEntry.updatedBy).exec();\n      }\n    },\n    createdBy: {\n      type: userType,\n      async resolve (schemaEntry) {\n        return await UserModel.findById(schemaEntry.createdBy).exec();\n      }\n    },\n    data: {\n      type: GraphQLString,\n      resolve (schemaEntry) {\n        return JSON.stringify(schemaEntry.data);\n      }\n    },\n    properties: {\n      type: GraphQLString,\n      resolve (schemaEntry) {\n        return JSON.stringify(schemaEntry.properties);\n      }\n    }\n  }\n});\n"
  },
  {
    "path": "lib/server/graphql/types/schema-input.js",
    "content": "import {\n  GraphQLInputObjectType,\n  GraphQLString,\n  GraphQLInt,\n  GraphQLFloat,\n  GraphQLID\n} from 'graphql';\n\nconst schemaInputType = new GraphQLInputObjectType({\n  name: 'SchemaInput',\n  fields: {\n    _id: {type: GraphQLString},\n    __v: {type: GraphQLInt},\n    title: {type: GraphQLString},\n    slug: {type: GraphQLString},\n    type: {type: GraphQLString},\n    date: {\n      type: GraphQLFloat,\n      resolve: () => Date.now()\n    },\n    updatedDate: {\n      type: GraphQLFloat,\n      resolve: () => Date.now()\n    },\n    data: {type: GraphQLString},\n    schemaLinks: {type: GraphQLString},\n    updatedBy: {type: GraphQLID},\n    createdBy: {type: GraphQLID},\n    properties: {type: GraphQLString}\n  }\n});\n\nexport default schemaInputType;\n"
  },
  {
    "path": "lib/server/graphql/types/schema.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLInt,\n  GraphQLFloat,\n  GraphQLID\n} from 'graphql';\n\nimport userType from './user';\nimport UserModel from '../../models/user';\n\nconst schemaType = new GraphQLObjectType({\n  name: 'Schema',\n  fields: {\n    _id: {\n      type: new GraphQLNonNull(GraphQLID)\n    },\n    title: {\n      type: GraphQLString\n    },\n    slug: {\n      type: new GraphQLNonNull(GraphQLString)\n    },\n    type: {\n      type: GraphQLString\n    },\n    __v: {\n      type: GraphQLInt\n    },\n    date: {\n      type: GraphQLFloat,\n      resolve: ({date}) => (date && date.getTime())\n    },\n    updatedDate: {\n      type: GraphQLFloat,\n      resolve: ({updatedDate}) => (updatedDate && updatedDate.getTime())\n    },\n    data: {\n      type: GraphQLString,\n      resolve: (schema) => JSON.stringify(schema.data)\n    },\n    schemaLinks: {\n      type: GraphQLString,\n      resolve: (schema) => JSON.stringify(schema.schemaLinks)\n    },\n    updatedBy: {\n      type: userType,\n      resolve: (schema) => UserModel.findById(schema.updatedBy).exec()\n    },\n    createdBy: {\n      type: userType,\n      resolve: (schema) => UserModel.findById(schema.createdBy).exec()\n    },\n    properties: {\n      type: GraphQLString,\n      resolve: (schema) => JSON.stringify(schema.properties)\n    }\n  }\n});\n\nexport default schemaType;\n"
  },
  {
    "path": "lib/server/graphql/types/setting-input.js",
    "content": "import {\n  GraphQLInputObjectType,\n  GraphQLString\n} from 'graphql';\n\nconst settingInputType = new GraphQLInputObjectType({\n  name: 'SettingInput',\n  fields: {\n    _id: {type: GraphQLString},\n    value: {type: GraphQLString}\n  }\n});\n\nexport default settingInputType;\n"
  },
  {
    "path": "lib/server/graphql/types/setting.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLString\n} from 'graphql';\n\nconst settingType = new GraphQLObjectType({\n  name: 'Setting',\n  fields: {\n    _id: {type: new GraphQLNonNull(GraphQLString)},\n    value: {type: GraphQLString}\n  }\n});\n\nexport default settingType;\n"
  },
  {
    "path": "lib/server/graphql/types/style-input.js",
    "content": "import {\n  GraphQLInputObjectType,\n  GraphQLString,\n  GraphQLID\n} from 'graphql';\n\nconst styleInputType = new GraphQLInputObjectType({\n  name: 'StyleInput',\n  fields: {\n    _id: {type: GraphQLID},\n    title: {type: GraphQLString},\n    type: {type: GraphQLString},\n    options: {type: GraphQLString},\n    displayOptions: {type: GraphQLString}\n  }\n});\n\nexport default styleInputType;\n"
  },
  {
    "path": "lib/server/graphql/types/style.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLID\n} from 'graphql';\n\nconst styleType = new GraphQLObjectType({\n  name: 'Style',\n  fields: {\n    _id: {type: new GraphQLNonNull(GraphQLID)},\n    type: {type: new GraphQLNonNull(GraphQLString)},\n    title: {type: GraphQLString},\n    options: {\n      type: GraphQLString,\n      resolve (style) {\n        return JSON.stringify(style.options);\n      }\n    },\n    displayOptions: {\n      type: GraphQLString,\n      resolve (style) {\n        return JSON.stringify(style.displayOptions);\n      }\n    }\n  }\n});\n\nexport default styleType;\n"
  },
  {
    "path": "lib/server/graphql/types/symbol-input.js",
    "content": "import {\n  GraphQLInputObjectType,\n  GraphQLString,\n  GraphQLID\n} from 'graphql';\n\nconst symbolInputType = new GraphQLInputObjectType({\n  name: 'SymbolInput',\n  fields: {\n    _id: {type: GraphQLID},\n    title: {type: GraphQLString},\n    data: {type: GraphQLString}\n  }\n});\n\nexport default symbolInputType;\n"
  },
  {
    "path": "lib/server/graphql/types/symbol.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLString,\n  GraphQLID\n} from 'graphql';\n\nconst symbolType = new GraphQLObjectType({\n  name: 'Symbol',\n  fields: {\n    _id: {type: new GraphQLNonNull(GraphQLID)},\n    title: {type: GraphQLString},\n    data: {\n      type: GraphQLString,\n      resolve (symbol) {\n        return JSON.stringify(symbol.data);\n      }\n    }\n  }\n});\n\nexport default symbolType;\n"
  },
  {
    "path": "lib/server/graphql/types/tab-item.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLString\n} from 'graphql';\n\nexport default new GraphQLObjectType({\n  name: 'TabItem',\n  fields: {\n    _id: {\n      type: new GraphQLNonNull(GraphQLString)\n    },\n    title: {\n      type: GraphQLString\n    }\n  }\n});\n"
  },
  {
    "path": "lib/server/graphql/types/tab.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLID,\n  GraphQLString\n} from 'graphql';\n\nimport tabItemType from './tab-item';\nimport PageModel from '../../models/page';\n\nexport default new GraphQLObjectType({\n  name: 'Tab',\n  fields: {\n    _id: {\n      type: new GraphQLNonNull(GraphQLID)\n    },\n    _userId: {\n      type: GraphQLID\n    },\n    type: {\n      type: new GraphQLNonNull(GraphQLString)\n    },\n    item: {\n      type: tabItemType,\n      async resolve ({type, item}) {\n        let result = null;\n\n        if (type === 'page') {\n          result = await PageModel.findById(item).exec();\n        }\n\n        return result;\n      }\n    }\n  }\n});\n"
  },
  {
    "path": "lib/server/graphql/types/uploaded-input.js",
    "content": "import {\n  GraphQLInputObjectType,\n  GraphQLString,\n  GraphQLInt\n} from 'graphql';\n\nconst uploadedInputType = new GraphQLInputObjectType({\n  name: 'UploadedFileInput',\n  fields: {\n    originalname: {type: GraphQLString},\n    mimetype: {type: GraphQLString},\n    destination: {type: GraphQLString},\n    filename: {type: GraphQLString},\n    path: {type: GraphQLString},\n    size: {type: GraphQLInt}\n  }\n});\n\nexport default uploadedInputType;\n"
  },
  {
    "path": "lib/server/graphql/types/uploaded.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLString,\n  GraphQLInt\n} from 'graphql';\n\nconst uploadedType = new GraphQLObjectType({\n  name: 'UploadedFile',\n  fields: {\n    originalname: {type: GraphQLString},\n    mimetype: {type: GraphQLString},\n    destination: {type: GraphQLString},\n    filename: {type: GraphQLString},\n    path: {type: GraphQLString},\n    size: {type: GraphQLInt}\n  }\n});\n\nexport default uploadedType;\n"
  },
  {
    "path": "lib/server/graphql/types/user-input.js",
    "content": "import {\n  GraphQLInputObjectType,\n  GraphQLString,\n  GraphQLNonNull\n} from 'graphql';\n\nconst userInputType = new GraphQLInputObjectType({\n  name: 'UserInput',\n  fields: {\n    _id: {type: GraphQLString},\n    username: {type: new GraphQLNonNull(GraphQLString)},\n    name: {type: GraphQLString},\n    password: {type: GraphQLString},\n    email: {type: GraphQLString},\n    date: {type: GraphQLString}\n  }\n});\n\nexport default userInputType;\n"
  },
  {
    "path": "lib/server/graphql/types/user.js",
    "content": "import {\n  GraphQLObjectType,\n  GraphQLNonNull,\n  GraphQLString\n} from 'graphql';\n\nconst userType = new GraphQLObjectType({\n  name: 'User',\n  fields: {\n    _id: {type: new GraphQLNonNull(GraphQLString)},\n    username: {type: new GraphQLNonNull(GraphQLString)},\n    name: {type: GraphQLString},\n    email: {type: GraphQLString},\n    date: {type: GraphQLString}\n  }\n});\n\nexport default userType;\n"
  },
  {
    "path": "lib/server/index.js",
    "content": "import bodyParser from 'body-parser';\nimport connectMongo from 'connect-mongo';\nimport express from 'express';\nimport graphqlHTTP from 'express-graphql';\nimport mongoose from 'mongoose';\nimport morgan from 'morgan';\nimport multer from 'multer';\nimport parseSettings from 'helpers/parse-settings';\nimport passport from 'passport';\nimport path from 'path';\nimport safeHtmlString from 'helpers/safe-html-string';\nimport session from 'express-session';\n\nimport config from '../../config';\nimport middleware from './middleware';\nimport routers from './routers';\nimport schema from './schema';\nimport SettingModel from './models/setting';\n\nconst app = express();\n\napp.use(morgan('short'));\napp.use(bodyParser.urlencoded({extended: false}));\napp.use(bodyParser.json({limit: 100000000}));\n\n// View engine\napp.set('views', path.join(__dirname, 'components'));\n\n// session\nconst MongoStore = connectMongo(session);\napp.use(session({\n  secret: 'Is very secret',\n  store: new MongoStore({mongooseConnection: mongoose.connection})\n}));\n\n// Passport\napp.use(passport.initialize());\napp.use(passport.session());\n\n// Static files\napp.use(express.static('./public'));\napp.use(['favicon.ico', '/images*', '/media*', '/css*', '/fonts*', '/js*'], (req, res) => {\n  res.status(404).end();\n});\n\n// Multer\napp.use('/graphql', multer({dest: './uploads/'}).single('file'));\n\n// GraphqQL server\napp.use('/graphql', graphqlHTTP(req => ({\n  schema: schema.getSchema(),\n  rootValue: {\n    isAuthenticated: req.isAuthenticated(),\n    user: req.user,\n    file: req.file\n  },\n  graphiql: true\n})));\n\napp.use(async (req, res, next) => {\n  const settingsArr = await SettingModel\n    .find({\n      _id: {$in: ['title', 'favicon']}\n    })\n    .exec();\n  const settings = parseSettings(settingsArr);\n\n  res.locals.header = [\n    {\n      tag: 'title',\n      content: settings.title && safeHtmlString(settings.title) || 'Relax CMS'\n    }\n  ];\n\n  if (process.env.NODE_ENV !== 'production') {\n    res.baseScriptsURL = `http://localhost:${config.devPort}`;\n    res.locals.header.push({\n      tag: 'script',\n      props: {\n        src: `${res.baseScriptsURL}/webpack-dev-server.js`\n      }\n    });\n  } else {\n    res.baseScriptsURL = '';\n  }\n\n  // footer\n  res.locals.footer = [{\n    tag: 'script',\n    props: {\n      src: `${res.baseScriptsURL}/js/common.js`\n    }\n  }];\n\n  next();\n});\n\napp.use(middleware.fonts);\napp.use(middleware.googleAnalytics);\n\napp.use(routers.authRouter);\napp.use(routers.adminRouter);\napp.use(routers.publicRouter);\n\napp.use((req, res) => {\n  res.status(404).end();\n});\n\napp.use((error, req, res) => {\n  const statusCode = error.statusCode || 500;\n  const err = {\n    error: statusCode,\n    message: error.message\n  };\n  if (!res.headersSent) {\n    res.status(statusCode).send(err);\n  }\n});\n\nexport default app;\n"
  },
  {
    "path": "lib/server/logger.js",
    "content": "import winston from 'winston';\n\nexport default new winston.Logger({\n  transports: [\n    new winston.transports.Console({\n      level: 'debug',\n      handleExceptions: true,\n      json: false,\n      colorize: true\n    })\n  ],\n  exitOnError: false\n});\n"
  },
  {
    "path": "lib/server/middleware/fonts.js",
    "content": "import forEach from 'lodash.foreach';\n\nimport SettingModel from '../models/setting';\n\nexport default async (req, res, next) => {\n  res.locals.header.push({\n    tag: 'script',\n    props: {\n      src: '//ajax.googleapis.com/ajax/libs/webfont/1.5.10/webfont.js'\n    }\n  });\n\n  try {\n    const fontsSetting = await SettingModel.findOne({_id: 'fonts'});\n\n    if (fontsSetting && fontsSetting.value) {\n      const fonts = JSON.parse(fontsSetting.value);\n\n      if (fonts.customFonts) {\n        let css = '';\n\n        forEach(fonts.customFonts, (customFont) => {\n          const family = customFont.family;\n          const map = customFont.files;\n          const location = `/fonts/${customFont.id}/`;\n\n          css += `@font-face {\n            font-family: \"${family}\";\n            src: url(\"${location}${map.eot}\");\n            src:\n          `;\n\n          if (map.woff2) {\n            css += `url(\"${location}${map.woff2}\"), `;\n          }\n\n          css += `\n            url(\"${location}${map.woff}\"),\n            url(\"${location}${map.ttf}\");\n          }\n          `;\n        });\n\n        if (css !== '') {\n          res.locals.header.push({\n            tag: 'style',\n            props: {\n              type: 'text/css'\n            },\n            content: css\n          });\n        }\n      }\n\n      if (fonts.webfontloader) {\n        res.locals.header.push({\n          tag: 'script',\n          content: `WebFont.load(${JSON.stringify(fonts.webfontloader)});`\n        });\n      }\n    }\n\n    next();\n  } catch (err) {\n    next();\n  }\n};\n"
  },
  {
    "path": "lib/server/middleware/google-analytics.js",
    "content": "import utils from 'helpers/utils';\n\nimport SettingModel from '../models/setting';\n\nexport default async (req, res, next) => {\n  res.locals.header.push({\n    tag: 'script',\n    props: {\n      src: '//ajax.googleapis.com/ajax/libs/webfont/1.5.10/webfont.js'\n    }\n  });\n\n  const googleAnalyticsSetting = await SettingModel\n    .findById('googleAnalytics')\n    .exec();\n\n  if (googleAnalyticsSetting &&\n      googleAnalyticsSetting.value &&\n      utils.validateGATrackingId(googleAnalyticsSetting.value)) {\n    res.locals.header.push({\n      tag: 'script',\n      content: `\n        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n        })(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\n        ga('create', '${googleAnalyticsSetting.value}', 'auto');\n      `\n    });\n    next();\n  } else {\n    next();\n  }\n};\n"
  },
  {
    "path": "lib/server/middleware/index.js",
    "content": "import fonts from './fonts';\nimport googleAnalytics from './google-analytics';\n\nexport default {\n  fonts,\n  googleAnalytics\n};\n"
  },
  {
    "path": "lib/server/migrate.js",
    "content": "import q from 'q';\nimport semver from 'semver';\nimport {readdirSync} from 'fs';\nimport {basename, extname, join} from 'path';\n\nimport logger from './logger';\nimport MigrationModel from './models/migration';\n\nconst migrationsPath = './migrations';\n\nfunction saveMigration (path) {\n  return new MigrationModel({_id: path}).save();\n}\n\nfunction runMigration (path) {\n  const migration = require(join(migrationsPath, path));\n  return migration()\n    .then(() => saveMigration(path))\n    .then(() => logger.info(`migration ${path} was applied`));\n}\n\nexport default function migrate () {\n  return q()\n    .then(() => {\n      let promise = q();\n\n      readdirSync(migrationsPath)\n        .map((path) => (extname(path) === '.js' ? basename(path) : false))\n        .filter((path) => path && semver.valid(path.split('-')[0]))\n        .sort((a, b) => semver.compare(a.split('-')[0], b.split('-')[0]))\n        .forEach((path) => {\n          promise = promise\n            .then(() => MigrationModel.findOne({_id: path}).exec())\n            .then((migration) => !migration && runMigration(path));\n        });\n\n      return promise;\n    });\n}\n"
  },
  {
    "path": "lib/server/models/color.js",
    "content": "import mongoose from 'mongoose';\n\nconst colorSchema = new mongoose.Schema({\n  label: {\n    type: String,\n    required: true\n  },\n  value: {\n    type: String,\n    required: true\n  }\n});\n\nexport default mongoose.model('Color', colorSchema);\n"
  },
  {
    "path": "lib/server/models/draft.js",
    "content": "import mongoose from 'mongoose';\n\nconst draftSchema = new mongoose.Schema({\n  _id: {\n    _id: {\n      type: mongoose.Schema.Types.ObjectId\n    },\n    _userId: {\n      type: mongoose.Schema.Types.ObjectId,\n      ref: 'User'\n    }\n  },\n  data: {\n    type: mongoose.Schema.Types.Mixed,\n    default: {}\n  },\n  actions: {\n    type: Array,\n    default: []\n  },\n  schemaLinks: {\n    type: mongoose.Schema.Types.Mixed,\n    default: {}\n  }\n});\n\nexport default mongoose.model('Draft', draftSchema);\n"
  },
  {
    "path": "lib/server/models/index.js",
    "content": "import color from './color';\nimport draft from './draft';\nimport media from './media';\nimport menu from './menu';\nimport page from './page';\nimport revision from './revision';\nimport schema from './schema';\nimport setting from './setting';\nimport style from './style';\nimport tab from './tab';\nimport user from './user';\n\nexport default [\n  color,\n  draft,\n  media,\n  menu,\n  page,\n  revision,\n  schema,\n  setting,\n  style,\n  tab,\n  user\n];\n"
  },
  {
    "path": "lib/server/models/media.js",
    "content": "import mongoose from 'mongoose';\n\nconst mediaSchema = new mongoose.Schema({\n  name: {\n    type: String,\n    required: true\n  },\n  fileName: {\n    type: String,\n    required: true\n  },\n  type: {\n    type: String,\n    required: true\n  },\n  size: {\n    type: String,\n    required: true\n  },\n  filesize: {\n    type: Number,\n    required: true\n  },\n  dimension: {\n    width: {\n      type: Number\n    },\n    height: {\n      type: Number\n    }\n  },\n  url: {\n    type: String,\n    required: true,\n    unique: true\n  },\n  absoluteUrl: {\n    type: String,\n    required: true,\n    unique: true\n  },\n  date: {\n    type: Date,\n    default: Date.now\n  },\n  thumbnail: {\n    type: String\n  },\n  variations: {\n    type: Array\n  }\n});\n\nexport default mongoose.model('Media', mediaSchema);\n"
  },
  {
    "path": "lib/server/models/menu.js",
    "content": "import mongoose from 'mongoose';\n\nconst menuSchema = new mongoose.Schema({\n  title: {\n    type: String,\n    required: true\n  },\n  date: {\n    type: Date,\n    default: Date.now\n  },\n  updatedDate: {\n    type: Date,\n    default: Date.now\n  },\n  createdBy: {\n    type: mongoose.Schema.Types.ObjectId,\n    ref: 'User'\n  },\n  updatedBy: {\n    type: mongoose.Schema.Types.ObjectId,\n    ref: 'User'\n  },\n  data: {}\n}, {minimize: false});\n\nexport default mongoose.model('Menu', menuSchema);\n"
  },
  {
    "path": "lib/server/models/migration.js",
    "content": "import mongoose from 'mongoose';\n\nconst migrationSchema = new mongoose.Schema({\n  _id: {\n    type: String\n  },\n  when: {\n    type: Date,\n    default: Date.now\n  }\n});\n\nexport default mongoose.model('Migration', migrationSchema);\n"
  },
  {
    "path": "lib/server/models/page.js",
    "content": "import mongoose from 'mongoose';\n\nconst pageSchema = new mongoose.Schema({\n  title: {\n    type: String,\n    required: true\n  },\n  slug: {\n    type: String,\n    required: true,\n    unique: true\n  },\n  state: {\n    type: String,\n    default: 'draft'\n  },\n  date: {\n    type: Date,\n    default: Date.now\n  },\n  updatedDate: {\n    type: Date,\n    default: Date.now\n  },\n  data: {\n    type: mongoose.Schema.Types.Mixed,\n    default: {}\n  },\n  createdBy: {\n    type: mongoose.Schema.Types.ObjectId,\n    ref: 'User'\n  },\n  updatedBy: {\n    type: mongoose.Schema.Types.ObjectId,\n    ref: 'User'\n  }\n});\n\nexport default mongoose.model('Page', pageSchema);\n"
  },
  {
    "path": "lib/server/models/revision.js",
    "content": "import mongoose from 'mongoose';\n\nconst schema = new mongoose.Schema({\n  _id: {\n    _id: {\n      type: mongoose.Schema.Types.ObjectId,\n      required: true\n    },\n    __v: {\n      type: Number,\n      required: true\n    }\n  },\n  date: {\n    type: Date,\n    default: Date.now\n  },\n  user: {\n    type: mongoose.Schema.Types.ObjectId,\n    ref: 'User'\n  },\n  doc: {\n    type: mongoose.Schema.Types.Mixed,\n    required: true\n  }\n});\n\nexport default mongoose.model('Revision', schema);\n"
  },
  {
    "path": "lib/server/models/schema-entry.js",
    "content": "import forEach from 'lodash.foreach';\nimport mongoose from 'mongoose';\nimport {TypesNative} from 'helpers/data-types/native';\n\nimport SchemaModel from './schema';\n\n// import tabsStore from '../stores/tabs';\n// import revisionsStore from '../stores/revisions';\n\nconst models = {};\nexport default async (schemaId) => {\n  if (models[schemaId]) {\n    return models[schemaId];\n  }\n\n  const schema = await SchemaModel.findById(schemaId).exec();\n\n  const properties = {};\n  forEach(schema.properties, (property) => {\n    if (TypesNative[property.type]) {\n      const native = TypesNative[property.type];\n      properties[property.id] = {\n        type: native,\n        required: property.required\n      };\n    }\n  });\n\n  const mongooseSchema = {\n    title: {\n      type: String,\n      required: true\n    },\n    slug: {\n      type: String,\n      required: true,\n      unique: true\n    },\n    state: {\n      type: String,\n      default: 'draft'\n    },\n    date: {\n      type: Date,\n      default: Date.now\n    },\n    publishedDate: {\n      type: Date,\n      default: Date.now\n    },\n    updatedDate: {\n      type: Date,\n      default: Date.now\n    },\n    data: {\n      type: Array\n    },\n    schemaLinks: {\n      type: mongoose.Schema.Types.Mixed\n    },\n    overlap: {\n      type: Boolean,\n      default: false\n    },\n    createdBy: {\n      type: mongoose.Schema.Types.ObjectId,\n      ref: 'User'\n    },\n    updatedBy: {\n      type: mongoose.Schema.Types.ObjectId,\n      ref: 'User'\n    },\n    properties\n  };\n\n  const entrySchema = new mongoose.Schema(mongooseSchema, {collection: schema.slug});\n\n  // entrySchema.post('remove', (schemaEntry) => {\n  //   tabsStore.removeMultiple({\n  //     '_id._id': schemaEntry._id\n  //   });\n  //   revisionsStore.removeMultiple({\n  //     '_id._id': schemaEntry._id\n  //   });\n  // });\n\n  const model = mongoose.model(schema.slug, entrySchema);\n  models[schemaId] = model;\n  return model;\n};\n"
  },
  {
    "path": "lib/server/models/schema.js",
    "content": "import mongoose from 'mongoose';\n// import tabsStore from '../stores/tabs';\n// import revisionsStore from '../stores/revisions';\n\nconst schemaSchema = new mongoose.Schema({\n  title: {\n    type: String,\n    required: true\n  },\n  slug: {\n    type: String,\n    required: true,\n    unique: true\n  },\n  type: {\n    type: String,\n    required: true\n  },\n  data: {\n    type: Array,\n    default: []\n  },\n  schemaLinks: {\n    type: mongoose.Schema.Types.Mixed,\n    default: {}\n  },\n  date: {\n    type: Date,\n    default: Date.now\n  },\n  updatedDate: {\n    type: Date,\n    default: Date.now\n  },\n  createdBy: {\n    type: mongoose.Schema.Types.ObjectId,\n    ref: 'User'\n  },\n  updatedBy: {\n    type: mongoose.Schema.Types.ObjectId,\n    ref: 'User'\n  },\n  properties: [\n    {\n      id: {\n        type: String,\n        required: true\n      },\n      title: {\n        type: String,\n        required: true\n      },\n      type: {\n        type: String,\n        required: true\n      },\n      props: {\n        type: mongoose.Schema.Types.Mixed,\n        required: false\n      },\n      default: {},\n      required: {\n        type: Boolean,\n        required: true,\n        default: false\n      },\n      dependencies: {\n        type: Array,\n        required: false\n      }\n    }\n  ]\n});\n\n// schemaSchema.post('remove', (schema) => {\n//   tabsStore.removeMultiple({\n//     '_id._id': schema._id\n//   });\n//\n//   revisionsStore.removeMultiple({\n//     '_id._id': schema._id\n//   });\n// });\n\nexport default mongoose.model('Schema', schemaSchema);\n"
  },
  {
    "path": "lib/server/models/setting.js",
    "content": "import mongoose from 'mongoose';\n\nconst settingSchema = new mongoose.Schema({\n  _id: {\n    type: String\n  },\n  value: {\n    type: mongoose.Schema.Types.Mixed,\n    required: true\n  }\n});\n\nexport default mongoose.model('Setting', settingSchema);\n"
  },
  {
    "path": "lib/server/models/style.js",
    "content": "import mongoose from 'mongoose';\n\nconst styleSchema = new mongoose.Schema({\n  type: {\n    type: String,\n    required: true\n  },\n  title: {\n    type: String,\n    required: true\n  },\n  options: {\n    type: mongoose.Schema.Types.Mixed,\n    required: true\n  },\n  displayOptions: {\n    type: mongoose.Schema.Types.Mixed\n  }\n});\n\nexport default mongoose.model('Style', styleSchema);\n"
  },
  {
    "path": "lib/server/models/symbol.js",
    "content": "import mongoose from 'mongoose';\n\nconst symbolSchema = new mongoose.Schema({\n  title: {\n    type: String,\n    required: true\n  },\n  data: {\n    type: mongoose.Schema.Types.Mixed,\n    required: true\n  }\n});\n\nexport default mongoose.model('Symbol', symbolSchema);\n"
  },
  {
    "path": "lib/server/models/tab.js",
    "content": "import mongoose from 'mongoose';\n\nconst tabSchema = new mongoose.Schema({\n  _userId: {\n    type: mongoose.Schema.Types.ObjectId\n  },\n  type: {\n    type: String\n  },\n  item: {\n    type: mongoose.Schema.Types.ObjectId\n  }\n});\n\nexport default mongoose.model('Tab', tabSchema);\n"
  },
  {
    "path": "lib/server/models/user.js",
    "content": "import mongoose from 'mongoose';\nimport passport from 'passport';\nimport passportLocalMongoose from 'passport-local-mongoose';\nimport {Strategy} from 'passport-local';\n\nconst userSchema = new mongoose.Schema({\n  username: {\n    type: String,\n    required: true,\n    unique: true\n  },\n  name: {\n    type: String,\n    required: true\n  },\n  password: {\n    type: String\n  },\n  email: {\n    type: String,\n    unique: true,\n    trim: true,\n    required: true\n  },\n  date: {\n    type: Date,\n    default: Date.now\n  }\n});\n\nuserSchema.plugin(passportLocalMongoose);\n\nconst UserModel = mongoose.model('User', userSchema);\n\npassport.use(new Strategy(UserModel.authenticate()));\npassport.serializeUser(UserModel.serializeUser());\npassport.deserializeUser(UserModel.deserializeUser());\n\nexport default UserModel;\n"
  },
  {
    "path": "lib/server/routers/admin.js",
    "content": "import getDefaultFavicon from 'helpers/default-favicon';\nimport getMarkup from 'helpers/get-markup';\nimport routeHandler from 'helpers/route-handler';\nimport routes from 'routers/admin';\nimport {Router} from 'express';\n\nconst adminRouter = new Router();\n\n// Restrict from here onwards\nadminRouter.get('/admin*', (req, res, next) => {\n  if (req.isAuthenticated()) {\n    res.locals.footer.push({\n      tag: 'link',\n      props: {\n        rel: 'stylesheet',\n        type: 'text/css',\n        href: 'https://fonts.googleapis.com/css?family=Open+Sans:400,600,700'\n      }\n    });\n    res.locals.header.push(getDefaultFavicon(res));\n\n    if (process.env.NODE_ENV === 'production') {\n      res.locals.header.push({\n        tag: 'link',\n        props: {\n          rel: 'stylesheet',\n          type: 'text/css',\n          href: '/css/admin.css'\n        }\n      });\n    }\n\n    res.locals.footer.push({\n      tag: 'script',\n      props: {\n        src: `${res.baseScriptsURL}/js/admin.js`\n      }\n    });\n    next();\n  } else {\n    res.redirect('/admin/login');\n  }\n});\n\nadminRouter.get('/admin*', (req, res, next) => {\n  if (req.isAuthenticated()) {\n    routeHandler(routes, req, res, next);\n  } else {\n    next();\n  }\n});\n\nadminRouter.get('/admin*', async (req, res, next) => {\n  if (req.isAuthenticated() && req.routerState) {\n    // const AdminContainer = req.routerState.components[0];\n    // const PanelContainer = req.routerState.components[1];\n    //\n    // const {panelSettings, defaultQuery} = PanelContainer;\n    // const queryVariables = Object.assign({}, defaultQuery, req.query);\n    //\n    // const paginateQuery = getQueryVariables(queryVariables);\n    //\n    // const {query, variables} = AdminContainer.getQueryAndVariables(\n    //   {\n    //     params: req.routerState.params,\n    //     queryVariables: {\n    //       ...paginateQuery\n    //     }\n    //   },\n    //   {\n    //     ...panelSettings\n    //   }\n    // );\n\n    // const username = req.session.passport.user;\n    // const user = await UserModel\n    //   .findOne({username})\n    //     .select({\n    //       _id: 1,\n    //       username: 1,\n    //       name: 1,\n    //       email: 1\n    //     })\n    //     .exec();\n\n    // const data = await graphql(\n    //   schema.getSchema(),\n    //   query,\n    //   {\n    //     isAuthenticated: true,\n    //     user\n    //   },\n    //   variables\n    // );\n\n    // await req.store.dispatch({\n    //   type: graphqlActionType,\n    //   ...data\n    // });\n\n    res.status(200).send(getMarkup(req.store, res));\n  } else {\n    next();\n  }\n});\n\nexport default adminRouter;\n"
  },
  {
    "path": "lib/server/routers/auth.js",
    "content": "import getDefaultFavicon from 'helpers/default-favicon';\nimport getMarkup from 'helpers/get-markup';\nimport passport from 'passport';\nimport routeHandler from 'helpers/route-handler';\nimport routes from 'routers/auth';\nimport {Router} from 'express';\n\nimport UserModel from '../models/user';\n\nconst authRouter = new Router();\n\nfunction injectScript (req, res, next) {\n  res.locals.header.push({\n    tag: 'link',\n    props: {\n      rel: 'stylesheet',\n      type: 'text/css',\n      href: 'https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700'\n    }\n  });\n  if (process.env.NODE_ENV === 'production') {\n    res.locals.header.push({\n      tag: 'link',\n      props: {\n        rel: 'stylesheet',\n        type: 'text/css',\n        href: '/css/auth.css'\n      }\n    });\n  }\n  res.locals.header.push(getDefaultFavicon(res));\n  res.locals.footer.push({\n    tag: 'script',\n    props: {\n      src: `${res.baseScriptsURL}/js/auth.js`\n    }\n  });\n  next();\n}\n\nauthRouter.get(/^\\/admin\\/(login|init)$/, (req, res, next) => {\n  if (req.isAuthenticated()) {\n    res.redirect('/admin');\n  } else {\n    routeHandler(routes, req, res, next);\n  }\n});\n\n// Logout\nauthRouter.get('/admin/logout', (req, res) => {\n  req.logout();\n  res.redirect('/admin/login');\n});\n\n// Register\nauthRouter.get('/admin/init', injectScript, async (req, res, next) => {\n  try {\n    const count = await UserModel.count().exec();\n    if (count === 0) {\n      res.status(200).send(getMarkup(req.store, res));\n    } else {\n      next();\n    }\n  } catch (error) {\n    next(error);\n  }\n});\n\n// Login\nauthRouter.get('/admin/login', injectScript, (req, res) => {\n  if (req.isAuthenticated()) {\n    res.redirect('/admin');\n  } else {\n    res.status(200).send(getMarkup(req.store, res));\n  }\n});\n\nauthRouter.post('/admin/login', (req, res, next) => {\n  passport.authenticate('local', (err, user) => {\n    if (err) {\n      res.status(500).send({\n        error: 500,\n        message: err.message\n      });\n    } else if (!user) {\n      res.status(403).send({\n        error: 403,\n        message: 'Invalid username and password combination'\n      });\n    } else {\n      req.logIn(user, (error) => {\n        if (error) {\n          res.status(500).send({\n            error: 500,\n            message: error.message\n          });\n        } else {\n          res.status(200).end();\n        }\n      });\n    }\n  })(req, res, next);\n});\n\nexport default authRouter;\n"
  },
  {
    "path": "lib/server/routers/index.js",
    "content": "import adminRouter from './admin';\nimport authRouter from './auth';\nimport publicRouter from './public';\n\nexport default {\n  adminRouter,\n  authRouter,\n  publicRouter\n};\n"
  },
  {
    "path": "lib/server/routers/public.js",
    "content": "import find from 'lodash.find';\nimport forEach from 'lodash.foreach';\nimport getDefaultFavicon from 'helpers/default-favicon';\nimport getMarkup from 'helpers/get-markup';\nimport nodemailer from 'nodemailer';\nimport parseSettings from 'helpers/parse-settings';\nimport path from 'path';\nimport resizeImage from 'helpers/resize-image';\nimport routeHandler from 'helpers/route-handler';\nimport routes from 'routers/public';\nimport {graphql as graphqlActionType} from 'actions';\nimport {Router} from 'express';\nimport {graphql} from 'graphql';\n\nimport schema from '../schema';\nimport MediaModel from '../models/media';\nimport SettingModel from '../models/setting';\n\nconst publicRouter = new Router();\n\npublicRouter.get('/api/media/resize/:mediaId/:width/:height', async (req, res, next) => {\n  try {\n    const {mediaId: id} = req.params;\n    let {width, height} = req.params;\n\n    width = parseInt(width, 10);\n    height = parseInt(height, 10);\n\n    const media = await MediaModel\n      .findById(id)\n      .select({\n        dimension: 1,\n        variations: 1,\n        fileName: 1,\n        absoluteUrl: 1\n      })\n      .exec();\n\n    if (!media) {\n      throw new Error('Media not found');\n    }\n\n    if (!media.dimension) {\n      throw new Error('Media file is not an image');\n    }\n\n    const relativePath = path.join('media', id);\n    const mediaPath = path.join('.', 'public', relativePath);\n    const originalRatio = media.dimension.width / media.dimension.height;\n\n    let resultWidth = Math.ceil(width / 100) * 100;\n    let resultHeight = resultWidth / originalRatio;\n\n    if (resultHeight < height) {\n      resultHeight = Math.ceil(height / 100) * 100;\n      resultWidth = resultHeight * originalRatio;\n    }\n\n    resultWidth = Math.round(resultWidth);\n    resultHeight = Math.round(resultHeight);\n\n    const filename = `${resultWidth}x${resultHeight}-${media.fileName}`;\n    const filePath = path.join(mediaPath, filename);\n\n    let variation;\n    // Check if variation already exists\n    forEach(media.variations, (_variation) => {\n      const {dimension: {width: _width, height: _height}} = _variation;\n      if (_width === resultWidth && _height === resultHeight) {\n        variation = _variation;\n        return false;\n      }\n    });\n\n    if (!variation) {\n      await resizeImage(media.absoluteUrl, filePath, {\n        width: resultWidth,\n        height: resultHeight,\n        quality: 100\n      });\n\n      variation = {\n        url: path.join(relativePath, filename),\n        absoluteUrl: path.join(mediaPath, filename),\n        dimension: {\n          width: resultWidth,\n          height: resultHeight\n        }\n      };\n\n      media.variations.push(variation);\n\n      await media.save();\n    }\n\n    res.sendFile(variation.absoluteUrl, {root: '.'});\n  } catch (error) {\n    next(error);\n  }\n});\n\npublicRouter.post('/send-email', async (req, res) => {\n  const settingsIds = [\n    'mailService',\n    'mailUser',\n    'mailPass',\n    'mailTo'\n  ];\n  const settingsArr = await SettingModel\n    .find({\n      _id: {\n        $in: settingsIds\n      }\n    })\n    .exec();\n\n  const settings = parseSettings(settingsArr);\n  const formData = req.body;\n\n  let allSetup = true;\n  forEach(settingsIds, (id) => {\n    if (!settings[id]) {\n      allSetup = false;\n      return false;\n    }\n  });\n\n  if (allSetup) {\n    const transporter = nodemailer.createTransport({\n      service: settings.mailService,\n      auth: {\n        user: settings.mailUser,\n        pass: settings.mailPass\n      }\n    });\n    const mailOptions = {\n      from: formData.from,\n      to: settings.mailTo,\n      subject: formData.subject,\n      html: formData.message\n    };\n\n    try {\n      await transporter.sendMail(mailOptions);\n      res.status(200).send();\n    } catch (err) {\n      res.status(500).send('Error sending email');\n    }\n  } else {\n    res.status(500).send('Admin: setup not concluded');\n  }\n});\n\npublicRouter.use('/', (req, res, next) => {\n  res.locals.footer.push({\n    tag: 'script',\n    props: {\n      src: `${res.baseScriptsURL}/js/public.js`\n    }\n  });\n  res.locals.header.push({\n    tag: 'link',\n    props: {\n      rel: 'stylesheet',\n      type: 'text/css',\n      href: '/css/public.css'\n    }\n  });\n  routeHandler(routes, req, res, next);\n});\npublicRouter.use('/', async (req, res, next) => {\n  if (req.routerState) {\n    const settingsArr = await SettingModel\n      .find({\n        _id: {$in: ['favicon', 'webclip']}\n      })\n      .exec();\n    const settings = parseSettings(settingsArr);\n\n    let iconLink = getDefaultFavicon(res);\n    if (settings.favicon) {\n      const favicon = await MediaModel\n        .findById(settings.favicon)\n        .select('type url')\n        .exec();\n\n      if (favicon) {\n        iconLink = {\n          tag: 'link',\n          props: {\n            rel: 'icon',\n            type: favicon.type,\n            href: `${res.baseScriptsURL}/${favicon.url}`\n          }\n        };\n      }\n    }\n    res.locals.header.push(iconLink);\n\n    if (settings.webclip) {\n      const webclip = await MediaModel\n        .findById(settings.webclip)\n        .select('url')\n        .exec();\n\n      if (webclip) {\n        res.locals.header.push({\n          tag: 'link',\n          props: {\n            rel: 'apple-touch-icon',\n            href: `${res.baseScriptsURL}/${webclip.url}`\n          }\n        });\n      }\n    }\n\n    const PageContainer = req.routerState.components[0];\n\n    const {query, variables} = PageContainer.getQueryAndVariables(\n      {\n        params: req.routerState.params\n      }\n    );\n\n    const data = await graphql(\n      schema.getSchema(),\n      query,\n      {\n        isAuthenticated: false,\n        user: null\n      },\n      variables\n    );\n\n    if (data && data.data && data.data.page && data.data.page.title) {\n      const titleTag = find(res.locals.header, 'tag', 'title');\n      titleTag.content += ` - ${data.data.page.title}`;\n    }\n\n    await req.store.dispatch({\n      type: graphqlActionType,\n      ...data\n    });\n\n    res.status(200).send(getMarkup(req.store, res));\n  } else {\n    next();\n  }\n});\n\nexport default publicRouter;\n"
  },
  {
    "path": "lib/server/schema.js",
    "content": "import clone from 'lodash.clone';\nimport forEach from 'lodash.foreach';\nimport {\n  GraphQLObjectType,\n  GraphQLSchema\n} from 'graphql';\n\nimport mutations from './graphql/mutations';\nimport queries from './graphql/queries';\nimport SchemaModel from './models/schema';\n\n// import schemaEntryInputType from './graphql/types/generators/schema-entry-input';\n// import schemaEntryType from './graphql/types/generators/schema-entry';\n// import schemaListCountQuery from './graphql/queries/generators/schema-list-count';\n// import schemaListQuery from './graphql/queries/generators/schema-list';\n\nclass SchemaManager {\n  constructor () {\n    this.init();\n  }\n\n  async init () {\n    this.queryFields = clone(queries);\n    this.mutationFields = clone(mutations);\n\n    const schemas = await SchemaModel.find().exec();\n    forEach(schemas, (schema) => {\n      this.processSchema(schema);\n    });\n\n    this.createRoot();\n  }\n\n  processSchema (/* schema */) {\n    // const type = schemaEntryType(schema);\n    // const inputType = schemaEntryInputType(schema);\n    //\n    // const schemaQueries = {\n    //   ['rlx_' + schema.slug]: schemaListQuery(type, schema),\n    //   ['rlx_' + schema.slug + '_count']: schemaListCountQuery(type, schema)\n    // };\n    //\n    // // TODO create mutations\n    //\n    // Object.assign(this.queryFields, schemaQueries);\n  }\n\n  createRoot () {\n    this.rootQuery = new GraphQLObjectType({\n      name: 'Query',\n      fields: () => (this.queryFields)\n    });\n    this.rootMutation = new GraphQLObjectType({\n      name: 'Mutation',\n      fields: () => (this.mutationFields)\n    });\n  }\n\n  getSchema () {\n    const schema = {\n      query: this.rootQuery\n    };\n\n    if (Object.keys(this.mutationFields).length) {\n      schema.mutation = this.rootMutation;\n    }\n\n    return new GraphQLSchema(schema);\n  }\n}\n\nexport default new SchemaManager();\n"
  },
  {
    "path": "lib/server/shared/components/html.jsx",
    "content": "import React, {PropTypes} from 'react';\n\nexport default class Html extends React.Component {\n  static propTypes = {\n    locals: PropTypes.object,\n    props: PropTypes.any,\n    body: PropTypes.any\n  };\n\n  render () {\n    return (\n      <html>\n        <head>\n          {this.renderHeader()}\n          <meta name='viewport' content='width=device-width, initial-scale=1.0' />\n        </head>\n        <body>\n          <div id='view' dangerouslySetInnerHTML={{__html: this.props.body}} />\n          <script dangerouslySetInnerHTML={{__html: `window.__initialState = ${this.props.props};`}} />\n          {this.renderFooter()}\n        </body>\n      </html>\n    );\n  }\n\n  renderHeader () {\n    if (this.props.locals && this.props.locals.header) {\n      return this.props.locals.header.map(this.renderTag, this);\n    }\n  }\n\n  renderFooter () {\n    if (this.props.locals && this.props.locals.footer) {\n      return this.props.locals.footer.map(this.renderTag, this);\n    }\n  }\n\n  renderTag (tag) {\n    const tagProps = Object.assign({}, tag.props || {});\n    if (tag.content) {\n      tagProps.dangerouslySetInnerHTML = {__html: tag.content};\n    }\n    return (\n      <tag.tag {...tagProps} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/server/shared/helpers/create-image-thumbnail.js",
    "content": "import path from 'path';\nimport sharp from 'sharp';\nimport {fcall, ninvoke} from 'q';\n\nconst defaultOptions = {\n  width: 100,\n  height: 100,\n  quality: 100\n};\n\nexport default async function createImageThumbnail (imagePath, destPath, options = defaultOptions) {\n  const {quality, width, height} = options;\n\n  const image = await fcall(sharp, imagePath);\n  const metadata = await ninvoke(image, 'metadata');\n  const thumbnailPath = `thumbnail.${metadata.format}`;\n\n  await image\n    .quality(quality)\n    .resize(width, height)\n    .toFile(path.join(destPath, thumbnailPath));\n\n  return {\n    thumbnailPath,\n    metadata\n  };\n}\n"
  },
  {
    "path": "lib/server/shared/helpers/default-favicon.js",
    "content": "export default function getDefaultIcon (res) {\n  return {\n    tag: 'link',\n    props: {\n      rel: 'shortcut icon',\n      type: 'image/vnd.microsoft.icon',\n      href: `${res.baseScriptsURL}/images/admin/favicon.ico`\n    }\n  };\n}\n"
  },
  {
    "path": "lib/server/shared/helpers/file-mimetype.js",
    "content": "export default function fileMimetype (file) {\n  const fileData = file.file;\n  return fileData.substring(fileData.indexOf(':') + 1, fileData.indexOf(';'));\n}\n"
  },
  {
    "path": "lib/server/shared/helpers/get-markup.js",
    "content": "import serialize from 'serialize-javascript';\nimport Html from 'components/html';\nimport React from 'react';\nimport {renderToString} from 'react-dom/server';\nimport {Provider} from 'react-redux';\nimport {ReduxRouter} from 'redux-router';\n\nexport default function getMarkup (store, res) {\n  const state = store.getState();\n  const initialState = serialize(state);\n\n  const markup = renderToString(\n    <Provider store={store}>\n      <ReduxRouter />\n    </Provider>\n  );\n\n  const htmlMarkup = renderToString(\n    <Html\n      body={markup}\n      props={initialState}\n      locals={res.locals}\n    />\n  );\n\n  return htmlMarkup;\n}\n"
  },
  {
    "path": "lib/server/shared/helpers/get-projection.js",
    "content": "export default function getProjection (fieldASTs) {\n  return fieldASTs.selectionSet.selections.reduce((projections, selection) => {\n    projections[selection.name.value] = 1;\n    return projections;\n  }, {});\n}\n"
  },
  {
    "path": "lib/server/shared/helpers/get-unique-slug.js",
    "content": "import slugify from 'slug';\n\nasync function check (Model, slug) {\n  const exists = await Model.count({slug});\n  return {\n    exists,\n    slug\n  };\n}\n\nexport default async (Model, str) => {\n  const generatedSlug = slugify(str).toLowerCase();\n  let result = await check(Model, generatedSlug);\n\n  if (result.exists) {\n    let counter = 1;\n    do {\n      result = await check(Model, `${generatedSlug}-${counter}`);\n      counter++;\n    } while (result.exists);\n  }\n\n  return result.slug;\n};\n"
  },
  {
    "path": "lib/server/shared/helpers/resize-image.js",
    "content": "import sharp from 'sharp';\nimport {fcall} from 'q';\n\nconst defaultOptions = {\n  width: 100,\n  height: 100,\n  quality: 100\n};\n\nexport default async function resizeImage (imagePath, destPath, options = defaultOptions) {\n  const {quality, width, height} = options;\n\n  const image = await fcall(sharp, imagePath);\n  image.quality(quality).resize(width, height);\n\n  await image.toFile(destPath);\n}\n"
  },
  {
    "path": "lib/server/shared/helpers/route-handler.js",
    "content": "import configureStore from 'helpers/configure-store';\nimport {createMemoryHistory} from 'history';\nimport {match, reduxReactRouter} from 'redux-router/server';\n\nexport default function routeHandler (routes, req, res, next) {\n  const store = configureStore(reduxReactRouter({\n    createHistory: createMemoryHistory,\n    routes\n  }));\n  const url = req.originalUrl;\n\n  store.dispatch(match(url, async (error, redirectLocation, routerState) => {\n    if (error) {\n      next(error);\n    } else if (redirectLocation) {\n      res.redirect(302, redirectLocation.pathname + redirectLocation.search);\n    } else if (routerState) {\n      req.routerState = routerState;\n      req.store = store;\n      next();\n    } else {\n      res.status(404).send('Not found');\n    }\n  }));\n}\n"
  },
  {
    "path": "lib/server/shared/helpers/safe-html-string.js",
    "content": "export default function safeHtmlString (str) {\n  return str.replace(/<\\/?[^>]+(>|$)/g, '');\n}\n"
  },
  {
    "path": "lib/server/shared/helpers/write-file.js",
    "content": "import fs from 'fs';\nimport mkdirp from 'mkdirp';\nimport path from 'path';\nimport {nfcall} from 'q';\n\nexport default async function writeFile (file, _destPath) {\n  let fileData = file.file;\n  fileData = fileData.substring(fileData.indexOf(',') + 1);\n\n  const destPath = path.join(_destPath, file.filename);\n\n  try {\n    await nfcall(mkdirp, _destPath);\n    await nfcall(fs.writeFile, destPath, fileData, 'base64');\n  } catch (ex) {\n    throw ex;\n  }\n\n  return {\n    filename: file.filename,\n    size: fileData.length,\n    destPath\n  };\n}\n"
  },
  {
    "path": "lib/shared/actions/admin-menu.js",
    "content": "import actionTypes from 'actions';\n\nexport function openAdminMenu () {\n  return {\n    type: actionTypes.openAdminMenu\n  };\n}\n\nexport function closeAdminMenu () {\n  return {\n    type: actionTypes.closeAdminMenu\n  };\n}\n"
  },
  {
    "path": "lib/shared/actions/colors.js",
    "content": "import {mutation} from 'relate-js';\n\nexport function updateColor (data) {\n  return mutation({\n    fragments: {\n      updateColor: {\n        _id: 1,\n        label: 1,\n        value: 1\n      }\n    },\n    variables: {\n      updateColor: {\n        data: {\n          value: data,\n          type: 'ColorInput!'\n        }\n      }\n    }\n  });\n}\n\nexport function addColor (data) {\n  return mutation({\n    fragments: {\n      addColor: {\n        _id: 1,\n        label: 1,\n        value: 1\n      }\n    },\n    variables: {\n      addColor: {\n        data: {\n          value: data,\n          type: 'ColorInput!'\n        }\n      }\n    }\n  });\n}\n\nexport function duplicateColor (id) {\n  return mutation({\n    fragments: {\n      duplicateColor: {\n        _id: 1,\n        label: 1,\n        value: 1\n      }\n    },\n    variables: {\n      duplicateColor: {\n        id: {\n          value: id,\n          type: 'ID!'\n        }\n      }\n    }\n  });\n}\n\nexport function removeColor (id) {\n  return mutation({\n    fragments: {\n      removeColor: {\n        _id: 1\n      }\n    },\n    variables: {\n      removeColor: {\n        id: {\n          value: id,\n          type: 'ID!'\n        }\n      }\n    },\n    type: 'REMOVE'\n  });\n}\n"
  },
  {
    "path": "lib/shared/actions/display.js",
    "content": "import actionTypes from 'actions';\n\nexport function changeDisplay (value) {\n  return {\n    type: actionTypes.changeDisplay,\n    value\n  };\n}\n"
  },
  {
    "path": "lib/shared/actions/dnd.js",
    "content": "import actionTypes from 'actions';\n\nexport function startDragging (draggingData, dragInfo) {\n  return {\n    type: actionTypes.startDragging,\n    draggingData,\n    dragInfo\n  };\n}\n\nexport function onDroppable (dropInfo) {\n  return {\n    type: actionTypes.onDroppable,\n    dropInfo\n  };\n}\n\nexport function outDroppable (id) {\n  return {\n    type: actionTypes.outDroppable,\n    id\n  };\n}\n\nexport function stopDragging () {\n  return {\n    type: actionTypes.stopDragging\n  };\n}\n"
  },
  {
    "path": "lib/shared/actions/draft.js",
    "content": "import actionTypes from 'actions';\nimport request from 'helpers/request';\nimport {mutation} from 'relate-js';\nimport {fragmentToQL} from 'relax-fragments';\n\nexport function saveDraft () {\n  return (dispatch, getState) => {\n    const pageBuilder = getState().pageBuilder;\n    const draftInput = Object.assign({}, {\n      data: JSON.stringify(pageBuilder.data),\n      actions: JSON.stringify(pageBuilder.actions)\n    });\n\n    return mutation({\n      fragments: {\n        updateDraft: {\n          _id: {\n            _id: 1,\n            _userId: 1\n          }\n        }\n      },\n      variables: {\n        updateDraft: {\n          id: {\n            type: 'ID!',\n            value: getState().router.params.id\n          },\n          data: {\n            type: 'DraftInput!',\n            value: draftInput\n          }\n        }\n      }\n    })(dispatch, getState);\n  };\n}\n\nexport function dropDraft (fragments, id) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.dropDraft,\n      query: `\n        mutation dropDraft ($id: String!) {\n          dropDraft (id: $id) {\n            ${fragmentToQL(fragments.draft)}\n          }\n        }\n      `,\n      variables: {\n        id\n      }\n    })\n  );\n}\n"
  },
  {
    "path": "lib/shared/actions/elements.js",
    "content": "import actionTypes from 'actions';\nimport request from 'helpers/request';\n\nexport function getElementData (elementId, {query, variables}) {\n  return (dispatch) => request({\n    dispatch,\n    type: actionTypes.getElementData,\n    query,\n    variables,\n    params: {\n      elementId\n    }\n  });\n}\n"
  },
  {
    "path": "lib/shared/actions/fonts.js",
    "content": "import actionTypes from 'actions';\nimport loadFontsAsync from 'helpers/load-fonts';\nimport request from 'helpers/request';\n\nexport function changeFontsPreviewText (value) {\n  return {\n    type: actionTypes.changeFontsPreviewText,\n    value\n  };\n}\n\nexport function changeFontsPreviewLayout (value) {\n  return {\n    type: actionTypes.changeFontsPreviewLayout,\n    value\n  };\n}\n\nexport function changeFontInput (tab, value) {\n  return {\n    type: actionTypes.changeFontInput,\n    tab,\n    value\n  };\n}\n\nexport function loadFonts () {\n  return (dispatch, getState) => (\n    loadFontsAsync({\n      dispatch,\n      webfontloader: getState().fonts.data.webfontloader,\n      type: actionTypes.loadFonts\n    })\n  );\n}\n\nexport function saveFonts () {\n  return (dispatch, getState) => (\n    request({\n      dispatch,\n      type: actionTypes.saveFonts,\n      query: `\n        mutation saveSettings ($data: [SettingInput]!) {\n          saveSettings (data: $data) {\n            _id,\n            value\n          }\n        }\n      `,\n      variables: {\n        data: [{\n          _id: 'fonts',\n          value: JSON.stringify(getState().fonts.data)\n        }]\n      }\n    })\n  );\n}\n\nexport function changeFontInputAndUpdate (tab, value) {\n  return {\n    types: [\n      'UPDATE_FONTS_START',\n      'UPDATE_FONTS_SUCCESS',\n      'UPDATE_FONTS_ERROR'\n    ],\n    payload: [changeFontInput.bind(null, tab, value), loadFonts, saveFonts],\n    sequence: true\n  };\n}\n\nfunction _includeCustomFont () {\n  return (dispatch, getState) => {\n    const newCustom = getState().fonts.newCustom;\n    if (newCustom) {\n      const id = newCustom.id;\n      const map = newCustom.files;\n\n      let css = `\n      @font-face {\n        font-family: \"${newCustom.family}\";\n        src: url('/fonts/${id}/${map.eot}');\n        src:\n      `;\n\n      if (map.woff2) {\n        css += `url('/fonts/${id}/${map.woff2}'), `;\n      }\n\n      css += `\n        url('/fonts/${id}/${map.woff}'),\n        url('/fonts/${id}/${map.ttf}');\n      }\n      `;\n\n      const styleTag = document.createElement('style');\n      styleTag.type = 'text/css';\n      document.getElementsByTagName('head')[0].appendChild(styleTag);\n\n      if (styleTag.styleSheet) {\n        styleTag.styleSheet.cssText = css;\n      } else {\n        styleTag.appendChild(document.createTextNode(css));\n      }\n    }\n    dispatch({\n      type: actionTypes.customFontIncluded\n    });\n  };\n}\n\nfunction _submitCustomFont (name, files, types) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.submitCustomFont,\n      query: `\n        mutation submitCustomFont ($name: String!, $files: [UploadedFileInput]!, $types: [String]!) {\n          submitCustomFont (name: $name, files: $files, types: $types) {\n            family,\n            id,\n            files {\n              eot,\n              woff2,\n              woff,\n              ttf\n            }\n          }\n        }\n      `,\n      variables: {\n        name,\n        files,\n        types\n      }\n    })\n  );\n}\n\nexport function submitCustomFont (name, files, types) {\n  return {\n    types: [\n      'SUBMIT_CUSTOM_FONT_START',\n      'SUBMIT_CUSTOM_FONT_SUCCESS',\n      'SUBMIT_CUSTOM_FONT_ERROR'\n    ],\n    payload: [_submitCustomFont.bind(null, name, files, types), _includeCustomFont, loadFonts, saveFonts],\n    sequence: true\n  };\n}\n\nexport function _removeCustomFont (id) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.removeCustomFont,\n      query: `\n        mutation removeCustomFont ($id: String!) {\n          removeCustomFont (id: $id) {\n            id\n          }\n        }\n      `,\n      variables: {\n        id\n      }\n    })\n  );\n}\n\nexport function removeCustomFont (id) {\n  return {\n    types: [\n      'REMOVE_CUSTOM_FONT_START',\n      'REMOVE_CUSTOM_FONT_SUCCESS',\n      'REMOVE_CUSTOM_FONT_ERROR'\n    ],\n    payload: [_removeCustomFont.bind(null, id), loadFonts, saveFonts],\n    sequence: true\n  };\n}\n"
  },
  {
    "path": "lib/shared/actions/graphql.js",
    "content": "import actionTypes from 'actions';\nimport request from 'helpers/request';\n\nexport function graphql ({query, variables}, connectors) {\n  return (dispatch) => request({\n    dispatch,\n    type: actionTypes.graphql,\n    query,\n    variables,\n    params: {\n      connectors\n    }\n  });\n}\n\nexport function removeConnector (id) {\n  return {\n    type: actionTypes.removeConnector,\n    id\n  };\n}\n"
  },
  {
    "path": "lib/shared/actions/index.js",
    "content": "export default {\n  // Session\n  authenticate: 'AUTHENTICATE',\n  // Admin menu\n  openAdminMenu: 'OPEN_ADMIN_MENU',\n  closeAdminMenu: 'CLOSE_ADMIN_MENU',\n  // Colors\n  updateColor: 'UPDATE_COLOR',\n  addColor: 'ADD_COLOR',\n  removeColor: 'REMOVE_COLOR',\n  // Display\n  changeDisplay: 'CHANGE_DISPLAY',\n  // Fonts\n  changeFontsPreviewText: 'CHANGE_FONTS_PREVIEW_TEXT',\n  changeFontsPreviewLayout: 'CHANGE_FONTS_PREVIEW_LAYOUT',\n  changeFontInput: 'CHANGE_FONT_INPUT',\n  loadFonts: 'LOAD_FONTS',\n  saveFonts: 'SAVE_FONTS',\n  submitCustomFont: 'SUBMIT_CUSTOM_FONT',\n  removeCustomFont: 'REMOVE_CUSTOM_FONT',\n  customFontIncluded: 'CUSTOM_FONT_INCLUDED',\n  // Media\n  changeMediaDisplay: 'CHANGE_MEDIA_DISPLAY',\n  addFilesToUpload: 'ADD_MEDIA_FILES_TO_UPLOAD',\n  uploadingMedia: 'UPLOADING_MEDIA',\n  mediaUploadSuccess: 'UPLOAD_MEDIA_SUCCESS',\n  mediaUploadError: 'UPLOAD_MEDIA_ERROR',\n  addMedia: 'ADD_MEDIA',\n  removeMedia: 'REMOVE_MEDIA',\n  removeMediaItem: 'REMOVE_MEDIA_ITEM',\n  // Menu\n  addMenu: 'ADD_MENU',\n  addMenuItem: 'ADD_MENU_ITEM',\n  moveMenuItem: 'MOVE_MENU_ITEM',\n  removeMenu: 'REMOVE_MENU',\n  // Page\n  getPage: 'GET_PAGE',\n  updatePage: 'UPDATE_PAGE',\n  addPage: 'ADD_PAGE',\n  changePageFields: 'CHANGE_FIELDS',\n  changePageToDefault: 'CHANGE_TO_DEFAULT',\n  validatePageSlug: 'VALIDATE_PAGE_SLUG',\n  restorePage: 'RESTORE_PAGE',\n  savePageFromDraft: 'SAVE_PAGE_FROM_DRAFT',\n  // Pages\n  removePage: 'REMOVE_PAGE',\n  duplicatePage: 'DUPLICATE_PAGE',\n  // Schema\n  changeSchemaType: 'CHANGE_SCHEMA_TYPE',\n  changeSchemaTitle: 'CHANGE_SCHEMA_TITLE',\n  schemaStepBack: 'SCHEMA_STEP_BACK',\n  schemaStepForward: 'SCHEMA_STEP_FORWARD',\n  schemaAddProperty: 'SCHEMA_ADD_PROPERTY',\n  schemaToggleProperty: 'SCHEMA_TOGGLE_PROPERTY',\n  schemaChangePropertySetting: 'SCHEMA_CHANGE_PROPERTY_SETTING',\n  changeSchemaToDefault: 'CHANGE_SCHEMA_TO_DEFAULT',\n  updateSchema: 'UPDATE_SCHEMA',\n  addSchema: 'ADD_SCHEMA',\n  restoreSchema: 'RESTORE_SCHEMA',\n  validateSchemaSlug: 'VALIDATE_SCHEMA_SLUG',\n  // Schemas\n  removeSchema: 'REMOVE_SCHEMA',\n  // Schema List\n  removeSchemaEntry: 'REMOVE_SCHEMA_ENTRY',\n  // Schema entry\n  addSchemaEntry: 'ADD_SCHEMA_ENTRY',\n  updateSchemaEntry: 'UPDATE_SCHEMA_ENTRY',\n  restoreSchemaEntry: 'RESTORE_SCHEMA_ENTRY',\n  validateSchemaEntrySlug: 'VALIDATE_SCHEMA_ENTRY_SLUG',\n  changeSchemaEntryFields: 'CHANGE_SCHEMA_ENTRY_FIELDS',\n  changeSchemaEntryProperty: 'CHANGE_SCHEMA_ENTRY_PROPERTY',\n  changeSchemaEntryToDefault: 'CHANGE_SCHEMA_ENTRY_TO_DEFAULT',\n  // Settings\n  changeSettingValue: 'CHANGE_SETTING_VALUE',\n  saveSettings: 'SAVE_SETTINGS',\n  // Users\n  removeUser: 'REMOVE_USER',\n  addUser: 'ADD_USER',\n  // DND\n  startDragging: 'START_DRAGGING',\n  onDroppable: 'ON_DROPPABLE',\n  outDroppable: 'OUT_DROPPABLE',\n  stopDragging: 'STOP_DRAGGING',\n  // Page builder\n  pbToggleEditing: 'PB_TOGGLE_EDITING',\n  pbSetMenuOpened: 'PB_SET_MENU_OPENED',\n  pbSetMenuSide: 'PB_SET_MENU_SIDE',\n  pbSetMenuTab: 'PB_SET_MENU_TAB',\n  pbOpenElementsMenu: 'PB_OPEN_ELEMENTS_MENU',\n  pbCloseElementsMenu: 'PB_CLOSE_ELEMENTS_MENU',\n  pbToggleExpandElement: 'PB_TOGGLE_EXPAND_ELEMENT',\n  pbExpandAll: 'PB_EXPAND_ALL',\n  pbCollapseAll: 'PB_COLLAPSE_ALL',\n  pbToggleCategory: 'PB_TOGGLE_CATEGORY',\n  pbOverElement: 'PB_OVER_ELEMENT',\n  pbOutElement: 'PB_OUT_ELEMENT',\n  pbSelectElement: 'PB_SELECT_ELEMENT',\n  pbDoAction: 'PB_DO_ACTION',\n  pbUndoAction: 'PB_UNDO_ACTION',\n  pbRedoAction: 'PB_REDO_ACTION',\n  pbLinkDataMode: 'PB_LINK_DATA_MODE',\n  pbCloseLinkDataMode: 'PB_CLOSE_LINK_DATA_MODE',\n  pbLinkFormDataMode: 'PB_LINK_FORM_DATA_MODE',\n  pbCloseLinkFormDataMode: 'PB_CLOSE_LINK_FORM_DATA_MODE',\n  // Symbols\n  makeElementSymbol: 'MAKE_ELEMENT_SYMBOL',\n  getSymbol: 'GET_SYMBOL',\n  // Elements\n  getElementData: 'GET_ELEMENT_DATA',\n  // Revisions\n  getRevisions: 'GET_REVISIONS',\n  // Draft\n  saveDraft: 'SAVE_DRAFT',\n  dropDraft: 'DROP_DRAFT',\n  // Tabs\n  removeTab: 'REMOVE_TAB',\n  // styles\n  saveStyle: 'SAVE_STYLE',\n  updateStyle: 'UPDATE_STYLE',\n  changeStyleProp: 'CHANGE_STYLE_PROP',\n  removeStyle: 'REMOVE_STYLE'\n};\n"
  },
  {
    "path": "lib/shared/actions/media.js",
    "content": "import actionTypes from 'actions';\nimport request from 'helpers/request';\nimport {mutation} from 'relate-js';\nimport {fragmentToQL} from 'relax-fragments';\n\nexport function changeMediaDisplay (display) {\n  return {\n    type: actionTypes.changeMediaDisplay,\n    display\n  };\n}\n\nexport function getMediaItem (fragments, id) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.getMediaItem,\n      query: `\n        query mediaItem ($id: ID!) {\n          mediaItem (id: $id) {\n            ${fragmentToQL(fragments.media)}\n          }\n        }\n      `,\n      variables: {\n        id\n      }\n    })\n  );\n}\n\nexport function uploadMedia (fragments, file) {\n  const data = {\n    file\n  };\n\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.addMedia,\n      query: `\n        mutation addMedia ($data: MediaInput!) {\n          addMedia (data: $data) {\n            ${fragmentToQL(fragments.media)}\n          }\n        }\n      `,\n      files: [file],\n      variables: {\n        data\n      }\n    })\n  );\n}\n\nexport function addingMedia (fileInfo) {\n  return {\n    type: actionTypes.addingMedia,\n    fileInfo\n  };\n}\n\nexport function addMedia (fragments, file, fileInfo) {\n  return {\n    types: [\n      'ADD_MEDIA_START',\n      'ADD_MEDIA_SUCCESS',\n      'ADD_MEDIA_ERROR'\n    ],\n    payload: [addingMedia.bind(null, fileInfo), uploadMedia.bind(null, fragments, file)],\n    sequence: true\n  };\n}\n\nconst uploadsAtTime = 3;\nlet uploadsID = 0;\nlet uploadingNumber = 0;\nlet uploadQueue = [];\n\n// Check if there are files to upload and initiates if there is\nfunction checkUploadQueue (dispatch, getState) {\n  if (uploadQueue.length) {\n    let numberToUpload = Math.min(uploadsAtTime - uploadingNumber, uploadQueue.length);\n    uploadingNumber += numberToUpload;\n\n    for (numberToUpload; numberToUpload > 0; numberToUpload--) {\n      const file = uploadQueue.shift();\n      const reader = new FileReader();\n      reader.onload = (event) => {\n        dispatch({\n          type: actionTypes.uploadingMedia,\n          fileId: file.id\n        });\n        mutation({\n          fragments: {\n            addMedia: {\n              _id: 1,\n              name: 1,\n              fileName: 1,\n              type: 1,\n              size: 1,\n              filesize: 1,\n              dimension: {\n                width: 1,\n                height: 1\n              },\n              url: 1,\n              absoluteUrl: 1,\n              date: 1,\n              thumbnail: 1,\n              variations: 1\n            }\n          },\n          variables: {\n            addMedia: {\n              data: {\n                value: {\n                  file: {\n                    file: event.target.result,\n                    filename: file.name\n                  }\n                },\n                type: 'MediaInput!'\n              }\n            }\n          }\n        }, (result) => {\n          if (result.addMedia) {\n            dispatch({\n              type: actionTypes.mediaUploadSuccess,\n              fileId: file.id\n            });\n          } else {\n            dispatch({\n              type: actionTypes.mediaUploadError,\n              fileId: file.id\n            });\n          }\n        })(dispatch, getState)\n        .catch(() => {\n          dispatch({\n            type: actionTypes.mediaUploadError,\n            fileId: file.id\n          });\n        })\n        .fin(() => {\n          uploadingNumber--;\n          checkUploadQueue(dispatch, getState);\n        });\n      };\n      reader.readAsDataURL(file);\n    }\n  }\n}\n\nexport function uploadMediaFiles (files) {\n  uploadQueue = uploadQueue.concat(files);\n\n  return (dispatch, getState) => {\n    // add to files uploading\n    dispatch({\n      type: actionTypes.addFilesToUpload,\n      files: files.map((file) => Object.assign(file, {id: uploadsID++}))\n    });\n\n    checkUploadQueue(dispatch, getState);\n  };\n}\n\nexport function removeMediaItems (ids) {\n  return mutation({\n    fragments: {\n      removeMedia: {\n        _id: 1\n      }\n    },\n    variables: {\n      removeMedia: {\n        ids: {\n          value: ids,\n          type: '[ID!]'\n        }\n      }\n    },\n    type: 'REMOVE'\n  });\n}\n\nexport function removeMediaItem (id) {\n  return mutation({\n    fragments: {\n      removeMediaItem: {\n        _id: 1\n      }\n    },\n    variables: {\n      removeMediaItem: {\n        id: {\n          value: id,\n          type: 'ID!'\n        }\n      }\n    },\n    type: 'REMOVE'\n  });\n}\n"
  },
  {
    "path": "lib/shared/actions/menu.js",
    "content": "import actionTypes from 'actions';\nimport {pushState} from 'redux-router';\nimport {mutation} from 'relate-js';\n\nexport function addMenu (data, redirect = false) {\n  return mutation({\n    fragments: {\n      addMenu: {\n        _id: 1,\n        title: 1,\n        date: 1\n      }\n    },\n    variables: {\n      addMenu: {\n        data: {\n          value: data,\n          type: 'MenuInput!'\n        }\n      }\n    }\n  }, (result, dispatch) => {\n    if (redirect) {\n      dispatch(pushState(null, `/admin/menus/${result.addMenu._id}`));\n    }\n  });\n}\n\nexport function removeMenu (id, redirect) {\n  return mutation({\n    fragments: {\n      removeMenu: {\n        _id: 1\n      }\n    },\n    variables: {\n      removeMenu: {\n        id: {\n          value: id,\n          type: 'ID!'\n        }\n      }\n    },\n    type: 'REMOVE'\n  }, (result, dispatch) => {\n    if (redirect) {\n      dispatch(pushState(null, '/admin/menus'));\n    }\n  });\n}\n\nexport function updateMenuTitle (_id, title) {\n  return mutation({\n    fragments: {\n      updateMenu: {\n        _id: 1,\n        title: 1\n      }\n    },\n    variables: {\n      updateMenu: {\n        data: {\n          value: {_id, title},\n          type: 'MenuInput!'\n        }\n      }\n    }\n  });\n}\n\nexport function updateMenuData (_id) {\n  return (dispatch, getState) => {\n    const data = JSON.stringify(getState().menu);\n    return mutation({\n      fragments: {\n        updateMenu: {\n          _id: 1,\n          data: 1\n        }\n      },\n      variables: {\n        updateMenu: {\n          data: {\n            value: {_id, data},\n            type: 'MenuInput!'\n          }\n        }\n      }\n    })(dispatch, getState);\n  };\n}\n\nexport function draggedMenuItem (dragInfo, dropInfo) {\n  let action;\n\n  const destination = {\n    id: dropInfo.id,\n    position: dropInfo.position ? dropInfo.position : 0\n  };\n\n  if (dragInfo.type === 'new') {\n    action = {\n      type: actionTypes.addMenuItem,\n      item: dragInfo.item,\n      destination\n    };\n  } else if (dragInfo.type === 'move') {\n    action = {\n      type: actionTypes.moveMenuItem,\n      id: dragInfo.item.id,\n      destination\n    };\n  }\n\n  return action;\n}\n"
  },
  {
    "path": "lib/shared/actions/page-builder.js",
    "content": "import actionTypes from 'actions';\nimport forEach from 'lodash.foreach';\nimport request from 'helpers/request';\nimport stringifyFields from 'helpers/stringify-fields';\n\nexport function toggleEditing () {\n  return {\n    type: actionTypes.pbToggleEditing\n  };\n}\n\nexport function setMenuOpened (value) {\n  return {\n    type: actionTypes.pbSetMenuOpened,\n    value\n  };\n}\n\nexport function setMenuSide (value) {\n  return {\n    type: actionTypes.pbSetMenuSide,\n    value\n  };\n}\n\nexport function setMenuTab (value) {\n  return {\n    type: actionTypes.pbSetMenuTab,\n    value\n  };\n}\n\nexport function openElementsMenu (options) {\n  return {\n    type: actionTypes.pbOpenElementsMenu,\n    options\n  };\n}\n\nexport function closeElementsMenu () {\n  return {\n    type: actionTypes.pbCloseElementsMenu\n  };\n}\n\nexport function toggleCategory (category) {\n  return {\n    type: actionTypes.pbToggleCategory,\n    category\n  };\n}\n\nexport function toggleExpandElement (elementId) {\n  return {\n    type: actionTypes.pbToggleExpandElement,\n    elementId\n  };\n}\n\nexport function collapseAll () {\n  return {\n    type: actionTypes.pbCollapseAll\n  };\n}\n\nexport function expandAll () {\n  return {\n    type: actionTypes.pbExpandAll\n  };\n}\n\nexport function overElement (elementId) {\n  return {\n    type: actionTypes.pbOverElement,\n    elementId\n  };\n}\n\nexport function outElement (elementId) {\n  return {\n    type: actionTypes.pbOutElement,\n    elementId\n  };\n}\n\nexport function selectElement (elementId) {\n  return {\n    type: actionTypes.pbSelectElement,\n    elementId\n  };\n}\n\nexport function duplicateElement (elementId) {\n  return {\n    type: actionTypes.pbDoAction,\n    action: {\n      type: 'duplicate',\n      elementId\n    }\n  };\n}\n\nexport function removeElement (elementId) {\n  return {\n    type: actionTypes.pbDoAction,\n    action: {\n      type: 'remove',\n      elementId\n    }\n  };\n}\n\nexport function toggleElementVisibleOn (elementId, display) {\n  return {\n    type: actionTypes.pbDoAction,\n    action: {\n      type: 'changeDisplay',\n      elementId,\n      display\n    }\n  };\n}\n\nexport function changeElementAnimation (elementId, property, value) {\n  return {\n    type: actionTypes.pbDoAction,\n    action: {\n      type: 'changeAnimation',\n      elementId,\n      property,\n      value\n    }\n  };\n}\n\nexport function changeElementPosition (elementId, property, value) {\n  return (dispatch, getState) => {\n    const {display} = getState();\n    dispatch({\n      type: actionTypes.pbDoAction,\n      action: {\n        type: 'changePosition',\n        elementId,\n        property,\n        value,\n        display\n      }\n    });\n  };\n}\n\nexport function changeElementLabel (elementId, value) {\n  return {\n    type: actionTypes.pbDoAction,\n    action: {\n      type: 'changeLabel',\n      elementId,\n      value\n    }\n  };\n}\n\nexport function changeElementStyle (elementId, property, value) {\n  return (dispatch, getState) => {\n    const {display} = getState();\n    dispatch({\n      type: actionTypes.pbDoAction,\n      action: {\n        type: 'changeStyle',\n        elementId,\n        property,\n        value,\n        display\n      }\n    });\n  };\n}\n\nexport function changeElementProperty (elementId, property, value) {\n  return (dispatch, getState) => {\n    const {display} = getState();\n    dispatch({\n      type: actionTypes.pbDoAction,\n      action: {\n        type: 'changeProp',\n        elementId,\n        property,\n        value,\n        display\n      }\n    });\n  };\n}\n\nexport function changeElementContent (elementId, value) {\n  return {\n    type: actionTypes.pbDoAction,\n    action: {\n      type: 'changeContent',\n      elementId,\n      value\n    }\n  };\n}\n\nexport function changeElementChildren (elementId, children) {\n  return {\n    type: actionTypes.pbDoAction,\n    action: {\n      type: 'changeChildren',\n      elementId,\n      children\n    }\n  };\n}\n\nexport function elementAddSchemaLink (elementId, propertyId, linkElementId, action) {\n  return {\n    type: actionTypes.pbDoAction,\n    action: {\n      type: 'elementAddSchemaLink',\n      elementId,\n      propertyId,\n      linkElementId,\n      action\n    }\n  };\n}\n\nexport function elementRemoveSchemaLink (elementId, propertyId, index) {\n  return {\n    type: actionTypes.pbDoAction,\n    action: {\n      type: 'elementRemoveSchemaLink',\n      elementId,\n      propertyId,\n      index\n    }\n  };\n}\n\nexport function elementChangeSchemaLinkAction (elementId, propertyId, index, value) {\n  return {\n    type: actionTypes.pbDoAction,\n    action: {\n      type: 'elementChangeSchemaLinkAction',\n      elementId,\n      propertyId,\n      index,\n      value\n    }\n  };\n}\n\nexport function undoAction () {\n  return {\n    type: actionTypes.pbUndoAction\n  };\n}\n\nexport function redoAction () {\n  return {\n    type: actionTypes.pbRedoAction\n  };\n}\n\nexport function addElementAt (element, destination) {\n  return {\n    type: actionTypes.pbDoAction,\n    action: {\n      type: 'new',\n      element,\n      destination\n    }\n  };\n}\n\nexport function makeElementDynamic (elementId) {\n  return {\n    type: actionTypes.pbDoAction,\n    action: {\n      type: 'makeDynamic',\n      elementId\n    }\n  };\n}\n\nexport function draggedComponent (dragInfo, dropInfo) {\n  const action = {\n    type: dragInfo.type\n  };\n\n  if (dragInfo.type === 'new') {\n    action.element = {\n      tag: dragInfo.element\n    };\n  } else if (dragInfo.type === 'move') {\n    action.source = {\n      id: dragInfo.id\n    };\n  }\n\n  action.destination = {\n    id: dropInfo.id,\n    position: 0\n  };\n\n  if (typeof dropInfo.position !== 'undefined') {\n    action.destination.position = dropInfo.position;\n  }\n\n  return {\n    type: actionTypes.pbDoAction,\n    action\n  };\n}\n\nexport function linkFormDataMode (elementId) {\n  return {\n    type: actionTypes.pbLinkFormDataMode,\n    elementId\n  };\n}\n\nexport function closeLinkFormDataMode (elementId) {\n  return {\n    type: actionTypes.pbCloseLinkFormDataMode,\n    elementId\n  };\n}\n\nexport function linkDataMode (elementId) {\n  return {\n    type: actionTypes.pbLinkDataMode,\n    elementId\n  };\n}\n\nexport function closeLinkDataMode () {\n  return {\n    type: actionTypes.pbCloseLinkDataMode\n  };\n}\n\nfunction extractChildren (children, data, draftData) {\n  forEach(children, (childId) => {\n    data[childId] = Object.assign({}, draftData[childId]);\n    if (data[childId].children && data[childId].children.constructor === Array) {\n      extractChildren(data[childId].children, data, draftData);\n    }\n  });\n}\n\nexport function makeElementSymbol (elementId, title) {\n  return (dispatch, getState) => {\n    const symbolData = {};\n    const draftData = getState().draft.data.data;\n\n    symbolData.base = Object.assign({}, draftData[elementId]);\n    if (symbolData.base.children && symbolData.base.children.constructor === Array) {\n      extractChildren(symbolData.base.children, symbolData, draftData);\n    }\n\n    const data = {\n      title,\n      data: symbolData\n    };\n\n    return request({\n      dispatch,\n      type: actionTypes.makeElementSymbol,\n      query: `\n        mutation addSymbol ($data: SymbolInput!) {\n          addSymbol (data: $data) {\n            _id,\n            title,\n            data\n          }\n        }\n      `,\n      variables: {\n        data: stringifyFields(data, ['data'])\n      },\n      params: {\n        elementId\n      }\n    });\n  };\n}\n"
  },
  {
    "path": "lib/shared/actions/page.js",
    "content": "import actionTypes from 'actions';\nimport request from 'helpers/request';\nimport {pushState} from 'redux-router';\nimport {mutation} from 'relate-js';\nimport {fragmentToQL} from 'relax-fragments';\n\nexport function updatePage (fragments, data) {\n  return mutation({\n    fragments: {\n      updatePage: {\n        _id: 1,\n        title: 1,\n        slug: 1,\n        updatedDate: 1\n      }\n    },\n    variables: {\n      updatePage: {\n        data: {\n          value: data,\n          type: 'PageInput!'\n        }\n      }\n    }\n  });\n}\n\nexport function publishPage (_id) {\n  return mutation({\n    fragments: {\n      updatePage: {\n        _id: 1,\n        state: 1\n      }\n    },\n    variables: {\n      updatePage: {\n        data: {\n          value: {_id, state: 'published'},\n          type: 'PageInput!'\n        }\n      }\n    }\n  });\n}\n\nexport function unpublishPage (_id) {\n  return mutation({\n    fragments: {\n      updatePage: {\n        _id: 1,\n        state: 1\n      }\n    },\n    variables: {\n      updatePage: {\n        data: {\n          value: {_id, state: 'draft'},\n          type: 'PageInput!'\n        }\n      }\n    }\n  });\n}\n\nexport function updatePageTitle (_id, title) {\n  return mutation({\n    fragments: {\n      updatePage: {\n        _id: 1,\n        title: 1\n      }\n    },\n    variables: {\n      updatePage: {\n        data: {\n          value: {_id, title},\n          type: 'PageInput!'\n        }\n      }\n    }\n  });\n}\n\nexport function updatePageSlug (_id, slug) {\n  return mutation({\n    fragments: {\n      updatePage: {\n        _id: 1,\n        slug: 1\n      }\n    },\n    variables: {\n      updatePage: {\n        data: {\n          value: {_id, slug},\n          type: 'PageInput!'\n        }\n      }\n    }\n  });\n}\n\nexport function savePageFromDraft (fragments, publish = false) {\n  return (dispatch, getState) => {\n    const draft = getState().draft.data;\n    const page = getState().page.data;\n    const stringified = JSON.stringify(draft.data);\n\n    const pageInput = Object.assign({}, page, {\n      data: stringified,\n      state: publish ? 'published' : page.state\n    });\n    const draftInput = Object.assign({}, draft, {\n      data: stringified,\n      actions: '[]',\n      __v: page.__v + 1\n    });\n\n    return request({\n      dispatch,\n      type: actionTypes.savePageFromDraft,\n      query: `\n        mutation ($data: PageInput!, $data0: DraftInput!) {\n          updatePage (data: $data) {\n            ${fragmentToQL(fragments.page)}\n          }\n          updateDraft (data: $data0) {\n            ${fragmentToQL(fragments.draft)}\n          }\n        }\n      `,\n      variables: {\n        data: pageInput,\n        data0: draftInput\n      }\n    });\n  };\n}\n\nexport function addPage (fragments, data, redirect = false) {\n  return mutation({\n    fragments: {\n      addPage: {\n        _id: 1,\n        title: 1,\n        state: 1,\n        slug: 1,\n        date: 1,\n        updatedDate: 1\n      }\n    },\n    variables: {\n      addPage: {\n        data: {\n          value: data,\n          type: 'PageInput!'\n        }\n      }\n    }\n  }, (result, dispatch) => {\n    if (redirect) {\n      dispatch(pushState(null, `/admin/pages/${result.addPage._id}`));\n    }\n  });\n}\n\nexport function removePage (id, redirect = false) {\n  return mutation({\n    fragments: {\n      removePage: {\n        _id: 1\n      }\n    },\n    variables: {\n      removePage: {\n        id: {\n          value: id,\n          type: 'ID!'\n        }\n      }\n    },\n    type: 'REMOVE'\n  }, (result, dispatch) => {\n    if (redirect) {\n      dispatch(pushState(null, '/admin/pages'));\n    }\n  });\n}\n\nexport function duplicatePage (fragments, data) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.duplicatePage,\n      query: `\n        mutation duplicatePage ($data: String!) {\n          duplicatePage (data: $data) {\n            ${fragmentToQL(fragments.page)}\n          }\n        }\n      `,\n      variables: {\n        data\n      }\n    })\n  );\n}\n\nexport function restorePage (fragments, pageId, version) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.restorePage,\n      query: `\n        mutation restorePage ($pageId: ID!, $version: Int!) {\n          restorePage (pageId: $pageId, version: $version) {\n            ${fragmentToQL(fragments.page)}\n          }\n        }\n      `,\n      variables: {\n        pageId,\n        version\n      }\n    })\n  );\n}\n\nexport function validatePageSlug ({slug, pageId}) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.validatePageSlug,\n      query: `\n        query validatePageSlug ($slug: String!, $pageId: ID) {\n          validatePageSlug (slug: $slug, pageId: $pageId)\n        }\n      `,\n      variables: {\n        slug,\n        pageId\n      }\n    })\n  );\n}\n\nexport function changePageFields (values) {\n  return {\n    type: actionTypes.changePageFields,\n    values\n  };\n}\n\nexport function changePageToDefault () {\n  return {\n    type: actionTypes.changePageToDefault\n  };\n}\n"
  },
  {
    "path": "lib/shared/actions/revisions.js",
    "content": "import {fragmentToQL} from 'relax-fragments';\n\nimport actionTypes from 'actions';\nimport request from 'helpers/request';\n\nexport function getRevisions (fragments, id) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.getRevisions,\n      query: `\n        query revisions ($id: String!) {\n          revisions (id: $id) {\n            ${fragmentToQL(fragments.revisions)}\n          }\n        }\n      `,\n      variables: {\n        id\n      }\n    })\n  );\n}\n"
  },
  {
    "path": "lib/shared/actions/schema-entry.js",
    "content": "import actionTypes from 'actions';\nimport request from 'helpers/request';\nimport stringifyFields from 'helpers/stringify-fields';\nimport {pushState} from 'redux-router';\nimport {mutation} from 'relate-js';\nimport {fragmentToQL} from 'relax-fragments';\n\nconst stringifiableFields = ['properties', 'data'];\n\nexport function addSchemaEntry (schemaId, data, redirect = false) {\n  return mutation({\n    fragments: {\n      addSchemaEntry: {\n        _id: 1,\n        title: 1,\n        state: 1,\n        slug: 1,\n        date: 1,\n        updatedDate: 1\n      }\n    },\n    variables: {\n      addSchemaEntry: {\n        schemaId: {\n          value: schemaId,\n          type: 'ID!'\n        },\n        data: {\n          value: data,\n          type: 'SchemaEntryInput!'\n        }\n      }\n    }\n  }, (result, dispatch) => {\n    if (redirect) {\n      dispatch(pushState(null, `/admin/schemas/${schemaId}/${result.addSchemaEntry._id}`));\n    }\n  });\n}\n\nexport function updateSchemaEntry (fragments, schemaId, data) {\n  return (dispatch) => request({\n    dispatch,\n    type: actionTypes.updateSchemaEntry,\n    query: `\n      mutation updateSchemaEntry ($schemaId: ID!, $data: SchemaEntryInput!) {\n        updateSchemaEntry (schemaId: $schemaId, data: $data) {\n          ${fragmentToQL(fragments.schemaEntry)}\n        }\n      }\n    `,\n    variables: {\n      schemaId,\n      data: stringifyFields(data, stringifiableFields)\n    }\n  }).then((resultData) => resultData.updateSchemaEntry);\n}\n\nexport function restoreSchemaEntry (fragments, schemaId, schemaEntryId, version) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.restoreSchemaEntry,\n      query: `\n        mutation restoreSchemaEntry ($schemaId: ID!, $schemaEntryId: ID!, $version: Int!) {\n          restoreSchemaEntry (schemaId: $schemaId, schemaEntryId: $schemaEntryId, version: $version) {\n            ${fragmentToQL(fragments.schemaEntry)}\n          }\n        }\n      `,\n      variables: {\n        schemaId,\n        schemaEntryId,\n        version\n      }\n    })\n  );\n}\n\nexport function validateSchemaEntrySlug ({slug, schemaId, schemaEntryId}) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.validateSchemaEntrySlug,\n      query: `\n        query validateSchemaEntrySlug ($slug: String!, $schemaId: ID, $schemaEntryId: ID) {\n          validateSchemaEntrySlug (slug: $slug, schemaId: $schemaId, schemaEntryId: $schemaEntryId)\n        }\n      `,\n      variables: {\n        slug,\n        schemaId,\n        schemaEntryId\n      }\n    })\n  );\n}\n\nexport function changeSchemaEntryFields (values) {\n  return {\n    type: actionTypes.changeSchemaEntryFields,\n    values\n  };\n}\n\nexport function changeSchemaEntryProperty (key, value) {\n  return {\n    type: actionTypes.changeSchemaEntryProperty,\n    key,\n    value\n  };\n}\n\nexport function changeSchemaEntryToDefault () {\n  return {\n    type: actionTypes.changeSchemaEntryToDefault\n  };\n}\n"
  },
  {
    "path": "lib/shared/actions/schema-list.js",
    "content": "import actionTypes from 'actions';\nimport request from 'helpers/request';\nimport {fragmentToQL} from 'relax-fragments';\n\nexport function removeSchemaEntry (fragments, schemaId, id) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.removeSchemaEntry,\n      query: `\n        mutation removeSchemaEntry ($schemaId: ID!, $id: ID!) {\n          removeSchemaEntry (schemaId: $schemaId, id: $id) {\n            ${fragmentToQL(fragments.schemaEntry)}\n          }\n        }\n      `,\n      variables: {\n        id,\n        schemaId\n      }\n    })\n  );\n}\n"
  },
  {
    "path": "lib/shared/actions/schema.js",
    "content": "import actionTypes from 'actions';\nimport request from 'helpers/request';\nimport stringifyFields from 'helpers/stringify-fields';\nimport {pushState} from 'redux-router';\nimport {mutation} from 'relate-js';\nimport {fragmentToQL} from 'relax-fragments';\n\nconst stringifiableFields = ['properties', 'data'];\n\nexport function changeSchemaType (schemaType) {\n  return {\n    type: actionTypes.changeSchemaType,\n    schemaType\n  };\n}\n\nexport function changeSchemaTitle (title) {\n  return {\n    type: actionTypes.changeSchemaTitle,\n    title\n  };\n}\n\nexport function schemaStepBack () {\n  return {\n    type: actionTypes.schemaStepBack\n  };\n}\n\nexport function schemaStepForward () {\n  return {\n    type: actionTypes.schemaStepForward\n  };\n}\n\nexport function changeSchemaToDefault () {\n  return {\n    type: actionTypes.changeSchemaToDefault\n  };\n}\n\nexport function addProperty () {\n  return {\n    type: actionTypes.schemaAddProperty\n  };\n}\n\nexport function toggleProperty (id) {\n  return {\n    type: actionTypes.schemaToggleProperty,\n    id\n  };\n}\n\nexport function changePropertySetting (id, settingId, value) {\n  return {\n    type: actionTypes.schemaChangePropertySetting,\n    id,\n    settingId,\n    value\n  };\n}\n\nexport function addSchema (data, redirect = true) {\n  return mutation({\n    fragments: {\n      addSchema: {\n        _id: 1,\n        title: 1,\n        type: 1\n      }\n    },\n    variables: {\n      addSchema: {\n        data: {\n          value: stringifyFields(data, stringifiableFields),\n          type: 'SchemaInput!'\n        }\n      }\n    }\n  }, (result, dispatch) => {\n    if (redirect) {\n      dispatch(pushState(null, `/admin/schemas/${result.addSchema._id}`));\n    }\n  });\n}\n\n\nexport function updateSchema (fragments, data) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.updateSchema,\n      query: `\n        mutation updateSchema ($data: SchemaInput!) {\n          updateSchema (data: $data) {\n            ${fragmentToQL(fragments.schema)}\n          }\n        }\n      `,\n      variables: {\n        data: stringifyFields(data, stringifiableFields)\n      }\n    })\n  );\n}\n\nexport function restoreSchema (fragments, schemaId, version) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.restoreSchema,\n      query: `\n        mutation restoreSchema ($schemaId: ID!, $version: Int!) {\n          restoreSchema (schemaId: $schemaId, version: $version) {\n            ${fragmentToQL(fragments.schema)}\n          }\n        }\n      `,\n      variables: {\n        schemaId,\n        version\n      }\n    })\n  );\n}\n\nexport function validateSchemaSlug ({slug, schemaId}) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.validateSchemaSlug,\n      query: `\n        query validateSchemaSlug ($slug: String!, $schemaId: ID) {\n          validateSchemaSlug (slug: $slug, schemaId: $schemaId)\n        }\n      `,\n      variables: {\n        slug,\n        schemaId\n      }\n    })\n  );\n}\n"
  },
  {
    "path": "lib/shared/actions/schemas.js",
    "content": "import actionTypes from 'actions';\nimport request from 'helpers/request';\nimport {fragmentToQL} from 'relax-fragments';\n\nexport function removeSchema (fragments, id) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.removeSchema,\n      query: `\n        mutation removeSchema ($id: String!) {\n          removeSchema (id: $id) {\n            ${fragmentToQL(fragments.schema)}\n          }\n        }\n      `,\n      variables: {\n        id\n      }\n    })\n  );\n}\n"
  },
  {
    "path": "lib/shared/actions/session.js",
    "content": "import actionTypes from 'actions';\nimport request from 'helpers/request';\n\nexport function authenticate (dispatch) {\n  return (nextState, replaceState, callback) => {\n    if (dispatch) {\n      request({\n        dispatch,\n        type: actionTypes.authenticate,\n        query: `\n          query {\n            session {\n              userId\n            }\n          }\n        `\n      }).then(() => {\n        callback();\n      }).catch(() => {\n        replaceState(null, '/admin/login');\n      });\n    } else {\n      callback();\n    }\n  };\n}\n"
  },
  {
    "path": "lib/shared/actions/settings.js",
    "content": "import actionTypes from 'actions';\nimport forEach from 'lodash.foreach';\nimport request from 'helpers/request';\nimport {fragmentToQL} from 'relax-fragments';\n\nexport function changeSettingValue (id, value) {\n  return {\n    type: actionTypes.changeSettingValue,\n    id,\n    value\n  };\n}\n\nexport function saveSettings (fragments, data) {\n  const settings = [];\n  forEach(data, (value, _id) => {\n    settings.push({_id, value});\n  });\n\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.saveSettings,\n      query: `\n        mutation saveSettings ($data: [SettingInput]!) {\n          saveSettings (data: $data) {\n            ${fragmentToQL(fragments.settings)}\n          }\n        }\n      `,\n      variables: {\n        data: settings\n      }\n    })\n  );\n}\n"
  },
  {
    "path": "lib/shared/actions/styles.js",
    "content": "import actionTypes from 'actions';\nimport request from 'helpers/request';\nimport stringifyFields from 'helpers/stringify-fields';\nimport {fragmentToQL} from 'relax-fragments';\n\nconst stringifiableFields = ['options', 'displayOptions'];\n\nexport function saveStyle (fragments, elementId, data) {\n  return (dispatch, getState) => (\n    request({\n      dispatch,\n      type: actionTypes.saveStyle,\n      query: `\n        mutation addStyle ($data: StyleInput!) {\n          addStyle (data: $data) {\n            ${fragmentToQL(fragments.style)}\n          }\n        }\n      `,\n      variables: {\n        data: stringifyFields(data, stringifiableFields)\n      },\n      params: {\n        elementId,\n        display: getState().display\n      }\n    })\n  );\n}\n\nexport function changeStyleProp (styleId, property, value) {\n  return (dispatch, getState) => {\n    const {display} = getState();\n    dispatch({\n      type: actionTypes.changeStyleProp,\n      styleId,\n      property,\n      value,\n      display\n    });\n  };\n}\n\nexport function updateStyle (fragments, data) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.updateStyle,\n      query: `\n        mutation updateStyle ($data: StyleInput!) {\n          updateStyle (data: $data) {\n            ${fragmentToQL(fragments.style)}\n          }\n        }\n      `,\n      variables: {\n        data: stringifyFields(data, stringifiableFields)\n      }\n    })\n  );\n}\n\nexport function removeStyle (styleId) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.removeStyle,\n      query: `\n        mutation removeStyle ($id: ID!) {\n          removeStyle (_id: $id) {\n            _id\n          }\n        }\n      `,\n      variables: {\n        id: styleId\n      }\n    })\n  );\n}\n"
  },
  {
    "path": "lib/shared/actions/symbols.js",
    "content": "import actionTypes from 'actions';\nimport request from 'helpers/request';\nimport {fragmentToQL} from 'relax-fragments';\n\nexport function getSymbol (symbolId, fragments) {\n  return (dispatch) => (\n    request({\n      dispatch,\n      type: actionTypes.getSymbol,\n      query: `\n        query symbol ($id: ID!) {\n          symbol (id: $id) {\n            ${fragmentToQL(fragments.symbol)}\n          }\n        }\n      `,\n      variables: {\n        id: symbolId\n      }\n    })\n  );\n}\n"
  },
  {
    "path": "lib/shared/actions/tabs.js",
    "content": "import {pushState} from 'redux-router';\nimport {mutation} from 'relate-js';\n\nexport function addTab (type, id) {\n  return mutation({\n    fragments: {\n      addTab: {\n        _id: 1,\n        type: 1,\n        item: {\n          _id: 1,\n          title: 1\n        }\n      }\n    },\n    variables: {\n      addTab: {\n        id: {\n          value: id,\n          type: 'ID!'\n        },\n        type: {\n          value: type,\n          type: 'String!'\n        }\n      }\n    }\n  });\n}\n\nexport function removeTab (id, redirect) {\n  return mutation({\n    fragments: {\n      removeTab: {\n        _id: 1\n      }\n    },\n    variables: {\n      removeTab: {\n        id: {\n          value: id,\n          type: 'ID!'\n        }\n      }\n    },\n    type: 'REMOVE'\n  }, (result, dispatch) => {\n    if (redirect) {\n      dispatch(pushState(null, redirect));\n    }\n  });\n}\n"
  },
  {
    "path": "lib/shared/actions/users.js",
    "content": "import {mutation} from 'relate-js';\n\nexport function removeUser (id) {\n  return mutation({\n    fragments: {\n      removeUser: {\n        _id: 1\n      }\n    },\n    variables: {\n      removeUser: {\n        id: {\n          value: id,\n          type: 'ID!'\n        }\n      }\n    },\n    type: 'REMOVE'\n  });\n}\n\nexport function addUser (fragments, data) {\n  return mutation({\n    fragments: {\n      addUser: fragments.users\n    },\n    variables: {\n      addUser: {\n        data: {\n          value: data,\n          type: 'UserInput!'\n        }\n      }\n    }\n  });\n}\n"
  },
  {
    "path": "lib/shared/components/a.jsx",
    "content": "import qs from 'query-string';\nimport Component from 'components/component';\nimport React from 'react';\nimport {Link} from 'react-router';\n\nexport default class A extends Component {\n  static propTypes = {\n    href: React.PropTypes.string.isRequired,\n    children: React.PropTypes.node,\n    onClick: React.PropTypes.func,\n    afterClick: React.PropTypes.func\n  };\n\n  onClick (event) {\n    if (this.props.onClick) {\n      this.props.onClick(event);\n    }\n\n    if (this.props.afterClick) {\n      this.props.afterClick(event);\n    }\n  }\n\n  render () {\n    const {href, ...tagProps} = this.props;\n    const urlAndQuery = href && href.split('?');\n\n    let url;\n    let query;\n    if (urlAndQuery) {\n      url = urlAndQuery[0];\n      query = qs.parse(urlAndQuery[1]);\n    }\n\n    return (\n      <Link to={url} query={query} {...tagProps} onClick={::this.onClick}>\n        {this.props.children}\n      </Link>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/animate-props.jsx",
    "content": "import velocity from 'velocity-animate';\nimport Component from 'components/component';\nimport React from 'react';\nimport {findDOMNode} from 'react-dom';\n\nexport default class AnimateProps extends Component {\n  static propTypes = {\n    props: React.PropTypes.object,\n    options: React.PropTypes.object,\n    children: React.PropTypes.node\n  };\n\n  static defaultProps = {\n    props: {},\n    options: {}\n  };\n\n  componentDidMount () {\n    const dom = findDOMNode(this);\n    velocity(dom, this.props.props, this.props.options);\n  }\n\n  render () {\n    return this.props.children;\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/animate.jsx",
    "content": "import velocity from 'velocity-animate';\nimport Component from 'components/component';\nimport {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nexport default class Animate extends Component {\n  static propTypes = {\n    transition: PropTypes.string,\n    duration: PropTypes.number,\n    children: PropTypes.node,\n    options: PropTypes.object,\n    initial: PropTypes.bool\n  };\n\n  static defaultProps = {\n    transition: 'slideUpIn',\n    duration: 400,\n    options: {},\n    initial: true\n  };\n\n  componentDidMount () {\n    if (this.props.initial) {\n      this.makeTransition(this.props);\n    }\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (this.props.transition !== nextProps.transition) {\n      this.makeTransition(nextProps);\n    }\n  }\n\n  makeTransition (props) {\n    const dom = findDOMNode(this);\n    const transition = `transition.${props.transition}`;\n    velocity(dom, transition, Object.assign({\n      duration: props.duration,\n      display: null\n    }, props.options));\n  }\n\n  render () {\n    return this.props.children;\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/background-image.jsx",
    "content": "import utils from 'helpers/utils';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nimport MediaImage from './image';\n\nexport default class BackgroundImage extends Component {\n\n  static propTypes = {\n    backgroundImage: PropTypes.string.isRequired,\n    repeat: PropTypes.string.isRequired,\n    vertical: PropTypes.number,\n    horizontal: PropTypes.number,\n    opacity: PropTypes.number\n  };\n\n  static defaultProps = {\n    backgroundImage: '',\n    repeat: 'no-repeat',\n    vertical: 50,\n    horizontal: 50,\n    opacity: 100\n  };\n\n  getInitState () {\n    return {\n      mounted: false\n    };\n  }\n\n  componentDidMount () {\n    this.resize();\n  }\n\n  componentDidUpdate () {\n    this.resize();\n  }\n\n  resize () {\n    const dom = findDOMNode(this);\n    const rect = dom.getBoundingClientRect();\n    const width = Math.round(rect.right - rect.left);\n    const height = Math.round(rect.bottom - rect.top);\n\n    if (this.state.width !== width || this.state.height !== height) {\n      this.setState({\n        mounted: true,\n        width,\n        height\n      });\n    }\n  }\n\n  render () {\n    if (this.state.mounted && this.props.backgroundImage && this.props.backgroundImage !== '') {\n      let result;\n      const style = {\n        position: 'absolute',\n        top: 0, left: 0, right: 0, bottom: 0,\n        overflow: 'hidden',\n        opacity: this.props.opacity / 100\n      };\n\n      if (this.props.repeat === 'no-repeat') {\n        const imageStyle = {\n          position: 'relative',\n          minWidth: '100%',\n          minHeight: '100%',\n          maxWidth: 'none'\n        };\n        imageStyle.top = this.state.height * (this.props.vertical / 100);\n        imageStyle.left = this.state.width * (this.props.horizontal / 100);\n        utils.translate(imageStyle, `${-this.props.horizontal}%`, `${-this.props.vertical}%`);\n\n        result = (\n          <div style={style}>\n            <MediaImage\n              id={this.props.backgroundImage}\n              width={this.state.width}\n              height={this.state.height}\n              style={imageStyle}\n            />\n          </div>\n        );\n      } else {\n        style.backgroundImage = `url(\"${utils.getBestImageUrl(this.props.backgroundImage)}\")`;\n        style.backgroundRepeat = this.props.repeat;\n        style.backgroundPosition = `${-this.props.horizontal}% ${-this.props.vertical}%`;\n        result = <div style={style}></div>;\n      }\n\n      return result;\n    }\n\n    return <span />;\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/button/index.jsx",
    "content": "import cx from 'classnames';\nimport forEach from 'lodash.foreach';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class Button extends Component {\n  static propTypes = {\n    children: PropTypes.node.isRequired,\n    onClick: PropTypes.func.isRequired,\n    className: PropTypes.string,\n    style: PropTypes.object,\n    primary: PropTypes.bool,\n    full: PropTypes.bool,\n    big: PropTypes.bool,\n    noBackground: PropTypes.bool\n  };\n\n  static defaultProps = {\n    primary: true,\n    full: false,\n    big: false,\n    noBackground: false\n  };\n\n  render () {\n    const {onClick, className, ...classes} = this.props;\n\n    let resultClassName = cx(styles.button, className);\n    forEach(classes, (value, key) => {\n      if (styles[key] && value) {\n        resultClassName = cx(resultClassName, styles[key]);\n      }\n    });\n\n    return (\n      <button className={resultClassName} onClick={onClick} style={this.props.style}>\n        {this.props.children}\n      </button>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/button/index.less",
    "content": "@import '~styles/colors.less';\n\n.button {\n  cursor: pointer;\n  padding: 8px 15px;\n  text-decoration: none;\n  font-size: 12px;\n  line-height: 15px;\n  display: inline-block;\n  vertical-align: top;\n  border-radius: 3px;\n  outline: 0;\n  border: 0;\n}\n\n.full {\n  display: block;\n  text-align: center;\n  width: 100%;\n  margin-right: 0;\n  text-transform: uppercase;\n  font-size: 10px;\n}\n\n.primary {\n  background-color: @primary;\n  color: #ffffff;\n\n  &:hover {\n    background-color: @primaryDarker;\n  }\n}\n\n.alert {\n  background-color: @alert;\n  color: #ffffff;\n}\n\n.big {\n  font-size: 12px;\n  padding: 12px 15px;\n}\n\n.noBackground {\n  background-color: transparent;\n  text-transform: uppercase;\n\n  &.primary {\n    color: @primary;\n    font-size: 16px;\n  }\n\n  &.alert {\n    color: @alert;\n    font-size: 16px;\n  }\n\n  &.grey {\n    color: @adminText;\n    font-size: 16px;\n  }\n\n  &:hover {\n    background-color: transparent;\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/component.jsx",
    "content": "import React from 'react';\n\nexport default class BaseComponent extends React.Component {\n  constructor (props, context) {\n    super(props, context);\n    this.state = this.getInitState ? this.getInitState() : {};\n    this.init && this.init();\n  }\n\n  isClient () {\n    return typeof document !== 'undefined';\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/dnd/draggable/draggable.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nconst LEFT_BUTTON = 0;\n\nexport default class Draggable extends Component {\n  static propTypes = {\n    dndActions: PropTypes.object.isRequired,\n    type: PropTypes.string.isRequired,\n    dragInfo: PropTypes.object.isRequired,\n    onStartDrag: PropTypes.func,\n    droppableOn: PropTypes.string,\n    onClick: PropTypes.func,\n    disabled: PropTypes.bool,\n    children: PropTypes.node\n  };\n\n  constructor (props, children) {\n    super(props, children);\n    this.onMouseUpListener = this.onMouseUp.bind(this);\n    this.onMouseMoveListener = this.onMouseMove.bind(this);\n  }\n\n  onMouseUp () {\n    document.removeEventListener('mouseup', this.onMouseUpListener);\n    document.removeEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  onMouseMove (event) {\n    event.preventDefault();\n\n    this.onMouseUp();\n\n    const element = findDOMNode(this);\n    const elementOffset = element.getBoundingClientRect();\n    const width = Math.round(elementOffset.right - elementOffset.left);\n    const {startDragging} = this.props.dndActions;\n\n    // Dragging data\n    const draggingData = {\n      children: this.props.children,\n      elementOffset,\n      elementWidth: width,\n      mouseX: event.pageX,\n      mouseY: event.pageY,\n      type: this.props.type\n    };\n    if (this.props.droppableOn) {\n      draggingData.droppableOn = this.props.droppableOn;\n    }\n\n    startDragging(draggingData, this.props.dragInfo);\n    this.props.onStartDrag && this.props.onStartDrag();\n  }\n\n  onMouseDown (event) {\n    if (event.button === LEFT_BUTTON) {\n      const draggable = !this.props.disabled;\n      event.stopPropagation();\n\n      if (draggable) {\n        document.addEventListener('mouseup', this.onMouseUpListener);\n        document.addEventListener('mousemove', this.onMouseMoveListener);\n      }\n    }\n  }\n\n  render () {\n    const props = {\n      className: cx(this.props.children.props.className, 'draggable'),\n      draggable: 'false',\n      onMouseDown: this.onMouseDown.bind(this)\n    };\n\n    if (this.props.onClick) {\n      props.onClick = this.props.onClick;\n    }\n\n    return React.cloneElement(this.props.children, props);\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/dnd/draggable/index.js",
    "content": "import * as dndActions from 'actions/dnd';\n\nimport Component from 'components/component';\nimport React from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport Draggable from './draggable';\n\n@connect(\n  () => ({}),\n  (dispatch) => ({\n    dndActions: bindActionCreators(dndActions, dispatch)\n  })\n)\nexport default class DraggableContainer extends Component {\n  render () {\n    return <Draggable {...this.props} />;\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/dnd/dragger/dragger.jsx",
    "content": "import cx from 'classnames';\nimport velocity from 'velocity-animate';\nimport Component from 'components/component';\nimport Portal from 'components/portal';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nimport styles from './dragger.less';\n\nexport default class Dragger extends Component {\n  static propTypes = {\n    dndActions: PropTypes.object.isRequired,\n    onStopDrag: PropTypes.func.isRequired,\n    offset: PropTypes.object,\n    draggingData: PropTypes.object,\n    dragInfo: PropTypes.object,\n    dropInfo: PropTypes.object,\n    shadow: PropTypes.bool\n  };\n\n  static defaultProps = {\n    shadow: true\n  };\n\n  getInitState () {\n    const {draggingData, offset} = this.props;\n    return {\n      top: draggingData.elementOffset.top + (offset && offset.top ? offset.top : 0),\n      left: draggingData.elementOffset.left + (offset && offset.left ? offset.left : 0)\n    };\n  }\n\n  componentDidMount () {\n    const {draggingData} = this.props;\n\n    this.onMouseUpListener = this.onMouseUp.bind(this);\n    this.onMouseMoveListener = this.onMouseMove.bind(this);\n\n    const node = findDOMNode(this.refs.dragger);\n\n    const relativeX = draggingData.mouseX - draggingData.elementOffset.left;\n    const relativeY = draggingData.mouseY - draggingData.elementOffset.top;\n    node.style.transformOrigin = `${relativeX}px ${relativeY}px`;\n\n    velocity(node, {\n      scaleX: '0.5',\n      scaleY: '0.5',\n      opacity: '0.7'\n    }, {duration: 500, easing: 'easeOutExpo'});\n\n    document.addEventListener('mouseup', this.onMouseUpListener);\n    document.addEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  onMouseUp () {\n    const {dragInfo, dropInfo, onStopDrag, dndActions} = this.props;\n\n    document.removeEventListener('mouseup', this.onMouseUpListener);\n    document.removeEventListener('mousemove', this.onMouseMoveListener);\n\n    onStopDrag && dragInfo && dropInfo && onStopDrag(dragInfo, dropInfo);\n    dndActions.stopDragging();\n  }\n\n  onMouseMove (event) {\n    const {draggingData} = this.props;\n    event.preventDefault();\n\n    const deltaX = event.pageX - draggingData.mouseX + draggingData.elementOffset.left;\n    const deltaY = event.pageY - draggingData.mouseY + draggingData.elementOffset.top;\n\n    this.setState({\n      top: deltaY + (this.props.offset && this.props.offset.top ? this.props.offset.top : 0),\n      left: deltaX + (this.props.offset && this.props.offset.left ? this.props.offset.left : 0)\n    });\n  }\n\n  render () {\n    const {draggingData, shadow} = this.props;\n    const style = {\n      width: `${draggingData.elementWidth}px`,\n      top: `${this.state.top}px`,\n      left: `${this.state.left}px`\n    };\n\n    return (\n      <Portal>\n        <div className={cx(styles.root, shadow && styles.shadow)} draggable='false' style={style} ref='dragger'>\n          {draggingData.children}\n        </div>\n      </Portal>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/dnd/dragger/dragger.less",
    "content": ".root {\n  position: fixed;\n  pointer-events: none;\n  z-index: 20;\n}\n\n.shadow {\n  box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.5);\n}\n"
  },
  {
    "path": "lib/shared/components/dnd/dragger/index.js",
    "content": "import * as dndActions from 'actions/dnd';\n\nimport Component from 'components/component';\nimport React from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport Dragger from './dragger';\n\n@connect(\n  (state) => ({\n    draggingData: state.dnd.draggingData,\n    dragInfo: state.dnd.dragInfo,\n    dropInfo: state.dnd.dropInfo\n  }),\n  (dispatch) => ({\n    dndActions: bindActionCreators(dndActions, dispatch)\n  })\n)\nexport default class DraggerContainer extends Component {\n  render () {\n    return <Dragger {...this.props} />;\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/dnd/droppable/add-ballon.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nimport styles from './add-ballon.less';\n\nexport default class AddBallon extends Component {\n  static propTypes = {\n    vertical: PropTypes.bool,\n    active: PropTypes.bool,\n    position: PropTypes.number.isRequired,\n    onClick: PropTypes.func.isRequired\n  };\n\n  onClick () {\n    const {onClick, position} = this.props;\n    onClick(position, findDOMNode(this.refs.marker));\n  }\n\n  render () {\n    const {vertical, active} = this.props;\n    return (\n      <div\n        className={cx(\n          styles.root,\n          vertical && styles.vertical,\n          !vertical && this.state.closeToMargin && styles.inverted,\n          active && styles.active\n        )}\n        onClick={::this.onClick}\n      >\n        <span className={styles.marker} ref='marker'>\n          <span className={styles.triangle}></span>\n          <span className={styles.circle}>\n            <i className='nc-icon-mini ui-1_simple-add'></i>\n          </span>\n        </span>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/dnd/droppable/add-ballon.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  position: relative;\n  width: 100%;\n  height: 0;\n  z-index: 3;\n  text-align: left;\n  left: 0;\n}\n\n.marker {\n  position: absolute;\n  display: inline-block;\n  left: -15px;\n  top: -15px;\n  cursor: pointer;\n\n  width: 30px;\n  height: 30px;\n\n  opacity: 0.9;\n  transform: scale(0.3);\n  transition: all 0.2s ease-out;\n\n  &:before {\n    content: ' ';\n    position: absolute;\n    top: -5px;\n    left: -5px;\n    width: 40px;\n    height: 40px;\n    background-color: rgba(255, 255, 255, 0.4);\n    border-radius: 50%;\n    opacity: 1;\n  }\n}\n\n.circle {\n  width: 30px;\n  height: 30px;\n  background-color: #131618;\n  display: inline-block;\n  position: relative;\n  text-align: center;\n  border-radius: 50%;\n\n  :global i {\n    opacity: 0;\n    text-align: center;\n    color: #eeeeee;\n    font-size: 14px;\n    line-height: 30px;\n  }\n}\n\n.triangle {\n  position: absolute;\n  background-color: #131618;\n  text-align: left;\n  cursor: pointer;\n  opacity: 0;\n\n  position: absolute;\n  left: 16px;\n  top: 3px;\n}\n.triangle:before,\n.triangle:after {\n  content: '';\n  position: absolute;\n  background-color: inherit;\n}\n.triangle,\n.triangle:before,\n.triangle:after {\n  width:  16px;\n  height: 16px;\n  border-top-right-radius: 30%;\n}\n\n.triangle {\n  transform: rotate(-90deg) skewX(-30deg) scale(1,.866);\n}\n.triangle:before {\n  transform: rotate(-135deg) skewX(-45deg) scale(1.414,.707) translate(0,-50%);\n}\n.triangle:after {\n  transform: rotate(135deg) skewY(-45deg) scale(.707,1.414) translate(50%);\n}\n\n.root {\n  &:hover, &.active {\n    &:before {\n      content: ' ';\n      position: absolute;\n      display: block;\n      top: -1px;\n      bottom: -1px;\n      width: 100%;\n      background-color: @primary;\n    }\n    .marker {\n      transform: scale(1);\n      opacity: 1;\n\n      &:before {\n        opacity: 0;\n        transform: scale(1.1, 1.1);\n      }\n    }\n    .circle, .triangle {\n      background-color: @primary;\n\n      :global i {\n        color: #ffffff;\n        opacity: 1;\n      }\n    }\n    .triangle {\n      opacity: 1;\n    }\n  }\n\n  &.inverted {\n    .marker {\n      left: 0px;\n      .triangle {\n      \ttransform: rotate(90deg) skewX(-30deg) scale(1,.866);\n        left: -2px;\n        top: 11px;\n      }\n    }\n  }\n\n  &.vertical {\n    width: 0;\n    height: 100%;\n    left: auto;\n\n    .triangle {\n    \ttransform: rotate(-0deg) skewX(-30deg) scale(1,.866);\n      left: 11px;\n      top: 16px;\n    }\n\n    .marker {\n      left: -15px;\n      top: -15px;\n      width: 30px;\n      height: 30px;\n    }\n\n    &:hover, &.active {\n      &:before {\n        top: auto;\n        bottom: auto;\n        height: 100%;\n        left: -1px;\n        right: -1px;\n        width: auto;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/dnd/droppable/droppable.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport forEach from 'lodash.foreach';\nimport AnimateProps from 'components/animate-props';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nimport styles from './droppable.less';\nimport AddBallon from './add-ballon';\nimport Marker from './marker';\n\nexport default class Droppable extends Component {\n  static propTypes = {\n    dndActions: PropTypes.object.isRequired,\n    dragging: PropTypes.bool.isRequired,\n    activeDropInfo: PropTypes.any.isRequired,\n    activeDragInfo: PropTypes.any.isRequired,\n    dropInfo: PropTypes.object.isRequired,\n    minHeight: PropTypes.number.isRequired,\n    minWidth: PropTypes.number.isRequired,\n    children: PropTypes.node,\n    className: PropTypes.string,\n    style: PropTypes.object,\n    draggingData: PropTypes.object.isRequired,\n    accepts: PropTypes.any,\n    rejects: PropTypes.any,\n    type: PropTypes.string,\n    showMarks: PropTypes.bool.isRequired,\n    isActive: PropTypes.bool.isRequired,\n    orientation: PropTypes.string.isRequired,\n    elementsMenuSpot: PropTypes.string,\n    selectedId: PropTypes.string,\n    openElementsMenu: PropTypes.func.isRequired,\n    placeholder: PropTypes.bool,\n    hidePlaceholder: PropTypes.bool,\n    Placeholder: PropTypes.object,\n    placeholderRender: PropTypes.func\n  };\n\n  static contextTypes = {\n    dropBlock: PropTypes.bool\n  };\n\n  static childContextTypes = {\n    dropHighlight: PropTypes.string.isRequired,\n    dropBlock: PropTypes.bool\n  };\n\n  static defaultProps = {\n    orientation: 'vertical',\n    minHeight: 150,\n    minWidth: 50\n  };\n\n  getInitState () {\n    return {\n      closeToMargin: false\n    };\n  }\n\n  getChildContext () {\n    const {dragging} = this.props;\n    const childContext = {\n      dropHighlight: 'none'\n    };\n\n    if (dragging) {\n      if (this.droppableHere()) {\n        if (this.props.orientation && this.props.orientation === 'horizontal') {\n          childContext.dropHighlight = 'horizontal';\n        } else {\n          childContext.dropHighlight = 'vertical';\n        }\n      } else if (this.draggingSelf()) {\n        childContext.dropBlock = true;\n      }\n    }\n\n    return childContext;\n  }\n\n  componentWillReceiveProps () {\n    const containerRect = findDOMNode(this).getBoundingClientRect();\n    if (containerRect.left < 40) {\n      if (!this.state.closeToMargin) {\n        this.setState({\n          closeToMargin: true\n        });\n      }\n    } else if (this.state.closeToMargin) {\n      this.setState({\n        closeToMargin: false\n      });\n    }\n  }\n\n  @bind\n  onMouseEnter () {\n    if (!this.props.isActive) {\n      const order = this.hasChildren();\n\n      this.setState({\n        order\n      });\n\n      if (!order) {\n        const {onDroppable} = this.props.dndActions;\n        onDroppable(this.props.dropInfo);\n      }\n    }\n  }\n\n  @bind\n  onMouseLeave () {\n    if (this.props.isActive) {\n      const {dropInfo} = this.props;\n      const {outDroppable} = this.props.dndActions;\n\n      outDroppable(dropInfo.id);\n    }\n  }\n\n  hasChildren () {\n    const children = this.props.children;\n    let _hasChildren = false;\n    if (children) {\n      if (children instanceof Array) {\n        _hasChildren = children.length > 0;\n      } else if (children instanceof Object) {\n        _hasChildren = true;\n      }\n    }\n    return _hasChildren;\n  }\n\n  draggingSelf () {\n    const {dropInfo, activeDragInfo} = this.props;\n    return dropInfo.id && activeDragInfo.id && dropInfo.id === activeDragInfo.id;\n  }\n\n  droppableHere () {\n    const {draggingData, accepts, rejects, type} = this.props;\n    let is = true;\n\n    const dropBlock = this.context.dropBlock;\n    if (this.draggingSelf() || dropBlock) {\n      return false;\n    }\n\n    // Droppable restrictions\n    if (accepts) {\n      if (accepts !== 'any' && accepts !== draggingData.type) {\n        is = false;\n      }\n    } else if (rejects) {\n      if (rejects === 'any' || rejects === draggingData.type) {\n        is = false;\n      }\n    }\n\n    // Dragging restrictions\n    if (is && draggingData.droppableOn) {\n      if (draggingData.droppableOn !== 'any' && type !== draggingData.droppableOn) {\n        is = false;\n      }\n    }\n\n    return is;\n  }\n\n  getEvents (droppableHere) {\n    const {dragging} = this.props;\n    if (dragging && droppableHere) {\n      return {\n        onMouseOver: this.onMouseEnter,\n        onMouseLeave: this.onMouseLeave\n      };\n    }\n  }\n\n  addSpotClick (position, dom) {\n    this.props.openElementsMenu({\n      targetId: this.props.dropInfo.id || 'body',\n      targetType: this.props.type,\n      targetPosition: position,\n      container: dom || this.refs.spot0,\n      accepts: this.props.accepts,\n      rejects: this.props.rejects\n    });\n  }\n\n  render () {\n    const {dragging, minHeight, minWidth, className, style, showMarks, isActive, hidePlaceholder} = this.props;\n    const droppableHere = this.droppableHere();\n\n    let children = this.props.children;\n    const hasChildren = this.hasChildren();\n\n    // style\n    const inlineStyle = Object.assign({}, style || {});\n    if (!hasChildren && (!hidePlaceholder || hidePlaceholder && this.droppableHere())) {\n      inlineStyle.minHeight = minHeight;\n      inlineStyle.minWidth = minWidth;\n    }\n\n    // children\n    if (hasChildren && dragging && droppableHere) {\n      children = this.renderDropMarkers(children);\n    } else if (hasChildren && !dragging && showMarks) {\n      children = this.renderAddMarkers(children);\n    }\n\n    return (\n      <div\n        className={cx(styles.droppable, className, isActive && styles.active)}\n        draggable='false'\n        style={inlineStyle}\n        {...this.getEvents(droppableHere)}\n      >\n        {hasChildren ? children : this.renderPlaceholder()}\n      </div>\n    );\n  }\n\n  renderDropMarkers (children) {\n    const {isActive, activeDropInfo, dropInfo, activeDragInfo, orientation, dndActions} = this.props;\n    const isDraggingParent = activeDragInfo.parentId === dropInfo.id;\n\n    const tempChildren = [];\n\n    if (!isDraggingParent || activeDragInfo.positionInParent !== 0) {\n      tempChildren.push(\n        <Marker\n          key='marker'\n          dndActions={dndActions}\n          orientation={orientation}\n          active={isActive && activeDropInfo.position === 0}\n          report={{...this.props.dropInfo, position: 0}}\n        />\n      );\n    }\n\n    forEach(children, (child, index) => {\n      tempChildren.push(child);\n\n      if (!isDraggingParent ||\n          activeDragInfo.positionInParent !== index &&\n          activeDragInfo.positionInParent !== index + 1) {\n        tempChildren.push((\n          <Marker\n            key={`marker${index}`}\n            dndActions={dndActions}\n            orientation={orientation}\n            active={isActive && activeDropInfo.position === index + 1}\n            report={{...this.props.dropInfo, position: index + 1}}\n          />\n        ));\n      }\n    });\n\n    return tempChildren;\n  }\n\n  renderAddMarkers (children) {\n    const tempChildren = [\n      this.renderMark(0)\n    ];\n\n    forEach(children, (child, index) => {\n      tempChildren.push(child);\n      tempChildren.push(this.renderMark(index + 1));\n    });\n\n    return tempChildren;\n  }\n\n  renderMark (position) {\n    const {elementsMenuSpot, selectedId, orientation, dropInfo} = this.props;\n    const vertical = orientation === 'horizontal';\n    const active = elementsMenuSpot === position && selectedId === dropInfo.id;\n\n    return (\n      <AddBallon\n        key={`mark${position}`}\n        position={position}\n        onClick={::this.addSpotClick}\n        vertical={vertical}\n        active={active}\n        ref={`spot${position}`}\n      />\n    );\n  }\n\n  renderPlaceholder () {\n    const {placeholder, hidePlaceholder, Placeholder, isActive, placeholderRender} = this.props;\n    if (placeholder && (!hidePlaceholder || hidePlaceholder && this.droppableHere())) {\n      let result;\n      const customProps = {\n        spotClick: ::this.addSpotClick,\n        isActive\n      };\n\n      if (Placeholder) {\n        result = (\n          <Placeholder {...customProps} />\n        );\n      } else if (placeholderRender) {\n        result = placeholderRender(customProps);\n      } else {\n        result = this.renderDefaultPlaceholder();\n      }\n\n      return result;\n    }\n  }\n\n  renderDefaultPlaceholder () {\n    let result;\n\n    if (this.props.isActive) {\n      const props = {\n        scaleX: '150%',\n        scaleY: '150%'\n      };\n      const options = {\n        duration: 600,\n        loop: true\n      };\n      result = (\n        <AnimateProps props={props} options={options}>\n          <i className='material-icons'>add_circle</i>\n        </AnimateProps>\n      );\n    } else {\n      const addSpotClick = this.addSpotClick.bind(this, 0, null);\n      result = (\n        <div>\n          <span>Drop elements here or </span>\n          <span className='link' onClick={addSpotClick} ref='spot0'>\n            <span>click to add</span>\n          </span>\n        </div>\n      );\n    }\n\n    return (\n      <div className={cx('drop-placeholder', this.props.isActive && 'active')}>\n        {result}\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/dnd/droppable/droppable.less",
    "content": ""
  },
  {
    "path": "lib/shared/components/dnd/droppable/index.js",
    "content": "import * as dndActions from 'actions/dnd';\n\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {openElementsMenu} from 'actions/page-builder';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport Droppable from './droppable';\n\n@connect(\n  (state, props) => ({\n    elementsMenuSpot: state.pageBuilder.elementsMenuSpot,\n    selectedId: state.pageBuilder.selectedId,\n    dragging: state.dnd.dragging,\n    activeDropInfo: state.dnd.dropInfo,\n    activeDragInfo: state.dnd.dragInfo,\n    draggingData: state.dnd.draggingData,\n    showMarks: props.showMarks !== false && // TODO split this into variables\n              state.router.location.query.build &&\n              state.pageBuilder.editing &&\n              !state.pageBuilder.linkingData &&\n              (props.dropInfo.id === 'body' ||\n                (state.pageBuilder.selectedParent === props.dropInfo.id &&\n                 state.pageBuilder.selectedElement &&\n                 (!state.pageBuilder.selectedElement.children ||\n                   state.pageBuilder.selectedElement.children.constructor !== Array)) ||\n                 (state.pageBuilder.selectedId === props.dropInfo.id)),\n    isActive: state.dnd.dragging && state.dnd.dropInfo.id === props.dropInfo.id\n  }),\n  (dispatch) => ({\n    dndActions: bindActionCreators(dndActions, dispatch),\n    ...bindActionCreators({openElementsMenu}, dispatch)\n  })\n)\nexport default class DroppableContainer extends Component {\n  static propTypes = {\n    dropInfo: PropTypes.object.isRequired\n  };\n\n  render () {\n    return <Droppable {...this.props} />;\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/dnd/droppable/marker.jsx",
    "content": "import cx from 'classnames';\nimport utils from 'helpers/utils';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nimport styles from './marker.less';\n\nexport default class Marker extends Component {\n  static propTypes = {\n    dndActions: PropTypes.object.isRequired,\n    report: PropTypes.object.isRequired,\n    active: PropTypes.bool,\n    orientation: PropTypes.string\n  };\n\n  getInitState () {\n    return {\n      visible: false\n    };\n  }\n\n  componentDidMount () {\n    this.onMouseMoveListener = ::this.onMouseMove;\n    document.addEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  componentWillUnmount () {\n    document.removeEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  onMouseMove (event) {\n    const elementOffset = utils.getOffsetRect(findDOMNode(this));\n    const distance = Math.abs(elementOffset.top - event.pageY);\n\n    if (distance < 100 && !this.state.visible) {\n      this.setState({\n        visible: true\n      });\n      document.removeEventListener('mousemove', this.onMouseMoveListener);\n    }\n  }\n\n  onMouseEnter () {\n    const {onDroppable} = this.props.dndActions;\n    onDroppable(this.props.report, this.props.orientation);\n  }\n\n  onMouseLeave () {\n    const {outDroppable} = this.props.dndActions;\n    outDroppable(this.props.report.id);\n  }\n\n  render () {\n    const {orientation, active} = this.props;\n\n    return (\n      <div\n        className={cx(styles.marker, active && styles.active, styles[orientation], this.state.visible && styles.visible)}\n        onMouseEnter={::this.onMouseEnter}\n        onMouseLeave={::this.onMouseLeave}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/dnd/droppable/marker.less",
    "content": "@import '~styles/colors.less';\n\n.marker {\n  background-color: @primary;\n  opacity: 0.2;\n  margin-bottom: 0px;\n  transition: all 0.3s ease-out;\n}\n\n.vertical {\n  height: 0;\n\n  &.visible {\n    height: 8px;\n    margin-bottom: 1px;\n  }\n  &.active {\n    height: 12px;\n  }\n}\n\n.horizontal {\n  display: table-cell;\n  width: 0;\n\n  &.visible {\n    width: 7px;\n  }\n  &.active {\n    width: 10px;\n  }\n}\n\n.active {\n  background-color: #33CC33;\n  opacity: 0.7;\n}\n"
  },
  {
    "path": "lib/shared/components/image.jsx",
    "content": "import utils from 'helpers/utils';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nexport default class Image extends Component {\n  static propTypes = {\n    id: PropTypes.string.isRequired,\n    width: PropTypes.number,\n    height: PropTypes.number\n  };\n\n  static defaultProps = {\n    width: 200,\n    height: 0\n  };\n\n  render () {\n    const {id, width, height, ...htmlProps} = this.props;\n    let result = null;\n\n    if (id) {\n      const url = utils.getBestImageUrl(id, width, height);\n      result = (\n        <img src={url} {...htmlProps} />\n      );\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/medium-editor/index.jsx",
    "content": "import './index.less';\n\nimport Component from 'components/component';\nimport MediumEditor from 'medium-editor';\nimport React from 'react';\nimport {findDOMNode} from 'react-dom';\n\nexport default class MediumEditorElement extends Component {\n  static propTypes = {\n    tag: React.PropTypes.string,\n    className: React.PropTypes.string,\n    value: React.PropTypes.string.isRequired,\n    onChange: React.PropTypes.func.isRequired,\n    options: React.PropTypes.obj\n  };\n\n  static defaultProps = {\n    tag: 'div'\n  };\n\n  getInitState () {\n    this.currentValue = this.props.value;\n    return {\n      value: this.props.value\n    };\n  }\n\n  componentDidMount () {\n    this.medium = new MediumEditor(findDOMNode(this), this.props.options);\n    this.medium.subscribe('editableInput', this.onChange.bind(this));\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (this.currentValue !== nextProps.value) {\n      this.currentValue = nextProps.value;\n      this.setState({\n        value: nextProps.value\n      });\n    }\n  }\n\n  componentWillUnmount () {\n    this.medium.destroy();\n  }\n\n  onChange () {\n    const value = findDOMNode(this).innerHTML;\n    this.currentValue = value;\n    this.props.onChange && this.props.onChange(value);\n  }\n\n  render () {\n    return (\n      <this.props.tag\n        className={this.props.className}\n        contentEditable\n        dangerouslySetInnerHTML={{__html: this.state.value}}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/medium-editor/index.less",
    "content": "@import '~styles/colors.less';\n\n:global {\n  @-webkit-keyframes medium-editor-image-loading {\n    0% {\n      -webkit-transform: scale(0);\n              transform: scale(0); }\n    100% {\n      -webkit-transform: scale(1);\n              transform: scale(1); } }\n\n  @keyframes medium-editor-image-loading {\n    0% {\n      -webkit-transform: scale(0);\n              transform: scale(0); }\n    100% {\n      -webkit-transform: scale(1);\n              transform: scale(1); } }\n\n  @-webkit-keyframes medium-editor-pop-upwards {\n    0% {\n      opacity: 0;\n      -webkit-transform: matrix(0.97, 0, 0, 1, 0, 12);\n              transform: matrix(0.97, 0, 0, 1, 0, 12); }\n    20% {\n      opacity: .7;\n      -webkit-transform: matrix(0.99, 0, 0, 1, 0, 2);\n              transform: matrix(0.99, 0, 0, 1, 0, 2); }\n    40% {\n      opacity: 1;\n      -webkit-transform: matrix(1, 0, 0, 1, 0, -1);\n              transform: matrix(1, 0, 0, 1, 0, -1); }\n    100% {\n      -webkit-transform: matrix(1, 0, 0, 1, 0, 0);\n              transform: matrix(1, 0, 0, 1, 0, 0); } }\n\n  @keyframes medium-editor-pop-upwards {\n    0% {\n      opacity: 0;\n      -webkit-transform: matrix(0.97, 0, 0, 1, 0, 12);\n              transform: matrix(0.97, 0, 0, 1, 0, 12); }\n    20% {\n      opacity: .7;\n      -webkit-transform: matrix(0.99, 0, 0, 1, 0, 2);\n              transform: matrix(0.99, 0, 0, 1, 0, 2); }\n    40% {\n      opacity: 1;\n      -webkit-transform: matrix(1, 0, 0, 1, 0, -1);\n              transform: matrix(1, 0, 0, 1, 0, -1); }\n    100% {\n      -webkit-transform: matrix(1, 0, 0, 1, 0, 0);\n              transform: matrix(1, 0, 0, 1, 0, 0); } }\n\n  .medium-editor-anchor-preview {\n    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n    font-size: 16px;\n    left: 0;\n    line-height: 1.4;\n    max-width: 280px;\n    position: absolute;\n    text-align: center;\n    top: 0;\n    word-break: break-all;\n    word-wrap: break-word;\n    visibility: hidden;\n    z-index: 2000; }\n    .medium-editor-anchor-preview a {\n      color: #fff;\n      display: inline-block;\n      margin: 5px 5px 10px; }\n\n  .medium-editor-anchor-preview-active {\n    visibility: visible; }\n\n  .medium-editor-dragover {\n    background: #ddd; }\n\n  .medium-editor-image-loading {\n    -webkit-animation: medium-editor-image-loading 1s infinite ease-in-out;\n            animation: medium-editor-image-loading 1s infinite ease-in-out;\n    background-color: #333;\n    border-radius: 100%;\n    display: inline-block;\n    height: 40px;\n    width: 40px; }\n\n  .medium-editor-placeholder {\n    position: relative; }\n    .medium-editor-placeholder:after {\n      content: attr(data-placeholder) !important;\n      font-style: italic;\n      left: 0;\n      position: absolute;\n      top: 0;\n      white-space: pre; }\n\n  .medium-toolbar-arrow-under:after, .medium-toolbar-arrow-over:before {\n    border-style: solid;\n    content: '';\n    display: block;\n    height: 0;\n    left: 50%;\n    margin-left: -8px;\n    position: absolute;\n    width: 0; }\n\n  .medium-toolbar-arrow-under:after {\n    border-width: 8px 8px 0 8px; }\n\n  .medium-toolbar-arrow-over:before {\n    border-width: 0 8px 8px 8px;\n    top: -8px; }\n\n  .medium-editor-toolbar {\n    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n    font-size: 16px;\n    left: 0;\n    position: absolute;\n    top: 0;\n    visibility: hidden;\n    z-index: 2000; }\n    .medium-editor-toolbar ul {\n      margin: 0;\n      padding: 0; }\n    .medium-editor-toolbar li {\n      float: left;\n      list-style: none;\n      margin: 0;\n      padding: 0; }\n      .medium-editor-toolbar li button {\n        box-sizing: border-box;\n        cursor: pointer;\n        display: block;\n        font-size: 14px;\n        line-height: 1.33;\n        margin: 0;\n        padding: 15px;\n        text-decoration: none; }\n        .medium-editor-toolbar li button:focus {\n          outline: none; }\n      .medium-editor-toolbar li .medium-editor-action-underline {\n        text-decoration: underline; }\n      .medium-editor-toolbar li .medium-editor-action-pre {\n        font-family: Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n        font-size: 12px;\n        font-weight: 100;\n        padding: 15px 0; }\n\n  .medium-editor-toolbar-active {\n    visibility: visible; }\n\n  .medium-editor-sticky-toolbar {\n    position: fixed;\n    top: 1px; }\n\n  .medium-editor-toolbar-active.medium-editor-stalker-toolbar {\n    -webkit-animation: medium-editor-pop-upwards 160ms forwards linear;\n            animation: medium-editor-pop-upwards 160ms forwards linear; }\n\n  .medium-editor-action-bold {\n    font-weight: bolder; }\n\n  .medium-editor-action-italic {\n    font-style: italic; }\n\n  .medium-editor-toolbar-form {\n    display: none; }\n    .medium-editor-toolbar-form input,\n    .medium-editor-toolbar-form a {\n      font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif; }\n    .medium-editor-toolbar-form .medium-editor-toolbar-form-row {\n      line-height: 14px;\n      margin-left: 5px;\n      padding-bottom: 5px; }\n    .medium-editor-toolbar-form .medium-editor-toolbar-input,\n    .medium-editor-toolbar-form label {\n      border: none;\n      box-sizing: border-box;\n      font-size: 14px;\n      margin: 0;\n      padding: 6px;\n      width: 316px;\n      display: inline-block; }\n      .medium-editor-toolbar-form .medium-editor-toolbar-input:focus,\n      .medium-editor-toolbar-form label:focus {\n        -webkit-appearance: none;\n           -moz-appearance: none;\n                appearance: none;\n        border: none;\n        box-shadow: none;\n        outline: 0; }\n    .medium-editor-toolbar-form a {\n      display: inline-block;\n      font-size: 24px;\n      font-weight: bolder;\n      margin: 0 10px;\n      text-decoration: none; }\n\n  .medium-editor-toolbar-actions:after {\n    clear: both;\n    content: \"\";\n    display: table; }\n\n  [data-medium-editor-element] img {\n    max-width: 100%; }\n\n  [data-medium-editor-element] sub {\n    vertical-align: sub; }\n\n  [data-medium-editor-element] sup {\n    vertical-align: super; }\n\n  .medium-editor-hidden {\n    display: none; }\n\n  .medium-toolbar-arrow-under:after {\n    border-color: rgba(19, 22, 24, 0.95) transparent transparent transparent;\n    top: 40px;\n  }\n\n  .medium-toolbar-arrow-over:before {\n    border-color: transparent transparent rgba(19, 22, 24, 0.95) transparent;\n  }\n\n  .medium-editor-toolbar {\n    background-color: rgba(19, 22, 24, 0.95);\n    border-radius: 4px;\n  }\n  .medium-editor-toolbar li button {\n    background-color: transparent;\n    border: none;\n    border-right: 1px solid rgba(0, 0, 0, 0.2);\n    box-sizing: border-box;\n    color: #efefef;\n    height: 40px;\n    min-width: 40px;\n    padding: 0;\n    -webkit-transition: background-color 0.2s ease-in, color 0.2s ease-in;\n    transition: background-color 0.2s ease-in, color 0.2s ease-in;\n  }\n  .medium-editor-toolbar li button:hover {\n    background-color: #12171a;\n    color: #fff;\n  }\n  .medium-editor-toolbar li .medium-editor-button-first {\n    border-bottom-left-radius: 4px;\n    border-top-left-radius: 4px;\n  }\n  .medium-editor-toolbar li .medium-editor-button-last {\n    border-bottom-right-radius: 4px;\n    border-right: none;\n    border-top-right-radius: 4px;\n  }\n\n  .medium-editor-toolbar li .medium-editor-button-active {\n    position: relative;\n    color: #fff;\n  }\n  .medium-editor-toolbar li .medium-editor-button-active {\n    &:after {\n      content: \" \";\n      position: absolute;\n      left: 0; right: 0; bottom: 0;\n      height: 3px;\n      background-color: @primary;\n    }\n  }\n\n  .medium-editor-toolbar-form {\n    background: transparent;\n    border-radius: 4px;\n    color: #fff;\n  }\n  .medium-editor-toolbar-form .medium-editor-toolbar-input {\n    background: transparent;\n    color: #fff;\n    height: 40px;\n  }\n  .medium-editor-toolbar-form .medium-editor-toolbar-input::-webkit-input-placeholder {\n    color: #fff;\n    color: rgba(255, 255, 255, 0.8);\n  }\n  .medium-editor-toolbar-form .medium-editor-toolbar-input:-moz-placeholder {\n    /* Firefox 18- */\n    color: #fff;\n    color: rgba(255, 255, 255, 0.8);\n  }\n  .medium-editor-toolbar-form .medium-editor-toolbar-input::-moz-placeholder {\n    /* Firefox 19+ */\n    color: #fff;\n    color: rgba(255, 255, 255, 0.8);\n  }\n  .medium-editor-toolbar-form .medium-editor-toolbar-input:-ms-input-placeholder {\n    color: #fff;\n    color: rgba(255, 255, 255, 0.8);\n  }\n  .medium-editor-toolbar-form a {\n    color: #fff;\n    font-size: 14px;\n  }\n\n  .medium-editor-toolbar-anchor-preview {\n    background: rgba(19, 22, 24, 0.95);\n    border-radius: 4px;\n    color: #fff;\n  }\n\n  .medium-editor-placeholder:after {\n    color: rgba(19, 22, 24, 0.95);\n  }\n}\n"
  },
  {
    "path": "lib/shared/components/portal.jsx",
    "content": "import Component from 'components/component';\nimport ReactDOM from 'react-dom';\nimport {PropTypes} from 'react';\n\nconst renderSubtreeIntoContainer = ReactDOM.unstable_renderSubtreeIntoContainer;\n\nexport default class Portal extends Component {\n  static propTypes = {\n    children: PropTypes.node.isRequired,\n    attachTo: PropTypes.string\n  };\n\n  componentDidMount () {\n    this._target =\n      this.props.attachTo ?\n      document.getElementById(this.props.attachTo).appendChild(document.createElement('div')) :\n      document.body.appendChild(document.createElement('div'));\n    this._portal = renderSubtreeIntoContainer(this, this.props.children, this._target);\n  }\n\n  componentDidUpdate () {\n    this._portal = renderSubtreeIntoContainer(this, this.props.children, this._target);\n  }\n\n  componentWillUnmount () {\n    ReactDOM.unmountComponentAtNode(this._target);\n    if (this.props.attachTo) {\n      document.getElementById(this.props.attachTo).removeChild(this._target);\n    } else {\n      document.body.removeChild(this._target);\n    }\n  }\n\n  render () {\n    return null;\n  }\n}\n"
  },
  {
    "path": "lib/shared/decorators/bind.js",
    "content": "export default function bind (target, key, {value: fn}) {\n  return {\n    configurable: true,\n    get () {\n      const value = fn.bind(this);\n      Object.defineProperty(this, key, {\n        value,\n        configurable: true,\n        writable: true\n      });\n      return value;\n    }\n  };\n}\n"
  },
  {
    "path": "lib/shared/decorators/debounce.js",
    "content": "export default function debounce (delay = 300) {\n  return (target, key, descriptor) => {\n    const fn = descriptor.value;\n    let args;\n    let context;\n    let timer;\n\n    descriptor.value = function debounced (...a) {\n      args = a;\n      context = this;\n      clearTimeout(timer);\n      timer = setTimeout(() => {\n        fn.apply(context, args);\n        args = context = timer = null;\n      }, delay);\n    };\n\n    return descriptor;\n  };\n}\n"
  },
  {
    "path": "lib/shared/decorators/query-props.jsx",
    "content": "import forEach from 'lodash.foreach';\nimport hoistStatics from 'hoist-non-react-statics';\nimport qs from 'query-string';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nfunction sanatizeQueryObject (query) {\n  if (query.limit) {\n    query.limit = parseInt(query.limit, 10);\n  }\n  if (query.page) {\n    query.page = parseInt(query.page, 10);\n  }\n  return query;\n}\n\nexport function getQueryVariables (query) {\n  const queryVariables = {};\n\n  if (query.sort) {\n    queryVariables.sort = {\n      value: query.sort,\n      type: 'String'\n    };\n  }\n  if (query.order) {\n    queryVariables.order = {\n      value: query.order,\n      type: 'String'\n    };\n  }\n  if (query.limit) {\n    queryVariables.limit = {\n      value: query.limit,\n      type: 'Int'\n    };\n  }\n  if (query.filters) {\n    queryVariables.filters = {\n      value: query.filters,\n      type: '[Filter]'\n    };\n  }\n  if (query.page) {\n    queryVariables.page = {\n      value: query.page,\n      type: 'Int'\n    };\n  }\n  if (query.search && query.s) {\n    queryVariables.search = {\n      value: query.search,\n      type: 'String'\n    };\n    queryVariables.s = {\n      value: query.s,\n      type: 'String'\n    };\n  }\n\n  return queryVariables;\n}\n\nconst _defaultQuery = {\n  page: 1,\n  limit: 10\n};\n\nexport default function queryProps (defaultQuery = _defaultQuery) {\n  return function wrapWithQueryProps (WrappedComponent) {\n    class QueryProps extends Component {\n      static propTypes = {\n        query: PropTypes.object,\n        location: PropTypes.object\n      };\n\n      getInitState (props = this.props) {\n        if (!props.location.query) {\n          props.location.query = qs.parse(props.location.search);\n        }\n\n        const query = sanatizeQueryObject(Object.assign(\n          {},\n          defaultQuery,\n          props.location.query\n        ));\n        const queryVariables = getQueryVariables(query);\n\n        return {\n          queryVariables,\n          query,\n          hasQueryChanged: true\n        };\n      }\n\n      componentWillReceiveProps (nextProps) {\n        const nextState = {};\n\n        if (!nextProps.location.query) {\n          nextProps.location.query = qs.parse(nextProps.location.search);\n        }\n\n        const nextQuery = sanatizeQueryObject(Object.assign(\n          {},\n          defaultQuery,\n          nextProps.location.query\n        ));\n\n        if (this.hasQueryChanged(nextQuery)) {\n          nextState.hasQueryChanged = true;\n          Object.assign(nextState, this.getInitState(nextProps));\n        } else {\n          nextState.hasQueryChanged = false;\n        }\n\n        this.setState(nextState);\n      }\n\n      static defaultQuery = defaultQuery;\n\n      hasQueryChanged (newQuery) {\n        const currentQuery = this.state.query;\n        let changed = !newQuery && currentQuery || newQuery && !currentQuery;\n\n        if (!changed && newQuery) {\n          forEach(newQuery, (value, key) => {\n            if (!currentQuery[key] || currentQuery[key] !== value) {\n              changed = true;\n            }\n          });\n        }\n        if (!changed && currentQuery) {\n          forEach(currentQuery, (value, key) => {\n            if (!newQuery[key] || newQuery[key] !== value) {\n              changed = true;\n            }\n          });\n        }\n        return changed;\n      }\n\n      render () {\n        return <WrappedComponent {...this.props} {...this.state} />;\n      }\n    }\n\n    return hoistStatics(QueryProps, WrappedComponent);\n  };\n}\n"
  },
  {
    "path": "lib/shared/elements/button/classes.js",
    "content": "import jss from 'helpers/stylesheet';\n\nexport default jss.createRules({\n  holder: {\n    textAlign: 'center'\n  },\n  button: {\n    color: '#ffffff',\n    backgroundColor: '#282828',\n    borderRadius: '3px 3px 3px 3px',\n    padding: '11px 20px 11px 20px',\n    maxWidth: '250px',\n    display: 'inline-block',\n    cursor: 'pointer',\n    ':hover': {\n      color: '#282828',\n      backgroundColor: '#ffffff'\n    }\n  },\n  sided: {\n    display: 'block',\n    '>div': {\n      display: 'table-cell',\n      verticalAlign: 'middle'\n    }\n  }\n});\n"
  },
  {
    "path": "lib/shared/elements/button/index.jsx",
    "content": "import cx from 'classnames';\nimport forEach from 'lodash.foreach';\nimport React, {PropTypes} from 'react';\nimport {changeElementChildren} from 'actions/page-builder';\n\nimport classes from './classes';\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport style from './style';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class Button extends Component {\n\n  static propTypes = {\n    layout: PropTypes.string.isRequired,\n    arrange: PropTypes.string.isRequired,\n    styleClassMap: PropTypes.object,\n    children: PropTypes.node,\n    relax: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    layout: 'text',\n    arrange: 'side'\n  };\n\n  static defaultChildren = [\n    {\n      tag: 'TextBox',\n      children: 'Button text',\n      subComponent: true\n    }\n  ];\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n  static style = style;\n\n  componentWillReceiveProps (nextProps) {\n    const {relax} = this.props;\n    const editing = relax.editing;\n    if (editing && relax.selected) {\n      // Check if layout changed\n      if (nextProps.layout !== this.props.layout) {\n        // 'text', 'icontext', 'texticon', 'icon'\n        const newChildren = [];\n\n        let textChild = false;\n        let iconChild = false;\n\n        if (nextProps.layout === 'text' || nextProps.layout === 'texticon' || nextProps.layout === 'icontext') {\n          forEach(relax.element.children, (child) => {\n            if (child.tag === 'TextBox') {\n              textChild = child;\n            }\n          });\n\n          if (!textChild) {\n            textChild = {\n              tag: 'TextBox',\n              children: 'Button text',\n              subComponent: true\n            };\n          }\n        }\n\n        if (nextProps.layout === 'icon' || nextProps.layout === 'texticon' || nextProps.layout === 'icontext') {\n          forEach(relax.element.children, (child) => {\n            if (child.tag === 'Icon') {\n              iconChild = child;\n            }\n          });\n\n          if (!iconChild) {\n            iconChild = {\n              tag: 'Icon',\n              subComponent: true\n            };\n          }\n        }\n\n        if (iconChild && textChild) {\n          if (nextProps.layout === 'icon' || nextProps.layout === 'icontext') {\n            newChildren.push(iconChild);\n            if (nextProps.layout === 'icontext') {\n              newChildren.push(textChild);\n            }\n          } else if (nextProps.layout === 'text' || nextProps.layout === 'texticon') {\n            newChildren.push(textChild);\n            if (nextProps.layout === 'texticon') {\n              newChildren.push(iconChild);\n            }\n          }\n        } else {\n          newChildren.push(iconChild || textChild);\n        }\n\n        relax.dispatch(changeElementChildren(relax.element.id, newChildren));\n      }\n    }\n  }\n\n  render () {\n    const classMap = this.props.styleClassMap || {};\n\n    const props = {\n      htmlTag: 'div',\n      ...this.props.relax,\n      settings,\n      className: cx(classes.holder, classMap.holder)\n    };\n\n    return (\n      <Element {...props}>\n        <div className={cx(classes.button, classMap.button)}>\n          {this.renderChildren()}\n        </div>\n      </Element>\n    );\n  }\n\n  renderChildren () {\n    let result;\n    if (this.props.arrange === 'blocks' || this.props.layout === 'text' || this.props.layout === 'icon') {\n      result = this.props.children;\n    } else {\n      result = (\n        <div className={cx(classes.sided)}>\n          {this.props.children[0]}\n          {this.props.children[1]}\n        </div>\n      );\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/button/props-schema.js",
    "content": "export default [\n  {\n    label: 'Layout',\n    type: 'Select',\n    id: 'layout',\n    props: {\n      labels: ['Text', 'Icon - Text', 'Text - Icon', 'Icon'],\n      values: ['text', 'icontext', 'texticon', 'icon']\n    },\n    unlocks: {\n      icontext: [\n        {\n          label: 'Arrange',\n          type: 'Select',\n          id: 'arrange',\n          props: {\n            labels: ['Side by side', 'Blocks'],\n            values: ['side', 'blocks']\n          }\n        }\n      ],\n      texticon: [\n        {\n          label: 'Arrange',\n          type: 'Select',\n          id: 'arrange',\n          props: {\n            labels: ['Side by side', 'Blocks'],\n            values: ['side', 'blocks']\n          }\n        }\n      ]\n    }\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/button/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini ui-2_link-66'\n  },\n  category: 'content',\n  drop: false,\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/button/style.js",
    "content": "import Utils from 'helpers/utils';\nimport {getColorString} from 'helpers/colors';\n\nexport default {\n  type: 'button',\n  options: [\n    {\n      label: 'Layout',\n      type: 'Section',\n      id: 'layoutSection',\n      unlocks: [\n        {\n          label: 'Size',\n          type: 'Select',\n          id: 'size',\n          props: {\n            labels: ['Full Width', 'Fit Content', 'Max Width (px)', 'Strict (px)'],\n            values: ['full', 'fit', 'max', 'strict']\n          },\n          unlocks: {\n            fit: [\n              {\n                label: 'Horizontal alignment',\n                type: 'Select',\n                id: 'alignment',\n                props: {\n                  labels: ['Left', 'Center', 'Right'],\n                  values: ['left', 'center', 'right']\n                }\n              }\n            ],\n            max: [\n              {\n                label: 'Max Width',\n                type: 'Number',\n                id: 'maxWidth',\n                props: {\n                  allowed: ['%', 'px']\n                }\n              },\n              {\n                label: 'Horizontal alignment',\n                type: 'Select',\n                id: 'alignment',\n                props: {\n                  labels: ['Left', 'Center', 'Right'],\n                  values: ['left', 'center', 'right']\n                }\n              }\n            ],\n            strict: [\n              {\n                label: 'Width',\n                type: 'Pixels',\n                id: 'width'\n              },\n              {\n                label: 'Height',\n                type: 'Pixels',\n                id: 'height'\n              },\n              {\n                label: 'Horizontal alignment',\n                type: 'Select',\n                id: 'alignment',\n                props: {\n                  labels: ['Left', 'Center', 'Right'],\n                  values: ['left', 'center', 'right']\n                }\n              }\n            ]\n          }\n        },\n        {\n          label: 'Padding',\n          type: 'Optional',\n          id: 'usePadding',\n          unlocks: [\n            {\n              type: 'Padding',\n              id: 'padding'\n            }\n          ]\n        }\n      ]\n    },\n\n    {\n      label: 'Default state',\n      type: 'Section',\n      id: 'defaultSection',\n      unlocks: [\n        {\n          label: 'Text Color',\n          type: 'Optional',\n          id: 'useColor',\n          unlocks: [\n            {\n              type: 'Color',\n              id: 'color'\n            }\n          ]\n        },\n        {\n          label: 'Background',\n          type: 'Optional',\n          id: 'useBackground',\n          unlocks: [\n            {\n              type: 'Color',\n              id: 'backgroundColor'\n            }\n          ]\n        },\n        {\n          label: 'Border',\n          type: 'Optional',\n          id: 'useBorder',\n          unlocks: [\n            {\n              type: 'Border',\n              id: 'border'\n            }\n          ]\n        },\n        {\n          label: 'Rounded Corners',\n          type: 'Optional',\n          id: 'useCorners',\n          unlocks: [\n            {\n              type: 'Corners',\n              id: 'corners'\n            }\n          ]\n        }\n      ]\n    },\n    {\n      label: 'Overed state',\n      type: 'Section',\n      id: 'overedSection',\n      unlocks: [\n        {\n          label: 'Text Color',\n          type: 'Optional',\n          id: 'useColorOver',\n          unlocks: [\n            {\n              type: 'Color',\n              id: 'colorOver'\n            }\n          ]\n        },\n        {\n          label: 'Background',\n          type: 'Optional',\n          id: 'useBackgroundOver',\n          unlocks: [\n            {\n              type: 'Color',\n              id: 'backgroundColorOver'\n            }\n          ]\n        },\n        {\n          label: 'Border Color',\n          type: 'Optional',\n          id: 'useBorderColorOver',\n          unlocks: [\n            {\n              type: 'Color',\n              id: 'borderColorOver'\n            }\n          ]\n        },\n        {\n          label: 'Rounded Corners',\n          type: 'Optional',\n          id: 'useCornersOver',\n          unlocks: [\n            {\n              type: 'Corners',\n              id: 'cornersOver'\n            }\n          ]\n        },\n        {\n          label: 'Animation on Over',\n          type: 'Optional',\n          id: 'useAnimation',\n          unlocks: [\n            {\n              type: 'Number',\n              id: 'animationDuration',\n              props: {\n                label: 'ms'\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      label: 'Pressed state',\n      type: 'Section',\n      id: 'pressedSection',\n      unlocks: [\n        {\n          label: 'Text Color',\n          type: 'Optional',\n          id: 'useColorPressed',\n          unlocks: [\n            {\n              type: 'Color',\n              id: 'colorPressed'\n            }\n          ]\n        },\n        {\n          label: 'Background',\n          type: 'Optional',\n          id: 'useBackgroundPressed',\n          unlocks: [\n            {\n              type: 'Color',\n              id: 'backgroundColorPressed'\n            }\n          ]\n        },\n        {\n          label: 'Border Color',\n          type: 'Optional',\n          id: 'useBorderColorPressed',\n          unlocks: [\n            {\n              type: 'Color',\n              id: 'borderColorPressed'\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  defaults: {\n    size: 'fit',\n    maxWidth: '100%',\n    width: '70px',\n    height: '70px',\n    alignment: 'center',\n    usePadding: false,\n    padding: '0px',\n\n    useColor: false,\n    color: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    useBackground: false,\n    backgroundColor: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    useBorder: false,\n    border: false,\n    useCorners: false,\n    corners: '0px',\n\n    useColorOver: false,\n    colorOver: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    useBackgroundOver: false,\n    backgroundColorOver: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    useBorderColorOver: false,\n    borderColorOver: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    useCornersOver: false,\n    cornersOver: '0px',\n    useAnimation: false,\n    animationDuration: 500,\n\n    useColorPressed: false,\n    colorPressed: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    useBackgroundPressed: false,\n    backgroundColorPressed: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    useBorderColorPressed: false,\n    borderColorPressed: {\n      value: '#ffffff',\n      opacity: 100\n    }\n  },\n  rules: (props) => {\n    const rules = {\n      button: {\n        backgroundColor: props.useBackground && getColorString(props.backgroundColor),\n        borderRadius: props.useCorners && props.corners,\n        padding: props.usePadding && props.padding,\n        '*': {\n          color: props.useColor && getColorString(props.color)\n        },\n        ':hover': {\n          '*': {\n            color: props.useColorOver && getColorString(props.colorOver)\n          },\n          borderRadius: props.useCornersOver && props.cornersOver,\n          backgroundColor: props.useBackgroundOver && getColorString(props.backgroundColorOver)\n        },\n        ':active': {\n          '*': {\n            color: props.useColorPressed && getColorString(props.colorPressed)\n          },\n          backgroundColor: props.useBackgroundPressed && getColorString(props.backgroundColorPressed)\n        }\n      },\n      holder: {}\n    };\n\n    if (props.size === 'strict') {\n      rules.button.width = props.width;\n      rules.button.height = props.height;\n    } else if (props.size === 'fit') {\n      rules.button.display = 'inline-block';\n    } else if (props.size === 'max') {\n      rules.button.maxWidth = props.maxWidth;\n    }\n\n    if (props.size !== 'full') {\n      rules.holder.textAlign = props.alignment;\n      rules.button.display = 'inline-block';\n    }\n\n    if (props.useAnimation) {\n      rules.button.transition = `all ${props.animationDuration}ms cubic-bezier(0.190, 1.000, 0.220, 1.000)`;\n    }\n\n    if (props.useBorder) {\n      Utils.applyBorders(rules.button, props.border);\n\n      if (props.useBorderColorOver) {\n        rules.button[':hover'].borderColor = getColorString(props.borderColorOver);\n      }\n\n      if (props.useBorderColorPressed) {\n        rules.button[':active'].borderColor = getColorString(props.borderColorPressed);\n      }\n    }\n\n    return rules;\n  }\n};\n"
  },
  {
    "path": "lib/shared/elements/column/index.jsx",
    "content": "import React, {PropTypes} from 'react';\n\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class Column extends Component {\n  static propTypes = {\n    padding: PropTypes.string.isRequired,\n    vertical: PropTypes.string.isRequired,\n    left: PropTypes.number,\n    right: PropTypes.number,\n    bottom: PropTypes.number,\n    layout: PropTypes.object,\n    relax: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    padding: '15px',\n    vertical: 'top'\n  };\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n\n  render () {\n    const layout = this.props.layout || {\n      width: 'auto'\n    };\n\n    const style = {\n      display: layout.width === 'block' ? 'block' : 'table-cell',\n      verticalAlign: this.props.vertical\n    };\n\n    if (this.props.left || this.props.right) {\n      style.padding = `0px ${this.props.right}px 0px ${this.props.left}px`;\n    }\n    if (this.props.bottom) {\n      style.marginBottom = this.props.bottom;\n    }\n\n    const contentStyle = {\n      padding: this.props.padding\n    };\n\n    if (layout.width !== 'block') {\n      style.width = `${layout.widthPerc}`;\n    }\n\n    return (\n      <div className='column' style={style}>\n        <Element {...this.props.relax} htmlTag='div' style={contentStyle} settings={settings}>\n          {this.renderContent()}\n        </Element>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/column/props-schema.js",
    "content": "\nexport default [\n  {\n    label: 'Padding',\n    type: 'Padding',\n    id: 'padding'\n  },\n  {\n    label: 'Content vertical align',\n    type: 'Select',\n    id: 'vertical',\n    props: {\n      labels: ['Top', 'Center', 'Bottom'],\n      values: ['top', 'middle', 'bottom']\n    }\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/column/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini design_distribute-horizontal'\n  },\n  category: 'structure',\n  drop: {\n    rejects: 'Section',\n    customDropArea: true\n  },\n  drag: {\n    droppableOn: 'Columns'\n  }\n};\n"
  },
  {
    "path": "lib/shared/elements/columns/classes.js",
    "content": "import jss from 'helpers/stylesheet';\n\nexport default jss.createRules({\n  row: {\n    display: 'table',\n    tableLayout: 'fixed',\n    width: '100%'\n  }\n});\n"
  },
  {
    "path": "lib/shared/elements/columns/index.jsx",
    "content": "import utils from 'helpers/utils';\nimport Droppable from 'components/dnd/droppable';\nimport React, {PropTypes} from 'react';\n\nimport classes from './classes';\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class Columns extends Component {\n  static propTypes = {\n    spacing: PropTypes.string,\n    spacingRows: PropTypes.string,\n    columnsDisplay: PropTypes.array.isRequired,\n    children: PropTypes.node,\n    relax: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    spacing: '10px',\n    spacingRows: '10px',\n    columnsDisplay: []\n  };\n\n  static defaultChildren = [\n    {tag: 'Column'}, {tag: 'Column'}\n  ];\n  static propsSchema = propsSchema;\n  static settings = settings;\n\n  render () {\n    return (\n      <Element {...this.props.relax} htmlTag='div' settings={settings}>\n        {this.renderChildren()}\n      </Element>\n    );\n  }\n\n  renderChildren () {\n    const {columnsDisplay, relax, spacing} = this.props;\n    const children = [];\n    const numChildren = this.props.children && this.props.children.length || 0;\n    const layout = utils.parseColumnsDisplay(columnsDisplay, numChildren, relax.display !== 'desktop');\n    const editing = relax.editing;\n\n    const spacingNum = parseFloat(spacing, 10);\n    const spaceThird = Math.round(spacingNum / 3 * 100) / 100;\n    const spaceSides = spaceThird * 2;\n    let result;\n\n    const dropInfo = {\n      id: relax.element.id\n    };\n\n    if (numChildren > 0) {\n      for (let i = 0; i < numChildren; i++) {\n        if (layout[i].width === 'block') {\n          children.push(this.renderBlock(\n            this.props.children[i],\n            layout[i],\n            i !== numChildren - 1 ? spacingNum : 0\n          ));\n        } else {\n          const columns = [];\n          for (i; i < numChildren; i++) {\n            if (layout[i].width !== 'block' && !(columns.length > 0 && layout[i].break)) {\n              const isLastColumn = (\n                columns.length !== 0 &&\n                (i === numChildren - 1 || (layout[i + 1].width === 'block' || layout[i + 1].break))\n              );\n              let left;\n              let right;\n\n              if (columns.length === 0) {\n                left = 0;\n                right = spaceSides;\n              } else if (isLastColumn) {\n                left = spaceSides;\n                right = 0;\n              } else {\n                left = spaceThird;\n                right = spaceThird;\n              }\n\n              columns.push(this.renderColumn(this.props.children[i], layout[i], left, right));\n            } else {\n              i--;\n              break;\n            }\n          }\n\n          if (editing && relax.display === 'desktop') {\n            result = (\n              <Droppable\n                type={relax.element.tag}\n                dropInfo={dropInfo}\n                {...settings.drop}\n                className={classes.row}\n                placeholder\n              >\n                {columns}\n              </Droppable>\n            );\n            break;\n          } else {\n            const style = {};\n\n            if (i < numChildren - 1) {\n              style.paddingBottom = this.props.spacingRows;\n            }\n\n            children.push(\n              <div className={classes.row} key={i} style={style}>\n                {columns}\n              </div>\n            );\n          }\n        }\n      }\n    } else if (editing) {\n      result = (\n        <Droppable\n          type={relax.element.tag}\n          dropInfo={dropInfo}\n          {...settings.drop}\n          className={classes.row}\n          placeholder\n        />\n      );\n    }\n\n    return result || children;\n  }\n\n  renderColumn (child, layout, left, right) {\n    return React.cloneElement(child, {\n      layout,\n      left,\n      right\n    });\n  }\n\n  renderBlock (child, layout, bottom) {\n    return React.cloneElement(child, {\n      layout,\n      bottom\n    });\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/columns/props-schema.js",
    "content": "export default [\n  {\n    id: 'add-button',\n    label: false,\n    type: 'Button',\n    props: {\n      label: 'Add column',\n      action: 'addElement',\n      actionProps: {tag: 'Column'}\n    }\n  },\n  {\n    label: 'Space between columns',\n    type: 'Pixels',\n    id: 'spacing'\n  },\n  {\n    label: 'Space between rows (not used on desktop)',\n    type: 'Pixels',\n    id: 'spacingRows'\n  },\n  {\n    label: 'Columns display',\n    type: 'ManageColumns',\n    id: 'columnsDisplay'\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/columns/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini '\n  },\n  category: 'structure',\n  drop: {\n    orientation: 'horizontal',\n    selectionChildren: 'column',\n    accepts: 'Column',\n    customDropArea: true\n  },\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/component.jsx",
    "content": "import Component from 'components/component';\nimport Droppable from 'components/dnd/droppable';\nimport React, {PropTypes} from 'react';\n\nimport Empty from './element/empty';\n\nexport default class ElementComponent extends Component {\n  static propTypes = {\n    children: PropTypes.node,\n    relax: PropTypes.object.isRequired\n  };\n\n  renderContent (customProps, children = this.props.children) {\n    const {relax} = this.props;\n    const editing = relax.editing;\n    let result;\n\n    if (editing) {\n      const droppableProps = Object.assign({\n        dropInfo: {\n          id: relax.element.id\n        },\n        type: relax.element.tag,\n        placeholder: true,\n        placeholderRender: ::this.renderPlaceholder\n      }, this.constructor.settings.drop);\n\n      result = (\n        <Droppable {...droppableProps}>\n          {children}\n        </Droppable>\n      );\n    } else {\n      result = children;\n    }\n\n    return result;\n  }\n\n  renderPlaceholder (options) {\n    const {relax} = this.props;\n    return (\n      <Empty {...options} settings={this.constructor.settings} element={relax.element} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/container/index.jsx",
    "content": "import React, {PropTypes} from 'react';\n\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport style from './style';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class Container extends Component {\n  static propTypes = {\n    styleClassMap: PropTypes.object,\n    children: PropTypes.node,\n    relax: PropTypes.object.isRequired\n  };\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n  static style = style;\n\n  render () {\n    const classMap = this.props.styleClassMap || {};\n\n    const props = {\n      ...this.props.relax,\n      htmlTag: 'div',\n      style: {\n        position: 'relative'\n      },\n      className: classMap.container,\n      settings\n    };\n\n    return (\n      <div className={classMap.holder}>\n        <Element {...props}>\n          {this.props.children}\n        </Element>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/container/props-schema.js",
    "content": "export default [];\n"
  },
  {
    "path": "lib/shared/elements/container/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini ui-2_enlarge-58'\n  },\n  category: 'structure',\n  drop: {\n    rejects: 'Section'\n  },\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/container/style.js",
    "content": "import utils from 'helpers/utils';\nimport {getColorString, applyBackground} from 'helpers/colors';\n\nexport default {\n  type: 'container',\n  options: [\n    {\n      label: 'Background Color',\n      type: 'Optional',\n      id: 'useBackgroundColor',\n      unlocks: [\n        {\n          type: 'Color',\n          id: 'backgroundColor',\n          props: {\n            gradients: true\n          }\n        }\n      ]\n    },\n    {\n      label: 'Max Width',\n      type: 'Optional',\n      id: 'useMaxWidth',\n      unlocks: [\n        {\n          label: 'Maximum Width',\n          type: 'Pixels',\n          id: 'widthPx',\n          props: {\n            min: 0,\n            max: false\n          }\n        },\n        {\n          label: 'Content horizontal alignment',\n          type: 'Select',\n          id: 'contentHorizontal',\n          props: {\n            labels: ['Left', 'Center', 'Right'],\n            values: ['left', 'center', 'right']\n          }\n        }\n      ]\n    },\n    {\n      label: 'Padding',\n      type: 'Padding',\n      id: 'padding'\n    },\n    {\n      label: 'Rounded Corners',\n      type: 'Optional',\n      id: 'useCorners',\n      unlocks: [\n        {\n          type: 'Corners',\n          id: 'corners'\n        }\n      ]\n    },\n    {\n      label: 'Border',\n      type: 'Optional',\n      id: 'useBorder',\n      unlocks: [\n        {\n          type: 'Border',\n          id: 'border'\n        }\n      ]\n    },\n    {\n      label: 'Shadow',\n      type: 'BoxShadow',\n      id: 'shadow'\n    }\n  ],\n  defaults: {\n    useBackgroundColor: false,\n    backgroundColor: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    useMaxWidth: true,\n    widthPx: '1000px',\n    contentHorizontal: 'center',\n    padding: '20px',\n    useCorners: false,\n    corners: '0px',\n    useBorder: false,\n    shadow: []\n  },\n  rules: (props) => {\n    const rule = {};\n    const holderRule = {};\n\n    props.useBackgroundColor && applyBackground(rule, props.backgroundColor);\n\n    if (props.useMaxWidth) {\n      rule.maxWidth = props.widthPx;\n      rule.width = '100%';\n      rule.display = 'inline-block';\n\n      holderRule.textAlign = props.contentHorizontal;\n    }\n\n    rule.padding = props.padding;\n    rule.borderRadius = props.useCorners && props.corners;\n\n    if (props.useBorder) {\n      utils.applyBorders(rule, props.border);\n    }\n\n    if (props.shadow && props.shadow.length > 0) {\n      utils.applyBoxShadows(rule, props.shadow);\n    }\n\n    return {\n      container: rule,\n      holder: holderRule\n    };\n  },\n  getIdentifierLabel: (props) => {\n    let str = '';\n\n    if (props.useMaxWidth) {\n      str += props.widthPx;\n    } else {\n      str += 'Full';\n    }\n\n    str += ' | ';\n\n    if (props.useBackgroundColor) {\n      str += getColorString(props.backgroundColor);\n    } else {\n      str += 'transparent';\n    }\n\n    return str;\n  }\n};\n"
  },
  {
    "path": "lib/shared/elements/counter/index.jsx",
    "content": "import cx from 'classnames';\nimport ReactCounter from 'react-counter';\nimport React, {PropTypes} from 'react';\n\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class Counter extends Component {\n  static propTypes = {\n    icon: PropTypes.string.isRequired,\n    style: PropTypes.any.isRequired,\n    styleClassMap: PropTypes.object,\n    align: PropTypes.string.isRequired,\n    begin: PropTypes.number.isRequired,\n    end: PropTypes.number.isRequired,\n    duration: PropTypes.number.isRequired,\n    relax: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    begin: 0,\n    end: 100,\n    duration: 2000,\n    align: 'center'\n  };\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n  static style = 'text';\n\n  getInitState () {\n    return {\n      animate: false\n    };\n  }\n\n  onEnterScreen () {\n    this.setState({\n      animate: true\n    });\n  }\n\n  render () {\n    const classMap = this.props.styleClassMap || {};\n\n    const props = {\n      ...this.props.relax,\n      htmlTag: 'div',\n      settings,\n      onEnterScreen: this.onEnterScreen.bind(this),\n      className: cx(classMap.text),\n      style: {\n        textAlign: this.props.align\n      }\n    };\n\n    return (\n      <Element {...props}>\n        {this.renderCounter()}\n      </Element>\n    );\n  }\n\n  renderCounter () {\n    let result;\n    if (this.state.animate) {\n      result = (\n        <ReactCounter begin={this.props.begin} end={this.props.end} time={this.props.duration} easing='outCube' />\n      );\n    } else {\n      result = <span>{this.props.begin}</span>;\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/counter/props-schema.js",
    "content": "export default [\n  {\n    type: 'Columns',\n    options: [\n      {\n        label: 'Begin',\n        type: 'Number',\n        id: 'begin'\n      },\n      {\n        label: 'End',\n        type: 'Number',\n        id: 'end'\n      }\n    ]\n  },\n  {\n    type: 'Columns',\n    options: [\n      {\n        label: 'Duration',\n        type: 'Number',\n        id: 'duration'\n      },\n      {\n        label: 'Alignment',\n        type: 'Select',\n        id: 'align',\n        props: {\n          labels: ['Left', 'Center', 'Right'],\n          values: ['left', 'center', 'right']\n        }\n      }\n    ]\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/counter/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini ui-2_time-countdown'\n  },\n  category: 'content',\n  style: 'text',\n  drop: false,\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/date/index.jsx",
    "content": "import cx from 'classnames';\nimport moment from 'moment';\nimport React, {PropTypes} from 'react';\n\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class Counter extends Component {\n  static propTypes = {\n    styleClassMap: PropTypes.object.isRequired,\n    date: PropTypes.number.isRequired,\n    format: PropTypes.string.isRequired,\n    customFormat: PropTypes.string,\n    relax: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    date: Date.now(),\n    format: 'LL',\n    customFormat: 'MMMM Do YYYY, h:mm:ss a'\n  };\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n  static style = 'text';\n\n  render () {\n    const classMap = this.props.styleClassMap || {};\n\n    const props = {\n      ...this.props.relax,\n      htmlTag: 'div',\n      settings,\n      className: cx(classMap.text)\n    };\n\n    const format = this.props.format;\n    const date = moment(parseInt(this.props.date, 10));\n\n    let dateStr = '';\n    if (format === 'fromNow') {\n      dateStr = date.fromNow();\n    } else if (format === 'custom') {\n      dateStr = date.format(this.props.customFormat);\n    } else {\n      dateStr = date.format(format);\n    }\n\n    return (\n      <Element {...props}>\n        {dateStr}\n      </Element>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/date/props-schema.jsx",
    "content": "import forEach from 'lodash.foreach';\nimport moment from 'moment';\n\nconst momentDate = moment();\nconst dateFormats = [\n  'fromNow',\n  'L',\n  'l',\n  'LL',\n  'll',\n  'LLL',\n  'lll',\n  'LLLL',\n  'llll',\n  'custom'\n];\nconst labels = [];\n\nforEach(dateFormats, (format) => {\n  if (format === 'fromNow') {\n    labels.push(momentDate.fromNow());\n  } else if (format === 'custom') {\n    labels.push('Custom');\n  } else {\n    labels.push(momentDate.format(format));\n  }\n});\n\nexport default [\n  {\n    label: 'Date',\n    type: 'Date',\n    id: 'date'\n  },\n  {\n    label: 'Format',\n    type: 'Select',\n    id: 'format',\n    props: {\n      values: dateFormats,\n      labels\n    },\n    unlocks: {\n      custom: [\n        {\n          label: 'Custom Format',\n          type: 'String',\n          id: 'customFormat'\n        }\n      ]\n    }\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/date/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini ui-1_calendar-60'\n  },\n  category: 'content',\n  drop: false,\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/dynamic-list/classes.js",
    "content": "import jss from 'helpers/stylesheet';\n\nexport default jss.createRules({\n  row: {\n    display: 'table',\n    width: '100%',\n    tableLayout: 'fixed',\n    textAlign: 'left'\n  },\n  column: {\n    display: 'table-cell',\n    verticalAlign: 'top',\n    position: 'relative'\n  }\n});\n"
  },
  {
    "path": "lib/shared/elements/dynamic-list/container.jsx",
    "content": "import * as elementsActions from 'actions/elements';\n\nimport utils from 'helpers/utils';\nimport React, {PropTypes} from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport {buildQueryAndVariables} from 'relax-fragments';\n\nimport settings from './settings';\nimport Component from '../component';\nimport Element from '../element';\nimport List from './list';\n\n@connect(\n  (state) => ({\n    elements: state.elements,\n    linkingData: state.pageBuilder.linkingData,\n    linkingDataElementId: state.pageBuilder.linkingDataElementId\n  }),\n  (dispatch) => bindActionCreators(elementsActions, dispatch)\n)\nexport default class DynamicListContainer extends Component {\n  static fragments = {\n    schemaList: {\n      _id: 1,\n      title: 1,\n      date: 1,\n      publishedDate: 1,\n      updatedDate: 1,\n      slug: 1,\n      state: 1,\n      properties: 1\n    }\n  };\n\n  static propTypes = {\n    children: PropTypes.node,\n    schemaId: PropTypes.string,\n    dataLinking: PropTypes.object,\n    limit: PropTypes.number,\n    columns: PropTypes.number,\n    renderChildren: PropTypes.func.isRequired,\n    verticalGutter: PropTypes.number.isRequired,\n    horizontalGutter: PropTypes.number.isRequired,\n    getElementData: PropTypes.func.isRequired,\n    elements: PropTypes.object.isRequired,\n    schemaLinks: PropTypes.object,\n    relax: PropTypes.object.isRequired\n  };\n\n  getInitState () {\n    this.fetchData(this.props);\n    return {};\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (nextProps.schemaId !== this.props.schemaId ||\n        nextProps.dataLinking !== this.props.dataLinking ||\n        nextProps.limit > this.props.limit) {\n      this.fetchData(nextProps);\n    }\n  }\n\n  fetchData (props) {\n    if (props.schemaId) {\n      props.getElementData(props.elementId, buildQueryAndVariables(\n        this.constructor.fragments,\n        {\n          schemaList: {\n            schemaId: {\n              value: props.schemaId,\n              type: 'ID!'\n            },\n            limit: {\n              value: props.limit,\n              type: 'Int'\n            }\n          }\n        }\n      ));\n    }\n  }\n\n  render () {\n    const props = {\n      htmlTag: 'div',\n      ...this.props.relax,\n      settings\n    };\n    const {elements, relax} = this.props;\n\n    const entries = elements[relax.element.id] && elements[relax.element.id].schemaList || [];\n    const elementsLinks = utils.getElementsSchemaLinks(this.props.schemaLinks);\n\n    return (\n      <Element {...props}>\n        <List {...this.props} entries={entries} elementsLinks={elementsLinks}>\n          {this.props.children}\n        </List>\n      </Element>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/dynamic-list/index.jsx",
    "content": "import React from 'react';\n\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport Component from '../component';\nimport Container from './container';\n\nexport default class DynamicList extends Component {\n  static defaultProps = {\n    limit: 10,\n    columns: 2,\n    verticalGutter: '10px',\n    horizontalGutter: '10px'\n  };\n  static propsSchema = propsSchema;\n  static settings = settings;\n\n  render () {\n    return <Container {...this.props} />;\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/dynamic-list/list.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport Droppable from 'components/dnd/droppable';\nimport React, {PropTypes} from 'react';\n\nimport classes from './classes';\nimport settings from './settings';\n\nexport default class List extends Component {\n  static propTypes = {\n    children: PropTypes.node,\n    entries: PropTypes.array.isRequired,\n    limit: PropTypes.number,\n    columns: PropTypes.number,\n    renderChildren: PropTypes.func.isRequired,\n    verticalGutter: PropTypes.number.isRequired,\n    horizontalGutter: PropTypes.number.isRequired,\n    elementsLinks: PropTypes.object.isRequired,\n    linkingData: PropTypes.bool.isRequired,\n    linkingDataElementId: PropTypes.string.isRequired,\n    relax: PropTypes.object.isRequired\n  };\n\n  isLinkingData () {\n    const {relax, linkingData, linkingDataElementId} = this.props;\n    return linkingData && linkingDataElementId === relax.element.id;\n  }\n\n  render () {\n    const items = [];\n    let number = Math.min(this.props.entries.length, this.props.limit);\n    if (number === 0) {\n      number = this.props.limit;\n    }\n\n    for (let i = 0; i < number; i) {\n      if (this.props.columns > 1) {\n        const columnItems = [];\n        for (let a = 0; a < this.props.columns && i < number; a++) {\n          columnItems.push(this.renderItem(i, a === 0, a === this.props.columns - 1));\n          i++;\n        }\n        if (columnItems.length < this.props.columns) {\n          const missing = this.props.columns - columnItems.length;\n          for (let c = 0; c < missing; c++) {\n            columnItems.push(this.renderItem(i, false, c === missing - 1, true));\n          }\n        }\n        items.push(this.renderRow(columnItems, i >= number));\n      } else {\n        items.push(this.renderItem(i));\n        i++;\n      }\n    }\n    return (\n      <div>\n        {items}\n      </div>\n    );\n  }\n\n  renderRow (items, isLast) {\n    const style = {};\n    if (!isLast) {\n      if (this.isLinkingData()) {\n        style.borderBottom = `${this.props.verticalGutter} solid rgba(0, 0, 0, 0.8)`;\n      } else {\n        style.marginBottom = this.props.verticalGutter;\n      }\n    }\n\n    return (\n      <div className={cx(classes.row)} style={style}>\n        {items}\n      </div>\n    );\n  }\n\n  renderItem (key, isFirst, isLast, dummy = false) {\n    let result;\n    const {relax, entries, elementsLinks, children, horizontalGutter, columns} = this.props;\n    const editing = relax.editing;\n    const schemaEntry = entries && entries[key];\n    const content = children && relax.renderChildren(relax.element.children, {\n      elementsLinks,\n      schemaEntry\n    });\n    const spaceThird = Math.round(parseInt(horizontalGutter, 10) / 3 * 100) / 100;\n    const spaceSides = spaceThird * 2;\n\n    if (!dummy) {\n      if (editing) {\n        result = (\n          <Droppable\n            key={key}\n            type={relax.element.tag}\n            dropInfo={{id: relax.element.id}}\n            {...settings.drop}\n            placeholder\n            style={{position: 'relative'}}\n          >\n            {content}\n          </Droppable>\n        );\n      } else {\n        result = content;\n      }\n    }\n\n    const style = {};\n    if (columns > 1) {\n      style.width = `${100 / columns}%`;\n\n      const isLinkingData = this.isLinkingData();\n      const property = !dummy && isLinkingData && 'border' || 'padding';\n\n      if (isFirst) {\n        style[`${property}Right`] = cx(`${spaceSides}px`, property === 'border' && 'solid rgba(0, 0, 0, 0.8)');\n      } else if (isLast) {\n        style[`${property}Left`] = cx(`${spaceSides}px`, property === 'border' && 'solid rgba(0, 0, 0, 0.8)');\n      } else {\n        style[`${property}Right`] = cx(`${spaceThird}px`, property === 'border' && 'solid rgba(0, 0, 0, 0.8)');\n        style[`${property}Left`] = cx(`${spaceThird}px`, property === 'border' && 'solid rgba(0, 0, 0, 0.8)');\n      }\n\n      if (dummy && isLinkingData) {\n        style.backgroundColor = 'rgba(0, 0, 0, 0.8)';\n      }\n    }\n\n    return (\n      <div className={cx(columns > 1 && classes.column)} style={style}>\n        {result}\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/dynamic-list/props-schema.js",
    "content": "import React from 'react';\n\nexport default [\n  {\n    label: 'Schema assigned',\n    id: 'schemaId',\n    type: 'SchemaPicker'\n  },\n  {\n    label: false,\n    id: 'linkDataButton',\n    type: 'Button',\n    props: {\n      label: (\n        <div>\n          <i className='material-icons'>radio_button_checked</i>\n          <span>Link data</span>\n        </div>\n      ),\n      action: 'linkData'\n    }\n  },\n  {\n    label: 'Limit',\n    id: 'limit',\n    type: 'Number'\n  },\n  {\n    label: 'Columns',\n    id: 'columns',\n    type: 'Number'\n  },\n  {\n    label: 'Vertical gutter',\n    id: 'verticalGutter',\n    type: 'Pixels'\n  },\n  {\n    label: 'Horizontal gutter',\n    id: 'horizontalGutter',\n    type: 'Pixels'\n  },\n  {\n    label: 'Filter',\n    id: 'filters',\n    type: 'Filters'\n  },\n  {\n    label: 'Sort',\n    id: 'sorts',\n    type: 'Sorts'\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/dynamic-list/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini ui-1_database'\n  },\n  drop: false,\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/element/context-menu/context-menu.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './context-menu.less';\n\nexport default class ContextMenu extends Component {\n  static propTypes = {\n    element: PropTypes.object.isRequired,\n    opened: PropTypes.bool.isRequired,\n    open: PropTypes.func.isRequired,\n    close: PropTypes.func.isRequired,\n    addingSymbol: PropTypes.bool.isRequired,\n    symbolTitle: PropTypes.string.isRequired,\n    openAddingSymbol: PropTypes.func.isRequired,\n    closeAddingSymbol: PropTypes.func.isRequired,\n    onSymbolChange: PropTypes.func.isRequired,\n    makeElementSymbol: PropTypes.func.isRequired,\n    makeElementDynamic: PropTypes.func.isRequired,\n    duplicateElement: PropTypes.func.isRequired,\n    removeElement: PropTypes.func.isRequired\n  };\n\n  saveSymbol (event) {\n    event.preventDefault();\n    const {symbolTitle, makeElementSymbol, element} = this.props;\n\n    if (this.props.symbolTitle) {\n      makeElementSymbol(element.id, symbolTitle);\n    } else {\n      this.refs.titleInput.focus();\n    }\n  }\n\n  makeDynamic (event) {\n    event.preventDefault();\n    const {makeElementDynamic, element} = this.props;\n    makeElementDynamic(element.id);\n  }\n\n  duplicate (event) {\n    event.preventDefault();\n    const {duplicateElement, element} = this.props;\n    duplicateElement(element.id);\n  }\n\n  remove (event) {\n    event.preventDefault();\n    const {removeElement, element} = this.props;\n    removeElement(element.id);\n  }\n\n  render () {\n    const {opened} = this.props;\n    return opened ? this.renderOpened() : this.renderClosed();\n  }\n\n  renderOpened () {\n    const {addingSymbol} = this.props;\n    return addingSymbol ? this.renderAddingSymbol() : this.renderActions();\n  }\n\n  renderClosed () {\n    return (\n      <button className={styles.closed} onClick={this.props.open}>\n        <i className='nc-icon-mini ui-2_menu-dots'></i>\n      </button>\n    );\n  }\n\n  renderAddingSymbol () {\n    const {closeAddingSymbol, symbolTitle, onSymbolChange} = this.props;\n    return (\n      <div className={styles.opened}>\n        <button className={styles.label} onClick={closeAddingSymbol}>\n          <i className='nc-icon-mini arrows-1_minimal-left'></i>\n          <span>Add to symbol library</span>\n        </button>\n        <form className={styles.form} onSubmit={::this.saveSymbol}>\n          <input\n            className={styles.input}\n            type='text'\n            value={symbolTitle}\n            onChange={onSymbolChange}\n            placeholder='Name Symbol'\n            ref='titleInput'\n          />\n          <div className={styles.saveButton} onClick={::this.saveSymbol}>Save</div>\n          <input type='submit' hidden />\n        </form>\n      </div>\n    );\n  }\n\n  renderActions () {\n    const {close, element, openAddingSymbol} = this.props;\n    return (\n      <div className={styles.opened} onMouseLeave={close}>\n        <div className={styles.label}>{element.label || element.tag}</div>\n        <div className={styles.action} onClick={openAddingSymbol}>Add to symbol library</div>\n        <div className={styles.action} onClick={::this.makeDynamic}>Make dynamic</div>\n        <div className={styles.action} onClick={::this.duplicate}>Duplicate</div>\n        <div className={styles.action} onClick={::this.remove}>Remove</div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/element/context-menu/context-menu.less",
    "content": "@import '~styles/colors.less';\n\n.closed {\n  width: 23px;\n  height: 23px;\n  border: 1px solid @primary;\n  display: inline-block;\n  position: absolute;\n  top: 4px;\n  right: 4px;\n\n  border-radius: 50%;\n\n  font-size: 11px;\n  line-height: 23px;\n  text-align: center;\n  color: @primary;\n  cursor: pointer;\n  pointer-events: all;\n  background-color: transparent;\n}\n\n.opened {\n  display: inline-block;\n  position: absolute;\n  top: 4px;\n  right: 4px;\n  pointer-events: all;\n  overflow: hidden;\n  padding-bottom: 7px;\n\n  width: 192px;\n  border-radius: 4px;\n  border: 1px solid @primary;\n  background-color: #ffffff;\n\n  -webkit-box-shadow: 0px 5px 9px 0px rgba(0,0,0,0.17);\n  -moz-box-shadow: 0px 5px 9px 0px rgba(0,0,0,0.17);\n  box-shadow: 0px 5px 9px 0px rgba(0,0,0,0.17);\n  text-align: center;\n}\n\n.label {\n  font-size: 10px;\n  line-height: 25px;\n  color: @primary;\n  padding-bottom: 3px;\n  text-transform: uppercase;\n  position: relative;\n  display: block;\n  text-align: center;\n  width: 100%;\n\n  :global i {\n    font-size: 14px;\n    position: absolute;\n    top: 0; left: 0;\n    line-height: 25px;\n    width: 25px;\n    text-align: center;\n  }\n}\n\n.form {\n  margin: 0;\n}\n\n.input {\n  margin: 0; padding: 0; outline: 0;\n  border: 1px solid rgba(0, 0, 0, 0.20);\n  height: 28px;\n  line-height: 28px;\n  color: #999999;\n  font-size: 12px;\n  font-weight: 300;\n  padding: 0 7px;\n  border-radius: 4px;\n  margin-top: 7px;\n  width: 175px;\n\n  &::-webkit-input-placeholder {\n    color: #dbdbdb;\n  }\n  &:-moz-placeholder {\n    color: #dbdbdb;\n  }\n  &::-moz-placeholder {\n    color: #dbdbdb;\n  }\n  &:-ms-input-placeholder {\n    color: #dbdbdb;\n  }\n  &::-ms-input-placeholder {\n    color: #dbdbdb;\n  }\n  &:placeholder-shown {\n    color: #dbdbdb;\n  }\n  &:focus {\n    border-color: @primary;\n  }\n}\n\n.saveButton {\n  color: @primary;\n  font-size: 12px;\n  font-weight: 800;\n  margin-top: 7px;\n  line-height: 25px;\n  text-transform: uppercase;\n  cursor: pointer;\n}\n\n.action {\n  line-height: 26px;\n  font-size: 12px;\n  color: #999999;\n  cursor: pointer;\n  text-transform: uppercase;\n\n  &:hover {\n    background-color: #efefef;\n    color: #333333;\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/element/context-menu/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {makeElementSymbol, makeElementDynamic, duplicateElement, removeElement} from 'actions/page-builder';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport ContextMenu from './context-menu';\n\n@connect(\n  () => ({}),\n  (dispatch) => bindActionCreators({\n    makeElementSymbol,\n    makeElementDynamic,\n    duplicateElement,\n    removeElement\n  }, dispatch)\n)\nexport default class ContextMenuContainer extends Component {\n  static propTypes = {\n    element: PropTypes.object.isRequired\n  };\n\n  getInitState () {\n    return {\n      opened: false,\n      addingSymbol: false,\n      symbolTitle: ''\n    };\n  }\n\n  openAddingSymbol () {\n    this.setState({\n      addingSymbol: true\n    });\n  }\n\n  closeAddingSymbol () {\n    this.setState({\n      addingSymbol: false\n    });\n  }\n\n  onSymbolChange (event) {\n    this.setState({\n      symbolTitle: event.target.value\n    });\n  }\n\n  open () {\n    this.setState({\n      opened: true\n    });\n  }\n\n  close () {\n    this.setState({\n      opened: false\n    });\n  }\n\n  render () {\n    return (\n      <ContextMenu\n        {...this.props}\n        {...this.state}\n        open={::this.open}\n        close={::this.close}\n        openAddingSymbol={::this.openAddingSymbol}\n        closeAddingSymbol={::this.closeAddingSymbol}\n        onSymbolChange={::this.onSymbolChange}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/element/element.jsx",
    "content": "import getElementPosition from 'helpers/get-element-position';\nimport utils from 'helpers/utils';\nimport velocity from 'velocity-animate';\nimport Component from 'components/component';\nimport Draggable from 'components/dnd/draggable';\nimport Droppable from 'components/dnd/droppable';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nimport Empty from './empty';\nimport Highlight from './highlight';\n\nexport default class Element extends Component {\n  static propTypes = {\n    display: PropTypes.string.isRequired,\n    editing: PropTypes.bool.isRequired,\n    settings: PropTypes.object.isRequired,\n    element: PropTypes.object.isRequired,\n    positionInParent: PropTypes.number.isRequired,\n    selected: PropTypes.bool.isRequired,\n    overed: PropTypes.bool.isRequired,\n    selectElement: PropTypes.func.isRequired,\n    htmlTag: PropTypes.string.isRequired,\n    className: PropTypes.string,\n    style: PropTypes.object,\n    animation: PropTypes.bool.isRequired,\n    animated: PropTypes.bool.isRequired,\n    animatedEditing: PropTypes.bool.isRequired,\n    children: PropTypes.node,\n    dragging: PropTypes.bool.isRequired,\n    overElement: PropTypes.func.isRequired,\n    outElement: PropTypes.func.isRequired,\n    onEnterScreen: PropTypes.func.isRequired,\n    startAnimation: PropTypes.func.isRequired,\n    resetAnimation: PropTypes.func.isRequired\n  };\n\n  static defaultProps = {\n    style: {},\n    className: ''\n  };\n\n  componentDidMount () {\n    const {editing, animation, onEnterScreen} = this.props;\n\n    if ((!editing && animation) || onEnterScreen) {\n      this.onScrollBind = ::this.onScroll;\n      window.addEventListener('scroll', this.onScrollBind);\n      this.onScroll();\n    }\n    if (editing) {\n      this.animationEditingBind = ::this.animationEditing;\n      window.addEventListener('animateElements', this.animationEditingBind);\n    }\n  }\n\n  componentWillUnmount () {\n    if (this.onScrollBind) {\n      window.removeEventListener('scroll', this.onScrollBind);\n    }\n    if (this.animationEditingBind) {\n      window.removeEventListener('animateElements', this.animationEditingBind);\n    }\n    if (this.animationTimeout) {\n      clearTimeout(this.animationTimeout);\n    }\n  }\n\n  animate () {\n    const dom = findDOMNode(this);\n    const {animation, startAnimation} = this.props;\n    startAnimation();\n    velocity(dom, animation.effect, {\n      duration: animation.duration,\n      display: null\n    });\n  }\n\n  animationInit () {\n    const animation = this.props.animation;\n    if (animation) {\n      this.animationTimeout = setTimeout(::this.animate, animation.delay);\n    }\n  }\n\n  animationEditing () {\n    if (this.props.animation) {\n      this.props.resetAnimation();\n      this.animationInit();\n    }\n  }\n\n  onScroll () {\n    const dom = findDOMNode(this);\n    const rect = dom.getBoundingClientRect();\n\n    if ((rect.top <= 0 && rect.bottom >= 0) || (rect.top > 0 && rect.top < window.outerHeight)) {\n      if (this.state.animation) {\n        this.animationInit();\n      }\n      if (this.props.onEnterScreen) {\n        this.props.onEnterScreen();\n      }\n      window.removeEventListener('scroll', this.onScrollBind);\n    }\n  }\n\n  onElementClick (event) {\n    const {selectElement, element} = this.props;\n    event.stopPropagation();\n    selectElement(element.id);\n  }\n\n  processAnimationStyle (style) {\n    const {editing, animation, animated, animatedEditing} = this.props;\n    if ((editing && animatedEditing) || (!editing && animation && !animated)) {\n      style.opacity = 0;\n    }\n  }\n\n  processPosition (style) {\n    const {element, display, editing} = this.props;\n    Object.assign(style, getElementPosition(element, display));\n\n    if (editing) {\n      if (style.position === 'fixed') {\n        if (style.top !== 'auto') {\n          if (utils.isPercentage(style.top)) {\n            const value = (1 - parseInt(style.top, 10) / 100) * 45;\n            style.top = `calc(${style.top} + ${value}px)`;\n          } else {\n            style.top = `calc(${style.top} + 45px)`;\n          }\n        }\n        if (style.bottom !== 'auto' && utils.isPercentage(style.bottom)) {\n          const value = parseInt(style.bottom, 10) / 100 * 45;\n          style.bottom = `calc(${style.bottom} - ${value}px)`;\n        }\n        if (style.right !== 'auto') {\n          if (utils.isPercentage(style.right)) {\n            const value = (1 - parseInt(style.right, 10) / 100) * 280;\n            style.right = `calc(${style.right} + ${value}px)`;\n          } else {\n            style.right = `calc(${style.right} + 280px)`;\n          }\n        }\n        if (style.left !== 'auto' && utils.isPercentage(style.left)) {\n          const value = parseInt(style.left, 10) / 100 * 280;\n          style.left = `calc(${style.left} - ${value}px)`;\n        }\n      }\n    }\n  }\n\n  onMouseOver (event) {\n    const {dragging, overed, selected, overElement, element} = this.props;\n    if (!dragging) {\n      event.stopPropagation();\n      clearTimeout(this.outTimeout);\n      if (!overed && !selected) {\n        overElement(element.id);\n      }\n    }\n  }\n\n  onMouseOut () {\n    const {dragging, overed} = this.props;\n    if (!dragging && overed) {\n      this.outTimeout = setTimeout(::this.selectOut, 50);\n    }\n  }\n\n  selectOut () {\n    const {outElement, element} = this.props;\n    outElement(element.id);\n  }\n\n  render () {\n    const {editing, settings, element, positionInParent, selected} = this.props;\n    let result;\n\n    if (editing && settings.drag) {\n      const draggableProps = Object.assign({\n        dragInfo: {\n          type: 'move',\n          id: element.id,\n          parentId: element.parent,\n          positionInParent\n        },\n        onClick: ::this.onElementClick,\n        type: element.tag,\n        disabled: (selected && settings.drag.dragSelected === false)\n      }, settings.drag);\n\n      result = (\n        <Draggable {...draggableProps}>\n          {this.renderTag()}\n        </Draggable>\n      );\n    } else {\n      result = this.renderTag();\n    }\n\n    return result;\n  }\n\n  renderTag () {\n    const HtmlTag = this.props.htmlTag;\n    const {style, className, editing, element} = this.props;\n\n    const calcStyle = Object.assign({}, style);\n    this.processAnimationStyle(calcStyle);\n    this.processPosition(calcStyle);\n\n    const tagProps = {\n      style: calcStyle,\n      className\n    };\n\n    if (editing) {\n      tagProps.onMouseOver = ::this.onMouseOver;\n      tagProps.onMouseOut = ::this.onMouseOut;\n      tagProps.ref = (ref) => {this.ref = ref;};\n      tagProps.id = element.id;\n    }\n\n    return (\n      <HtmlTag {...tagProps}>\n        {this.renderContent()}\n        {this.renderHighlight()}\n      </HtmlTag>\n    );\n  }\n\n  renderContent () {\n    const {editing, settings, element} = this.props;\n    let result;\n\n    if (editing && settings.drop && !settings.drop.customDropArea) {\n      const droppableProps = Object.assign({\n        dropInfo: {\n          id: element.id\n        },\n        type: element.tag,\n        placeholder: true,\n        placeholderRender: ::this.renderPlaceholder\n      }, settings.drop);\n\n      result = (\n        <Droppable {...droppableProps}>\n          {this.props.children}\n        </Droppable>\n      );\n    } else {\n      result = this.props.children;\n    }\n\n    return result;\n  }\n\n  renderPlaceholder (options) {\n    const {settings, element} = this.props;\n    return (\n      <Empty {...options} settings={settings} element={element} />\n    );\n  }\n\n  renderHighlight () {\n    const {editing, selected, overed, dragging, element, settings} = this.props;\n    if (editing && (selected || overed) && !dragging && this.ref) {\n      return (\n        <Highlight\n          element={element}\n          settings={settings}\n          selected={selected}\n          dom={this.ref}\n        />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/element/empty.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './empty.less';\n\nexport default class Empty extends Component {\n  static propTypes = {\n    settings: PropTypes.object.isRequired,\n    element: PropTypes.object.isRequired,\n    spotClick: PropTypes.func.isRequired\n  };\n\n  onClick () {\n    this.props.spotClick(0, this.refs.button);\n  }\n\n  render () {\n    const {settings, element} = this.props;\n    return (\n      <div className={styles.root}>\n        <div className={styles.info}>\n          <i className={settings.icon.class}>{settings.icon.content}</i>\n          <span>{`${element.label || element.tag} is empty`}</span>\n        </div>\n        <div className={styles.actions}>\n          <span>Drop elements here or </span>\n          <button className={styles.addButton} onClick={::this.onClick} ref='button'>click to add</button>\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/element/empty.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  text-align: center;\n  border: 1px solid #efefef;\n  min-height: 150px;\n}\n\n.info {\n  margin-top: 35px;\n  :global {\n    i, span {\n      display: inline-block;\n      vertical-align: top;\n      line-height: 36px;\n    }\n    i {\n      font-size: 14px;\n      color: @primary;\n      margin-right: 10px;\n    }\n    span {\n      font-size: 14px;\n      text-transform: uppercase;\n      color: @primary;\n    }\n  }\n}\n\n.actions {\n  font-size: 12px;\n  color: @adminText;\n}\n\n.addButton {\n  color: @primary;\n  text-decoration: underline;\n}\n"
  },
  {
    "path": "lib/shared/elements/element/highlight.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport Portal from 'components/portal';\nimport React, {PropTypes} from 'react';\n\nimport styles from './highlight.less';\nimport ContextMenu from './context-menu';\n\nexport default class Highlight extends Component {\n  static propTypes = {\n    selected: PropTypes.bool.isRequired,\n    element: PropTypes.object.isRequired,\n    settings: PropTypes.object.isRequired,\n    dom: PropTypes.node.isRequired\n  };\n\n  componentDidMount () {\n    this.mousewheelevt = (/Firefox/i.test(navigator.userAgent)) ? 'DOMMouseScroll' : 'mousewheel';\n    this.scrollBind = ::this.onScroll;\n    this.resizeBind = ::this.onResize;\n    document.body.addEventListener(this.mousewheelevt, this.scrollBind, false);\n    window.addEventListener('resize', this.resizeBind, false);\n    this.updateTimeoutInterval = setInterval(::this.updatePosition, 30);\n  }\n\n  componentWillUnmount () {\n    document.body.removeEventListener(this.mousewheelevt, this.scrollBind);\n    window.removeEventListener('resize', this.resizeBind);\n    clearInterval(this.updateTimeoutInterval);\n    clearTimeout(this.updateTimeout);\n  }\n\n  onScroll () {\n    this.updatePosition();\n    this.updateTimeout = setTimeout(::this.updatePosition, 0);\n  }\n\n  onResize () {\n    this.updatePosition();\n    this.updateTimeout = setTimeout(::this.updatePosition, 10);\n  }\n\n  updatePosition () {\n    this.forceUpdate();\n  }\n\n  getPosition () {\n    const rect = this.props.dom.getBoundingClientRect();\n    return {\n      left: rect.left,\n      top: rect.top,\n      width: rect.width || (rect.right - rect.left),\n      height: rect.height || (rect.bottom - rect.top)\n    };\n  }\n\n  render () {\n    const {selected, element, settings} = this.props;\n    const style = this.getPosition();\n    return (\n      <Portal>\n        <div\n          className={cx(\n            styles.root,\n            selected && styles.selected,\n            style.top < 60 && styles.inside,\n            element.tag === 'Symbol' && styles.symbol\n          )}\n          style={style}\n        >\n          <div className={styles.identifier}>\n            <i className={settings.icon.class}>{settings.icon.content}</i>\n            <span>{element.label || element.tag}</span>\n          </div>\n          {selected && style.height > 30 && this.renderContext()}\n        </div>\n      </Portal>\n    );\n  }\n\n  renderContext () {\n    const {element} = this.props;\n    return (\n      <ContextMenu element={element} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/element/highlight.less",
    "content": "@import '~styles/colors.less';\n@borderSize: 1px;\n\n.root {\n  position: absolute;\n  top: 0; left: 0; right: 0; bottom: 0;\n  pointer-events: none;\n  border: @borderSize solid @primary;\n  background-color: fade(@primary, 10%);\n  border-radius: 1px;\n  z-index: 1;\n  color: #ffffff;\n}\n\n.selected {\n  border: 1px solid @primary;\n  background-color: transparent;\n\n  &:before {\n    content: '';\n    display: inline-block;\n    position: absolute;\n    top: 0px; right: 0px; bottom: 0px; left: 0px;\n    border: 2px solid fade(@primary, 10%);\n  }\n\n  .identifier {\n    background-color: @primary;\n  }\n}\n\n.inside {\n  bottom: auto;\n  top: 0px;\n  left: 0px;\n  border-radius: 0px 0px 1px 0;\n}\n\n.symbol {\n  border-color: #ff9f00;\n  background-color: fade(#ff9f00, 10%);\n\n  .element-identifier {\n    background-color: #ff9f00;\n  }\n\n  &.selected {\n    border-color: #ff9f00;\n\n    &:before {\n      border: 2px solid fade(#ff9f00, 10%);\n    }\n\n    .identifier {\n      background-color: #ff9f00;\n    }\n  }\n}\n\n.identifier {\n  display: inline-block;\n  position: absolute;\n  top: -14px - @borderSize;\n  left: 0 - @borderSize;\n  font-size: 11px;\n  line-height: 15px;\n  padding: 0px 3px;\n  background-color: @primary;\n  border-radius: 1px 1px 0 0;\n\n  :global {\n    i, span {\n      display: inline-block;\n      vertical-align: top;\n    }\n    i {\n      margin-right: 3px;\n      font-size: 10px;\n      line-height: 15px;\n      color: #ffffff;\n    }\n    span {\n      line-height: 15px;\n      color: #ffffff;\n      font-size: 10px;\n      letter-spacing: 0.3px;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/element/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {selectElement, overElement, outElement} from 'actions/page-builder';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport Element from './element';\n\n@connect(\n  (state) => ({\n    editing: state.pageBuilder.editing,\n    overedId: state.pageBuilder.overedId,\n    selectedId: state.pageBuilder.selectedId,\n    display: state.display,\n    dragging: state.dnd.dragging,\n    building: state.router.location.query.build && true\n  }),\n  (dispatch) => bindActionCreators({\n    selectElement,\n    overElement,\n    outElement\n  }, dispatch)\n)\nexport default class ElementContainer extends Component {\n  static propTypes = {\n    children: PropTypes.node,\n    element: PropTypes.object.isRequired,\n    editing: PropTypes.bool.isRequired,\n    overedId: PropTypes.string,\n    selectedId: PropTypes.string,\n    building: PropTypes.bool\n  };\n\n  getInitState () {\n    const {element} = this.props;\n    return {\n      animation: element.animation && element.animation.use,\n      animated: false,\n      animatedEditing: false\n    };\n  }\n\n  componentWillReceiveProps () {\n    const {editing, element} = this.props;\n    if (editing && this.state.animation !== (element.animation && element.animation.use)) {\n      this.setState({\n        animation: element.animation && element.animation.use\n      });\n    }\n  }\n\n  startAnimation () {\n    this.setState({\n      animated: true,\n      animatedEditing: false\n    });\n  }\n\n  resetAnimation () {\n    this.setState({\n      animated: false,\n      animatedEditing: true\n    });\n  }\n\n  render () {\n    const {overedId, selectedId, element, building} = this.props;\n    return (\n      <Element\n        {...this.props}\n        {...this.state}\n        selected={building && selectedId === element.id}\n        overed={building && overedId === element.id}\n        startAnimation={::this.startAnimation}\n        resetAnimation={::this.resetAnimation}\n      >\n        {this.props.children}\n      </Element>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/form/index.jsx",
    "content": "import forEach from 'lodash.foreach';\nimport request from 'superagent';\nimport warning from 'warning';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport Component from '../component';\nimport Element from '../element';\n\n// import slugify from 'slug';\n\nexport default class Form extends Component {\n  static propTypes = {\n    action: PropTypes.string,\n    schema: PropTypes.string,\n    custom: PropTypes.string,\n    children: PropTypes.node,\n    relax: PropTypes.object.isRequired\n  };\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n\n  sendEmail (formData) {\n    request\n      .post('/send-email')\n      .set('Content-Type', 'application/json')\n      .type('json')\n      .send(formData)\n      .end((error, res) => {\n        warning(false, error);\n        warning(false, res);\n      });\n  }\n\n  addToSchema () {\n    // arg: formData\n    // let actions = schemaEntriesActionsFactory(this.props.schema);\n    //\n    // // Check required fields\n    // if (formData._title && !formData._slug) {\n    //   formData._slug = slugify(formData._title, {lower: true}).toLowerCase();\n    // }\n    //\n    // actions\n    //   .add(formData)\n    //   .then((result) => {\n    //\n    //   })\n    //   .catch(() => {\n    //\n    //   });\n  }\n\n  sendCustom () {\n    // arg: formData\n    // $\n    //   .post(this.props.custom, formData)\n    //   .done((response) => {\n    //\n    //   })\n    //   .fail((error) => {\n    //\n    //   });\n  }\n\n  onSubmit (event) {\n    event.preventDefault();\n    const formElement = findDOMNode(this);\n    const formData = {};\n\n    forEach(formElement.elements, (element) => {\n      formData[element.name] = element.value;\n    });\n\n    if (this.props.action === 'email') {\n      this.sendEmail(formData);\n    } else if (this.props.action === 'schema') {\n      this.addToSchema(formData);\n    } else if (this.props.action === 'custom') {\n      this.sendCustom(formData);\n    }\n  }\n\n  render () {\n    return (\n      <form onSubmit={::this.onSubmit}>\n        <Element {...this.props.relax} htmlTag='div' settings={settings}>\n          {this.props.children}\n        </Element>\n        <input type='submit' hidden />\n      </form>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/form/props-schema.js",
    "content": "import React from 'react';\n\nexport default [\n  {\n    label: 'Action',\n    type: 'Select',\n    id: 'action',\n    props: {\n      labels: ['Send e-mail', 'Schema entry', 'Custom endpoint'],\n      values: ['email', 'schema', 'custom']\n    },\n    unlocks: {\n      schema: [\n        {\n          label: 'Schema',\n          type: 'SelectEntry',\n          id: 'schema',\n          props: {\n            // store: schemasStore\n          }\n        }\n      ],\n      custom: [\n        {\n          label: 'Custom url',\n          type: 'String',\n          id: 'custom'\n        }\n      ]\n    }\n  },\n  {\n    label: false,\n    id: 'linkDataButton',\n    type: 'Button',\n    props: {\n      label: (\n        <div>\n          <i className='material-icons'>radio_button_checked</i>\n          <span>Link data</span>\n        </div>\n      ),\n      action: 'linkFormData'\n    }\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/form/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini ui-1_email-84'\n  },\n  category: 'form',\n  drop: {\n    rejects: 'Section'\n  },\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/gap/index.jsx",
    "content": "import React, {PropTypes} from 'react';\n\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class Gap extends Component {\n  static propTypes = {\n    amount: PropTypes.number.isRequired,\n    relax: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    amount: '30px'\n  };\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n\n  render () {\n    const style = {\n      height: this.props.amount\n    };\n\n    return (\n      <Element {...this.props.relax} htmlTag='div' style={style} settings={settings} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/gap/props-schema.js",
    "content": "export default [\n  {\n    label: 'Size',\n    type: 'Pixels',\n    id: 'amount'\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/gap/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini ui-1_bold-delete'\n  },\n  category: 'structure',\n  drop: false,\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/google-maps/index.jsx",
    "content": "import Utils from 'helpers/utils';\nimport React, {PropTypes} from 'react';\nimport {GoogleMap, GoogleMapLoader, Marker} from 'react-google-maps';\n\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class GoogleMapsElem extends Component {\n  static propTypes = {\n    zoom: PropTypes.number.isRequired,\n    lat: PropTypes.string.isRequired,\n    lng: PropTypes.string.isRequired,\n    height: PropTypes.number.isRequired,\n    scrollwheel: PropTypes.bool.isRequired,\n    zoomControls: PropTypes.bool.isRequired,\n    mapTypeControl: PropTypes.bool.isRequired,\n    streetViewControl: PropTypes.bool.isRequired,\n    useMarker: PropTypes.bool.isRequired,\n    relax: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    zoom: 0,\n    lat: '0',\n    lng: '0',\n    height: '250px',\n    scrollwheel: false,\n    zoomControls: true,\n    mapTypeControl: false,\n    streetViewControl: true,\n    useMarker: true\n  };\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n\n  getInitState () {\n    return {\n      ready: this.loadAPI()\n    };\n  }\n\n  componentDidUpdate (prevProps) {\n    if (this.props.relax.editing && this.state.ready && prevProps.height !== this.props.height && this._map) {\n      window.google.maps.event.trigger(this._map, 'resize');\n    }\n  }\n\n  loadAPI () {\n    let result = false;\n    if (typeof document !== 'undefined') {\n      if (!Utils.hasClass(document.body, 'googleMapsInitiated') &&\n          !Utils.hasClass(document.body, 'googleMapsLoading')) {\n        Utils.addClass(document.body, 'googleMapsLoading');\n\n        window.googleMapsInitiated = () => {\n          Utils.removeClass(document.body, 'googleMapsLoading');\n          Utils.addClass(document.body, 'googleMapsInitiated');\n          /* jshint ignore:start */\n          window.dispatchEvent(new Event('googleMapsInitiated'));\n          /* jshint ignore:end */\n        };\n\n        const script = document.createElement('script');\n        script.type = 'text/javascript';\n        script.src = 'https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=googleMapsInitiated';\n        document.body.appendChild(script);\n\n        window.addEventListener('googleMapsInitiated', this.onReady.bind(this));\n      } else if (!Utils.hasClass(document.body, 'googleMapsInitiated')) {\n        window.addEventListener('googleMapsInitiated', this.onReady.bind(this));\n      } else {\n        result = true;\n      }\n    }\n    return result;\n  }\n\n  onReady () {\n    this.setState({\n      ready: true\n    });\n  }\n\n  render () {\n    return (\n      <Element {...this.props.relax} htmlTag='div' settings={settings}>\n        {this.renderMap()}\n      </Element>\n    );\n  }\n\n  renderMap () {\n    if (this.state.ready) {\n      let result;\n      const editing = this.props.relax.editing;\n      const key =\n        this.props.zoom +\n        this.props.scrollwheel +\n        this.props.zoomControls +\n        this.props.streetViewControl +\n        this.props.mapTypeControl +\n        this.props.lat +\n        this.props.lng +\n        this.props.height;\n\n      const gmap = (\n        <GoogleMapLoader\n          key={key}\n          containerElement={\n            <div\n              style={{\n                height: this.props.height\n              }}\n            />\n          }\n          googleMapElement={\n            <GoogleMap\n              ref={(map) => {this._map = map;}}\n              containerProps={{\n                style: {\n                  height: this.props.height\n                }\n              }}\n              googleMapsApi={window.google.maps}\n              options={{\n                scrollwheel: this.props.scrollwheel,\n                zoomControl: this.props.zoomControls,\n                streetViewControl: this.props.streetViewControl,\n                mapTypeControl: this.props.mapTypeControl\n              }}\n              zoom={parseFloat(this.props.zoom, 10)}\n              center={{lat: parseFloat(this.props.lat, 10), lng: parseFloat(this.props.lng, 10)}}\n            >{this.renderMarker()}</GoogleMap>\n          }\n        />\n      );\n\n      if (editing) {\n        result = (\n          <div className='editing-wrapper'>\n            {gmap}\n            <div className='editing-cover'></div>\n          </div>\n        );\n      } else {\n        result = gmap;\n      }\n      return result;\n    }\n  }\n\n  renderMarker () {\n    if (this.props.useMarker) {\n      const position = {\n        lat: parseFloat(this.props.lat, 10),\n        lng: parseFloat(this.props.lng, 10)\n      };\n      return (\n        <Marker position={position} key={this.props.lat + this.props.lng} />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/google-maps/props-schema.js",
    "content": "import React from 'react';\n\nexport default [\n  {\n    label: 'Height',\n    type: 'Pixels',\n    id: 'height'\n  },\n  {\n    type: 'Columns',\n    options: [\n      {\n        label: 'Latitude',\n        type: 'Number',\n        id: 'lat',\n        props: {\n          arrows: false,\n          min: false\n        }\n      },\n      {\n        label: 'Longitude',\n        type: 'Number',\n        id: 'lng',\n        props: {\n          arrows: false,\n          min: false\n        }\n      }\n    ]\n  },\n  {\n    type: 'Columns',\n    options: [\n      {\n        label: 'Zoom',\n        type: 'Number',\n        id: 'zoom',\n        props: {\n          min: 0,\n          max: 21,\n          label: <i className='fa fa-search'></i>\n        }\n      },\n      {\n        label: 'Use scrollwheel',\n        type: 'Boolean',\n        id: 'scrollwheel'\n      }\n    ]\n  },\n  {\n    type: 'Columns',\n    options: [\n      {\n        label: 'Use marker',\n        type: 'Boolean',\n        id: 'useMarker'\n      },\n      {\n        label: 'Zoom controls',\n        type: 'Boolean',\n        id: 'zoomControls'\n      }\n    ]\n  },\n  {\n    type: 'Columns',\n    options: [\n      {\n        label: 'Map Type Controls',\n        type: 'Boolean',\n        id: 'mapTypeControl'\n      },\n      {\n        label: 'Streetview Control',\n        type: 'Boolean',\n        id: 'streetViewControl'\n      }\n    ]\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/google-maps/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini social_logo-google-plus'\n  },\n  category: 'media',\n  drop: false,\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/icon/classes.js",
    "content": "import jss from 'helpers/stylesheet';\n\nexport default jss.createRules({\n  holder: {\n    display: 'inline-block',\n    textAlign: 'center'\n  }\n});\n"
  },
  {
    "path": "lib/shared/elements/icon/index.jsx",
    "content": "import cx from 'classnames';\nimport React, {PropTypes} from 'react';\n\nimport classes from './classes';\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport style from './style';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class Icon extends Component {\n  static propTypes = {\n    icon: PropTypes.object.isRequired,\n    align: PropTypes.string.isRequired,\n    styleClassMap: PropTypes.object,\n    relax: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    icon: {\n      family: 'fontawesome',\n      className: 'fa fa-beer'\n    },\n    align: 'center'\n  };\n  static propsSchema = propsSchema;\n  static settings = settings;\n  static style = style;\n\n  render () {\n    const classMap = this.props.styleClassMap || {};\n    const props = {\n      htmlTag: 'div',\n      ...this.props.relax,\n      settings,\n      style: {\n        textAlign: this.props.align\n      }\n    };\n\n    return (\n      <Element {...props}>\n        <div className={cx(classes.holder, classMap.holder)}>\n          <i className={cx(this.props.icon && this.props.icon.className, classMap.icon)}>\n            {this.props.icon && this.props.icon.content}\n          </i>\n        </div>\n      </Element>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/icon/props-schema.js",
    "content": "export default [\n  {\n    label: 'Icon',\n    type: 'Icon',\n    id: 'icon'\n  },\n  {\n    label: 'Alignment',\n    type: 'Select',\n    id: 'align',\n    props: {\n      labels: ['Left', 'Center', 'Right'],\n      values: ['left', 'center', 'right']\n    }\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/icon/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini location_flag-points-31'\n  },\n  category: 'content',\n  drop: false,\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/icon/style.js",
    "content": "import {getColorString} from 'helpers/colors';\n\nexport default {\n  type: 'icon',\n  options: [\n    {\n      label: 'Color',\n      type: 'Color',\n      id: 'color'\n    },\n    {\n      label: 'Font size',\n      id: 'size',\n      type: 'Number',\n      props: {\n        allowed: ['px', 'em', 'pt']\n      }\n    },\n    {\n      label: 'Use Background',\n      type: 'Optional',\n      id: 'background',\n      unlocks: [\n        {\n          label: 'Width',\n          type: 'Pixels',\n          id: 'width'\n        },\n        {\n          label: 'Height',\n          type: 'Pixels',\n          id: 'height'\n        },\n        {\n          label: 'Background Color',\n          type: 'Color',\n          id: 'backgroundColor'\n        },\n        {\n          label: 'Rounded Corners',\n          type: 'Corners',\n          id: 'corners'\n        }\n      ]\n    }\n  ],\n  defaults: {\n    color: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    size: '16px',\n    background: false,\n    width: '70px',\n    height: '70px',\n    backgroundColor: {\n      value: '#000000',\n      opacity: 100\n    },\n    corners: '0px'\n  },\n  rules: (props) => {\n    const rules = {\n      icon: {}\n    };\n\n    rules.icon.fontSize = props.size;\n    rules.icon.color = getColorString(props.color);\n\n    if (props.background) {\n      rules.holder = {};\n\n      rules.holder.width = props.width;\n      rules.holder.height = props.height;\n      rules.holder.backgroundColor = getColorString(props.backgroundColor);\n      rules.holder.borderRadius = props.corners;\n\n      rules.icon.lineHeight = props.height;\n    }\n\n    return rules;\n  },\n  getIdentifierLabel: (props) => {\n    let str = '';\n\n    str += props.size;\n    str += ' | ';\n    str += getColorString(props.color);\n\n    return str;\n  }\n};\n"
  },
  {
    "path": "lib/shared/elements/image/classes.js",
    "content": "import jss from 'helpers/stylesheet';\n\nexport default jss.createRules({\n  overable: {\n    '.over-image': {\n      display: 'none'\n    },\n    ':hover': {\n      '.normal-image': {\n        display: 'none'\n      },\n      '.over-image': {\n        display: 'inline-block'\n      }\n    }\n  }\n});\n"
  },
  {
    "path": "lib/shared/elements/image/index.jsx",
    "content": "import cx from 'classnames';\nimport elementStyles from 'styles/element.less';\nimport MediaImage from 'components/image';\nimport Utils from 'helpers/utils';\nimport React, {PropTypes} from 'react';\nimport {getColorString} from 'helpers/colors';\nimport {findDOMNode} from 'react-dom';\n\nimport classes from './classes';\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class Image extends Component {\n  static propTypes = {\n    color: PropTypes.object.isRequired,\n    useOver: PropTypes.bool.isRequired,\n    imageOver: PropTypes.string,\n    strictHeight: PropTypes.bool.isRequired,\n    height: PropTypes.number.isRequired,\n    vertical: PropTypes.number.isRequired,\n    useMaxWidth: PropTypes.bool.isRequired,\n    width: PropTypes.number.isRequired,\n    horizontal: PropTypes.oneOf(['left', 'center', 'right']).isRequired,\n    children: PropTypes.string,\n    relax: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    color: {\n      value: '#ffffff',\n      opacity: 0\n    },\n    useOver: false,\n    strictHeight: false,\n    height: '200px',\n    vertical: '50%',\n    useMaxWidth: false,\n    width: '300px',\n    horizontal: 'center'\n  };\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n\n  getInitState () {\n    return {\n      mounted: false\n    };\n  }\n\n  componentDidMount () {\n    const dom = findDOMNode(this);\n    const rect = dom.getBoundingClientRect();\n    const width = Math.round(rect.right - rect.left);\n    this.setState({\n      mounted: true,\n      width\n    });\n  }\n\n  render () {\n    const style = {\n      backgroundColor: getColorString(this.props.color)\n    };\n    const imageStyle = {};\n\n    if (this.props.strictHeight) {\n      style.height = this.props.height;\n      style.overflow = 'hidden';\n\n      Utils.translate(imageStyle, 0, `-${this.props.vertical}`);\n      imageStyle.top = parseInt(this.props.height, 10) * (parseInt(this.props.vertical, 10) / 100);\n      imageStyle.position = 'relative';\n    }\n\n    if (this.props.useMaxWidth) {\n      imageStyle.maxWidth = this.props.width;\n      style.textAlign = this.props.horizontal;\n    } else {\n      imageStyle.minWidth = '100%';\n    }\n\n    return (\n      <Element\n        {...this.props.relax}\n        htmlTag='div'\n        className={cx(this.props.useOver && classes.overable)}\n        style={style}\n        settings={settings}\n      >\n        {this.renderImage(imageStyle)}\n      </Element>\n    );\n  }\n\n  renderImage (imageStyle) {\n    let result;\n    if (this.state.mounted && this.props.children) {\n      result = (\n        <div>\n          <MediaImage\n            className='normal-image'\n            editing={this.props.relax.editing}\n            id={this.props.children}\n            width={this.state.width}\n            style={imageStyle}\n            height={this.props.strictHeight && this.props.height}\n          />\n          {this.renderOverImage(imageStyle)}\n        </div>\n      );\n    } else if (this.props.relax.editing) {\n      result = (\n        <div className={elementStyles.dummy}>\n          <i className='nc-icon-outline media-1_image-02'></i>\n        </div>\n      );\n    }\n    return result;\n  }\n\n  renderOverImage (imageStyle) {\n    if (this.props.useOver) {\n      return (\n        <MediaImage\n          className='over-image'\n          id={this.props.imageOver}\n          width={this.state.width}\n          style={imageStyle}\n          height={this.props.strictHeight && this.props.height}\n        />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/image/props-schema.js",
    "content": "export default [\n  {\n    label: 'Background color',\n    type: 'Color',\n    id: 'color'\n  },\n  {\n    label: 'Image',\n    type: 'Image',\n    id: 'children'\n  },\n  {\n    label: 'On mouse over',\n    type: 'Optional',\n    id: 'useOver',\n    unlocks: [\n      {\n        type: 'Image',\n        id: 'imageOver'\n      }\n    ]\n  },\n  {\n    label: 'Strict height',\n    type: 'Optional',\n    id: 'strictHeight',\n    unlocks: [\n      {\n        label: 'Pixels',\n        type: 'Pixels',\n        id: 'height'\n      },\n      {\n        label: 'Vertical position',\n        type: 'Percentage',\n        id: 'vertical'\n      }\n    ]\n  },\n  {\n    label: 'Max Width',\n    type: 'Optional',\n    id: 'useMaxWidth',\n    unlocks: [\n      {\n        label: 'Pixels',\n        type: 'Pixels',\n        id: 'width'\n      },\n      {\n        label: 'Horizontal alignment',\n        type: 'Select',\n        id: 'horizontal',\n        props: {\n          labels: ['Left', 'Center', 'Right'],\n          values: ['left', 'center', 'right']\n        }\n      }\n    ]\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/image/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini media-1_image-02'\n  },\n  category: 'media',\n  drop: false,\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/index.js",
    "content": "import Button from './button';\nimport Column from './column';\nimport Columns from './columns';\nimport Container from './container';\nimport Counter from './counter';\nimport Date from './date';\nimport DynamicList from './dynamic-list';\nimport Form from './form';\nimport Gap from './gap';\nimport GoogleMaps from './google-maps';\nimport Icon from './icon';\nimport Image from './image';\nimport LineDivider from './line-divider';\nimport Menu from './menu';\nimport MusicPlayer from './music-player';\nimport Section from './section';\nimport Symbol from './symbol';\nimport Textarea from './textarea';\nimport TextBox from './text-box';\nimport TextInput from './text-input';\nimport Video from './video';\n\nexport default {\n  Button,\n  Columns,\n  Column,\n  Container,\n  Counter,\n  Form,\n  Gap,\n  GoogleMaps,\n  Icon,\n  Image,\n  LineDivider,\n  Menu,\n  MusicPlayer,\n  DynamicList,\n  Section,\n  TextBox,\n  TextInput,\n  Textarea,\n  Video,\n  Symbol,\n  Date\n};\n"
  },
  {
    "path": "lib/shared/elements/line-divider/classes.js",
    "content": "import jss from 'helpers/stylesheet';\n\nexport default jss.createRules({\n  holder: {\n    height: '1px'\n  },\n  line: {\n    borderBottom: '1px solid #000000'\n  }\n});\n"
  },
  {
    "path": "lib/shared/elements/line-divider/index.jsx",
    "content": "import cx from 'classnames';\nimport React, {PropTypes} from 'react';\n\nimport classes from './classes';\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport style from './style';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class LineDivider extends Component {\n  static propTypes = {\n    styleClassMap: PropTypes.object,\n    relax: PropTypes.object.isRequired\n  };\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n  static style = style;\n\n  render () {\n    const classMap = this.props.styleClassMap || {};\n\n    return (\n      <Element\n        {...this.props.relax}\n        htmlTag='div'\n        className={cx(classes.holder, classMap.holder)}\n        settings={settings}\n      >\n        <div className={cx(classes.line, classMap.line)}></div>\n      </Element>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/line-divider/props-schema.js",
    "content": "export default [];\n"
  },
  {
    "path": "lib/shared/elements/line-divider/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini ui-1_simple-delete'\n  },\n  category: 'structure',\n  style: 'lineDivider',\n  drop: false,\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/line-divider/style.js",
    "content": "import {getColorString} from 'helpers/colors';\n\nexport default {\n  type: 'lineDivider',\n  options: [\n    {\n      type: 'Columns',\n      options: [\n        {\n          label: 'Line Height',\n          type: 'Pixels',\n          id: 'size'\n        },\n        {\n          label: 'Style',\n          type: 'LineStyle',\n          id: 'style'\n        }\n      ]\n    },\n    {\n      label: 'Color',\n      type: 'Color',\n      id: 'color'\n    },\n    {\n      label: 'Max Width',\n      type: 'Optional',\n      id: 'useMaxWidth',\n      unlocks: [\n        {\n          label: 'Max Width',\n          type: 'Pixels',\n          id: 'maxWidth'\n        },\n        {\n          label: 'Align',\n          type: 'Select',\n          id: 'align',\n          props: {\n            labels: ['Left', 'Center', 'Right'],\n            values: ['left', 'center', 'right']\n          }\n        }\n      ]\n    },\n    {\n      label: 'Padding',\n      type: 'Padding',\n      id: 'padding'\n    }\n  ],\n  defaults: {\n    size: 1,\n    style: 'solid',\n    color: {\n      value: '#000000',\n      opacity: 100\n    },\n    useMaxWidth: false,\n    maxWidth: '100px',\n    align: 'center',\n    padding: '5px 0px 10px 0px'\n  },\n  rules: (props) => {\n    const rules = {\n      line: {},\n      holder: {}\n    };\n\n    rules.line.borderBottom = `${props.size} ${props.style} ${getColorString(props.color)}`;\n    rules.holder.height = props.size;\n    rules.holder.padding = props.padding;\n\n    if (props.useMaxWidth) {\n      rules.line.display = 'inline-block';\n      rules.line.width = props.maxWidth;\n      rules.line.maxWidth = '100%';\n      rules.line.verticalAlign = 'top';\n      rules.holder.textAlign = props.align;\n    }\n\n    return rules;\n  },\n  getIdentifierLabel: (props) => `${props.size}px | ${props.width}`\n};\n"
  },
  {
    "path": "lib/shared/elements/menu/classes.js",
    "content": "import jss from 'helpers/stylesheet';\n\nexport default jss.createRules({\n  menu: {\n    listStyleType: 'none',\n    padding: '0px',\n    margin: '0px',\n    textAlign: 'left',\n    'li:last-child': {\n      marginRight: '0px'\n    }\n  },\n  menuItem: {\n    display: 'inline-block',\n    position: 'relative',\n    verticalAlign: 'top',\n    marginRight: '20px'\n  },\n  button: {\n    textDecoration: 'none',\n    display: 'inline-block',\n    cursor: 'pointer'\n  },\n  submenu: {\n    position: 'absolute',\n    top: '100%',\n    left: 0\n  },\n  submenuItem: {\n    display: 'block',\n    textAlign: 'left'\n  },\n  submenuButton: {\n    display: 'block',\n    textDecoration: 'none',\n    cursor: 'pointer'\n  }\n});\n"
  },
  {
    "path": "lib/shared/elements/menu/entry.jsx",
    "content": "import cx from 'classnames';\nimport A from 'components/a';\nimport Animate from 'components/animate';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nexport default class Entry extends Component {\n\n  static propTypes = {\n    entry: PropTypes.object.isRequired,\n    subitem: PropTypes.bool.isRequired,\n    classMap: PropTypes.object,\n    classes: PropTypes.object,\n    pageBuilder: PropTypes.object\n  };\n\n  getInitState () {\n    return {\n      opened: false\n    };\n  }\n\n  componentWillUnmount () {\n    clearTimeout(this.closeTimeout);\n  }\n\n  onMouseOver () {\n    clearTimeout(this.closeTimeout);\n    this.setState({\n      opened: true\n    });\n  }\n\n  onMouseOut () {\n    this.closeTimeout = setTimeout(::this.close, 400);\n  }\n\n  close () {\n    this.setState({\n      opened: false\n    });\n  }\n\n  render () {\n    let label;\n    let href;\n\n    if (this.props.entry.type === 'page') {\n      label = this.props.entry.page && this.props.entry.page.title;\n      href = `/${this.props.entry.page && this.props.entry.page.slug}`;\n    } else if (this.props.entry.type === 'link') {\n      label = this.props.entry.link.label;\n      href = this.props.entry.link.url;\n    }\n\n    const className = cx(\n      !this.props.subitem ? this.props.classes.menuItem : this.props.classes.submenuItem,\n      !this.props.subitem ? this.props.classMap.entry : this.props.classMap.submenuEntry\n    );\n\n    return (\n      <li\n        className={className}\n        onMouseEnter={::this.onMouseOver}\n        onMouseLeave={::this.onMouseOut}\n      >\n        {this.renderEntryLink(href, label)}\n        {this.renderEntryChildren()}\n      </li>\n    );\n  }\n\n  renderEntryChildren () {\n    // This menu only supports 2 levels\n    if (!this.props.subitem &&\n        this.props.entry.children &&\n        this.props.entry.children.length > 0 &&\n        this.state.opened) {\n      return (\n        <Animate transition='fadeIn'>\n          <ul className={cx(this.props.classes.submenu, this.props.classMap.submenu)}>\n            {this.props.entry.children.map(this.renderEntry, this)}\n          </ul>\n        </Animate>\n      );\n    }\n  }\n\n  renderEntry (entry) {\n    return (\n      <Entry\n        entry={entry}\n        subitem\n        classMap={this.props.classMap}\n        classes={this.props.classes}\n        key={entry.id}\n        pageBuilder={this.props.pageBuilder}\n      />\n    );\n  }\n\n  renderEntryLink (href, label) {\n    let result;\n\n    const linkClasses = cx(\n      !this.props.subitem ? this.props.classes.button : this.props.classes.submenuButton,\n      !this.props.subitem ? this.props.classMap.button : this.props.classMap.submenuButton\n    );\n\n    if (this.props.pageBuilder && this.props.pageBuilder.editing) {\n      result = (\n        <a className={linkClasses}>\n          {label}\n        </a>\n      );\n    } else {\n      result = (\n        <A className={linkClasses} href={href}>\n          {label}\n        </A>\n      );\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/menu/index.jsx",
    "content": "import * as elementsActions from 'actions/elements';\n\nimport React, {PropTypes} from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport {buildQueryAndVariables} from 'relax-fragments';\n\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport style from './style';\nimport Component from '../component';\nimport Element from '../element';\nimport Menu from './menu';\n\nconst menuDataFragment = {\n  id: 1,\n  type: 1,\n  page: {\n    _id: 1,\n    title: 1\n  },\n  link: {\n    label: 1,\n    url: 1\n  }\n};\n\n@connect(\n  (state) => ({\n    elements: state.elements\n  }),\n  (dispatch) => bindActionCreators(elementsActions, dispatch)\n)\nexport default class MenuContainer extends Component {\n  static fragments = {\n    menu: {\n      data: {\n        ...menuDataFragment,\n        children: {\n          ...menuDataFragment\n        }\n      }\n    }\n  };\n  static propTypes = {\n    menuId: PropTypes.string,\n    relax: PropTypes.object.isRequired,\n    elements: PropTypes.object.isRequired\n  };\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n  static style = style;\n\n  getInitState () {\n    this.fetchData(this.props);\n    return {};\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (this.props.relax.editing && nextProps.menuId !== this.props.menuId) {\n      this.fetchData(nextProps);\n    }\n  }\n\n  fetchData (props) {\n    if (props.menuId) {\n      props.getElementData(props.elementId, buildQueryAndVariables(\n        this.constructor.fragments,\n        {\n          menu: {\n            _id: {\n              value: props.menuId,\n              type: 'ID!'\n            }\n          }\n        }\n      ));\n    }\n  }\n\n  render () {\n    const {elements, relax} = this.props;\n    const menu = elements[relax.element.id] && elements[relax.element.id].menu;\n    return (\n      <Element htmlTag='div' settings={settings} {...this.props.relax}>\n        <Menu {...this.props} menu={menu} />\n      </Element>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/menu/menu.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport classes from './classes';\nimport Entry from './entry';\n\nexport default class Menu extends Component {\n  static propTypes = {\n    menu: PropTypes.object,\n    styleClassMap: PropTypes.object,\n    pageBuilder: PropTypes.object\n  };\n  static defaultProps = {\n    styleClassMap: {}\n  };\n\n  render () {\n    const classMap = this.props.styleClassMap;\n    let result;\n    if (this.props.menu && this.props.menu.data) {\n      result = (\n        <ul className={cx(classes.menu, classMap.menu)}>\n          {this.props.menu.data.map(this.renderEntry, this)}\n        </ul>\n      );\n    } else if (this.context.editing) {\n      result = (\n        <div>Choose a menu on settings</div>\n      );\n    } else {\n      result = <div></div>;\n    }\n    return result;\n  }\n\n  renderEntry (entry) {\n    return (\n      <Entry\n        entry={entry}\n        subitem={false}\n        classMap={this.props.styleClassMap}\n        classes={classes}\n        key={entry.id}\n        pageBuilder={this.props.pageBuilder}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/menu/props-schema.js",
    "content": "export default [\n  {\n    label: 'Menu',\n    type: 'MenuPicker',\n    id: 'menuId'\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/menu/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini ui-2_menu-bold'\n  },\n  category: 'structure',\n  drop: false,\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/menu/style.js",
    "content": "import Utils from 'helpers/utils';\nimport {getColorString} from 'helpers/colors';\n\nexport default {\n  type: 'menu',\n  options: [\n    {\n      label: 'Layout',\n      type: 'Section',\n      id: 'layoutSection',\n      unlocks: [\n        {\n          label: 'Distance between buttons',\n          id: 'distance',\n          type: 'Pixels'\n        },\n        {\n          label: 'Buttons Alignment',\n          id: 'alignment',\n          type: 'Select',\n          props: {\n            labels: ['Left', 'Center', 'Right'],\n            values: ['left', 'center', 'right']\n          }\n        }\n      ]\n    },\n    {\n      label: 'Buttons Text',\n      type: 'Section',\n      id: 'textSection',\n      unlocks: [\n        {\n          label: 'Font Family',\n          id: 'font',\n          type: 'Font'\n        },\n        {\n          label: 'Font Size',\n          id: 'fontSize',\n          type: 'Pixels'\n        },\n        {\n          label: 'Line Height',\n          id: 'lineHeight',\n          type: 'Pixels'\n        },\n        {\n          label: 'Letter Spacing',\n          id: 'letterSpacing',\n          type: 'Pixels'\n        },\n        {\n          label: 'Color',\n          id: 'color',\n          type: 'Color'\n        },\n        {\n          label: 'Links color hover',\n          id: 'colorOver',\n          type: 'Color'\n        },\n        {\n          label: 'Underline',\n          id: 'underline',\n          type: 'Boolean'\n        }\n      ]\n    },\n    {\n      label: 'Buttons Background',\n      type: 'Section',\n      id: 'backgroundSection',\n      unlocks: [\n        {\n          label: 'Use Background',\n          type: 'Optional',\n          id: 'useBackground',\n          unlocks: [\n            {\n              label: 'Background Color',\n              type: 'Color',\n              id: 'backgroundColor'\n            },\n            {\n              label: 'Background Color on over',\n              type: 'Color',\n              id: 'backgroundColorOver'\n            }\n          ]\n        },\n        {\n          label: 'Border',\n          type: 'Optional',\n          id: 'useBorder',\n          unlocks: [\n            {\n              type: 'Border',\n              id: 'border'\n            },\n            {\n              label: 'Border Color on over',\n              type: 'Color',\n              id: 'borderColorOver'\n            }\n          ]\n        },\n        {\n          label: 'Rounded Corners',\n          type: 'Optional',\n          id: 'useCorners',\n          unlocks: [\n            {\n              type: 'Corners',\n              id: 'corners'\n            }\n          ]\n        },\n        {\n          label: 'Padding',\n          type: 'Optional',\n          id: 'usePadding',\n          unlocks: [\n            {\n              type: 'Padding',\n              id: 'padding'\n            }\n          ]\n        }\n      ]\n    },\n    {\n      label: 'Submenus Layout',\n      type: 'Section',\n      id: 'submenuLayoutSection',\n      unlocks: [\n        {\n          label: 'Snap submenu (relative to main button)',\n          id: 'submenuAlignment',\n          type: 'Select',\n          props: {\n            labels: ['Left', 'Center', 'Right'],\n            values: ['left', 'center', 'right']\n          }\n        },\n        {\n          label: 'Vertical Offset',\n          id: 'submenuVertical',\n          type: 'Pixels'\n        },\n        {\n          label: 'Horizontal Offset',\n          id: 'submenuHorizontal',\n          type: 'Pixels'\n        },\n        {\n          label: 'Buttons Alignment',\n          id: 'submenuButtonsAlignment',\n          type: 'Select',\n          props: {\n            labels: ['Left', 'Center', 'Right'],\n            values: ['left', 'center', 'right']\n          }\n        }\n      ]\n    },\n    {\n      label: 'Submenu Indicator',\n      type: 'Section',\n      id: 'submenuIndicatorSection',\n      unlocks: [\n        {\n          label: 'Submenu Indicator Icon',\n          id: 'submenuIndicatorIcon',\n          type: 'Icon'\n        },\n        {\n          label: 'Distance to text',\n          id: 'submenuIndicatorDistance',\n          type: 'Pixels'\n        },\n        {\n          label: 'Icon font Size',\n          id: 'submenuIndicatorSize',\n          type: 'Pixels'\n        }\n      ]\n    },\n    {\n      label: 'Submenus Background',\n      type: 'Section',\n      id: 'submenuBackgroundSection',\n      unlocks: [\n        {\n          label: 'Background Color',\n          type: 'Color',\n          id: 'submenuBackgroundColor'\n        },\n        {\n          label: 'Padding',\n          type: 'Optional',\n          id: 'submenuUsePadding',\n          unlocks: [\n            {\n              type: 'Padding',\n              id: 'submenuPadding'\n            }\n          ]\n        },\n        {\n          label: 'Border',\n          type: 'Optional',\n          id: 'submenuUseBorder',\n          unlocks: [\n            {\n              type: 'Border',\n              id: 'submenuBorder'\n            }\n          ]\n        },\n        {\n          label: 'Rounded Corners',\n          type: 'Optional',\n          id: 'submenuUseCorners',\n          unlocks: [\n            {\n              type: 'Corners',\n              id: 'submenuCorners'\n            }\n          ]\n        }\n      ]\n    },\n    {\n      label: 'Submenus Buttons Text',\n      type: 'Section',\n      id: 'submenuButtonsTextSection',\n      unlocks: [\n        {\n          label: 'Font Family',\n          id: 'submenuButtonsFont',\n          type: 'Font'\n        },\n        {\n          label: 'Font Size',\n          id: 'submenuButtonsFontSize',\n          type: 'Pixels'\n        },\n        {\n          label: 'Line Height',\n          id: 'submenuButtonsLineHeight',\n          type: 'Pixels'\n        },\n        {\n          label: 'Letter Spacing',\n          id: 'submenuButtonsLetterSpacing',\n          type: 'Pixels'\n        },\n        {\n          label: 'Color',\n          id: 'submenuButtonsColor',\n          type: 'Color'\n        },\n        {\n          label: 'Links color hover',\n          id: 'submenuButtonsColorOver',\n          type: 'Color'\n        },\n        {\n          label: 'Underline',\n          id: 'submenuButtonsUnderline',\n          type: 'Boolean'\n        }\n      ]\n    },\n    {\n      label: 'Submenus Buttons Background',\n      type: 'Section',\n      id: 'submenuButtonsBackgroundSection',\n      unlocks: [\n        {\n          label: 'Use Background',\n          type: 'Optional',\n          id: 'submenuButtonsUseBackground',\n          unlocks: [\n            {\n              label: 'Background Color',\n              type: 'Color',\n              id: 'submenuButtonsBackgroundColor'\n            },\n            {\n              label: 'Background Color on over',\n              type: 'Color',\n              id: 'submenuButtonsBackgroundColorOver'\n            }\n          ]\n        },\n        {\n          label: 'Border',\n          type: 'Optional',\n          id: 'submenuButtonsUseBorder',\n          unlocks: [\n            {\n              type: 'Border',\n              id: 'submenuButtonsBorder'\n            },\n            {\n              label: 'Border Color on over',\n              type: 'Color',\n              id: 'submenuButtonsBorderColorOver'\n            }\n          ]\n        },\n        {\n          label: 'Rounded Corners',\n          type: 'Optional',\n          id: 'submenuButtonsUseCorners',\n          unlocks: [\n            {\n              type: 'Corners',\n              id: 'submenuButtonsCorners'\n            }\n          ]\n        },\n        {\n          label: 'Padding',\n          type: 'Optional',\n          id: 'submenuButtonsUsePadding',\n          unlocks: [\n            {\n              type: 'Padding',\n              id: 'submenuButtonsPadding'\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  defaults: {\n    distance: 20,\n    alignment: 'left',\n    font: {},\n    fontSize: 16,\n    lineHeight: 16,\n    letterSpacing: 0,\n    color: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    colorOver: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    underline: false,\n    useBackground: false,\n    backgroundColor: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    backgroundColorOver: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    useBorder: false,\n    border: false,\n    borderColorOver: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    useCorners: false,\n    corners: '0px',\n    usePadding: false,\n    padding: '0px',\n    submenuAlignment: 'left',\n    submenuVertical: 10,\n    submenuHorizontal: 0,\n    submenuButtonsAlignment: 'left',\n    submenuBackgroundColor: {\n      value: '#333333',\n      opacity: 100\n    },\n    submenuUsePadding: false,\n    submenuPadding: '0px',\n    submenuUseBorder: false,\n    submenuBorder: {},\n    submenuUseCorners: false,\n    submenuCorners: '0px',\n    submenuButtonsFont: {},\n    submenuButtonsFontSize: 16,\n    submenuButtonsLineHeight: 16,\n    submenuButtonsLetterSpacing: 0,\n    submenuButtonsColor: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    submenuButtonsButtonsColorOver: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    submenuButtonsUnderline: false,\n    submenuButtonsUseBackground: false,\n    submenuButtonsBackgroundColor: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    submenuButtonsBackgroundColorOver: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    submenuButtonsUseBorder: false,\n    submenuButtonsBorder: false,\n    submenuButtonsBorderColorOver: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    submenuButtonsUseCorners: false,\n    submenuButtonsCorners: '0px',\n    submenuButtonsUsePadding: false,\n    submenuButtonsPadding: '0px'\n  },\n  rules: (props) => {\n    const style = {\n      menu: {\n        textAlign: props.alignment\n      },\n      entry: {\n        marginRight: props.distance\n      },\n      button: {\n        fontSize: props.fontSize,\n        lineHeight: props.lineHeight,\n        letterSpacing: props.letterSpacing,\n        color: getColorString(props.color),\n        textDecoration: props.underline && 'underline',\n        backgroundColor: props.useBackground && getColorString(props.backgroundColor),\n        borderRadius: props.useCorners && props.corners,\n        padding: props.usePadding && props.padding,\n\n        ':hover': {\n          color: getColorString(props.colorOver),\n          backgroundColor: props.useBackground && getColorString(props.backgroundColorOver),\n          borderColor: getColorString(props.borderColorOver)\n        }\n      },\n      submenu: {\n        backgroundColor: getColorString(props.submenuBackgroundColor),\n        padding: props.submenuUsePadding && props.submenuPadding,\n        borderRadius: props.submenuUseCorners && props.submenuCorners\n      },\n      submenuButton: {\n        fontSize: props.submenuButtonsFontSize,\n        lineHeight: props.submenuButtonsLineHeight,\n        letterSpacing: props.submenuButtonsLetterSpacing,\n        color: getColorString(props.submenuButtonsColor),\n        textDecoration: props.submenuButtonsUnderline && 'underline',\n        backgroundColor: props.submenuButtonsUseBackground && getColorString(props.submenuButtonsBackgroundColor),\n        borderRadius: props.submenuButtonsUseCorners && props.submenuButtonsCorners,\n        padding: props.submenuButtonsUsePadding && props.submenuButtonsPadding,\n        textAlign: props.submenuButtonsAlignment,\n\n        ':hover': {\n          color: getColorString(props.submenuButtonsColorOver),\n          backgroundColor:\n            props.submenuButtonsUseBackground &&\n            getColorString(props.submenuButtonsBackgroundColorOver),\n          borderColor: getColorString(props.submenuButtonsBorderColorOver)\n        }\n      }\n    };\n\n    // Font\n    if (props.font && props.font.family && props.font.fvd) {\n      style.button.fontFamily = props.font.family;\n      Utils.processFVD(style.button, props.font.fvd);\n    }\n\n    // Border\n    if (props.useBorder) {\n      Utils.applyBorders(style.button, props.border);\n    }\n\n    // Submenu Border\n    if (props.submenuUseBorder) {\n      Utils.applyBorders(style.submenu, props.submenuBorder);\n    }\n\n    // Submenu Buttons Font\n    if (props.submenuButtonsFont && props.submenuButtonsFont.family && props.submenuButtonsFont.fvd) {\n      style.submenuButton.fontFamily = props.submenuButtonsFont.family;\n      Utils.processFVD(style.submenuButton, props.submenuButtonsFont.fvd);\n    }\n\n    // Submenu Buttons Border\n    if (props.submenuButtonsUseBorder) {\n      Utils.applyBorders(style.submenuButton, props.submenuButtonsBorder);\n    }\n\n    // Submenu alignment and Offset\n    style.submenu.transform = `translateY(${props.submenuVertical})`;\n    if (props.submenuAlignment === 'left') {\n      style.submenu.left = props.submenuHorizontal;\n    } else if (props.submenuAlignment === 'right') {\n      style.submenu.left = 'auto';\n      style.submenu.right = -props.submenuHorizontal;\n    } else if (props.submenuAlignment === 'center') {\n      style.submenu.left = '50%';\n      style.submenu.transform = `translateX(-50%) translateY(${props.submenuVertical})`;\n    }\n\n    return style;\n  }\n};\n"
  },
  {
    "path": "lib/shared/elements/music-player/classes.js",
    "content": "import jss from 'helpers/stylesheet';\n\nexport default jss.createRules({\n  musicPlayer: {\n    position: 'relative',\n    backgroundColor: '#333333',\n    overflow: 'hidden',\n    '-webkit-mask-image': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC)'\n  },\n  wrapper: {\n    position: 'relative'\n  },\n  part: {\n    display: 'table-cell',\n    verticalAlign: 'middle'\n  },\n  table: {\n    display: 'table',\n    width: '100%'\n  },\n  fit: {\n    width: '1%',\n    whiteSpace: 'nowrap'\n  },\n  bar: {\n    position: 'relative',\n    overflow: 'hidden',\n    height: 7,\n    backgroundColor: '#cccccc'\n  },\n  streamBars: {\n    position: 'absolute',\n    top: 0,\n    left: 0,\n    bottom: 0,\n    width: 0,\n    cursor: 'pointer'\n  },\n  volume: {\n    width: 170\n  },\n  volumeBars: {\n    paddingLeft: 10\n  },\n  volumeBar: {\n    cursor: 'pointer'\n  },\n  divider: {\n    width: 1,\n    backgroundColor: '#3A3A3A'\n  }\n});\n"
  },
  {
    "path": "lib/shared/elements/music-player/container.jsx",
    "content": "import request from 'superagent';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {soundManager} from 'soundmanager2';\n\nimport Player from './player';\n\nconst CONSUMER_KEY = '6c786345f5161898f1e1380802ce9226';\n\nexport default class PlayerContainer extends Component {\n  static propTypes = {\n    type: PropTypes.oneOf(['local', 'soundcloud']).isRequired,\n    soundcloud: PropTypes.string,\n    sound: PropTypes.string,\n    pageBuilder: PropTypes.object,\n    elementId: PropTypes.string.isRequired,\n    defaultVolume: PropTypes.number\n  };\n\n  getInitState () {\n    const editing = this.props.pageBuilder && this.props.pageBuilder.editing;\n    if (!editing && this.isClient()) {\n      if (this.props.type === 'soundcloud') {\n        this.loadSoundcloud();\n      }\n    }\n\n    return {\n      playing: false,\n      muted: false,\n      loadedPercentage: 0,\n      loadedLabel: '00:00',\n      playedPercentage: 0,\n      playedLabel: '00:00',\n      volume: this.props.defaultVolume\n    };\n  }\n\n  componentDidUpdate () {\n    // if (!this.props.pageBuilder.editing && !prevState.sound && this.state.sound) {\n    //   this.url = this.state.sound.url;\n    //   soundManager.onready(this.createSound.bind(this));\n    // }\n  }\n\n  componentWillUnmount () {\n    if (this.sound) {\n      this.sound.destruct();\n    }\n  }\n\n  loadSoundcloud () {\n    request\n      .get(`http://api.soundcloud.com/resolve?url=${this.props.soundcloud}&format=json&consumer_key=${CONSUMER_KEY}&callback=?`)\n      .set('Accept', 'application/json')\n      .end(::this.soundcloudLoaded);\n  }\n\n  soundcloudLoaded (err, soundcloudInfo) {\n    if (!err && soundcloudInfo && soundcloudInfo.stream_url) {\n      this.url = soundcloudInfo.stream_url;\n\n      if (this.url.indexOf('secret_token') === -1) {\n        this.url += '?';\n      } else {\n        this.url += '&';\n      }\n\n      this.url += `consumer_key=${CONSUMER_KEY}`;\n      soundManager.onready(::this.createSound);\n    }\n  }\n\n  createSound () {\n    this.sound = soundManager.createSound({\n      id: `sound_${this.props.elementId}`,\n      url: this.url,\n      autoLoad: false,\n      autoPlay: false,\n      onfinish: this.playingStatusChanged.bind(this),\n      whileloading: this.whileLoading.bind(this),\n      whileplaying: this.whilePlaying.bind(this),\n      volume: this.state.volume\n    });\n\n    this.playingStatusChanged();\n  }\n\n  whileLoading () {\n    const loadedPercentage = this.sound.bytesLoaded / this.sound.bytesTotal;\n\n    let secondsPassed = Math.round(this.sound.duration / 1000);\n    let minutesPassed = 0;\n    if (secondsPassed >= 60) {\n      minutesPassed = Math.floor(secondsPassed / 60);\n      secondsPassed = secondsPassed - minutesPassed * 60;\n    }\n    const minutesLabel = (minutesPassed < 10 ? `0${minutesPassed}` : minutesPassed);\n    const secondsLabel = (secondsPassed < 10 ? `0${secondsPassed}` : secondsPassed);\n    const loadedLabel = `${minutesLabel}:${secondsLabel}`;\n\n    this.setState({\n      loadedPercentage,\n      loadedLabel\n    });\n  }\n\n  whilePlaying () {\n    let playedPercentage;\n    if (this.sound.loaded) {\n      playedPercentage = this.sound.position / this.sound.duration;\n    } else {\n      playedPercentage = this.sound.position / this.sound.durationEstimate;\n    }\n\n    let secondsPassed = Math.round(this.sound.position / 1000);\n    let minutesPassed = 0;\n    if (secondsPassed >= 60) {\n      minutesPassed = Math.floor(secondsPassed / 60);\n      secondsPassed = secondsPassed - minutesPassed * 60;\n    }\n    const minutesLabel = (minutesPassed < 10 ? `0${minutesPassed}` : minutesPassed);\n    const secondsLabel = (secondsPassed < 10 ? `0${secondsPassed}` : secondsPassed);\n    const playedLabel = `${minutesLabel}:${secondsLabel}`;\n\n    this.setState({\n      playedPercentage,\n      playedLabel\n    });\n  }\n\n  playingStatusChanged () {\n    if (this.sound.paused || this.sound.playState === 0) {\n      this.setState({\n        playing: false\n      });\n    } else {\n      this.setState({\n        playing: true\n      });\n    }\n  }\n\n  togglePlay () {\n    this.sound.togglePause();\n    this.playingStatusChanged();\n  }\n\n  toggleMute () {\n    this.sound.toggleMute();\n\n    if (!this.sound.muted && this.sound.volume === 0) {\n      this.sound.setVolume(this.props.defaultVolume);\n    }\n\n    this.setState({\n      volume: this.sound.muted ? 0 : this.sound.volume,\n      muted: this.sound.muted || this.sound.volume === 0\n    });\n  }\n\n  setVolume (perc) {\n    this.sound.setVolume(perc);\n\n    if (this.sound.muted && this.sound.volume > 0) {\n      this.sound.unmute();\n    } else if (!this.sound.muted && this.sound.volume === 0) {\n      this.sound.mute();\n    }\n\n    this.setState({\n      volume: this.sound.muted ? 0 : this.sound.volume,\n      muted: this.sound.muted || this.sound.volume === 0\n    });\n  }\n\n  goTo (perc) {\n    this.sound.setPosition(perc * this.sound.duration);\n  }\n\n  render () {\n    return (\n      <Player\n        {...this.state}\n        {...this.props}\n        togglePlay={::this.togglePlay}\n        toggleMute={::this.toggleMute}\n        setVolume={::this.setVolume}\n        goTo={::this.goTo}\n        editing={this.props.pageBuilder && this.props.pageBuilder.editing}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/music-player/index.jsx",
    "content": "import React, {PropTypes} from 'react';\n\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport style from './style';\nimport Component from '../component';\nimport Element from '../element';\nimport PlayerContainer from './container';\n\nexport default class MusicPlayer extends Component {\n  static propTypes = {\n    relax: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    type: 'local',\n    defaultVolume: 50\n  };\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n  static style = style;\n\n  render () {\n    return (\n      <Element {...this.props.relax} htmlTag='div' settings={settings}>\n        <PlayerContainer {...this.props} />\n      </Element>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/music-player/player.jsx",
    "content": "import cx from 'classnames';\nimport utils from 'helpers/utils';\nimport BackgroundImage from 'components/background-image';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport classes from './classes';\n\nexport default class Player extends Component {\n  static propTypes = {\n    togglePlay: PropTypes.func.isRequired,\n    toggleMute: PropTypes.func.isRequired,\n    setVolume: PropTypes.func.isRequired,\n    goTo: PropTypes.func.isRequired,\n    styleClassMap: PropTypes.object,\n    display: PropTypes.string,\n    useBackgroundImage: PropTypes.bool,\n    backgroundImage: PropTypes.string,\n    repeat: PropTypes.string,\n    vertical: PropTypes.string,\n    horizontal: PropTypes.string,\n    opacity: PropTypes.number,\n    defaultVolume: PropTypes.number,\n    muted: PropTypes.bool.isRequired,\n    playing: PropTypes.bool.isRequired,\n    volume: PropTypes.number.isRequired,\n    playedLabel: PropTypes.string.isRequired,\n    loadedLabel: PropTypes.string.isRequired,\n    loadedPercentage: PropTypes.number.isRequired,\n    playedPercentage: PropTypes.number.isRequired,\n    editing: PropTypes.bool\n  };\n\n  static defaultProps = {\n    styleClassMap: {}\n  };\n\n  togglePlay (event) {\n    event.preventDefault();\n    this.props.togglePlay();\n  }\n\n  toggleMute (event) {\n    event.preventDefault();\n    this.props.toggleMute();\n  }\n\n  onProgressClick (event) {\n    event.preventDefault();\n\n    const bounds = utils.getOffsetRect(this.refs.bars);\n    const percStream = (event.pageX - bounds.left) / bounds.width;\n\n    this.props.goTo(percStream);\n  }\n\n  onVolumeClick (event) {\n    event.preventDefault();\n\n    const bounds = utils.getOffsetRect(this.refs.volume);\n    const percVolume = Math.round(((event.pageX - bounds.left) / bounds.width) * 100);\n\n    this.props.setVolume(percVolume);\n  }\n\n  render () {\n    const classMap = this.props.styleClassMap;\n    const displayVolume = this.props.display !== 'mobile' && this.props.display !== 'tablet';\n    return (\n      <div className={cx(classes.musicPlayer, classMap.player)}>\n        {this.renderBackground()}\n        <div className={classes.wrapper}>\n          {this.renderControls(classMap)}\n          {this.renderDivider(classMap)}\n          {this.renderPlayback(classMap)}\n          {displayVolume && this.renderDivider(classMap)}\n          {displayVolume && this.renderVolume(classMap)}\n        </div>\n      </div>\n    );\n  }\n\n  renderBackground () {\n    if (this.props.useBackgroundImage) {\n      return (\n        <BackgroundImage\n          backgroundImage={this.props.backgroundImage}\n          repeat={this.props.repeat}\n          vertical={this.props.vertical}\n          horizontal={this.props.horizontal}\n          opacity={this.props.opacity}\n        />\n      );\n    }\n  }\n\n  renderDivider (classMap) {\n    return (\n      <div className={cx(classes.part, classes.divider, classMap.divider)}></div>\n    );\n  }\n\n  renderVolume (classMap) {\n    return (\n      <div className={cx(classes.part, classes.fit, classes.volume, classMap.volume)}>\n        <div className={cx(classes.table)}>\n          <div className={cx(classes.part, classes.fit)}>\n            <a href='#' onClick={::this.toggleMute}>\n              <i className='material-icons'>{this.props.muted ? 'volume_mute' : 'volume_up'}</i>\n            </a>\n          </div>\n          <div className={cx(classes.part, classes.volumeBars)}>\n            {this.renderVolumeBar(classMap)}\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n  renderVolumeBar (classMap) {\n    const volume = this.props.editing ? this.props.defaultVolume : this.props.volume;\n    const activeStyle = {\n      width: `${volume}%`\n    };\n    return (\n      <div\n        ref='volume'\n        className={cx(classes.bar, classMap.bars, classes.volumeBar)}\n        onClick={::this.onVolumeClick}\n      >\n        <div className={cx(classes.streamBars, classMap.active)} style={activeStyle}></div>\n      </div>\n    );\n  }\n\n  renderPlayback (classMap) {\n    return (\n      <div className={cx(classes.part, classMap.playback)}>\n        <div>Text 1</div>\n        <div>Text 2</div>\n        <div className={cx(classes.table)}>\n          <span className={cx(classes.part, classes.fit)}>\n            {this.props.playedLabel}\n          </span>\n          <div className={cx(classes.part)}>\n            {this.renderProgressBar(classMap)}\n          </div>\n          <span className={cx(classes.part, classes.fit)}>\n            {this.props.loadedLabel}\n          </span>\n        </div>\n      </div>\n    );\n  }\n\n  renderProgressBar (classMap) {\n    const streamStyle = {\n      width: `${this.props.loadedPercentage * 100}%`\n    };\n    const activeStyle = {\n      width: `${this.props.playedPercentage * 100}%`\n    };\n    return (\n      <div ref='bars' className={cx(classes.bar, classMap.bars)}>\n        <div\n          className={cx(classes.streamBars, classMap.stream)}\n          style={streamStyle}\n          onClick={::this.onProgressClick}\n        />\n        <div\n          className={cx(classes.streamBars, classMap.active)}\n          style={activeStyle}\n          onClick={::this.onProgressClick}\n        />\n      </div>\n    );\n  }\n\n  renderControls (classMap) {\n    return (\n      <div className={cx(classes.part, classes.fit, classMap.controls)}>\n        <a href='#' onClick={::this.togglePlay}>\n          <i className='material-icons'>{this.props.playing ? 'pause' : 'play_arrow'}</i>\n        </a>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/music-player/props-schema.js",
    "content": "export default [\n  {\n    label: 'Music',\n    type: 'Select',\n    id: 'type',\n    props: {\n      labels: ['Your Sounds', 'Soundcloud'],\n      values: ['local', 'soundcloud']\n    },\n    unlocks: {\n      local: [\n        {\n          label: 'Sound',\n          type: 'Audio',\n          id: 'sound'\n        }\n      ],\n      soundcloud: [\n        {\n          label: 'Soundcloud music url',\n          type: 'String',\n          id: 'soundcloud'\n        }\n      ]\n    }\n  },\n  {\n    label: 'Default volume',\n    type: 'Percentage',\n    id: 'defaultVolume'\n  },\n  {\n    label: 'Background Image',\n    type: 'Optional',\n    id: 'useBackgroundImage',\n    unlocks: [\n      {\n        type: 'Image',\n        id: 'backgroundImage',\n        unlocks: [\n          {\n            label: 'Repeat',\n            type: 'Select',\n            id: 'repeat',\n            props: {\n              labels: ['No repeat', 'Repeat', 'Repeat horiz.', 'Repeat vert.'],\n              values: ['no-repeat', 'repeat', 'repeat-x', 'repeat-y']\n            }\n          },\n          {\n            label: 'Opacity',\n            type: 'Percentage',\n            id: 'opacity'\n          },\n          {\n            label: 'Vertical position',\n            type: 'Percentage',\n            id: 'vertical'\n          },\n          {\n            label: 'Horizontal position',\n            type: 'Percentage',\n            id: 'horizontal'\n          }\n        ]\n      }\n    ]\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/music-player/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini media-2_note-03'\n  },\n  category: 'media',\n  drop: false,\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/music-player/style.js",
    "content": "import Utils from 'helpers/utils';\nimport {getColorString} from 'helpers/colors';\n\nexport default {\n  type: 'musicplayer',\n  options: [\n    {\n      label: 'Background',\n      type: 'Section',\n      id: 'backgroundSection',\n      unlocks: [\n        {\n          label: 'Background Color',\n          type: 'Color',\n          id: 'backgroundColor'\n        },\n        {\n          label: 'Padding',\n          type: 'Padding',\n          id: 'padding'\n        },\n        {\n          label: 'Border',\n          type: 'Optional',\n          id: 'useBorder',\n          unlocks: [\n            {\n              type: 'Border',\n              id: 'border'\n            }\n          ]\n        },\n        {\n          label: 'Rounded Corners',\n          type: 'Optional',\n          id: 'useCorners',\n          unlocks: [\n            {\n              type: 'Corners',\n              id: 'corners'\n            }\n          ]\n        }\n      ]\n    },\n    {\n      label: 'Layout',\n      type: 'Section',\n      id: 'layoutSection',\n      unlocks: [\n        {\n          label: 'Controls area padding',\n          type: 'Padding',\n          id: 'controlsPadding'\n        },\n        {\n          label: 'Playback area padding',\n          type: 'Padding',\n          id: 'playbackPadding'\n        },\n        {\n          label: 'Volume area padding',\n          type: 'Padding',\n          id: 'volumePadding'\n        },\n        {\n          label: 'Divider Width',\n          type: 'Pixels',\n          id: 'dividerWidth'\n        },\n        {\n          label: 'Divider Color',\n          type: 'Color',\n          id: 'dividerColor'\n        }\n      ]\n    },\n    {\n      label: 'Progress and volume bars',\n      type: 'Section',\n      id: 'barsSection',\n      unlocks: [\n        {\n          label: 'Background Color',\n          type: 'Color',\n          id: 'barsBackgroundColor'\n        },\n        {\n          label: 'Stream Color',\n          type: 'Color',\n          id: 'barsStreamColor'\n        },\n        {\n          label: 'Active Color',\n          type: 'Color',\n          id: 'barsActiveColor'\n        },\n        {\n          label: 'Height',\n          type: 'Pixels',\n          id: 'barsHeight'\n        },\n        {\n          label: 'Rounded Corners',\n          type: 'Pixels',\n          id: 'barsRounded'\n        }\n      ]\n    }\n  ],\n  defaults: {\n    // Background\n    backgroundColor: {\n      type: 'hex',\n      value: '#ffffff',\n      opacity: 100\n    },\n    padding: '10px',\n    useBorder: false,\n    border: false,\n    useCorners: false,\n    corners: '0px',\n    // Layout\n    controlsPadding: '0px',\n    playbackPadding: '0px',\n    volumePadding: '0px',\n    dividerColor: {\n      type: 'hex',\n      value: '#efefef',\n      opacity: 100\n    },\n    // Progress and volume bars\n    barsBackgroundColor: {\n      type: 'hex',\n      value: '#efefef',\n      opacity: 100\n    },\n    barsStreamColor: {\n      type: 'hex',\n      value: '#e9e9e9',\n      opacity: 100\n    },\n    barsActiveColor: {\n      type: 'hex',\n      value: '#333333',\n      opacity: 100\n    },\n    barsHeight: 6,\n    barsRounded: 3,\n    dividerWidth: 1\n  },\n  rules: (props) => {\n    const rules = {\n      player: {\n        backgroundColor: getColorString(props.backgroundColor),\n        borderRadius: props.useCorners && props.corners,\n        padding: props.padding\n      },\n      controls: {\n        padding: props.controlsPadding\n      },\n      playback: {\n        padding: props.playbackPadding\n      },\n      volume: {\n        padding: props.volumePadding\n      },\n      bars: {\n        backgroundColor: getColorString(props.barsBackgroundColor),\n        height: props.barsHeight,\n        borderRadius: props.barsRounded\n      },\n      stream: {\n        backgroundColor: getColorString(props.barsStreamColor)\n      },\n      active: {\n        backgroundColor: getColorString(props.barsActiveColor)\n      },\n      divider: {\n        width: props.dividerWidth,\n        backgroundColor: getColorString(props.dividerColor)\n      }\n    };\n\n    if (props.useBorder) {\n      Utils.applyBorders(rules.player, props.border);\n    }\n\n    return rules;\n  }\n};\n"
  },
  {
    "path": "lib/shared/elements/section/index.jsx",
    "content": "import cx from 'classnames';\nimport BackgroundImage from 'components/background-image';\nimport React, {PropTypes} from 'react';\n\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport style from './style';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class Section extends Component {\n  static propTypes = {\n    useBackgroundImage: PropTypes.bool,\n    backgroundImage: PropTypes.string,\n    repeat: PropTypes.string,\n    vertical: PropTypes.number,\n    horizontal: PropTypes.number,\n    navigation: PropTypes.string,\n    styleClassMap: PropTypes.object,\n    relax: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    backgroundImage: '',\n    repeat: 'no-repeat',\n    vertical: '50%',\n    horizontal: '50%',\n    navigation: ''\n  };\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n  static style = style;\n\n  render () {\n    const classMap = this.props.styleClassMap || {};\n\n    const props = {\n      ...this.props.relax,\n      htmlTag: 'div',\n      style: {\n        position: 'relative'\n      },\n      className: cx(classMap && classMap.section),\n      settings\n    };\n\n    if (this.props.navigation && this.props.navigation !== '') {\n      props.id = this.props.navigation;\n    }\n\n    return (\n      <Element {...props}>\n        {this.renderBackground()}\n        <div style={{position: 'relative'}} className={cx(classMap.content)}>\n          {this.renderContent()}\n        </div>\n      </Element>\n    );\n  }\n\n  renderBackground () {\n    if (this.props.useBackgroundImage) {\n      return (\n        <BackgroundImage\n          backgroundImage={this.props.backgroundImage}\n          repeat={this.props.repeat}\n          vertical={parseInt(this.props.vertical, 10)}\n          horizontal={parseInt(this.props.horizontal, 10)}\n        />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/section/props-schema.js",
    "content": "export default [\n  {\n    label: 'Navigation ID',\n    type: 'String',\n    id: 'navigation'\n  },\n  {\n    label: 'Background Image',\n    type: 'Optional',\n    id: 'useBackgroundImage',\n    unlocks: [\n      {\n        type: 'Image',\n        id: 'backgroundImage',\n        unlocks: [\n          {\n            label: 'Repeat',\n            type: 'Select',\n            id: 'repeat',\n            props: {\n              labels: ['No repeat', 'Repeat', 'Repeat horiz.', 'Repeat vert.'],\n              values: ['no-repeat', 'repeat', 'repeat-x', 'repeat-y']\n            }\n          },\n          {\n            label: 'Vertical position',\n            type: 'Percentage',\n            id: 'vertical'\n          },\n          {\n            label: 'Horizontal position',\n            type: 'Percentage',\n            id: 'horizontal'\n          }\n        ]\n      }\n    ]\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/section/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini design_distribute-vertical'\n  },\n  category: 'structure',\n  drop: {\n    rejects: 'Section',\n    customDropArea: true\n  },\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/section/style.js",
    "content": "import {getColorString, applyBackground} from 'helpers/colors';\n\nexport default {\n  type: 'section',\n  options: [\n    {\n      label: 'Background Color',\n      type: 'Optional',\n      id: 'useBackgroundColor',\n      unlocks: [\n        {\n          type: 'Color',\n          id: 'backgroundColor',\n          props: {\n            gradients: true\n          }\n        }\n      ]\n    },\n    {\n      label: 'Height',\n      type: 'Optional',\n      id: 'useFixHeight',\n      unlocks: [\n        {\n          label: 'Percentage from viewport',\n          type: 'Percentage',\n          id: 'heightPerc',\n          props: {\n            min: 0,\n            max: 200\n          }\n        },\n        {\n          label: 'Content vertical alignment',\n          type: 'Percentage',\n          id: 'contentVertical'\n        }\n      ]\n    },\n    {\n      label: 'Padding',\n      type: 'Padding',\n      id: 'padding'\n    }\n  ],\n  defaults: {\n    useBackgroundColor: false,\n    backgroundColor: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    useFixHeight: false,\n    heightPerc: '100%',\n    contentVertical: '50%',\n    padding: '20px'\n  },\n  rules: (props) => {\n    const rule = {};\n    const contentRule = {};\n\n    props.useBackgroundColor && applyBackground(rule, props.backgroundColor);\n\n    if (props.useFixHeight) {\n      rule.height = `${parseInt(props.heightPerc, 10)}vh`;\n      contentRule.position = 'relative';\n      contentRule.top = props.contentVertical;\n      contentRule.transform = `translateY(-${props.contentVertical})`;\n    }\n\n    rule.padding = props.padding;\n\n    return {\n      section: rule,\n      content: contentRule\n    };\n  },\n  getIdentifierLabel: (props) => {\n    let str = '';\n\n    if (props.useFixHeight) {\n      str += `${props.heightPerc}%`;\n    } else {\n      str += 'Auto';\n    }\n\n    str += ' | ';\n\n    if (props.useBackgroundColor) {\n      str += getColorString(props.backgroundColor);\n    } else {\n      str += 'transparent';\n    }\n\n    return str;\n  }\n};\n"
  },
  {
    "path": "lib/shared/elements/symbol/classes.js",
    "content": "import jss from 'helpers/stylesheet';\n\nexport default jss.createRules({\n  row: {\n    display: 'table',\n    width: '100%',\n    tableLayout: 'fixed',\n    textAlign: 'left'\n  },\n  column: {\n    display: 'table-cell',\n    verticalAlign: 'top',\n    position: 'relative'\n  }\n});\n"
  },
  {
    "path": "lib/shared/elements/symbol/container.jsx",
    "content": "import * as symbolsActions from 'actions/symbols';\n\nimport React, {PropTypes} from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport settings from './settings';\nimport Component from '../component';\nimport Element from '../element';\n\n@connect(\n  (state) => ({\n    symbols: state.symbols\n  }),\n  (dispatch) => bindActionCreators(symbolsActions, dispatch)\n)\nexport default class DynamicListContainer extends Component {\n  static fragments = {\n    symbol: {\n      _id: 1,\n      title: 1,\n      data: 1\n    }\n  };\n\n  static propTypes = {\n    symbols: PropTypes.object.isRequired,\n    symbolId: PropTypes.string.isRequired,\n    children: PropTypes.node.isRequired,\n    relax: PropTypes.object.isRequired\n  };\n\n  getInitState () {\n    this.fetchSymbol(this.props);\n    return {};\n  }\n\n  fetchSymbol (props) {\n    if (props.symbolId &&\n        (!props.symbols[props.symbolId] || !props.symbols[props.symbolId].data) &&\n        !this.fething) {\n      this.fething = true;\n      props.getSymbol(props.symbolId, this.constructor.fragments);\n    }\n  }\n\n  render () {\n    const props = {\n      htmlTag: 'div',\n      ...this.props.relax,\n      settings,\n      className: 'symbol'\n    };\n\n    return (\n      <Element {...props}>\n        {this.props.children}\n      </Element>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/symbol/index.jsx",
    "content": "import React from 'react';\n\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport Component from '../component';\nimport Container from './container';\n\nexport default class Symbol extends Component {\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n\n  render () {\n    return <Container {...this.props} />;\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/symbol/props-schema.js",
    "content": "export default [];\n"
  },
  {
    "path": "lib/shared/elements/symbol/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini objects_puzzle-10'\n  },\n  drop: false,\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/text-box/classes.js",
    "content": "import jss from 'helpers/stylesheet';\n\nconst common = {\n  fontSize: 'inherit',\n  lineHeight: 'inherit',\n  letterSpacing: 'inherit',\n  fontFamily: 'inherit',\n  fontStyle: 'inherit',\n  fontWeight: 'inherit',\n  margin: 0,\n  padding: 0,\n  color: 'inherit'\n};\n\nexport default jss.createRules({\n  text: {\n    outline: 0,\n    border: 0,\n    display: 'block',\n    p: common,\n    h1: common,\n    h2: common,\n    h3: common,\n    h4: common,\n    h5: common,\n    h6: common\n  },\n  cursor: {\n    cursor: 'default'\n  },\n  trim: {\n    '*': {\n      textOverflow: 'ellipsis',\n      whiteSpace: 'nowrap',\n      overflow: 'hidden'\n    },\n    display: 'inline-block'\n  }\n});\n"
  },
  {
    "path": "lib/shared/elements/text-box/index.jsx",
    "content": "import cx from 'classnames';\nimport Editor from 'components/medium-editor';\nimport React, {PropTypes} from 'react';\nimport {changeElementContent} from 'actions/page-builder';\n\nimport classes from './classes';\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport style from './style';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class TextBox extends Component {\n\n  static propTypes = {\n    usePadding: PropTypes.bool,\n    padding: PropTypes.string,\n    useAlign: PropTypes.bool,\n    textAlign: PropTypes.string,\n    children: PropTypes.node,\n    styleClassMap: PropTypes.object,\n    useTrim: PropTypes.bool,\n    maxWidth: PropTypes.number,\n    relax: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    padding: '0px',\n    textAlign: 'left',\n    maxWidth: 200\n  };\n\n  static defaultChildren = 'Click to edit text';\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n  static style = style;\n\n  getStyle () {\n    const result = {};\n\n    if (this.props.usePadding) {\n      result.padding = this.props.padding;\n    }\n    if (this.props.useAlign) {\n      result.textAlign = this.props.textAlign;\n    }\n\n    return result;\n  }\n\n  onChange (value) {\n    const {relax} = this.props;\n    relax.dispatch(changeElementContent(relax.element.id, value));\n  }\n\n  render () {\n    const props = {\n      ...this.props.relax,\n      htmlTag: 'div',\n      settings,\n      style: this.getStyle()\n    };\n\n    return (\n      <Element {...props}>\n        {this.renderContent()}\n      </Element>\n    );\n  }\n\n  renderContent () {\n    let result;\n    const classMap = this.props.styleClassMap || {};\n    const {editing, selected} = this.props.relax;\n    const styles = {};\n    const className = cx(classes.text, classMap.text);\n\n    let html = '';\n    if ((!this.props.children || this.props.children === '') && editing && !selected) {\n      html = 'Double click to edit text';\n    } else {\n      html = this.props.children;\n    }\n\n    if (this.props.useTrim) {\n      styles.maxWidth = this.props.maxWidth;\n    }\n\n    if (editing && selected) {\n      result = (\n        <Editor\n          tag='div'\n          className={className}\n          onChange={::this.onChange}\n          value={html}\n          options={{\n            toolbar: {\n              buttons: ['bold', 'italic', 'underline', 'anchor']\n            },\n            placeholder: false,\n            imageDragging: false\n          }}\n        />\n      );\n    } else {\n      result = (\n        <div\n          className={cx(className, this.props.useTrim && classes.trim, editing && classes.cursor)}\n          style={styles}\n          dangerouslySetInnerHTML={{__html: html}}\n        />\n      );\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/text-box/props-schema.js",
    "content": "export default [\n  {\n    label: 'Padding',\n    type: 'Optional',\n    id: 'usePadding',\n    unlocks: [\n      {\n        type: 'Padding',\n        id: 'padding'\n      }\n    ]\n  },\n  {\n    label: 'Alignment',\n    type: 'Optional',\n    id: 'useAlign',\n    unlocks: [\n      {\n        type: 'Select',\n        id: 'textAlign',\n        props: {\n          labels: ['Left', 'Center', 'Right'],\n          values: ['left', 'center', 'right']\n        }\n      }\n    ]\n  },\n  {\n    label: 'Trim',\n    type: 'Optional',\n    id: 'useTrim',\n    unlocks: [\n      {\n        type: 'Pixels',\n        id: 'maxWidth'\n      }\n    ]\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/text-box/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini design_text'\n  },\n  category: 'content',\n  drop: false,\n  drag: {\n    dragSelected: false\n  }\n};\n"
  },
  {
    "path": "lib/shared/elements/text-box/style.js",
    "content": "import utils from 'helpers/utils';\nimport {getColorString} from 'helpers/colors';\n\nexport default {\n  type: 'text',\n  options: [\n    {\n      label: 'Font Family',\n      id: 'font',\n      type: 'Font'\n    },\n    {\n      type: 'Columns',\n      options: [\n        {\n          label: 'Font Size',\n          id: 'fontSize',\n          type: 'Number',\n          props: {\n            allowed: ['px', 'em', 'pt']\n          }\n        },\n        {\n          label: 'Line Height',\n          id: 'lineHeight',\n          type: 'Pixels'\n        }\n      ]\n    },\n    {\n      type: 'Columns',\n      options: [\n        {\n          label: 'Letter Spacing',\n          id: 'letterSpacing',\n          type: 'Number',\n          props: {\n            allowed: ['px', 'em', 'pt']\n          }\n        },\n        {\n          label: 'Color',\n          id: 'color',\n          type: 'Color'\n        }\n      ]\n    },\n    {\n      label: 'Shadow',\n      id: 'shadow',\n      type: 'TextShadow'\n    },\n    {\n      type: 'Columns',\n      options: [\n        {\n          label: 'Links color',\n          id: 'linkColor',\n          type: 'Color'\n        },\n        {\n          label: 'Links color hover',\n          id: 'linkColorOver',\n          type: 'Color'\n        }\n      ]\n    },\n    {\n      label: 'Links underline',\n      id: 'linkUnderline',\n      type: 'Boolean'\n    }\n  ],\n  defaults: {\n    font: {},\n    fontSize: '16px',\n    lineHeight: '16px',\n    letterSpacing: '0px',\n    color: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    shadow: [],\n    linkUnderline: true,\n    linkColor: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    linkColorOver: {\n      value: '#ffffff',\n      opacity: 100\n    }\n  },\n  rules: (props) => {\n    const rule = {\n      fontSize: props.fontSize,\n      lineHeight: props.lineHeight,\n      letterSpacing: props.letterSpacing,\n      color: getColorString(props.color)\n    };\n\n    if (props.font && props.font.family && props.font.fvd) {\n      rule.fontFamily = props.font.family;\n      utils.processFVD(rule, props.font.fvd);\n    }\n\n    if (props.shadow && props.shadow.length > 0) {\n      utils.applyTextShadows(rule, props.shadow);\n    }\n\n    // links\n    rule.a = {\n      textDecoration: props.linkUnderline ? 'underline' : 'none',\n      color: getColorString(props.linkColor),\n      ':hover': {\n        color: getColorString(props.linkColorOver)\n      }\n    };\n\n    return {\n      text: rule\n    };\n  },\n  getIdentifierLabel: (props) => {\n    const variation = props.font && props.font.fvd && ` ${props.font.fvd.charAt(1)}00` || '';\n    return (props.font && props.font.family || '') + variation;\n  }\n};\n"
  },
  {
    "path": "lib/shared/elements/text-input/classes.js",
    "content": "import jss from 'helpers/stylesheet';\n\nexport default jss.createRules({\n  input: {\n    display: 'inline-block',\n    width: '100%',\n    maxWidth: '100%',\n    border: '1px solid #cccccc',\n    outline: 0,\n    backgroundColor: 'transparent'\n  },\n  holder: {\n    textAlign: 'left'\n  }\n});\n"
  },
  {
    "path": "lib/shared/elements/text-input/index.jsx",
    "content": "import cx from 'classnames';\nimport React, {PropTypes} from 'react';\n\nimport classes from './classes';\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport style from './style';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class TextInput extends Component {\n  static propTypes = {\n    name: PropTypes.string,\n    placeholder: PropTypes.string,\n    styleClassMap: PropTypes.object,\n    relax: PropTypes.object.isRequired\n  };\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n  static style = style;\n\n  render () {\n    const classMap = this.props.styleClassMap || {};\n    const props = {\n      htmlTag: 'div',\n      ...this.props.relax,\n      settings,\n      className: cx(classes.holder, classMap.holder)\n    };\n\n    return (\n      <Element {...props}>\n        <input\n          type='text'\n          name={this.props.name}\n          placeholder={this.props.placeholder}\n          className={cx(classes.input, classMap.input)}\n        />\n      </Element>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/text-input/props-schema.js",
    "content": "export default [\n  {\n    label: 'Name',\n    type: 'String',\n    id: 'name'\n  },\n  {\n    label: 'Placeholder',\n    type: 'String',\n    id: 'placeholder'\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/text-input/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini ui-1_edit-74'\n  },\n  category: 'form',\n  drop: false,\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/text-input/style.js",
    "content": "import Utils from 'helpers/utils';\nimport {getColorString} from 'helpers/colors';\n\nexport default {\n  type: 'input',\n  options: [\n    {\n      label: 'Background',\n      type: 'Section',\n      id: 'backgroundSection',\n      unlocks: [\n        {\n          label: 'Background Color',\n          type: 'Optional',\n          id: 'useBackground',\n          unlocks: [\n            {\n              type: 'Color',\n              id: 'backgroundColor'\n            }\n          ]\n        },\n        {\n          label: 'Padding',\n          type: 'Padding',\n          id: 'padding'\n        },\n        {\n          label: 'Border',\n          type: 'Optional',\n          id: 'useBorder',\n          unlocks: [\n            {\n              label: 'Border',\n              type: 'Border',\n              id: 'border'\n            },\n            {\n              label: 'Border color on focused',\n              type: 'Color',\n              id: 'borderColorFocused'\n            }\n          ]\n        },\n        {\n          label: 'Rounded Corners',\n          type: 'Optional',\n          id: 'useCorners',\n          unlocks: [\n            {\n              type: 'Corners',\n              id: 'corners'\n            }\n          ]\n        }\n      ]\n    },\n    {\n      label: 'Layout',\n      type: 'Section',\n      id: 'layoutSection',\n      unlocks: [\n        {\n          label: 'Width',\n          type: 'Select',\n          id: 'width',\n          props: {\n            labels: ['Full width', 'Max Width'],\n            values: ['full', 'max']\n          },\n          unlocks: {\n            max: [\n              {\n                label: 'Max Width',\n                id: 'maxWidth',\n                type: 'Pixels'\n              },\n              {\n                label: 'Align',\n                id: 'align',\n                type: 'Select',\n                props: {\n                  labels: ['Left', 'Center', 'Right'],\n                  values: ['left', 'center', 'right']\n                }\n              }\n            ]\n          }\n        }\n      ]\n    },\n    {\n      label: 'Text',\n      type: 'Section',\n      id: 'textSection',\n      unlocks: [\n        {\n          label: 'Font Family',\n          id: 'font',\n          type: 'Font'\n        },\n        {\n          label: 'Font Size',\n          id: 'fontSize',\n          type: 'Number',\n          props: {\n            allowed: ['px', 'em', 'pt']\n          }\n        },\n        {\n          label: 'Line Height',\n          id: 'lineHeight',\n          type: 'Pixels'\n        },\n        {\n          label: 'Letter Spacing',\n          id: 'letterSpacing',\n          type: 'Number',\n          props: {\n            allowed: ['px', 'em', 'pt']\n          }\n        },\n        {\n          label: 'Color',\n          id: 'color',\n          type: 'Color'\n        },\n        {\n          label: 'Placeholder Color',\n          id: 'placeholderColor',\n          type: 'Color'\n        },\n        {\n          label: 'Text align',\n          id: 'textAlign',\n          type: 'Select',\n          props: {\n            labels: ['Left', 'Center', 'Right'],\n            values: ['left', 'center', 'right']\n          }\n        }\n      ]\n    }\n  ],\n  defaults: {\n    useBackground: false,\n    backgroundColor: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    padding: '10px',\n    useBorder: false,\n    border: false,\n    borderColorFocused: {\n      value: '#333333',\n      opacity: 100\n    },\n    useCorners: false,\n    corners: '0px',\n    width: 'max',\n    maxWidth: '300px',\n    align: 'left',\n    font: {},\n    fontSize: '16px',\n    lineHeight: '16px',\n    letterSpacing: '0px',\n    color: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    placeholderColor: {\n      value: '#ffffff',\n      opacity: 100\n    },\n    textAlign: 'left'\n  },\n  rules: (props) => {\n    const placeholderColor = getColorString(props.placeholderColor);\n    const style = {\n      input: {\n        backgroundColor: props.useBackground && getColorString(props.backgroundColor),\n        borderRadius: props.useCorners && props.corners,\n        padding: props.padding,\n        fontSize: props.fontSize,\n        lineHeight: props.lineHeight,\n        color: getColorString(props.color),\n        letterSpacing: props.letterSpacing,\n        textAlign: props.textAlign,\n        ':focus': {\n          borderColor: props.useBorder && getColorString(props.borderColorFocused)\n        },\n        '::-webkit-input-placeholder': {\n          color: placeholderColor\n        },\n        ':-moz-placeholder': {\n          color: placeholderColor\n        },\n        '::-moz-placeholder': {\n          color: placeholderColor\n        },\n        ':-ms-input-placeholder': {\n          color: placeholderColor\n        }\n      },\n      holder: {\n        textAlign: props.align\n      }\n    };\n\n    if (props.useBorder) {\n      Utils.applyBorders(style.input, props.border);\n    }\n\n    if (props.width === 'max') {\n      style.input.width = props.maxWidth;\n    }\n\n    if (props.font && props.font.family && props.font.fvd) {\n      style.input.fontFamily = props.font.family;\n      Utils.processFVD(style.input, props.font.fvd);\n    }\n\n    return style;\n  }\n};\n"
  },
  {
    "path": "lib/shared/elements/textarea/classes.js",
    "content": "import jss from 'helpers/stylesheet';\n\nexport default jss.createRules({\n  input: {\n    display: 'inline-block',\n    width: '100%',\n    maxWidth: '100%',\n    border: '1px solid #cccccc',\n    outline: 0,\n    backgroundColor: 'transparent'\n  },\n  holder: {\n    textAlign: 'left'\n  }\n});\n"
  },
  {
    "path": "lib/shared/elements/textarea/index.jsx",
    "content": "import cx from 'classnames';\nimport React, {PropTypes} from 'react';\n\nimport classes from './classes';\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class Textarea extends Component {\n  static propTypes = {\n    name: PropTypes.string,\n    placeholder: PropTypes.string,\n    rows: PropTypes.number,\n    styleClassMap: PropTypes.object,\n    relax: PropTypes.object.isRequired\n  };\n  static defaultProps = {\n    rows: 6\n  };\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n  static style = 'input';\n\n  render () {\n    const classMap = this.props.styleClassMap || {};\n    const props = {\n      htmlTag: 'div',\n      ...this.props.relax,\n      settings,\n      className: cx(classes.holder, classMap.holder)\n    };\n\n    return (\n      <Element {...props}>\n        <textarea\n          name={this.props.name}\n          placeholder={this.props.placeholder}\n          className={cx(classes.input, classMap.input)}\n          rows={this.props.rows}\n        ></textarea>\n      </Element>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/textarea/props-schema.js",
    "content": "export default [\n  {\n    label: 'Name',\n    type: 'String',\n    id: 'name'\n  },\n  {\n    label: 'Placeholder',\n    type: 'String',\n    id: 'placeholder'\n  },\n  {\n    label: 'Rows',\n    type: 'Number',\n    id: 'rows'\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/textarea/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini ui-1_edit-76'\n  },\n  category: 'form',\n  drop: false,\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/elements/video/index.jsx",
    "content": "import elementStyles from 'styles/element.less';\nimport Utils from 'helpers/utils';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nimport propsSchema from './props-schema';\nimport settings from './settings';\nimport Component from '../component';\nimport Element from '../element';\n\nexport default class Video extends Component {\n  static propTypes = {\n    type: PropTypes.string.isRequired,\n    videoId: PropTypes.string.isRequired,\n    videoHeight: PropTypes.number.isRequired,\n    relax: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    type: 'youtube',\n    videoId: '',\n    videoHeight: '56%'\n  };\n\n  static propsSchema = propsSchema;\n  static settings = settings;\n\n  getInitState () {\n    this.onResizeBind = ::this.onResize;\n    return {\n      mounted: false\n    };\n  }\n\n  componentDidMount () {\n    window.addEventListener('resize', this.onResizeBind);\n    this.onResize();\n  }\n\n  componentWillUnmount () {\n    window.removeEventListener('resize', this.onResizeBind);\n  }\n\n  onResize () {\n    const dom = findDOMNode(this);\n    const rect = dom.getBoundingClientRect();\n    const width = Math.round(rect.right - rect.left);\n    this.setState({\n      mounted: true,\n      width\n    });\n  }\n\n  render () {\n    return (\n      <Element {...this.props.relax} htmlTag='div' settings={settings}>\n        {this.renderIframe()}\n      </Element>\n    );\n  }\n\n  renderIframe () {\n    let result;\n    let height = 300;\n    if (this.state.width) {\n      height = Math.round(this.state.width * (parseInt(this.props.videoHeight, 10) / 100));\n    }\n\n    if (this.props.videoId && this.props.videoId !== '') {\n      let src = '';\n      if (this.props.type === 'youtube') {\n        const parsedID = Utils.parseYoutubeURL(this.props.videoId);\n        src = `http://www.youtube.com/embed/${parsedID || this.props.videoId}`;\n      } else if (this.props.type === 'vimeo') {\n        const parsedID = Utils.parseVimeoURL(this.props.videoId);\n        src = `http://player.vimeo.com/video/${parsedID || this.props.videoId}`;\n      } else if (this.props.type === 'dailymotion') {\n        const parsedID = Utils.parseDailymotionURL(this.props.videoId);\n        src = `http://www.dailymotion.com/embed/video/${parsedID || this.props.videoId}`;\n      }\n\n      const iframe = (\n        <iframe\n          src={src}\n          width='100%'\n          height={height}\n          frameBorder='0'\n          webkitAllowFullScreen\n          mozallowfullscreen\n          allowFullScreen\n        ></iframe>\n      );\n\n      if (this.props.relax.editing) {\n        result = (\n          <div className={elementStyles.editingWrapper}>\n            {iframe}\n            <div className={elementStyles.editingCover}></div>\n          </div>\n        );\n      } else {\n        result = iframe;\n      }\n    } else {\n      const style = {\n        height\n      };\n      result = (\n        <div style={style} className={elementStyles.dummy}>\n          <i className='nc-icon-outline media-1_video-66'></i>\n        </div>\n      );\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/elements/video/props-schema.js",
    "content": "export default [\n  {\n    label: 'Video Host',\n    type: 'Select',\n    id: 'type',\n    props: {\n      labels: ['Youtube', 'Vimeo', 'Dailymotion'],\n      values: ['youtube', 'vimeo', 'dailymotion']\n    }\n  },\n  {\n    label: 'Video Id/Url',\n    type: 'String',\n    id: 'videoId'\n  },\n  {\n    label: 'Video Height',\n    type: 'Percentage',\n    id: 'videoHeight',\n    props: {\n      max: 200\n    }\n  }\n];\n"
  },
  {
    "path": "lib/shared/elements/video/settings.js",
    "content": "export default {\n  icon: {\n    class: 'nc-icon-mini media-1_video-65'\n  },\n  category: 'media',\n  drop: false,\n  drag: {}\n};\n"
  },
  {
    "path": "lib/shared/helpers/colors.js",
    "content": "import colr from 'colr';\nimport find from 'lodash.find';\nimport forEach from 'lodash.foreach';\nimport sortBy from 'lodash.sortby';\n\nlet colorsCollection = [];\n\nexport function updateColors (colors) {\n  colorsCollection = colors;\n}\n\nexport function hexIsValid (value) {\n  return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(value);\n}\n\nexport function getColor (colorObj, colors = colorsCollection) {\n  let color = colr().fromHex('#000000');\n  let opacity = 100;\n  let label = '#000000';\n  let type = 'hex';\n\n  if (typeof colorObj === 'object') {\n    opacity = typeof colorObj.opacity === 'number' ? colorObj.opacity : 100;\n    type = colorObj.type;\n\n    switch (colorObj.type) {\n      case 'palette': {\n        const colorFromPallete = find(colors, (clr) => (String(clr._id) === colorObj.value));\n        if (colorFromPallete) {\n          color = colr().fromHex(colorFromPallete.value);\n          label = colorFromPallete.label;\n        }\n        break;\n      }\n      case 'hex':\n        if (hexIsValid(colorObj.value)) {\n          color = colr().fromHex(colorObj.value);\n          label = colorObj.value;\n        }\n        break;\n      case 'hsv':\n        color = colr().fromHsvObject(colorObj.value);\n        label = color.toHex();\n        break;\n      case 'rgb':\n        color = colr().fromRgbObject(colorObj.value);\n        label = color.toHex();\n        break;\n      default:\n    }\n  }\n\n  return {\n    colr: color,\n    opacity,\n    label,\n    type\n  };\n}\n\nexport function getColorString (colorObj, colors = colorsCollection) {\n  let result = '#000000';\n  const color = (colorObj && colorObj.colr) ? colorObj : getColor(colorObj, colors);\n  if (color) {\n    if (color.opacity === 100) {\n      result = color.colr.toHex();\n    } else {\n      const rgb = color.colr.toRgbObject();\n      result = `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${color.opacity / 100})`;\n    }\n  }\n  return result;\n}\n\nexport function applyBackground (style, colorObj, colors = colorsCollection) {\n  if (colorObj.type !== 'linear' && colorObj.type !== 'radial') {\n    style.backgroundColor = getColorString(colorObj, colors);\n  } else if (colorObj.type === 'linear') {\n    const orderedPoints = sortBy(colorObj.points, 'perc');\n    const gradientColors = [];\n    forEach(orderedPoints, (point) => {\n      gradientColors.push(`${getColorString(point, colors)} ${point.perc}%`);\n    });\n    style.background = `linear-gradient(${90 - colorObj.angle}deg, ${gradientColors.toString()})`;\n    // TODO missing other browsers\n    // `-moz-linear-gradient(${colorObj.angle}deg, ${gradientColors.toString()})`,\n    // `-webkit-linear-gradient(${colorObj.angle}deg, ${gradientColors.toString()})`,\n    // `-o-linear-gradient(${colorObj.angle}deg, ${gradientColors.toString()})`,\n    // `-ms-linear-gradient(${colorObj.angle}deg, ${gradientColors.toString()})`,\n  } else if (colorObj.type === 'radial') {\n    const orderedPoints = sortBy(colorObj.points, 'perc');\n    const gradientColors = [];\n    forEach(orderedPoints, (point) => {\n      gradientColors.push(`${getColorString(point, colors)} ${point.perc}%`);\n    });\n\n    let radius;\n    switch (colorObj.radius) {\n      case 'cc':\n        radius = 'closest-corner';\n        break;\n      case 'fc':\n        radius = 'farthest-corner';\n        break;\n      case 'cs':\n        radius = 'closest-side';\n        break;\n      case 'fs':\n        radius = 'farthest-side';\n        break;\n      default:\n        radius = 'farthest-corner';\n    }\n\n    style.background = `radial-gradient(circle ${radius} at ${colorObj.center.left}% ${colorObj.center.top}%, ${gradientColors.toString()})`;\n    // radial-gradient(circle closest-corner at 25% 50% , #848484, #ededed 100%);\n  }\n}\n"
  },
  {
    "path": "lib/shared/helpers/configure-store.js",
    "content": "import combineActionsMiddleware from 'redux-combine-actions';\nimport createLogger from 'redux-logger';\nimport reducer from 'reducers';\nimport thunkMiddleware from 'redux-thunk';\nimport {createStore, applyMiddleware, compose} from 'redux';\n\nconst middleware = [];\n\nmiddleware.push(combineActionsMiddleware);\nmiddleware.push(thunkMiddleware);\n\nif (typeof window !== 'undefined' && module.hot) {\n  middleware.push(createLogger());\n}\n\nexport default function configureStore (routerMiddleware, initialState) {\n  const store = compose(\n    applyMiddleware(\n      ...middleware\n    ),\n    routerMiddleware\n  )(createStore)(reducer, initialState);\n\n  if (module.hot) {\n    // Enable Webpack hot module replacement for reducers\n    module.hot.accept('../reducers', () => {\n      const nextReducer = require('../reducers');\n      store.replaceReducer(nextReducer);\n    });\n  }\n\n  return store;\n}\n"
  },
  {
    "path": "lib/shared/helpers/data-types/index.js",
    "content": "export const TypesProps = {\n  String: {\n    default: ''\n  },\n  Boolean: {\n    default: false\n  },\n  Number: {\n    default: 0,\n    options: [\n      {\n        id: 'min',\n        label: 'Minimum',\n        type: 'Number',\n        props: {\n          label: '#',\n          min: false\n        }\n      },\n      {\n        id: 'max',\n        label: 'Maximum',\n        type: 'Number',\n        props: {\n          label: '#',\n          min: false\n        }\n      },\n      {\n        id: 'label',\n        label: 'Label',\n        type: 'String'\n      }\n    ],\n    defaults: {\n      min: -9999,\n      max: 9999,\n      label: '#'\n    }\n  }\n};\n\nexport const schemaTypesOrdered = [\n  'String',\n  'Html',\n  'Link',\n  'Image',\n  'Video',\n  'Audio',\n  'Date',\n  'Reference',\n  'Multiple Reference',\n  'User',\n  'Select',\n  'Boolean',\n  'Number',\n  'Icon',\n  'Color'\n];\n\nexport const dependsOnWhitelist = [\n  'String',\n  'Select',\n  'Boolean',\n  'Number'\n];\n\nexport const singleFixedProperties = [\n  {\n    id: 'title',\n    title: 'Title',\n    type: 'String',\n    required: true,\n    locked: true\n  },\n  {\n    id: 'slug',\n    title: 'Slug',\n    type: 'String',\n    required: true,\n    locked: true\n  },\n  {\n    id: 'state',\n    title: 'State',\n    type: 'String',\n    required: true,\n    locked: true\n  },\n  {\n    id: 'date',\n    title: 'Created Date',\n    type: 'Date',\n    required: true,\n    locked: true\n  },\n  {\n    id: 'updatedDate',\n    title: 'Updated Date',\n    type: 'Date',\n    required: true,\n    locked: true\n  },\n  {\n    id: 'publishedDate',\n    title: 'Published date',\n    type: 'Date',\n    required: true,\n    locked: true\n  },\n  {\n    id: 'data',\n    title: 'Page builder data',\n    type: 'Array',\n    required: true,\n    locked: true\n  }\n];\n\nexport const propertyOptions = [\n  {\n    type: 'Columns',\n    options: [\n      {\n        id: 'title',\n        label: 'Option Title',\n        type: 'String'\n      },\n      {\n        id: 'required',\n        label: 'Option Required',\n        type: 'Boolean'\n      }\n    ]\n  },\n  {\n    type: 'Select',\n    id: 'type',\n    label: 'Option Type',\n    props: {\n      labels: schemaTypesOrdered,\n      values: schemaTypesOrdered\n    }\n  }\n];\n\nexport default {\n  TypesProps,\n  schemaTypesOrdered,\n  dependsOnWhitelist,\n  singleFixedProperties,\n  propertyOptions\n};\n"
  },
  {
    "path": "lib/shared/helpers/data-types/native.js",
    "content": "import {\n  GraphQLString,\n  GraphQLInt,\n  GraphQLBoolean\n} from 'graphql';\nimport {Schema} from 'mongoose';\n\nexport const TypesNative = {\n  String,\n  Number,\n  Boolean,\n  Color: Schema.Types.Mixed,\n  Font: String,\n  Html: String,\n  Icon: String,\n  Image: String,\n  Select: String,\n  Pixels: Number,\n  Percentage: Number,\n  Padding: String,\n  Margin: String,\n  Corners: String\n};\n\nexport const TypesNativeGraphQL = {\n  String: {type: GraphQLString},\n  Number: {type: GraphQLInt},\n  Boolean: {type: GraphQLBoolean},\n  Color: {type: GraphQLString}, // TODO change to color option object\n  Font: {type: GraphQLString}, // TODO check structure\n  Html: {type: GraphQLString},\n  Icon: {type: GraphQLString},\n  Image: {type: GraphQLString},\n  Select: {type: GraphQLString},\n  Pixels: {type: GraphQLInt},\n  Percentage: {type: GraphQLInt},\n  Padding: {type: GraphQLString},\n  Margin: {type: GraphQLString},\n  Corners: {type: GraphQLString}\n};\n\nexport default {\n  TypesNative,\n  TypesNativeGraphQL\n};\n"
  },
  {
    "path": "lib/shared/helpers/displays.js",
    "content": "export default {\n  desktop: 99999,\n  tablet: 911,\n  mobile: 479\n};\n"
  },
  {
    "path": "lib/shared/helpers/ga-send.js",
    "content": "export default function gaSend () {\n  if (typeof window !== 'undefined') {\n    window.ga && window.ga('send', 'pageview');\n  }\n}\n"
  },
  {
    "path": "lib/shared/helpers/get-element-position.js",
    "content": "import forEach from 'lodash.foreach';\n\nimport displays from './displays';\n\nexport default function getElementPosition (element, display) {\n  let elementPosition = element.position;\n\n  if (display !== 'desktop' && element.displayPosition) {\n    const changes = {};\n    forEach(displays, (value, displayIt) => {\n      if (displayIt !== 'desktop' && value >= displays[display] && element.displayProps[displayIt]) {\n        Object.assign(changes, element.displayPosition[displayIt]);\n      }\n    });\n    elementPosition = Object.assign({}, elementPosition, changes);\n  }\n\n  return elementPosition;\n}\n"
  },
  {
    "path": "lib/shared/helpers/get-element-props.js",
    "content": "import forEach from 'lodash.foreach';\n\nimport displays from './displays';\n\nexport default function getElementProps (element, display) {\n  let elementProps = element.props;\n\n  if (display !== 'desktop' && element.displayProps) {\n    const changes = {};\n    forEach(displays, (value, displayIt) => {\n      if (displayIt !== 'desktop' && value >= displays[display] && element.displayProps[displayIt]) {\n        Object.assign(changes, element.displayProps[displayIt]);\n      }\n    });\n    elementProps = Object.assign({}, elementProps, changes);\n  }\n\n  return elementProps;\n}\n"
  },
  {
    "path": "lib/shared/helpers/get-element-style-values.js",
    "content": "import forEach from 'lodash.foreach';\n\nimport displays from './displays';\n\nexport default function getElementStyleValues (defaults, options, displayOptions, display) {\n  const displayValues = {};\n  if (display !== 'desktop' && displayOptions) {\n    forEach(displays, (value, displayIt) => {\n      if (displayIt !== 'desktop' && value >= displays[display] && displayOptions[displayIt]) {\n        Object.assign(displayValues, displayOptions[displayIt]);\n      }\n    });\n  }\n\n  return Object.assign({}, defaults, options, displayValues);\n}\n"
  },
  {
    "path": "lib/shared/helpers/get-gravatar-image.js",
    "content": "import md5 from 'js-md5';\n\nexport default (email, size = 100) => {\n  const hash = email ? md5(email.toLowerCase()) : '0';\n  return `http://www.gravatar.com/avatar/${hash}?d=mm&s=${size}`;\n};\n"
  },
  {
    "path": "lib/shared/helpers/icons.js",
    "content": "export default [\n  {\n    family: 'FontAwesome',\n    baseClass: 'fa',\n    reference: 'className',\n    link: 'http://fortawesome.github.io/Font-Awesome/',\n    icons: [\n      // web application icons\n      'fa-adjust',\n      'fa-adn',\n      'fa-align-center',\n      'fa-align-justify',\n      'fa-align-left',\n      'fa-align-right',\n      'fa-ambulance',\n      'fa-anchor',\n      'fa-android',\n      'fa-angellist',\n      'fa-angle-double-down',\n      'fa-angle-double-left',\n      'fa-angle-double-right',\n      'fa-angle-double-up',\n      'fa-apple',\n      'fa-archive',\n      'fa-area-chart',\n      'fa-arrow-circle-down',\n      'fa-arrow-circle-left',\n      'fa-arrow-circle-o-down',\n      'fa-arrow-circle-up',\n      'fa-arrow-down',\n      'fa-arrow-left',\n      'fa-arrow-right',\n      'fa-arrow-up',\n      'fa-arrows',\n      'fa-arrows-alt',\n      'fa-arrows-h',\n      'fa-arrows-v',\n      'fa-asterisk',\n      'fa-at',\n      'fa-automobile',\n      'fa-backward',\n      'fa-ban',\n      'fa-bank',\n      'fa-bar-chart',\n      'fa-barcode',\n      'fa-bars',\n      'fa-bed',\n      'fa-beer',\n      'fa-behance',\n      'fa-behance-square',\n      'fa-bell',\n      'fa-bell-o',\n      'fa-bell-slash',\n      'fa-bell-slash-o',\n      'fa-bicycle',\n      'fa-binoculars',\n      'fa-birthday-cake',\n      'fa-bitbucket',\n      'fa-bitbucket-square',\n      'fa-bitcoin',\n      'fa-bold',\n      'fa-bolt',\n      'fa-bomb',\n      'fa-book',\n      'fa-bookmark',\n      'fa-bookmark-o',\n      'fa-briefcase',\n      'fa-bug',\n      'fa-building',\n      'fa-building-o',\n      'fa-bullhorn',\n      'fa-bullseye',\n      'fa-bus',\n      'fa-buysellads',\n      'fa-cab',\n      'fa-calculator',\n      'fa-calendar',\n      'fa-calendar-o',\n      'fa-camera',\n      'fa-camera-retro',\n      'fa-car',\n      'fa-caret-down',\n      'fa-caret-left',\n      'fa-caret-right',\n      'fa-caret-square-o-down',\n      'fa-caret-square-o-left',\n      'fa-caret-square-o-right',\n      'fa-caret-square-o-up',\n      'fa-caret-up',\n      'fa-cart-arrow-down',\n      'fa-cart-plus',\n      'fa-cc',\n      'fa-cc-amex',\n      'fa-cc-discover',\n      'fa-cc-mastercard',\n      'fa-cc-paypal',\n      'fa-cc-stripe',\n      'fa-cc-visa',\n      'fa-certificate',\n      'fa-chain',\n      'fa-chain-broken',\n      'fa-check',\n      'fa-check-circle',\n      'fa-check-circle-o',\n      'fa-check-square',\n      'fa-check-square-o',\n      'fa-chevron-circle-down',\n      'fa-chevron-circle-left',\n      'fa-chevron-circle-right',\n      'fa-chevron-circle-up',\n      'fa-chevron-down',\n      'fa-chevron-left',\n      'fa-chevron-right',\n      'fa-chevron-up',\n      'fa-child',\n      'fa-circle',\n      'fa-circle-o',\n      'fa-circle-o-notch',\n      'fa-circle-thin',\n      'fa-clipboard',\n      'fa-clock-o',\n      'fa-close',\n      'fa-cloud',\n      'fa-cloud-download',\n      'fa-cloud-upload',\n      'fa-cny',\n      'fa-code',\n      'fa-code-fork',\n      'fa-codepen',\n      'fa-coffee',\n      'fa-cog',\n      'fa-cogs',\n      'fa-columns',\n      'fa-comment',\n      'fa-comment-o',\n      'fa-comments',\n      'fa-comments-o',\n      'fa-compass',\n      'fa-compress',\n      'fa-connectdevelop',\n      'fa-copy',\n      'fa-copyright',\n      'fa-credit-card',\n      'fa-crop',\n      'fa-crosshairs',\n      'fa-css3',\n      'fa-cube',\n      'fa-cubes',\n      'fa-cut',\n      'fa-cutlery',\n      'fa-dashboard',\n      'fa-dashcube',\n      'fa-database',\n      'fa-delicious',\n      'fa-desktop',\n      'fa-deviantart',\n      'fa-diamond',\n      'fa-digg',\n      'fa-dollar',\n      'fa-dot-circle-o',\n      'fa-download',\n      'fa-dribbble',\n      'fa-dropbox',\n      'fa-drupal',\n      'fa-edit',\n      'fa-eject',\n      'fa-ellipsis-h',\n      'fa-ellipsis-v',\n      'fa-empire',\n      'fa-envelope',\n      'fa-envelope-o',\n      'fa-envelope-square',\n      'fa-eraser',\n      'fa-euro',\n      'fa-exchange',\n      'fa-exclamation',\n      'fa-exclamation-circle',\n      'fa-exclamation-triangle',\n      'fa-expand',\n      'fa-external-link',\n      'fa-external-link-square',\n      'fa-eye',\n      'fa-eye-slash',\n      'fa-eyedropper',\n      'fa-facebook',\n      'fa-facebook-official',\n      'fa-facebook-square',\n      'fa-fast-backward',\n      'fa-fast-forward',\n      'fa-fax',\n      'fa-female',\n      'fa-fighter-jet',\n      'fa-file',\n      'fa-file-archive-o',\n      'fa-file-audio-o',\n      'fa-file-code-o',\n      'fa-file-excel-o',\n      'fa-file-image-o',\n      'fa-file-movie-o',\n      'fa-file-pdf-o',\n      'fa-file-photo-o',\n      'fa-file-picture-o',\n      'fa-file-powerpoint-o',\n      'fa-file-sound-o',\n      'fa-file-text',\n      'fa-file-text-o',\n      'fa-file-video-o',\n      'fa-file-word-o',\n      'fa-file-zip-o',\n      'fa-files-o',\n      'fa-film',\n      'fa-filter',\n      'fa-fire',\n      'fa-fire-extinguisher',\n      'fa-flag',\n      'fa-flag-checkered',\n      'fa-flag-o',\n      'fa-flash',\n      'fa-flask',\n      'fa-flickr',\n      'fa-floppy-o',\n      'fa-folder',\n      'fa-folder-o',\n      'fa-folder-open',\n      'fa-folder-open-o',\n      'fa-font',\n      'fa-forumbee',\n      'fa-forward',\n      'fa-foursquare',\n      'fa-frown-o',\n      'fa-futbol-o',\n      'fa-gamepad',\n      'fa-gavel',\n      'fa-gbp',\n      'fa-gear',\n      'fa-gears',\n      'fa-genderless',\n      'fa-gift',\n      'fa-git',\n      'fa-git-square',\n      'fa-github',\n      'fa-github-alt',\n      'fa-github-square',\n      'fa-gittip',\n      'fa-glass',\n      'fa-globe',\n      'fa-google',\n      'fa-google-plus',\n      'fa-google-plus-square',\n      'fa-google-wallet',\n      'fa-graduation-cap',\n      'fa-gratipay',\n      'fa-group',\n      'fa-h-square',\n      'fa-hacker-news',\n      'fa-hand-o-down',\n      'fa-hand-o-left',\n      'fa-hand-o-right',\n      'fa-hand-o-up',\n      'fa-hdd-o',\n      'fa-header',\n      'fa-headphones',\n      'fa-heart',\n      'fa-heart-o',\n      'fa-heartbeat',\n      'fa-history',\n      'fa-home',\n      'fa-hospital-o',\n      'fa-hotel',\n      'fa-html5',\n      'fa-ils',\n      'fa-image',\n      'fa-inbox',\n      'fa-indent',\n      'fa-info',\n      'fa-info-circle',\n      'fa-inr',\n      'fa-instagram',\n      'fa-institution',\n      'fa-ioxhost',\n      'fa-italic',\n      'fa-joomla',\n      'fa-jpy',\n      'fa-jsfiddle',\n      'fa-key',\n      'fa-keyboard-o',\n      'fa-krw',\n      'fa-language',\n      'fa-laptop',\n      'fa-lastfm',\n      'fa-lastfm-square',\n      'fa-leaf',\n      'fa-leanpub',\n      'fa-legal',\n      'fa-lemon-o',\n      'fa-level-down',\n      'fa-level-up',\n      'fa-life-bouy',\n      'fa-lightbulb-o',\n      'fa-line-chart',\n      'fa-link',\n      'fa-linkedin',\n      'fa-linkedin-square',\n      'fa-linux',\n      'fa-list',\n      'fa-list-alt',\n      'fa-list-ol',\n      'fa-list-ul',\n      'fa-location-arrow',\n      'fa-lock',\n      'fa-long-arrow-down',\n      'fa-long-arrow-left',\n      'fa-long-arrow-right',\n      'fa-long-arrow-up',\n      'fa-magic',\n      'fa-magnet',\n      'fa-mail-forward',\n      'fa-mail-reply',\n      'fa-mail-reply-all',\n      'fa-male',\n      'fa-map-marker',\n      'fa-mars',\n      'fa-mars-double',\n      'fa-mars-stroke',\n      'fa-mars-stroke-h',\n      'fa-mars-stroke-v',\n      'fa-maxcdn',\n      'fa-meanpath',\n      'fa-medium',\n      'fa-medkit',\n      'fa-meh-o',\n      'fa-mercury',\n      'fa-microphone',\n      'fa-microphone-slash',\n      'fa-minus',\n      'fa-minus-circle',\n      'fa-minus-square',\n      'fa-minus-square-o',\n      'fa-mobile',\n      'fa-money',\n      'fa-moon-o',\n      'fa-motorcycle',\n      'fa-music',\n      'fa-neuter',\n      'fa-newspaper-o',\n      'fa-openid',\n      'fa-outdent',\n      'fa-pagelines',\n      'fa-paint-brush',\n      'fa-paper-plane',\n      'fa-paper-plane-o',\n      'fa-paperclip',\n      'fa-paragraph',\n      'fa-paste',\n      'fa-pause',\n      'fa-paw',\n      'fa-paypal',\n      'fa-pencil',\n      'fa-pencil-square',\n      'fa-pencil-square-o',\n      'fa-phone',\n      'fa-phone-square',\n      'fa-picture-o',\n      'fa-pie-chart',\n      'fa-pied-piper',\n      'fa-pied-piper-alt',\n      'fa-pinterest',\n      'fa-pinterest-p',\n      'fa-pinterest-square',\n      'fa-plane',\n      'fa-play',\n      'fa-play-circle',\n      'fa-play-circle-o',\n      'fa-plug',\n      'fa-plus',\n      'fa-plus-circle',\n      'fa-plus-square',\n      'fa-plus-square-o',\n      'fa-power-off',\n      'fa-print',\n      'fa-puzzle-piece',\n      'fa-qq',\n      'fa-qrcode',\n      'fa-question',\n      'fa-question-circle',\n      'fa-quote-left',\n      'fa-quote-right',\n      'fa-random',\n      'fa-rebel',\n      'fa-recycle',\n      'fa-reddit',\n      'fa-reddit-square',\n      'fa-refresh',\n      'fa-remove',\n      'fa-renren',\n      'fa-repeat',\n      'fa-reply',\n      'fa-reply-all',\n      'fa-retweet',\n      'fa-road',\n      'fa-rocket',\n      'fa-rouble',\n      'fa-rss',\n      'fa-rss-square',\n      'fa-rub',\n      'fa-ruble',\n      'fa-rupee',\n      'fa-save',\n      'fa-scissors',\n      'fa-search',\n      'fa-search-minus',\n      'fa-search-plus',\n      'fa-sellsy',\n      'fa-server',\n      'fa-share',\n      'fa-share-alt',\n      'fa-share-alt-square',\n      'fa-share-square',\n      'fa-share-square-o',\n      'fa-shekel',\n      'fa-shield',\n      'fa-ship',\n      'fa-shirtsinbulk',\n      'fa-shopping-cart',\n      'fa-sign-in',\n      'fa-sign-out',\n      'fa-signal',\n      'fa-simplybuilt',\n      'fa-sitemap',\n      'fa-skyatlas',\n      'fa-skype',\n      'fa-slack',\n      'fa-sliders',\n      'fa-slideshare',\n      'fa-smile-o',\n      'fa-sort',\n      'fa-sort-alpha-asc',\n      'fa-sort-alpha-desc',\n      'fa-sort-amount-asc',\n      'fa-sort-amount-desc',\n      'fa-sort-asc',\n      'fa-sort-desc',\n      'fa-sort-numeric-asc',\n      'fa-sort-numeric-desc',\n      'fa-soundcloud',\n      'fa-space-shuttle',\n      'fa-spinner',\n      'fa-spoon',\n      'fa-spotify',\n      'fa-square',\n      'fa-square-o',\n      'fa-stack-exchange',\n      'fa-stack-overflow',\n      'fa-star',\n      'fa-star-half',\n      'fa-star-half-o',\n      'fa-star-o',\n      'fa-steam',\n      'fa-steam-square',\n      'fa-step-backward',\n      'fa-step-forward',\n      'fa-stethoscope',\n      'fa-stop',\n      'fa-street-view',\n      'fa-strikethrough',\n      'fa-stumbleupon',\n      'fa-stumbleupon-circle',\n      'fa-subscript',\n      'fa-subway',\n      'fa-suitcase',\n      'fa-sun-o',\n      'fa-superscript',\n      'fa-support',\n      'fa-table',\n      'fa-tablet',\n      'fa-tachometer',\n      'fa-tag',\n      'fa-tags',\n      'fa-tasks',\n      'fa-taxi',\n      'fa-tencent-weibo',\n      'fa-terminal',\n      'fa-text-height',\n      'fa-text-width',\n      'fa-th',\n      'fa-th-large',\n      'fa-th-list',\n      'fa-thumb-tack',\n      'fa-thumbs-down',\n      'fa-thumbs-o-down',\n      'fa-thumbs-o-up',\n      'fa-thumbs-up',\n      'fa-ticket',\n      'fa-times',\n      'fa-times-circle',\n      'fa-times-circle-o',\n      'fa-tint',\n      'fa-toggle-off',\n      'fa-toggle-on',\n      'fa-train',\n      'fa-transgender',\n      'fa-transgender-alt',\n      'fa-trash',\n      'fa-trash-o',\n      'fa-tree',\n      'fa-trello',\n      'fa-trophy',\n      'fa-truck',\n      'fa-try',\n      'fa-tty',\n      'fa-tumblr',\n      'fa-tumblr-square',\n      'fa-turkish-lira',\n      'fa-twitch',\n      'fa-twitter',\n      'fa-twitter-square',\n      'fa-umbrella',\n      'fa-underline',\n      'fa-undo',\n      'fa-university',\n      'fa-unlock',\n      'fa-unlock-alt',\n      'fa-unsorted',\n      'fa-upload',\n      'fa-usd',\n      'fa-user',\n      'fa-user-md',\n      'fa-user-plus',\n      'fa-user-secret',\n      'fa-user-times',\n      'fa-users',\n      'fa-venus',\n      'fa-venus-double',\n      'fa-venus-mars',\n      'fa-viacoin',\n      'fa-video-camera',\n      'fa-vimeo-square',\n      'fa-vine',\n      'fa-vk',\n      'fa-volume-down',\n      'fa-volume-off',\n      'fa-volume-up',\n      'fa-warning',\n      'fa-wechat',\n      'fa-weibo',\n      'fa-weixin',\n      'fa-whatsapp',\n      'fa-wheelchair',\n      'fa-wifi',\n      'fa-windows',\n      'fa-won',\n      'fa-wordpress',\n      'fa-wrench',\n      'fa-xing',\n      'fa-xing-square',\n      'fa-yahoo',\n      'fa-yelp',\n      'fa-youtube',\n      'fa-youtube-play',\n      'fa-youtube-square'\n    ]\n  },\n  {\n    family: 'Google icons',\n    baseClass: 'material-icons',\n    reference: 'content',\n    link: 'https://www.google.com/design/icons/',\n    icons: [\n      '3d_rotation',\n      'access_alarm',\n      'access_alarms',\n      'access_time',\n      'accessibility',\n      'account_balance',\n      'account_balance_wallet',\n      'account_box',\n      'account_circle',\n      'adb',\n      'add',\n      'add_alarm',\n      'add_alert',\n      'add_box',\n      'add_circle',\n      'add_circle_outline',\n      'add_shopping_cart',\n      'add_to_photos',\n      'adjust',\n      'airline_seat_flat',\n      'airline_seat_flat_angled',\n      'airline_seat_individual_suite',\n      'airline_seat_legroom_extra',\n      'airline_seat_legroom_normal',\n      'airline_seat_legroom_reduced',\n      'airline_seat_recline_extra',\n      'airline_seat_recline_normal',\n      'airplanemode_active',\n      'airplanemode_inactive',\n      'airplay',\n      'alarm',\n      'alarm_add',\n      'alarm_off',\n      'alarm_on',\n      'album',\n      'android',\n      'announcement',\n      'apps',\n      'archive',\n      'arrow_back',\n      'arrow_drop_down',\n      'arrow_drop_down_circle',\n      'arrow_drop_up',\n      'arrow_forward',\n      'aspect_ratio',\n      'assessment',\n      'assignment',\n      'assignment_ind',\n      'assignment_late',\n      'assignment_return',\n      'assignment_returned',\n      'assignment_turned_in',\n      'assistant',\n      'assistant_photo',\n      'attach_file',\n      'attach_money',\n      'attachment',\n      'audiotrack',\n      'autorenew',\n      'av_timer',\n      'backspace',\n      'backup',\n      'battery_alert',\n      'battery_charging_full',\n      'battery_full',\n      'battery_std',\n      'battery_unknown',\n      'beenhere',\n      'block',\n      'bluetooth',\n      'bluetooth_audio',\n      'bluetooth_connected',\n      'bluetooth_disabled',\n      'bluetooth_searching',\n      'blur_circular',\n      'blur_linear',\n      'blur_off',\n      'blur_on',\n      'book',\n      'bookmark',\n      'bookmark_border',\n      'border_all',\n      'border_bottom',\n      'border_clear',\n      'border_color',\n      'border_horizontal',\n      'border_inner',\n      'border_left',\n      'border_outer',\n      'border_right',\n      'border_style',\n      'border_top',\n      'border_vertical',\n      'brightness_1',\n      'brightness_2',\n      'brightness_3',\n      'brightness_4',\n      'brightness_5',\n      'brightness_6',\n      'brightness_7',\n      'brightness_auto',\n      'brightness_high',\n      'brightness_low',\n      'brightness_medium',\n      'broken_image',\n      'brush',\n      'bug_report',\n      'build',\n      'business',\n      'cached',\n      'cake',\n      'call',\n      'call_end',\n      'call_made',\n      'call_merge',\n      'call_missed',\n      'call_received',\n      'call_split',\n      'camera',\n      'camera_alt',\n      'camera_enhance',\n      'camera_front',\n      'camera_rear',\n      'camera_roll',\n      'cancel',\n      'card_giftcard',\n      'card_membership',\n      'card_travel',\n      'cast',\n      'cast_connected',\n      'center_focus_strong',\n      'center_focus_weak',\n      'change_history',\n      'chat',\n      'chat_bubble',\n      'chat_bubble_outline',\n      'check',\n      'check_box',\n      'check_box_outline_blank',\n      'check_circle',\n      'chevron_left',\n      'chevron_right',\n      'chrome_reader_mode',\n      'class',\n      'clear',\n      'clear_all',\n      'close',\n      'closed_caption',\n      'cloud',\n      'cloud_circle',\n      'cloud_done',\n      'cloud_download',\n      'cloud_off',\n      'cloud_queue',\n      'cloud_upload',\n      'code',\n      'collections',\n      'collections_bookmark',\n      'color_lens',\n      'colorize',\n      'comment',\n      'compare',\n      'computer',\n      'confirmation_number',\n      'contact_phone',\n      'contacts',\n      'content_copy',\n      'content_cut',\n      'content_paste',\n      'control_point',\n      'control_point_duplicate',\n      'create',\n      'credit_card',\n      'crop',\n      'crop_16_9',\n      'crop_3_2',\n      'crop_5_4',\n      'crop_7_5',\n      'crop_din',\n      'crop_free',\n      'crop_landscape',\n      'crop_original',\n      'crop_portrait',\n      'crop_square',\n      'dashboard',\n      'data_usage',\n      'dehaze',\n      'delete',\n      'description',\n      'desktop_mac',\n      'desktop_windows',\n      'details',\n      'developer_board',\n      'developer_mode',\n      'device_hub',\n      'devices',\n      'dialer_sip',\n      'dialpad',\n      'directions',\n      'directions_bike',\n      'directions_boat',\n      'directions_bus',\n      'directions_car',\n      'directions_railway',\n      'directions_run',\n      'directions_subway',\n      'directions_transit',\n      'directions_walk',\n      'disc_full',\n      'dns',\n      'do_not_disturb',\n      'do_not_disturb_alt',\n      'dock',\n      'domain',\n      'done',\n      'done_all',\n      'drafts',\n      'drive_eta',\n      'dvr',\n      'edit',\n      'eject',\n      'email',\n      'equalizer',\n      'error',\n      'error_outline',\n      'event',\n      'event_available',\n      'event_busy',\n      'event_note',\n      'event_seat',\n      'exit_to_app',\n      'expand_less',\n      'expand_more',\n      'explicit',\n      'explore',\n      'exposure',\n      'exposure_neg_1',\n      'exposure_neg_2',\n      'exposure_plus_1',\n      'exposure_plus_2',\n      'exposure_zero',\n      'extension',\n      'face',\n      'fast_forward',\n      'fast_rewind',\n      'favorite',\n      'favorite_border',\n      'feedback',\n      'file_download',\n      'file_upload',\n      'filter',\n      'filter_1',\n      'filter_2',\n      'filter_3',\n      'filter_4',\n      'filter_5',\n      'filter_6',\n      'filter_7',\n      'filter_8',\n      'filter_9',\n      'filter_9_plus',\n      'filter_b_and_w',\n      'filter_center_focus',\n      'filter_drama',\n      'filter_frames',\n      'filter_hdr',\n      'filter_list',\n      'filter_none',\n      'filter_tilt_shift',\n      'filter_vintage',\n      'find_in_page',\n      'find_replace',\n      'flag',\n      'flare',\n      'flash_auto',\n      'flash_off',\n      'flash_on',\n      'flight',\n      'flight_land',\n      'flight_takeoff',\n      'flip',\n      'flip_to_back',\n      'flip_to_front',\n      'folder',\n      'folder_open',\n      'folder_shared',\n      'folder_special',\n      'font_download',\n      'format_align_center',\n      'format_align_justify',\n      'format_align_left',\n      'format_align_right',\n      'format_bold',\n      'format_clear',\n      'format_color_fill',\n      'format_color_reset',\n      'format_color_text',\n      'format_indent_decrease',\n      'format_indent_increase',\n      'format_italic',\n      'format_line_spacing',\n      'format_list_bulleted',\n      'format_list_numbered',\n      'format_paint',\n      'format_quote',\n      'format_size',\n      'format_strikethrough',\n      'format_textdirection_l_to_r',\n      'format_textdirection_r_to_l',\n      'format_underlined',\n      'forum',\n      'forward',\n      'forward_10',\n      'forward_30',\n      'forward_5',\n      'fullscreen',\n      'fullscreen_exit',\n      'functions',\n      'gamepad',\n      'games',\n      'gesture',\n      'get_app',\n      'gif',\n      'gps_fixed',\n      'gps_not_fixed',\n      'gps_off',\n      'grade',\n      'gradient',\n      'grain',\n      'graphic_eq',\n      'grid_off',\n      'grid_on',\n      'group',\n      'group_add',\n      'group_work',\n      'hd',\n      'hdr_off',\n      'hdr_on',\n      'hdr_strong',\n      'hdr_weak',\n      'headset',\n      'headset_mic',\n      'healing',\n      'hearing',\n      'help',\n      'help_outline',\n      'high_quality',\n      'highlight_off',\n      'history',\n      'home',\n      'hotel',\n      'hourglass_empty',\n      'hourglass_full',\n      'http',\n      'https',\n      'image',\n      'image_aspect_ratio',\n      'import_export',\n      'inbox',\n      'indeterminate_check_box',\n      'info',\n      'info_outline',\n      'input',\n      'insert_chart',\n      'insert_comment',\n      'insert_drive_file',\n      'insert_emoticon',\n      'insert_invitation',\n      'insert_link',\n      'insert_photo',\n      'invert_colors',\n      'invert_colors_off',\n      'iso',\n      'keyboard',\n      'keyboard_arrow_down',\n      'keyboard_arrow_left',\n      'keyboard_arrow_right',\n      'keyboard_arrow_up',\n      'keyboard_backspace',\n      'keyboard_capslock',\n      'keyboard_hide',\n      'keyboard_return',\n      'keyboard_tab',\n      'keyboard_voice',\n      'label',\n      'label_outline',\n      'landscape',\n      'language',\n      'laptop',\n      'laptop_chromebook',\n      'laptop_mac',\n      'laptop_windows',\n      'launch',\n      'layers',\n      'layers_clear',\n      'leak_add',\n      'leak_remove',\n      'lens',\n      'library_add',\n      'library_books',\n      'library_music',\n      'link',\n      'list',\n      'live_help',\n      'live_tv',\n      'local_activity',\n      'local_airport',\n      'local_atm',\n      'local_bar',\n      'local_cafe',\n      'local_car_wash',\n      'local_convenience_store',\n      'local_dining',\n      'local_drink',\n      'local_florist',\n      'local_gas_station',\n      'local_grocery_store',\n      'local_hospital',\n      'local_hotel',\n      'local_laundry_service',\n      'local_library',\n      'local_mall',\n      'local_movies',\n      'local_offer',\n      'local_parking',\n      'local_pharmacy',\n      'local_phone',\n      'local_pizza',\n      'local_play',\n      'local_post_office',\n      'local_printshop',\n      'local_see',\n      'local_shipping',\n      'local_taxi',\n      'location_city',\n      'location_disabled',\n      'location_off',\n      'location_on',\n      'location_searching',\n      'lock',\n      'lock_open',\n      'lock_outline',\n      'looks',\n      'looks_3',\n      'looks_4',\n      'looks_5',\n      'looks_6',\n      'looks_one',\n      'looks_two',\n      'loop',\n      'loupe',\n      'loyalty',\n      'mail',\n      'map',\n      'markunread',\n      'markunread_mailbox',\n      'memory',\n      'menu',\n      'merge_type',\n      'message',\n      'mic',\n      'mic_none',\n      'mic_off',\n      'mms',\n      'mode_comment',\n      'mode_edit',\n      'money_off',\n      'monochrome_photos',\n      'mood',\n      'mood_bad',\n      'more',\n      'more_horiz',\n      'more_vert',\n      'mouse',\n      'movie',\n      'movie_creation',\n      'music_note',\n      'my_location',\n      'nature',\n      'nature_people',\n      'navigate_before',\n      'navigate_next',\n      'navigation',\n      'network_cell',\n      'network_locked',\n      'network_wifi',\n      'new_releases',\n      'nfc',\n      'no_sim',\n      'not_interested',\n      'note_add',\n      'notifications',\n      'notifications_active',\n      'notifications_none',\n      'notifications_off',\n      'notifications_paused',\n      'offline_pin',\n      'ondemand_video',\n      'open_in_browser',\n      'open_in_new',\n      'open_with',\n      'pages',\n      'pageview',\n      'palette',\n      'panorama',\n      'panorama_fish_eye',\n      'panorama_horizontal',\n      'panorama_vertical',\n      'panorama_wide_angle',\n      'party_mode',\n      'pause',\n      'pause_circle_filled',\n      'pause_circle_outline',\n      'payment',\n      'people',\n      'people_outline',\n      'perm_camera_mic',\n      'perm_contact_calendar',\n      'perm_data_setting',\n      'perm_device_information',\n      'perm_identity',\n      'perm_media',\n      'perm_phone_msg',\n      'perm_scan_wifi',\n      'person',\n      'person_add',\n      'person_outline',\n      'person_pin',\n      'personal_video',\n      'phone',\n      'phone_android',\n      'phone_bluetooth_speaker',\n      'phone_forwarded',\n      'phone_in_talk',\n      'phone_iphone',\n      'phone_locked',\n      'phone_missed',\n      'phone_paused',\n      'phonelink',\n      'phonelink_erase',\n      'phonelink_lock',\n      'phonelink_off',\n      'phonelink_ring',\n      'phonelink_setup',\n      'photo',\n      'photo_album',\n      'photo_camera',\n      'photo_library',\n      'photo_size_select_actual',\n      'photo_size_select_large',\n      'photo_size_select_small',\n      'picture_as_pdf',\n      'picture_in_picture',\n      'pin_drop',\n      'place',\n      'play_arrow',\n      'play_circle_filled',\n      'play_circle_outline',\n      'play_for_work',\n      'playlist_add',\n      'plus_one',\n      'poll',\n      'polymer',\n      'portable_wifi_off',\n      'portrait',\n      'power',\n      'power_input',\n      'power_settings_new',\n      'present_to_all',\n      'print',\n      'public',\n      'publish',\n      'query_builder',\n      'question_answer',\n      'queue',\n      'queue_music',\n      'radio',\n      'radio_button_checked',\n      'radio_button_unchecked',\n      'rate_review',\n      'receipt',\n      'recent_actors',\n      'redeem',\n      'redo',\n      'refresh',\n      'remove',\n      'remove_circle',\n      'remove_circle_outline',\n      'remove_red_eye',\n      'reorder',\n      'repeat',\n      'repeat_one',\n      'replay',\n      'replay_10',\n      'replay_30',\n      'replay_5',\n      'reply',\n      'reply_all',\n      'report',\n      'report_problem',\n      'restaurant_menu',\n      'restore',\n      'ring_volume',\n      'room',\n      'rotate_90_degrees_ccw',\n      'rotate_left',\n      'rotate_right',\n      'router',\n      'satellite',\n      'save',\n      'scanner',\n      'schedule',\n      'school',\n      'screen_lock_landscape',\n      'screen_lock_portrait',\n      'screen_lock_rotation',\n      'screen_rotation',\n      'sd_card',\n      'sd_storage',\n      'search',\n      'security',\n      'select_all',\n      'send',\n      'settings',\n      'settings_applications',\n      'settings_backup_restore',\n      'settings_bluetooth',\n      'settings_brightness',\n      'settings_cell',\n      'settings_ethernet',\n      'settings_input_antenna',\n      'settings_input_component',\n      'settings_input_composite',\n      'settings_input_hdmi',\n      'settings_input_svideo',\n      'settings_overscan',\n      'settings_phone',\n      'settings_power',\n      'settings_remote',\n      'settings_system_daydream',\n      'settings_voice',\n      'share',\n      'shop',\n      'shop_two',\n      'shopping_basket',\n      'shopping_cart',\n      'shuffle',\n      'signal_cellular_4_bar',\n      'signal_cellular_connected_no_internet_4_bar',\n      'signal_cellular_no_sim',\n      'signal_cellular_null',\n      'signal_cellular_off',\n      'signal_wifi_4_bar',\n      'signal_wifi_4_bar_lock',\n      'signal_wifi_off',\n      'sim_card',\n      'sim_card_alert',\n      'skip_next',\n      'skip_previous',\n      'slideshow',\n      'smartphone',\n      'sms',\n      'sms_failed',\n      'snooze',\n      'sort',\n      'sort_by_alpha',\n      'space_bar',\n      'speaker',\n      'speaker_group',\n      'speaker_notes',\n      'speaker_phone',\n      'spellcheck',\n      'star',\n      'star_border',\n      'star_half',\n      'stars',\n      'stay_current_landscape',\n      'stay_current_portrait',\n      'stay_primary_landscape',\n      'stay_primary_portrait',\n      'stop',\n      'storage',\n      'store',\n      'store_mall_directory',\n      'straighten',\n      'strikethrough_s',\n      'style',\n      'subject',\n      'subtitles',\n      'supervisor_account',\n      'surround_sound',\n      'swap_calls',\n      'swap_horiz',\n      'swap_vert',\n      'swap_vertical_circle',\n      'switch_camera',\n      'switch_video',\n      'sync',\n      'sync_disabled',\n      'sync_problem',\n      'system_update',\n      'system_update_alt',\n      'tab',\n      'tab_unselected',\n      'tablet',\n      'tablet_android',\n      'tablet_mac',\n      'tag_faces',\n      'tap_and_play',\n      'terrain',\n      'text_format',\n      'textsms',\n      'texture',\n      'theaters',\n      'thumb_down',\n      'thumb_up',\n      'thumbs_up_down',\n      'time_to_leave',\n      'timelapse',\n      'timer',\n      'timer_10',\n      'timer_3',\n      'timer_off',\n      'toc',\n      'today',\n      'toll',\n      'tonality',\n      'toys',\n      'track_changes',\n      'traffic',\n      'transform',\n      'translate',\n      'trending_down',\n      'trending_flat',\n      'trending_up',\n      'tune',\n      'turned_in',\n      'turned_in_not',\n      'tv',\n      'undo',\n      'unfold_less',\n      'unfold_more',\n      'usb',\n      'verified_user',\n      'vertical_align_bottom',\n      'vertical_align_center',\n      'vertical_align_top',\n      'vibration',\n      'video_library',\n      'videocam',\n      'videocam_off',\n      'view_agenda',\n      'view_array',\n      'view_carousel',\n      'view_column',\n      'view_comfy',\n      'view_compact',\n      'view_day',\n      'view_headline',\n      'view_list',\n      'view_module',\n      'view_quilt',\n      'view_stream',\n      'view_week',\n      'vignette',\n      'visibility',\n      'visibility_off',\n      'voice_chat',\n      'voicemail',\n      'volume_down',\n      'volume_mute',\n      'volume_off',\n      'volume_up',\n      'vpn_key',\n      'vpn_lock',\n      'wallpaper',\n      'warning',\n      'watch',\n      'wb_auto',\n      'wb_cloudy',\n      'wb_incandescent',\n      'wb_iridescent',\n      'wb_sunny',\n      'wc',\n      'web',\n      'whatshot',\n      'widgets',\n      'wifi',\n      'wifi_lock',\n      'wifi_tethering',\n      'work',\n      'wrap_text',\n      'youtube_searched_for',\n      'zoom_in',\n      'zoom_out'\n    ]\n  }\n];\n"
  },
  {
    "path": "lib/shared/helpers/load-fonts.js",
    "content": "import Q from 'q';\n\nexport default function loadFonts (body) {\n  const {dispatch: callback, webfontloader, type} = body;\n\n  return new Q()\n    .then(() => {\n      const deferred = Q.defer();\n      let promise = deferred.promise;\n      const newFonts = {};\n\n      function loadingFontsFinished () {\n        deferred.resolve(newFonts);\n      }\n\n      function fontActive (familyName, fvd) {\n        if (!newFonts[familyName]) {\n          newFonts[familyName] = [];\n        }\n        newFonts[familyName].push(fvd);\n      }\n\n      if (Object.keys(webfontloader).length === 0) {\n        deferred.resolve(newFonts);\n      } else {\n        const params = {\n          active: loadingFontsFinished,\n          fontactive: fontActive,\n          ...webfontloader\n        };\n\n        WebFont.load(params); // eslint-disable-line no-undef\n      }\n\n      if (callback) {\n        promise = promise.then((fonts) => {\n          callback({type, fonts});\n        });\n      }\n\n      return promise;\n    });\n}\n"
  },
  {
    "path": "lib/shared/helpers/mime-types.js",
    "content": "const IMAGE_MIME_TYPES = [\n  'image/jpeg',\n  'image/png',\n  'image/webp',\n  'image/tiff',\n  'image/gif',\n  'image/vnd.microsoft.icon',\n  'image/x-icon'\n];\nconst ICON_MIME_TYPES = ['image/vnd.microsoft.icon', 'image/x-icon'];\nconst VIDEO_MIME_TYPES = ['video/mp4', 'video/webm', 'video/ogg'];\nconst AUDIO_MIME_TYPES = ['audio/mp3', 'audio/mpeg', 'audio/ogg', 'audio/wav'];\n\nexport function getMediaType (mimeType) {\n  let result = '';\n  if (ICON_MIME_TYPES.indexOf(mimeType) !== -1) {\n    result = 'favicon';\n  } else if (IMAGE_MIME_TYPES.indexOf(mimeType) !== -1) {\n    result = 'image';\n  } else if (VIDEO_MIME_TYPES.indexOf(mimeType) !== -1) {\n    result = 'video';\n  } else if (AUDIO_MIME_TYPES.indexOf(mimeType) !== -1) {\n    result = 'audio';\n  }\n  return result;\n}\n\nexport function getMimeTypes (type) {\n  switch (type) {\n    case 'favicon':\n      return ICON_MIME_TYPES;\n    case 'image':\n      return IMAGE_MIME_TYPES;\n    case 'video':\n      return VIDEO_MIME_TYPES;\n    case 'audio':\n      return AUDIO_MIME_TYPES;\n    default:\n      return false;\n  }\n}\n"
  },
  {
    "path": "lib/shared/helpers/parse-fields.js",
    "content": "import forEach from 'lodash.foreach';\n\nexport default function parseFields (data, keys) {\n  let result = data;\n  if (data) {\n    result = Object.assign({}, data);\n    forEach(keys, (key) => {\n      if (result[key] && typeof result[key] === 'string') {\n        result[key] = JSON.parse(result[key]);\n      }\n    });\n  }\n  return result;\n}\n"
  },
  {
    "path": "lib/shared/helpers/parse-settings.js",
    "content": "import forEach from 'lodash.foreach';\n\nexport default function parseSettings (_settings) {\n  const settings = {};\n\n  forEach(_settings, (setting) => {\n    settings[setting._id] = setting.value;\n  });\n\n  return settings;\n}\n"
  },
  {
    "path": "lib/shared/helpers/request.js",
    "content": "import request from 'superagent';\nimport Q from 'q';\n\nexport default function doRequest (body) {\n  const {dispatch: callback, query, variables, type, params} = body;\n\n  return new Q()\n    .then(() => {\n      const deferred = Q.defer();\n      let promise = deferred.promise;\n\n      const req = request\n        .post('/graphql')\n        .set('Content-Type', 'application/json')\n        .set('Accept', 'application/json')\n        .send({query, variables});\n\n      req\n        .end((error, res) => {\n          if (error) {\n            deferred.reject(error);\n          } else {\n            deferred.resolve(res.body);\n          }\n        });\n\n      if (callback) {\n        promise = promise.then(({data, errors}) => {\n          callback({type, data, errors, params});\n          return data;\n        });\n      }\n\n      return promise;\n    });\n}\n"
  },
  {
    "path": "lib/shared/helpers/schema-filter-default-options.js",
    "content": "export default function getFilterDefaultOptions (type) {\n  switch (type) {\n    case 'Date':\n      return {\n        fromGran: 'day',\n        fromValue: 1,\n        toGran: 'present',\n        toValue: 1\n      };\n    case 'String':\n      return {\n        op: 'equal',\n        value: ''\n      };\n    case 'Boolean':\n      return {\n        value: 'true'\n      };\n    default:\n      return {\n        op: 'set'\n      };\n  }\n}\n"
  },
  {
    "path": "lib/shared/helpers/schema-link-actions.js",
    "content": "import forEach from 'lodash.foreach';\nimport Utils from 'helpers/utils';\n\nexport default function (pageBuilder, linkedElement, property) {\n  const actionsValues = [];\n  const actionsLabels = [];\n  const ElementClass = pageBuilder.elements[linkedElement.tag];\n\n  // Content\n  if (linkedElement.tag === 'TextBox') {\n    actionsLabels.push('Content');\n    actionsValues.push('children');\n  }\n\n  // Settings\n  if (ElementClass.propsSchema && ElementClass.propsSchema.length > 0) {\n    // Check settings that match property type\n    const propsList = Utils.getPropSchemaList(ElementClass.propsSchema);\n    forEach(propsList, propSchema => {\n      if (propSchema.id && propSchema.type === property.type) {\n        actionsLabels.push(propSchema.label);\n        actionsValues.push(propSchema.id);\n      }\n    });\n  }\n\n  // Display\n  const extraLabel = (property.type === 'Boolean' ? 'true' : 'not empty');\n  actionsLabels.push(`Visible (when ${extraLabel})`);\n  actionsValues.push('show');\n  actionsLabels.push(`Hidden (when ${extraLabel})`);\n  actionsValues.push('hide');\n\n  return {\n    labels: actionsLabels,\n    values: actionsValues\n  };\n}\n"
  },
  {
    "path": "lib/shared/helpers/schema-static-properties.js",
    "content": "export default [\n  {\n    id: 'title',\n    title: 'Title',\n    type: 'String'\n  },\n  {\n    id: 'slug',\n    title: 'Slug',\n    type: 'String'\n  },\n  {\n    id: 'date',\n    title: 'Created Date',\n    type: 'Date'\n  },\n  {\n    id: 'publishedDate',\n    title: 'Published Date',\n    type: 'Date'\n  },\n  {\n    id: 'updatedDate',\n    title: 'Updated Date',\n    type: 'Date'\n  }\n];\n"
  },
  {
    "path": "lib/shared/helpers/stringify-fields.js",
    "content": "import forEach from 'lodash.foreach';\n\nexport default function stringifyFields (data, keys) {\n  let result = data;\n  if (data) {\n    result = Object.assign({}, data);\n    forEach(keys, (key) => {\n      if (result[key]) {\n        result[key] = JSON.stringify(result[key]);\n      }\n    });\n  }\n  return result;\n}\n"
  },
  {
    "path": "lib/shared/helpers/styles-manager.js",
    "content": "import find from 'lodash.find';\nimport forEach from 'lodash.foreach';\nimport {Stylesheet} from 'relax-jss';\n\nimport getElementStyleValues from './get-element-style-values';\n\nclass StylesManager {\n  constructor () {\n    this.stylesMap = {};\n    this.singleStylesheet = new Stylesheet();\n  }\n\n  changeStyle (id, styleOptions, options, displayOptions, display, single) {\n    const stylesheet = single && this.singleStylesheet || new Stylesheet();\n    const rules = styleOptions.rules(getElementStyleValues(\n      styleOptions.defaults,\n      options,\n      displayOptions,\n      display\n    ));\n    const classMap = stylesheet.createRules(rules);\n\n    this.stylesMap = Object.assign({}, this.stylesMap, {\n      [id]: {\n        options,\n        displayOptions,\n        display,\n        stylesheet,\n        classMap\n      }\n    });\n\n    return classMap;\n  }\n\n  getClassMap (id, styleOptions, options, displayOptions, display, single) {\n    let classMap;\n    const styleMap = this.stylesMap[id];\n    if (!styleMap ||\n        styleMap &&\n        (styleMap.options !== options ||\n         display !== 'desktop' &&\n         styleMap.displayOptions !== displayOptions ||\n         styleMap.displayOptions &&\n         styleMap.display !== display)\n       ) {\n      classMap = this.changeStyle(id, styleOptions, options, displayOptions, display, single);\n    } else {\n      classMap = styleMap.classMap;\n    }\n    return classMap;\n  }\n\n  getStyleOptions (style, elements) {\n    let result = style;\n    if (typeof style === 'string') {\n      forEach(elements, (element) => {\n        if (element.style && typeof element.style === 'object' && element.style.type === style) {\n          result = element.style;\n        }\n      });\n    }\n    return result;\n  }\n\n  processElement (element, elementProps, ElementClass, styles, elements, display, single = false) {\n    let classMap = {};\n    if (ElementClass && ElementClass.style) {\n      const styleId = elementProps && elementProps.style || 'no_style';\n      const styleOptions = this.getStyleOptions(ElementClass.style, elements);\n\n      if (styleId === 'no_style' && !element.style) {\n        // Default style\n        classMap = this.getClassMap(\n          styleOptions.type,\n          styleOptions,\n          styleOptions.defaults,\n          element.displayStyle,\n          display,\n          single\n        );\n      } else {\n        // Apply style\n        if (styleId === 'no_style') {\n          classMap = this.getClassMap(\n            element.id,\n            styleOptions,\n            element.style,\n            element.displayStyle,\n            display,\n            single\n          );\n        } else {\n          const style = find(styles, {_id: styleId});\n          if (style) {\n            classMap = this.getClassMap(\n              styleId,\n              styleOptions,\n              style.options,\n              style.displayOptions,\n              display,\n              single\n            );\n          }\n        }\n      }\n    }\n    return classMap;\n  }\n}\n\nexport default new StylesManager();\n"
  },
  {
    "path": "lib/shared/helpers/stylesheet.js",
    "content": "import {Stylesheet} from 'relax-jss';\nexport default new Stylesheet();\n"
  },
  {
    "path": "lib/shared/helpers/utils.js",
    "content": "import cloneDeep from 'lodash.clonedeep';\nimport forEach from 'lodash.foreach';\nimport Colr from 'colr';\n\nimport {getColorString} from './colors';\n\nconst utils = {\n  isPercentage (str) {\n    return str && str[str.length - 1] === '%';\n  },\n\n  roundSnap (value, snaps) {\n    let result = Math.round(value);\n    forEach(snaps, (snap) => {\n      if (value > snap - 1 && value < snap + 1) {\n        result = snap;\n      }\n    });\n    return result;\n  },\n\n  pointsDistance (p1, p2) {\n    const distX = p1.x - p2.x;\n    const distY = p1.y - p2.y;\n    return Math.sqrt(distX * distX + distY * distY);\n  },\n\n  getPointInLineByPerc (pointA, pointB, perc) {\n    // PA + t / 100 * (PA - PB)\n    return {\n      x: pointA.x + perc / 100 * (pointB.x - pointA.x),\n      y: pointA.y + perc / 100 * (pointB.y - pointA.y)\n    };\n  },\n\n  validateGATrackingId (str) {\n    return /(UA|YT|MO)-\\d+-\\d+/i.test(str);\n  },\n\n  makeBorder (style, property, border) {\n    if (border.style !== 'none' && border.width !== 0) {\n      style[property] = `${border.width}px ${border.style} ${getColorString(border.color)}`;\n    }\n  },\n\n  applyBorders (style, borderObj) {\n    if (borderObj && borderObj.top && borderObj.left && borderObj.right && borderObj.bottom) {\n      if (borderObj.equal) {\n        this.makeBorder(style, 'border', borderObj.top);\n      } else {\n        this.makeBorder(style, 'borderTop', borderObj.top);\n        this.makeBorder(style, 'borderRight', borderObj.right);\n        this.makeBorder(style, 'borderBottom', borderObj.bottom);\n        this.makeBorder(style, 'borderLeft', borderObj.left);\n      }\n    }\n  },\n\n  applyTextShadows (style, shadows) {\n    const map = shadows.map(\n      (shadow) => `${shadow.x} ${shadow.y} ${shadow.blur} ${getColorString(shadow.color)}`\n    );\n    style.textShadow = map.toString();\n  },\n\n  applyBoxShadows (style, shadows) {\n    const map = shadows.map(\n      (shadow) => {\n        const type = shadow.type === 'inset' ? 'inset ' : '';\n        return `${type}${shadow.x} ${shadow.y} ${shadow.blur} ${shadow.spread} ${getColorString(shadow.color)}`;\n      }\n    );\n    const str = map.toString();\n    style.boxShadow = str;\n  },\n\n  parseYoutubeURL (url) {\n    const regExp = /^.*((youtu.be\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#&\\?]*).*/;\n    const match = url.match(regExp);\n    let result;\n    if (match && match[7].length === 11) {\n      result = match[7];\n    } else {\n      result = false;\n    }\n    return result;\n  },\n\n  parseVimeoURL (url) {\n    const regExp = /^.*(vimeo\\.com\\/)((channels\\/[A-z]+\\/)|(groups\\/[A-z]+\\/videos\\/))?([0-9]+)/;\n    const match = regExp.exec(url);\n    let result;\n    if (match && match[5].length === 9) {\n      result = match[5];\n    } else {\n      result = false;\n    }\n    return result;\n  },\n\n  parseDailymotionURL (url) {\n    const regExp = /^.+dailymotion.com\\/((video|hub)\\/([^_]+))?[^#]*(#video=([^_&]+))?/;\n    const match = url.match(regExp);\n    let result;\n    if (match && match.length > 2) {\n      result = match[5] || match[3];\n    } else {\n      result = false;\n    }\n    return result;\n  },\n\n  parseColumnsDisplay (value, numChildren, multiRows, idChanged = -1) {\n    let parsedValue;\n\n    if (value && value.constructor === Array) {\n      parsedValue = value;\n    } else {\n      parsedValue = [];\n    }\n\n    // Check missing\n    if (parsedValue.length < numChildren) {\n      let difference = numChildren - parsedValue.length;\n\n      for (difference; difference > 0; difference--) {\n        parsedValue.push({\n          width: multiRows ? 'block' : 'auto',\n          break: false,\n          widthPerc: '50%'\n        });\n      }\n    }\n\n    // Check if too much\n    if (parsedValue.length > numChildren) {\n      const difference = parsedValue.length - numChildren;\n      parsedValue.splice(-difference, difference);\n    }\n\n    // Go through all to check rules\n    if (multiRows && numChildren > 1) {\n      let previous = 'block';\n      let i;\n      for (i = 0; i < parsedValue.length; i++) {\n        if (previous === 'block' && parsedValue[i].width !== 'block') {\n          if (i === numChildren - 1) {\n            if (idChanged === i) {\n              parsedValue[i - 1].width = 'auto';\n            } else {\n              parsedValue[i].width = 'block';\n            }\n          } else if (parsedValue[i + 1].width === 'block') {\n            if (idChanged === i) {\n              parsedValue[i + 1].width = 'auto';\n            } else {\n              parsedValue[i].width = 'block';\n            }\n          }\n        }\n\n        if (parsedValue[i].width === 'block' ||\n            previous === 'block' ||\n            (i >= 2 && parsedValue[i - 2].width === 'block') ||\n            i === parsedValue.length - 1) {\n          parsedValue[i].break = false;\n        }\n\n        if (parsedValue[i].break && i < parsedValue.length - 1) {\n          if (parsedValue[i + 1].width === 'block') {\n            if (idChanged === i + 1) {\n              parsedValue[i].break = false;\n            } else {\n              parsedValue[i + 1].width = 'auto';\n            }\n          }\n        }\n\n        if (!parsedValue[i].widthPerc) {\n          parsedValue[i].widthPerc = '50%';\n        }\n\n        previous = parsedValue[i].width;\n      }\n    }\n\n    // Calculate auto widths\n    let it;\n    let it1;\n    for (it = 0; it < parsedValue.length; it++) {\n      if (parsedValue[it].width !== 'block') {\n        let countAutoColumns = 0;\n        let availableAutoSpace = 100;\n\n        for (it1 = it; it1 < parsedValue.length; it1++) {\n          if ((parsedValue[it1].break && it1 !== it) || parsedValue[it1].width === 'block') {\n            break;\n          }\n\n          if (parsedValue[it1].width === 'custom') {\n            availableAutoSpace -= parseInt(parsedValue[it1].widthPerc, 10);\n          } else if (parsedValue[it1].width === 'auto') {\n            countAutoColumns ++;\n          }\n        }\n\n        // calc and apply width\n        if (countAutoColumns > 0) {\n          const widthCalc = Math.round(availableAutoSpace / countAutoColumns * 100) / 100;\n\n          for (it; it < it1; it++) {\n            if (parsedValue[it].width === 'auto') {\n              parsedValue[it].widthPerc = `${widthCalc}%`;\n            }\n          }\n\n          it--;\n        } else {\n          it = it1 - 1;\n        }\n      }\n    }\n\n    return parsedValue;\n  },\n\n  getOffsetRect (elem) {\n    const box = elem.getBoundingClientRect();\n\n    const body = document.body;\n    const docElem = document.documentElement;\n\n    const scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;\n    const scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;\n\n    const clientTop = docElem.clientTop || body.clientTop || 0;\n    const clientLeft = docElem.clientLeft || body.clientLeft || 0;\n\n    const top = box.top + scrollTop - clientTop;\n    const left = box.left + scrollLeft - clientLeft;\n\n    return {\n      top: Math.round(top),\n      left: Math.round(left),\n      width: Math.round(box.right - box.left),\n      height: Math.round(box.bottom - box.top)\n    };\n  },\n\n  limitNumber (number, min, max) {\n    let result = number;\n\n    if (number < min) {\n      result = min;\n    } else if (number > max) {\n      result = max;\n    }\n\n    return result;\n  },\n\n  hasClass (dom, className) {\n    return dom.className.indexOf(className) !== -1;\n  },\n\n  addClass (dom, className) {\n    if (!this.hasClass(dom, className)) {\n      dom.className = `${dom.className} ${className}`;\n    }\n  },\n\n  removeClass (dom, className) {\n    let str = dom.className;\n    str = str.replace(` ${className}`, '');\n    str = str.replace(`${className} `, '');\n    dom.className = str;\n  },\n\n  getBestImageVariation (variations, width, height = 0) {\n    let variationReturn = false;\n\n    forEach(variations, (variation) => {\n      if (variation.dimension.width >= width &&\n          variation.dimension.height >= height &&\n          (variation.dimension.width - width < 100 || variation.dimension.heigh - height < 100)) {\n        variationReturn = variation;\n      }\n    });\n\n    return variationReturn;\n  },\n\n  getBestImageUrl (imageId, width = 0, height = 0) {\n    let result = '';\n\n    if (imageId && imageId !== '' && typeof imageId !== 'undefined') {\n      result = `/api/media/resize/${imageId}/${width}/${height}`;\n    }\n\n    return result;\n  },\n\n  parseQueryUrl (url, query) {\n    let resultUrl = url;\n    let count = 0;\n    forEach(query, (value, key) => {\n      resultUrl += count === 0 ? '?' : '&';\n      resultUrl += `${key}=`;\n      resultUrl += typeof value === 'object' ? JSON.stringify(value) : value;\n      count ++;\n    });\n    return resultUrl;\n  },\n\n  parseQueryString (queryString) {\n    const params = {};\n    let i;\n    let l;\n\n    // Split into key/value pairs\n    const queries = queryString.split('&');\n\n    // Convert the array of strings into an object\n    for (i = 0, l = queries.length; i < l; i++) {\n      const temp = queries[i].split('=');\n      params[temp[0]] = temp[1];\n    }\n\n    return params;\n  },\n\n  _getPropSchemaListIt (propsSchema, list, defaultLabel = '') {\n    let resultList = list;\n    forEach(propsSchema, (propSchema) => {\n      if (!propSchema.label && defaultLabel !== '') {\n        propSchema.label = defaultLabel;\n      }\n      resultList.push(propSchema);\n      if (propSchema.unlocks) {\n        if (propSchema.unlocks.constructor === Array) {\n          resultList = this._getPropSchemaListIt(propSchema.unlocks, resultList, propSchema.label);\n        } else {\n          forEach(propsSchema.unlocks, (propSchemaUnlocks) => {\n            resultList = this._getPropSchemaListIt(propSchemaUnlocks, resultList);\n          });\n        }\n      }\n    });\n\n    return resultList;\n  },\n\n  getPropSchemaList (propsSchema) {\n    return this._getPropSchemaListIt(cloneDeep(propsSchema), []);\n  },\n\n\n  // Filers font family into more readable state ex: source-sans-pro into source sans pro\n  filterFontFamily (str) {\n    return str.replace(/-/g, ' ');\n  },\n\n  // Makes a fvd more readable\n  filterFVD (fvd) {\n    let str = '';\n\n    // font weight\n    const weightChar = fvd.charAt(1);\n    str += `${weightChar}00 `;\n\n    // font style\n    // n: normal  (default)\n    // i: italic\n    // o: oblique\n    const styleChar = fvd.charAt(0);\n\n    if (styleChar === 'n') {\n      str += 'normal';\n    } else if (styleChar === 'i') {\n      str += 'italic';\n    } else if (styleChar === 'o') {\n      str += 'oblique';\n    }\n\n    return str;\n  },\n\n  getRGBA (hex, opacity) {\n    const colr = Colr.fromHex(hex);\n    const rgb = colr.toRgbObject();\n\n    return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${opacity})`;\n  },\n\n  border (arr, size, style, color, opacity) {\n    arr.border = `${size} ${style} ${utils.getRGBA(color, parseInt(opacity, 10) / 100.0)}`;\n    arr.WebkitBackgroundClip = 'padding-box';\n    arr.backgroundClip = 'padding-box';\n  },\n\n  isClient () {\n    return typeof document !== 'undefined';\n  },\n\n  rounded (arr, corners) {\n    arr.WebkitBorderRadius = corners;\n    arr.MozBorderRadius = corners;\n    arr.OBorderRadius = corners;\n    arr.borderRadius = corners;\n  },\n\n  backgroundRGBA (arr, color, opacity) {\n    arr.backgroundColor = utils.getRGBA(color, parseInt(opacity, 10) / 100.0);\n  },\n\n  transition (arr, to, time, ease) {\n    const transition = `${to} ${time} ${ease}`;\n    arr.transition = transition;\n    arr.WebkitTransition = transition;\n    arr.MozTransition = transition;\n    arr.OTransition = transition;\n  },\n\n  translate (arr, x, y) {\n    const translate = `translate(${x}, ${y})`;\n    arr.transform = translate;\n    arr.msTransform = translate;\n    arr.MozTransform = translate;\n    arr.WebkitTransform = translate;\n    arr.OTransform = translate;\n  },\n\n  padding (arr, top, right, bottom, left) {\n    arr.padding = `${top} ${right} ${bottom} ${left}`;\n  },\n\n  // Return json from a font format fvd (ex. input: i4, n4, n8 ...) https://github.com/typekit/fvd\n  processFVD (style, fvd) {\n    style.fontStyle = 'normal';\n    style.fontWeight = 400;\n\n    // font style\n    // n: normal  (default)\n    // i: italic\n    // o: oblique\n    const styleChar = fvd.charAt(0);\n\n    if (styleChar === 'i') {\n      style.fontStyle = 'italic';\n    } else if (styleChar === 'o') {\n      style.fontStyle = 'oblique';\n    }\n\n    // font weight\n    const weightChar = fvd.charAt(1);\n    style.fontWeight = parseInt(`${weightChar}00`, 10);\n  },\n\n  getElementsSchemaLinks (schemaLinks) {\n    const elementsLinks = {};\n    if (schemaLinks) {\n      forEach(schemaLinks, (links, propertyId) => {\n        forEach(links, (link) => {\n          elementsLinks[link.elementId] = elementsLinks[link.elementId] || [];\n          elementsLinks[link.elementId].push({\n            propertyId,\n            action: link.action\n          });\n        });\n      });\n    }\n    return elementsLinks;\n  },\n\n  alterSchemaElementProps (links, element, schemaEntry, elementProps = {}) {\n    const changes = {};\n    forEach(links, (link) => {\n      const splitted = link.propertyId.split('#');\n      let schemaEntryValue = schemaEntry;\n      forEach(splitted, (pathKey) => {\n        schemaEntryValue = schemaEntryValue[pathKey];\n      });\n\n      if (link.action === 'children') {\n        if (schemaEntryValue) {\n          changes.children = schemaEntryValue;\n        } else {\n          changes.display = false;\n        }\n      } else if (link.action === 'show' && (!schemaEntryValue || schemaEntryValue === '')) {\n        changes.display = false;\n      } else if (link.action === 'hide' && schemaEntryValue && schemaEntryValue !== '') {\n        changes.display = false;\n      } else if (link.action) { // setting\n        elementProps[link.action] = schemaEntryValue;\n      }\n    });\n    return Object.assign({}, element, changes);\n  }\n};\n\nexport default utils;\n"
  },
  {
    "path": "lib/shared/reducers/admin-menu.js",
    "content": "import actionTypes from 'actions';\n\nconst defaultState = true;\n\nexport default function adminMenuReducer (state = defaultState, action = {}) {\n  switch (action.type) {\n    case actionTypes.openAdminMenu:\n      return true;\n    case actionTypes.closeAdminMenu:\n      return false;\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "lib/shared/reducers/display.js",
    "content": "import actionTypes from 'actions';\n\nconst defaultState = 'desktop';\n\nexport default function displayReducer (state = defaultState, action = {}) {\n  switch (action.type) {\n    case actionTypes.changeDisplay:\n      return action.value;\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "lib/shared/reducers/dnd.js",
    "content": "import actionTypes from 'actions';\n\nconst defaultState = {\n  dragging: false,\n  draggingData: {},\n  dragInfo: false,\n  dropInfo: false,\n  droppableOrientation: 'vertical'\n};\n\nexport default function dndReducer (state = defaultState, action = {}) {\n  switch (action.type) {\n    case actionTypes.startDragging:\n      return Object.assign({}, state, {\n        dragging: true,\n        draggingData: action.draggingData,\n        dragInfo: action.dragInfo\n      });\n    case actionTypes.onDroppable:\n      return Object.assign({}, state, {\n        dropInfo: action.dropInfo\n      });\n    case actionTypes.outDroppable:\n      if (state.dropInfo && state.dropInfo.id === action.id) {\n        return Object.assign({}, state, {\n          dropInfo: false\n        });\n      }\n      return state;\n    case actionTypes.stopDragging:\n      return Object.assign({}, defaultState);\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "lib/shared/reducers/fonts.js",
    "content": "import actionTypes from 'actions';\nimport cloneDeep from 'lodash.clonedeep';\nimport forEach from 'lodash.foreach';\nimport Relate from 'relate-js';\n\nconst defaultState = {\n  data: {\n    previewText: 'Abc',\n    previewLayout: 'grid', // grid || list\n    input: {\n      google: {\n        input: '',\n        valid: false\n      },\n      typekit: {\n        input: '',\n        valid: false\n      },\n      fontdeck: {\n        input: '',\n        valid: false\n      },\n      monotype: {\n        input: '',\n        valid: false\n      },\n      custom: {\n        input: '',\n        valid: false\n      }\n    },\n    customFonts: [],\n    fonts: {},\n    webfontloader: {}\n  },\n  newCustom: null,\n  errors: null\n};\n\nfunction parseSettings (_settings) {\n  const settings = {};\n\n  forEach(_settings, (setting) => {\n    settings[setting._id] = setting.value;\n  });\n\n  return settings;\n}\n\nexport default function fontsReducer (state = defaultState, action = {}) {\n  switch (action.type) {\n    case Relate.actionTypes.query:\n      if (action.data.settings) {\n        const parsed = parseSettings(action.data.settings);\n        if (parsed.fonts) {\n          return Object.assign({}, state, {\n            data: JSON.parse(parsed.fonts),\n            errors: action.errors\n          });\n        }\n      }\n      return state;\n    case actionTypes.changeFontsPreviewText:\n      return Object.assign({}, state, {\n        data: Object.assign({}, state.data, {\n          previewText: action.value\n        })\n      });\n    case actionTypes.changeFontsPreviewLayout:\n      return Object.assign({}, state, {\n        data: Object.assign({}, state.data, {\n          previewLayout: action.value\n        })\n      });\n    case actionTypes.loadFonts:\n      return Object.assign({}, state, {\n        data: Object.assign({}, state.data, {\n          fonts: action.fonts\n        })\n      });\n    case actionTypes.submitCustomFont:\n      return Object.assign({}, state, {\n        data: Object.assign({}, state.data, {\n          customFonts: [...state.data.customFonts, action.data.submitCustomFont]\n        }),\n        newCustom: action.data.submitCustomFont,\n        errors: action.errors\n      });\n    case actionTypes.customFontIncluded: {\n      const fontsDataClone = cloneDeep(state.data);\n      fontsDataClone.webfontloader.custom = fontsDataClone.webfontloader.custom || {families: []};\n      fontsDataClone.webfontloader.custom.families.push(state.newCustom.family);\n      return Object.assign({}, state, {\n        data: fontsDataClone,\n        newCustom: null\n      });\n    }\n    case actionTypes.removeCustomFont: {\n      const fontsDataRemoveClone = cloneDeep(state.data);\n      const id = action.data.removeCustomFont.id;\n      forEach(fontsDataRemoveClone.customFonts, (obj, index) => {\n        if (obj.id === id) {\n          fontsDataRemoveClone.customFonts.splice(index, 1);\n\n          const ind = fontsDataRemoveClone.webfontloader.custom.families.indexOf(obj.family);\n          if (ind !== -1) {\n            fontsDataRemoveClone.webfontloader.custom.families.splice(ind, 1);\n            if (fontsDataRemoveClone.webfontloader.custom.families.length === 0) {\n              delete fontsDataRemoveClone.webfontloader.custom;\n            }\n          }\n\n          return false;\n        }\n      });\n      return Object.assign({}, state, {\n        data: fontsDataRemoveClone\n      });\n    }\n    case actionTypes.changeFontInput: {\n      const fontsClone = cloneDeep(state.data);\n      const tab = action.tab;\n      const value = action.value;\n      let nowValid = false;\n      let previousValid;\n\n      if (tab === 0) {\n        // Google fonts validation\n        previousValid = state.data.input.google.valid;\n        fontsClone.input.google.input = value;\n        fontsClone.input.google.valid = false;\n\n        const paramsStr = value.split('?');\n\n        // Valid if has params\n        if (paramsStr.length === 2) {\n          const params = {};\n          const re = /[?&]?([^=]+)=([^&]*)/g;\n          let tokens = re.exec(paramsStr[1]);\n\n          while (tokens) {\n            params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);\n            tokens = re.exec(paramsStr[1]);\n          }\n\n          if (params.family) {\n            fontsClone.input.google.valid = true;\n            nowValid = true;\n\n            if (!fontsClone.webfontloader.google) {\n              fontsClone.webfontloader.google = {\n                families: []\n              };\n            } else {\n              fontsClone.webfontloader.google.families = [];\n            }\n\n            // Object {family: \"Lobster|Open+Sans:400,700\", subset: \"latin,cyrillic-ext,cyrillic\"}\n            const families = params.family.split('|');\n            for (let i = 0; i < families.length; i++) {\n              let googleFont = families[i];\n\n              // Might not have multiple weights\n              if (families[i].indexOf(':') === -1) {\n                googleFont += ':';\n              }\n\n              if (params.subset) {\n                googleFont += `:${params.subset}`;\n              } else {\n                googleFont += ':latin';\n              }\n\n              fontsClone.webfontloader.google.families.push(googleFont);\n            }\n          }\n        }\n\n        if (!nowValid && fontsClone.webfontloader.google) {\n          delete fontsClone.webfontloader.google;\n        }\n      } else if (tab === 1) {\n        // Typekit validation\n        previousValid = state.data.input.typekit.valid;\n        fontsClone.input.typekit.input = value;\n        fontsClone.input.typekit.valid = false;\n\n        if (value.length === 7) {\n          nowValid = true;\n          fontsClone.input.typekit.valid = true;\n          fontsClone.webfontloader.typekit = fontsClone.webfontloader.typekit || {};\n          fontsClone.webfontloader.typekit.id = value;\n        }\n\n        if (!nowValid && fontsClone.webfontloader.typekit) {\n          delete fontsClone.webfontloader.typekit;\n        }\n      } else if (tab === 2) {\n        // Fonts.com (monotype) validation\n        previousValid = state.data.input.monotype.valid;\n        fontsClone.input.monotype.input = value;\n        fontsClone.input.monotype.valid = false;\n\n        if (value.length === 36) {\n          const regex = new RegExp(/[0-9|a-z]{8}-[0-9|a-z]{4}-[0-9|a-z]{4}-[0-9|a-z]{4}-[0-9|a-z]{12}/g);\n          fontsClone.input.monotype.valid = regex.test(value);\n        }\n\n        // valid\n        if (fontsClone.input.monotype.valid) {\n          nowValid = true;\n          fontsClone.webfontloader.monotype = fontsClone.webfontloader.monotype || {};\n\n          fontsClone.webfontloader.monotype.projectId = value;\n        } else if (fontsClone.webfontloader.monotype) {\n          delete fontsClone.webfontloader.monotype;\n        }\n      } else if (tab === 3) {\n        // Font Deck validation\n        previousValid = state.data.input.fontdeck.valid;\n        fontsClone.input.fontdeck.input = value;\n        fontsClone.input.fontdeck.valid = false;\n\n        if (value.length === 5) {\n          nowValid = true;\n          fontsClone.input.fontdeck.valid = true;\n          fontsClone.webfontloader.fontdeck = fontsClone.webfontloader.fontdeck || {};\n\n          fontsClone.webfontloader.fontdeck.id = value;\n        }\n\n        if (!nowValid && fontsClone.webfontloader.fontdeck) {\n          delete fontsClone.webfontloader.fontdeck;\n        }\n      }\n\n      if (previousValid && !nowValid || nowValid) {\n        // TODO re load fonts\n      }\n\n      return Object.assign({}, state, {\n        data: fontsClone\n      });\n    }\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "lib/shared/reducers/index.js",
    "content": "import {combineReducers} from 'redux';\nimport {routerStateReducer as router} from 'redux-router';\nimport {relateReducer} from 'relate-js';\n\nimport adminMenu from './admin-menu';\nimport display from './display';\nimport dnd from './dnd';\nimport fonts from './fonts';\nimport media from './media';\nimport menu from './menu';\nimport pageBuilder from './page-builder';\nimport revisions from './revisions';\nimport schema from './schema';\nimport schemaEntry from './schema-entry';\nimport session from './session';\nimport settings from './settings';\nimport styles from './styles';\nimport symbols from './symbols';\n\nconst rootReducer = combineReducers({\n  relateReducer,\n  adminMenu,\n  display,\n  dnd,\n  fonts,\n  media,\n  menu,\n  pageBuilder,\n  revisions,\n  schema,\n  schemaEntry,\n  settings,\n  styles,\n  symbols,\n  session,\n  router\n});\n\nexport default rootReducer;\n"
  },
  {
    "path": "lib/shared/reducers/media.js",
    "content": "import actionTypes from 'actions';\nimport findIndex from 'lodash.findindex';\n\nconst defaultState = {\n  display: 'grid',\n  uploads: []\n};\n\nfunction changeUploadStatus ({state, id, status}) {\n  const uploads = state.uploads.slice(0);\n  const index = findIndex(uploads, ['id', id]);\n\n  if (index !== -1) {\n    uploads[index] = Object.assign({}, uploads[index], {\n      status\n    });\n  }\n\n  return Object.assign({}, state, {uploads});\n}\n\nexport default function mediaReducer (state = defaultState, action = {}) {\n  switch (action.type) {\n    case actionTypes.addFilesToUpload: {\n      const files = action.files.map((file) => ({\n        id: file.id,\n        name: file.name,\n        status: 'queue' // queue || uploading || success || error\n      }));\n      return Object.assign({}, state, {\n        uploads: state.uploads.concat(files)\n      });\n    }\n    case actionTypes.changeMediaDisplay:\n      return Object.assign({}, state, {\n        display: action.display\n      });\n    case actionTypes.uploadingMedia:\n      return changeUploadStatus({\n        state,\n        id: action.fileId,\n        status: 'uploading'\n      });\n    case actionTypes.mediaUploadSuccess:\n      return changeUploadStatus({\n        state,\n        id: action.fileId,\n        status: 'success'\n      });\n    case actionTypes.mediaUploadError:\n      return changeUploadStatus({\n        state,\n        id: action.fileId,\n        status: 'error'\n      });\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "lib/shared/reducers/menu.js",
    "content": "import actionTypes from 'actions';\nimport Relate from 'relate-js';\n\nconst defaultState = {};\n\nlet ID = 0;\nexport default function getLastId (data) {\n  while (data[ID]) {\n    ID++;\n  }\n  return (ID++).toString();\n}\n\nexport default function menuReducer (state = defaultState, action = {}) {\n  switch (action.type) {\n    case Relate.actionTypes.query:\n      if (action.data.menu && action.data.menu.data) {\n        return JSON.parse(action.data.menu.data);\n      }\n      return state;\n    case actionTypes.addMenuItem: { // new menu item\n      const destId = action.destination.id;\n      const destPos = action.destination.position;\n      const id = getLastId(state);\n      const changes = {\n        [id]: Object.assign({id, parent: destId}, action.item)\n      };\n\n      if (!state[destId] && destId === 'root') {\n        // create root\n        changes.root = {\n          id: 'root',\n          children: [id]\n        };\n      } else {\n        const children = state[destId] && state[destId].children || [];\n        children.splice(destPos, 0, id);\n        changes[destId] = Object.assign({}, state[destId], {\n          children\n        });\n      }\n\n      return Object.assign({}, state, changes);\n    }\n    case actionTypes.moveMenuItem: {\n      const destId = action.destination.id;\n      let destPos = action.destination.position;\n      const sourceId = action.id;\n      const sourceElement = state[sourceId];\n\n      // remove element from current position\n      const parentElement = state[sourceElement.parent];\n      const parentChildren = parentElement.children.slice(0);\n      const oldPosition = parentElement.children.indexOf(sourceId);\n      parentChildren.splice(oldPosition, 1);\n      const changes = {\n        [parentElement.id]: Object.assign({}, parentElement, {\n          children: parentChildren\n        })\n      };\n\n      // change source parent value\n      if (sourceElement.parent !== destId) {\n        changes[sourceId] = Object.assign({}, sourceElement, {\n          parent: destId\n        });\n      } else if (oldPosition < destPos) {\n        destPos--;\n      }\n\n      // change destination\n      const children =\n        changes[destId] && changes[destId].children ||\n        state[destId].children && state[destId].children.slice(0) ||\n        [];\n      children.splice(destPos, 0, sourceId);\n      changes[destId] = Object.assign({}, changes[destId] || state[destId], {\n        children\n      });\n\n      return Object.assign({}, state, changes);\n    }\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/add.js",
    "content": "import forEach from 'lodash.foreach';\n\nimport getId from './helpers/get-id';\n\nexport default (data, action) => {\n  const destinationId = action.destination.id;\n  const destinationPosition = action.destination.position;\n  const sourceId = action.element.id || getId(data);\n  const changes = {\n    [sourceId]: Object.assign({\n      id: sourceId,\n      parent: destinationId\n    }, action.element)\n  };\n\n  if (action.childrenElements) {\n    forEach(action.childrenElements, (childElement) => {\n      changes[childElement.id] = Object.assign({}, childElement);\n    });\n  }\n\n  const children = changes[destinationId] && changes[destinationId].children ||\n                   data[destinationId].children && data[destinationId].children.slice(0) ||\n                   [];\n  children.splice(destinationPosition, 0, sourceId);\n  changes[destinationId] = Object.assign({}, data[destinationId], {\n    children\n  });\n\n  return {\n    data: Object.assign({}, data, changes),\n    revertAction: {\n      type: 'remove',\n      elementId: sourceId\n    }\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/change-animation.js",
    "content": "export default (data, action) => {\n  const defaults = {\n    use: false,\n    effect: 'transition.fadeIn',\n    duration: 400,\n    delay: 300\n  };\n  const element = data[action.elementId];\n  const previousValue = element.animation && element.animation[action.property];\n  const changedElement = Object.assign({}, element, {\n    animation: Object.assign({}, element.animation || defaults, {\n      [action.property]: action.value\n    })\n  });\n\n  return {\n    data: Object.assign({}, data, {\n      [action.elementId]: changedElement\n    }),\n    revertAction: Object.assign({}, action, {\n      value: previousValue\n    })\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/change-children.js",
    "content": "import forEach from 'lodash.foreach';\n\nimport getId from './helpers/get-id';\n\nexport default (data, action) => {\n  const element = data[action.elementId];\n  const previousChildren = [];\n  const newData = Object.assign({}, data);\n  if (element.children && element.children.constructor === Array) {\n    forEach(element.children, (child) => {\n      previousChildren.push(Object.assign({}, data[child.id]));\n      delete newData[child.id];\n    });\n  }\n  const changes = {};\n  const newChildren = [];\n  forEach(action.children, (child) => {\n    const childId = getId(data);\n    newChildren.push(childId);\n    const newChild = Object.assign({}, child, {\n      id: childId,\n      parent: element.id\n    });\n    changes[childId] = newChild;\n  });\n  changes[element.id] = Object.assign({}, element, {\n    children: newChildren\n  });\n\n  return {\n    data: Object.assign(newData, changes),\n    revertAction: Object.assign({}, action, {\n      children: previousChildren\n    })\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/change-content.js",
    "content": "export default (data, action) => {\n  const element = data[action.elementId];\n  const previousValue = element.children || '';\n  const changedElement = Object.assign({}, element, {\n    children: action.value\n  });\n\n  return {\n    data: Object.assign({}, data, {\n      [action.elementId]: changedElement\n    }),\n    revertAction: Object.assign({}, action, {\n      value: previousValue\n    })\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/change-display.js",
    "content": "\n// Changes an element 'visible on' property\n// action:\n//   - elementId\n//   - display\n\nexport default (data, action) => {\n  const element = data[action.elementId];\n  const previousValue = element.hide && element.hide[action.display] && true;\n  const changedElement = Object.assign({}, element, {\n    hide: Object.assign({}, element.hide || {}, {\n      [action.display]: !previousValue\n    })\n  });\n\n  return {\n    data: Object.assign({}, data, {\n      [action.elementId]: changedElement\n    }),\n    revertAction: Object.assign({}, action)\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/change-label.js",
    "content": "export default (data, action) => {\n  const element = data[action.elementId];\n  const previousValue = element.label || element.tag;\n\n  return {\n    data: Object.assign({}, data, {\n      [action.elementId]: Object.assign({}, element, {\n        label: action.value\n      })\n    }),\n    revertAction: Object.assign({}, action, {\n      value: previousValue\n    })\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/change-position.js",
    "content": "export default (data, action) => {\n  const defaults = {\n    position: 'static',\n    top: 'auto',\n    right: 'auto',\n    bottom: 'auto',\n    left: 'auto',\n    zIndex: '1'\n  };\n  const element = data[action.elementId];\n  let previousValue;\n  let changedElement;\n\n  if (action.display === 'desktop') {\n    previousValue = element.position && element.position[action.property];\n    changedElement = Object.assign({}, element, {\n      position: Object.assign({}, element.position || defaults, {\n        [action.property]: action.value\n      })\n    });\n  } else {\n    previousValue =\n      element.displayPosition &&\n      element.displayPosition[action.display] &&\n      element.displayPosition[action.display][action.property];\n    changedElement = Object.assign({}, element, {\n      displayPosition: Object.assign({}, element.displayPosition || {}, {\n        [action.display]: Object.assign(\n          {},\n          element.displayPosition && element.displayPosition[action.display] || {},\n          {\n            [action.property]: action.value\n          }\n        )\n      })\n    });\n  }\n\n  return {\n    data: Object.assign({}, data, {\n      [action.elementId]: changedElement\n    }),\n    revertAction: Object.assign({}, action, {\n      value: previousValue\n    })\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/change-prop.js",
    "content": "\n// Changes an element prop\n// action:\n//   - type\n//   - elementId\n//   - property\n//   - value\n//   - display\n\nexport default (data, action) => {\n  const element = data[action.elementId];\n  let previousValue;\n  let changedElement;\n\n  if (action.display === 'desktop') {\n    if (action.property === 'children') {\n      previousValue = element.children || '';\n      changedElement = Object.assign({}, element, {\n        children: action.value,\n        props: Object.assign({}, element.props || {}, {\n          [action.property]: action.value\n        })\n      });\n    } else {\n      previousValue = element.props && element.props[action.property];\n      changedElement = Object.assign({}, element, {\n        props: Object.assign({}, element.props || {}, {\n          [action.property]: action.value\n        })\n      });\n    }\n  } else {\n    previousValue =\n      element.displayProps &&\n      element.displayProps[action.display] &&\n      element.displayProps[action.display][action.property];\n    changedElement = Object.assign({}, element, {\n      displayProps: Object.assign({}, element.displayProps || {}, {\n        [action.display]: Object.assign({}, element.displayProps && element.displayProps[action.display] || {}, {\n          [action.property]: action.value\n        })\n      })\n    });\n  }\n\n  return {\n    data: Object.assign({}, data, {\n      [action.elementId]: changedElement\n    }),\n    revertAction: Object.assign({}, action, {\n      value: previousValue\n    })\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/change-style.js",
    "content": "\n// Changes an element custom style property (no-style only)\n// action:\n//   - type\n//   - elementId\n//   - property\n//   - value\n//   - display\n\nexport default (data, action) => {\n  const element = data[action.elementId];\n  let previousValue;\n  let changedElement;\n\n  if (action.display === 'desktop') {\n    previousValue = element.style && element.style[action.property];\n\n    changedElement = Object.assign({}, element, {\n      style: Object.assign({}, element.style || {}, {\n        [action.property]: action.value\n      })\n    });\n\n    if (action.value === null || typeof action.value === 'undefined') {\n      delete changedElement.style[action.property];\n    }\n  } else {\n    previousValue =\n      element.displayStyle &&\n      element.displayStyle[action.display] &&\n      element.displayStyle[action.display][action.property];\n\n    changedElement = Object.assign({}, element, {\n      displayStyle: Object.assign({}, element.displayStyle || {}, {\n        [action.display]: Object.assign({}, element.displayStyle && element.displayStyle[action.display] || {}, {\n          [action.property]: action.value\n        })\n      })\n    });\n\n    if (action.value === null || typeof action.value === 'undefined') {\n      delete changedElement.displayStyle[action.display][action.property];\n    }\n  }\n\n\n  return {\n    data: Object.assign({}, data, {\n      [action.elementId]: changedElement\n    }),\n    revertAction: Object.assign({}, action, {\n      value: previousValue\n    })\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/duplicate.js",
    "content": "import cloneDeep from 'lodash.clonedeep';\n\nimport cloneChildren from './helpers/clone-children';\nimport getId from './helpers/get-id';\n\nexport default (data, action) => {\n  const sourceId = getId(data);\n  const changes = {};\n  const toDuplicate = data[action.elementId];\n  const destinationId = toDuplicate.parent;\n  const destinationPosition = data[toDuplicate.parent].children.indexOf(toDuplicate.id) + 1;\n\n  const cloned = cloneDeep(toDuplicate);\n  cloned.id = sourceId;\n  if (cloned.children && cloned.children.constructor === Array) {\n    cloned.children = cloneChildren(cloned.children, data, changes, sourceId);\n  }\n  changes[sourceId] = cloned;\n\n  const children =\n    changes[destinationId] && changes[destinationId].children ||\n    data[destinationId].children && data[destinationId].children.slice(0) ||\n    [];\n  children.splice(destinationPosition, 0, sourceId);\n  changes[destinationId] = Object.assign({}, data[destinationId], {\n    children\n  });\n\n  return {\n    data: Object.assign({}, data, changes),\n    revertAction: {\n      type: 'remove',\n      elementId: sourceId\n    }\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/element-add-schema-link.js",
    "content": "export default (data, action) => {\n  const element = data[action.elementId];\n  const newLink = {\n    elementId: action.linkElementId,\n    action: action.action\n  };\n  const currentSchemaLinks = element.props && element.props.schemaLinks || {};\n  const schemaLinksChanged = Object.assign({}, currentSchemaLinks, {\n    [action.propertyId]: [...(currentSchemaLinks[action.propertyId] || []), newLink]\n  });\n\n  const changedElement = Object.assign({}, element, {\n    props: Object.assign({}, element.props || {}, {\n      schemaLinks: schemaLinksChanged\n    })\n  });\n\n  return {\n    data: Object.assign({}, data, {\n      [action.elementId]: changedElement\n    }),\n    revertAction: {\n      type: 'elementRemoveSchemaLink',\n      elementId: action.elementId,\n      propertyId: action.propertyId,\n      index: schemaLinksChanged[action.propertyId].length - 1\n    }\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/element-change-schema-link-action.js",
    "content": "export default (data, action) => {\n  const element = data[action.elementId];\n  const currentSchemaLinks = element.props.schemaLinks;\n  const newProperties = currentSchemaLinks[action.propertyId].slice(0);\n  const oldAction = newProperties[action.index].action;\n\n  newProperties.splice(action.index, 1, Object.assign({}, newProperties[action.index], {\n    action: action.value\n  }));\n\n  const schemaLinksChanged = Object.assign({}, currentSchemaLinks, {\n    [action.propertyId]: newProperties\n  });\n  const changedElement = Object.assign({}, element, {\n    props: Object.assign({}, element.props || {}, {\n      schemaLinks: schemaLinksChanged\n    })\n  });\n\n  return {\n    data: Object.assign({}, data, {\n      [action.elementId]: changedElement\n    }),\n    revertAction: Object.assign({}, action, {\n      value: oldAction\n    })\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/element-remove-schema-link.js",
    "content": "export default (data, action) => {\n  const element = data[action.elementId];\n  const currentSchemaLinks = element.props.schemaLinks;\n  const newProperties = currentSchemaLinks[action.propertyId].slice(0);\n  const removedProperty = (newProperties.splice(action.index, 1))[0];\n\n  const schemaLinksChanged = Object.assign({}, currentSchemaLinks, {\n    [action.propertyId]: newProperties\n  });\n  const changedElement = Object.assign({}, element, {\n    props: Object.assign({}, element.props || {}, {\n      schemaLinks: schemaLinksChanged\n    })\n  });\n\n  return {\n    data: Object.assign({}, data, {\n      [action.elementId]: changedElement\n    }),\n    revertAction: {\n      type: 'elementAddSchemaLink',\n      elementId: action.elementId,\n      propertyId: action.propertyId,\n      linkElementId: removedProperty.elementId,\n      action: removedProperty.action\n    }\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/helpers/clone-children.js",
    "content": "import cloneDeep from 'lodash.clonedeep';\nimport forEach from 'lodash.foreach';\n\nimport getId from './get-id';\n\nexport default function cloneChildren (children, data, changes, parentId) {\n  const resultChildren = [];\n\n  forEach(children, (childId) => {\n    const newId = getId(data);\n    const element = data[childId];\n    const clonedChild = cloneDeep(element);\n    clonedChild.id = newId;\n    clonedChild.parent = parentId;\n    if (clonedChild.children && clonedChild.children.constructor === Array) {\n      clonedChild.children = cloneChildren(clonedChild.children, data, changes, newId);\n    }\n    changes[newId] = clonedChild;\n    resultChildren.push(newId);\n  });\n\n  return resultChildren;\n}\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/helpers/get-id.js",
    "content": "let ID_COUNTER = 0;\nexport default function getLastId (data) {\n  while (data[ID_COUNTER]) {\n    ID_COUNTER++;\n  }\n  return (ID_COUNTER++).toString();\n}\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/helpers/remove-children.js",
    "content": "import forEach from 'lodash.foreach';\n\nexport default function removeChildren (children, copiedData) {\n  const childrenElements = {};\n  forEach(children, (childId) => {\n    const element = copiedData[childId];\n    childrenElements[element.id] = Object.assign({}, element);\n    if (element.children && element.children.constructor === Array) {\n      Object.assign(childrenElements, removeChildren(element.children, copiedData));\n    }\n    delete copiedData[childId];\n  });\n  return childrenElements;\n}\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/index.js",
    "content": "import add from './add';\nimport changeAnimation from './change-animation';\nimport changeChildren from './change-children';\nimport changeContent from './change-content';\nimport changeDisplay from './change-display';\nimport changeLabel from './change-label';\nimport changePosition from './change-position';\nimport changeProp from './change-prop';\nimport changeStyle from './change-style';\nimport duplicate from './duplicate';\nimport elementAddSchemaLink from './element-add-schema-link';\nimport elementChangeSchemaLinkAction from './element-change-schema-link-action';\nimport elementRemoveSchemaLink from './element-remove-schema-link';\nimport makeDynamic from './make-dynamic';\nimport move from './move';\nimport newAction from './new';\nimport remove from './remove';\n\nexport default {\n  new: newAction,\n  move,\n  add,\n  duplicate,\n  remove,\n  makeDynamic,\n  changeLabel,\n  changeDisplay,\n  changeProp,\n  changeAnimation,\n  changePosition,\n  changeStyle,\n  changeContent,\n  changeChildren,\n  elementAddSchemaLink,\n  elementRemoveSchemaLink,\n  elementChangeSchemaLinkAction\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/make-dynamic.js",
    "content": "import getId from './helpers/get-id';\n\nexport default (data, action) => {\n  const element = data[action.elementId];\n  const destinationId = element.parent;\n  const destinationPosition = data[destinationId].children.indexOf(element.id);\n\n  // Add new dynamic element\n  const dynamicElementId = getId(data);\n  const newChildren = data[destinationId].children.slice(0);\n  newChildren.splice(destinationPosition, 1, dynamicElementId);\n  const changes = {\n    [dynamicElementId]: {\n      parent: destinationId,\n      id: dynamicElementId,\n      tag: 'DynamicList',\n      children: [element.id]\n    },\n    [destinationId]: Object.assign({}, data[destinationId], {\n      children: newChildren\n    }),\n    [element.id]: Object.assign({}, element, {\n      parent: dynamicElementId\n    })\n  };\n\n  return {\n    data: Object.assign({}, data, changes),\n    revertAction: [\n      {\n        type: 'move',\n        source: {\n          id: element.id\n        },\n        destination: {\n          id: destinationId,\n          position: destinationPosition\n        }\n      },\n      {\n        type: 'remove',\n        elementId: dynamicElementId\n      }\n    ]\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/move.js",
    "content": "export default (data, action) => {\n  let destinationPosition = action.destination.position;\n  const destinationId = action.destination.id;\n  const sourceId = action.source.id;\n  const sourceElement = data[sourceId];\n\n  // remove from old parent children\n  const parentElement = data[sourceElement.parent];\n  const parentChildren = parentElement.children.slice(0);\n  const oldPosition = parentElement.children.indexOf(sourceId);\n  parentChildren.splice(oldPosition, 1);\n  const changes = {\n    [parentElement.id]: Object.assign({}, parentElement, {\n      children: parentChildren\n    })\n  };\n\n  if (sourceElement.parent !== destinationId) {\n    changes[sourceId] = Object.assign({}, sourceElement, {\n      parent: destinationId\n    });\n  } else if (oldPosition < destinationPosition) {\n    destinationPosition--;\n  }\n\n  const children =\n    changes[destinationId] && changes[destinationId].children ||\n    data[destinationId].children && data[destinationId].children.slice(0) ||\n    [];\n  children.splice(destinationPosition, 0, sourceId);\n  changes[destinationId] = Object.assign({}, data[destinationId], {\n    children\n  });\n\n  return {\n    data: Object.assign({}, data, changes),\n    revertAction: {\n      type: 'move',\n      source: {\n        id: action.source.id\n      },\n      destination: {\n        id: sourceElement.parent,\n        position: oldPosition\n      }\n    }\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/new.js",
    "content": "import elements from 'elements';\nimport forEach from 'lodash.foreach';\n\nimport getId from './helpers/get-id';\n\nexport default (data, action) => {\n  const destinationId = action.destination.id;\n  const destinationPosition = action.destination.position;\n  const sourceId = getId(data);\n  const changes = {\n    [sourceId]: {\n      parent: destinationId,\n      id: sourceId,\n      ...action.element\n    }\n  };\n\n  const ElementClass = elements[action.element.tag];\n  if (ElementClass && ElementClass.defaultChildren) {\n    const defaultChildren = ElementClass.defaultChildren;\n    if (defaultChildren.constructor === Array) {\n      forEach(defaultChildren, (child) => {\n        const childId = getId(data);\n        changes[childId] = Object.assign({}, child, {\n          parent: sourceId,\n          id: childId\n        });\n        changes[sourceId].children = changes[sourceId].children || [];\n        changes[sourceId].children.push(childId);\n      });\n    }\n  }\n\n  // Destination\n  if (!data[destinationId] && destinationId === 'body') {\n    changes.body = {\n      id: 'body',\n      tag: 'body',\n      children: [sourceId]\n    };\n  } else {\n    const children =\n      changes[destinationId] && changes[destinationId].children ||\n      data[destinationId].children && data[destinationId].children.slice(0) ||\n      [];\n    children.splice(destinationPosition, 0, sourceId);\n    changes[destinationId] = Object.assign({}, data[destinationId], {\n      children\n    });\n  }\n\n  return {\n    data: Object.assign({}, data, changes),\n    revertAction: {\n      type: 'remove',\n      elementId: sourceId\n    }\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder-actions/remove.js",
    "content": "import removeChildren from './helpers/remove-children';\n\nexport default (data, action) => {\n  const element = data[action.elementId];\n  const parentChildren = data[element.parent].children.slice(0);\n  const positionInParent = parentChildren.indexOf(element.id);\n  parentChildren.splice(positionInParent, 1);\n\n  const copiedData = Object.assign({}, data, {\n    [element.parent]: Object.assign({}, data[element.parent], {\n      children: parentChildren\n    })\n  });\n\n  let childrenElements = null; // For revert action\n  if (element.children && element.children.constructor === Array) {\n    childrenElements = removeChildren(element.children, copiedData);\n  }\n\n  const removedElement = copiedData[action.elementId];\n  delete copiedData[action.elementId];\n\n  return {\n    data: copiedData,\n    revertAction: {\n      type: 'add',\n      element: removedElement,\n      childrenElements,\n      destination: {\n        id: element.parent,\n        position: positionInParent\n      }\n    }\n  };\n};\n"
  },
  {
    "path": "lib/shared/reducers/page-builder.js",
    "content": "import actionTypes from 'actions';\nimport elements from 'elements';\nimport forEach from 'lodash.foreach';\nimport Relate from 'relate-js';\n\nimport pageBuilderActions from './page-builder-actions';\n\nconst categories = [\n  'structure',\n  'content',\n  'media',\n  'form'\n];\nforEach(elements, (element) => {\n  if (element.settings && element.settings.category) {\n    if (categories.indexOf(element.settings.category) === -1) {\n      categories.push(element.settings.category);\n    }\n  }\n});\ncategories.push('other');\nconst categoriesCollapsed = {};\nforEach(categories, (category) => {categoriesCollapsed[category] = false;});\n\nconst defaultState = {\n  data: {},\n  actions: [],\n  redos: [],\n  expanded: {}, // for structure layer\n  userExpanded: {}, // for structure layer\n  editing: true,\n  elements,\n  selectedId: null,\n  selectedElement: null,\n  selectedParent: null,\n  selectedPath: [],\n  overedId: null,\n  focusElementId: null,\n  linkingData: false,\n  linkingDataElementId: null,\n  linkingDataElement: null,\n  linkingFormData: false,\n  linkingFormDataElementId: null,\n  categories,\n  categoriesCollapsed,\n  elementsMenuOpened: false,\n  elementsMenuOptions: {},\n  elementsMenuSpot: null,\n  menuTab: 'style'\n};\n\nfunction doAction (data, action) {\n  let result;\n  if (action && action.constructor === Array) {\n    const revertActions = [];\n    let resultData = data;\n\n    forEach(action, (actionPart) => {\n      const actionFunction = pageBuilderActions[actionPart.type];\n      const partResult = actionFunction && actionFunction(resultData, actionPart);\n      if (partResult) {\n        resultData = partResult.data;\n        revertActions.unshift(partResult.revertAction);\n      }\n    });\n\n    result = {\n      data: resultData,\n      revertAction: revertActions\n    };\n  } else {\n    const actionFunction = pageBuilderActions[action.type];\n    result = actionFunction && actionFunction(data, action);\n  }\n  return result;\n}\n\nfunction getElementPath (selectedElement, data) {\n  const result = [];\n  let current = selectedElement;\n\n  while (current.parent) {\n    current = data[current.parent];\n    result.unshift(current);\n  }\n\n  return result;\n}\n\nfunction inPath (elementId, targetId, data) {\n  let found = false;\n  let current = data[elementId];\n\n  while (!found && current.parent) {\n    if (current.parent === targetId) {\n      found = true;\n    }\n    current = data[current.parent];\n  }\n\n  return found;\n}\n\nfunction checkOverAndSelected (state) {\n  const changes = {\n    selectedId: state.selectedId,\n    overedId: state.overedId\n  };\n\n  // Check if inside the focused element\n  if (state.focusElementId) {\n    if (state.overedId && !inPath(state.overedId, state.focusElementId, state.data)) {\n      changes.overedId = null;\n    }\n    if (state.selectedId && !inPath(state.selectedId, state.focusElementId, state.data)) {\n      changes.selectedId = null;\n    }\n  }\n\n  if (state.selectedId && changes.selectedId) {\n    const selectedElement = state.data[state.selectedId];\n    changes.selectedElement = selectedElement;\n    changes.selectedParent = selectedElement && selectedElement.parent;\n    changes.selectedPath = selectedElement && getElementPath(selectedElement, state.data);\n    changes.selectedId = selectedElement && state.selectedId;\n  }\n\n  if (state.linkingDataElementId) {\n    const linkingDataElement = state.data[state.linkingDataElementId];\n    changes.linkingDataElement = linkingDataElement;\n    changes.linkingDataElementId = linkingDataElement && state.linkingDataElementId;\n  }\n\n  return Object.assign({}, state, changes);\n}\n\nexport default function pageBuilderReducer (state = defaultState, action = {}) {\n  switch (action.type) {\n    case Relate.actionTypes.query:\n      if (action.data.draft) {\n        const dataChange = {};\n\n        if (action.data.draft.data) {\n          dataChange.data = JSON.parse(action.data.draft.data);\n        }\n        if (action.data.draft.actions) {\n          dataChange.actions = JSON.parse(action.data.draft.actions);\n        }\n\n        return Object.assign({}, defaultState, dataChange);\n      }\n      return state;\n    case actionTypes.pbDoAction: {\n      const actionResult = doAction(state.data, action.action);\n      return checkOverAndSelected(Object.assign({}, state, {\n        data: actionResult.data,\n        actions: [...state.actions, actionResult.revertAction],\n        redos: []\n      }));\n    }\n    case actionTypes.pbUndoAction: {\n      if (state.data.actions.length > 0) {\n        const actions = state.actions.slice(0);\n        const undoActionResult = doAction(state.data, actions.pop());\n        return checkOverAndSelected(Object.assign({}, state, {\n          redos: [...state.redos, undoActionResult.revertAction],\n          data: undoActionResult.data,\n          actions\n        }));\n      }\n      return state;\n    }\n    case actionTypes.pbRedoAction:\n      if (state.redos.length > 0) {\n        const redos = state.redos.slice(0);\n        const redoActionResult = doAction(state.data, redos.pop());\n        return checkOverAndSelected(Object.assign({}, state, {\n          redos,\n          data: redoActionResult.data,\n          actions: [...state.actions, redoActionResult.revertAction]\n        }));\n      }\n      return state;\n    case actionTypes.makeElementSymbol: {\n      const elementToSymbol = state.data[action.params.elementId];\n      const elementToSymbolParent = state.data[elementToSymbol.parent];\n      const elementToSymbolPosition = elementToSymbolParent.children.indexOf(action.params.elementId);\n\n      const makeElementSymbolActionResult = doAction(state.data, [\n        {\n          type: 'remove',\n          elementId: action.params.elementId\n        },\n        {\n          type: 'new',\n          destination: {\n            id: elementToSymbol.parent,\n            position: elementToSymbolPosition\n          },\n          element: {\n            tag: 'Symbol',\n            props: {\n              symbolId: action.data.addSymbol._id\n            }\n          }\n        }\n      ]);\n      return checkOverAndSelected(Object.assign({}, state, {\n        redos: [],\n        data: makeElementSymbolActionResult.data,\n        actions: [...state.actions, makeElementSymbolActionResult.revertAction]\n      }));\n    }\n    case actionTypes.saveStyle: {\n      const styleActionResult = doAction(state.data, {\n        type: 'changeProp',\n        property: 'style',\n        value: action.data.addStyle._id,\n        elementId: action.params.elementId,\n        display: action.params.display\n      });\n      return checkOverAndSelected(Object.assign({}, state, {\n        data: styleActionResult.data\n      }));\n    }\n    case actionTypes.pbSelectElement: {\n      const expandedChanges = {};\n      let element = state.data[action.elementId];\n      if (element) {\n        while (element && element.parent) {\n          element = state.data[element.parent];\n          if (element && element.id !== 'body') {\n            expandedChanges[element.id] = true;\n          }\n        }\n      }\n      return checkOverAndSelected(Object.assign({}, state, {\n        expanded: expandedChanges,\n        selectedId: action.elementId\n      }));\n    }\n    case actionTypes.pbToggleExpandElement: {\n      const isExpanded = state.expanded[action.elementId] || state.userExpanded[action.elementId];\n      return Object.assign({}, state, {\n        expanded: Object.assign({}, state.expanded, {\n          [action.elementId]: !isExpanded\n        }),\n        userExpanded: Object.assign({}, state.userExpanded, {\n          [action.elementId]: !isExpanded\n        })\n      });\n    }\n    case actionTypes.pbExpandAll: {\n      const allExpanded = {};\n      forEach(state.data, (elementIt, elementId) => {\n        allExpanded[elementId] = true;\n      });\n      return Object.assign({}, state, {\n        userExpanded: allExpanded\n      });\n    }\n    case actionTypes.pbCollapseAll:\n      return Object.assign({}, state, {\n        expanded: {},\n        userExpanded: {}\n      });\n    case actionTypes.pbToggleEditing:\n      return Object.assign({}, state, {\n        editing: !state.editing\n      });\n    case actionTypes.pbSetMenuTab:\n      return Object.assign({}, state, {\n        menuTab: action.value\n      });\n    case actionTypes.pbOpenElementsMenu:\n      return Object.assign({}, state, {\n        elementsMenuOpened: true,\n        elementsMenuOptions: action.options\n      });\n    case actionTypes.pbCloseElementsMenu:\n      return Object.assign({}, state, {\n        elementsMenuOpened: false,\n        elementsMenuOptions: null,\n        elementsMenuSpot: null\n      });\n    case actionTypes.pbToggleCategory:\n      return Object.assign({}, state, {\n        categoriesCollapsed: Object.assign({}, state.categoriesCollapsed, {\n          [action.category]: !state.categoriesCollapsed[action.category]\n        })\n      });\n    case actionTypes.pbOverElement:\n      return checkOverAndSelected(Object.assign({}, state, {\n        overedId: action.elementId\n      }));\n    case actionTypes.pbOutElement:\n      if (state.overedId === action.elementId) {\n        return checkOverAndSelected(Object.assign({}, state, {\n          overedId: null\n        }));\n      }\n      return state;\n    case actionTypes.pbLinkFormDataMode:\n      return checkOverAndSelected(Object.assign({}, state, {\n        linkingFormData: true,\n        linkingFormDataElementId: action.elementId,\n        focusElementId: action.elementId\n      }));\n    case actionTypes.pbCloseLinkFormDataMode:\n      return checkOverAndSelected(Object.assign({}, state, {\n        linkingFormData: false,\n        linkingFormDataElementId: null,\n        focusElementId: null\n      }));\n    case actionTypes.pbLinkDataMode:\n      return checkOverAndSelected(Object.assign({}, state, {\n        linkingData: true,\n        linkingDataElementId: action.elementId,\n        focusElementId: action.elementId\n      }));\n    case actionTypes.pbCloseLinkDataMode:\n      return checkOverAndSelected(Object.assign({}, state, {\n        linkingData: false,\n        linkingDataElementId: null,\n        focusElementId: null\n      }));\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "lib/shared/reducers/revisions.js",
    "content": "import actionTypes from 'actions';\n\nconst defaultState = {\n  data: [],\n  errors: null\n};\n\nexport default function colorsReducer (state = defaultState, action = {}) {\n  switch (action.type) {\n    case actionTypes.getRevisions:\n      return Object.assign({}, state, {\n        data: action.data.revisions,\n        errors: action.errors\n      });\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "lib/shared/reducers/schema-entry.js",
    "content": "import actionTypes from 'actions';\nimport parseFields from 'helpers/parse-fields';\n\nconst defaultState = {\n  data: {\n    title: '',\n    slug: '',\n    state: 'draft'\n  },\n  isSlugValid: false,\n  errors: 'Not found'\n};\nconst parsableFields = ['data', 'properties'];\n\nexport default function schemaEntryReducer (state = defaultState, action = {}) {\n  switch (action.type) {\n    case actionTypes.changeSchemaEntryToDefault:\n      return Object.assign({}, state, defaultState);\n    case actionTypes.changeSchemaEntryFields:\n      return Object.assign({}, state, {\n        data: Object.assign({}, state.data, action.values)\n      });\n    case actionTypes.changeSchemaEntryProperty:\n      return Object.assign({}, state, {\n        data: Object.assign({}, state.data, {\n          properties: Object.assign({}, state.data.properties, {\n            [action.key]: action.value\n          })\n        })\n      });\n    case actionTypes.graphql:\n      if (action.data.schemaEntry) {\n        return Object.assign({}, state, {\n          data: Object.assign({}, state.data, parseFields(action.data.schemaEntry, parsableFields)),\n          errors: action.errors\n        });\n      }\n      return state;\n    case actionTypes.updateSchemaEntry:\n      return Object.assign({}, state, {\n        data: parseFields(action.data.updateSchemaEntry, parsableFields) || state.data,\n        errors: action.errors\n      });\n    case actionTypes.addSchemaEntry:\n      return Object.assign({}, state, {\n        data: parseFields(action.data.addSchemaEntry, parsableFields) || state.data,\n        errors: action.errors\n      });\n    case actionTypes.restoreSchemaEntry:\n      return Object.assign({}, state, {\n        data: parseFields(action.data.restoreSchemaEntry, parsableFields) || state.data,\n        errors: action.errors\n      });\n    case actionTypes.validateSchemaEntrySlug:\n      return Object.assign({}, state, {\n        isSlugValid: action.data.validateSchemaEntrySlug,\n        errors: action.errors\n      });\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "lib/shared/reducers/schema.js",
    "content": "import actionTypes from 'actions';\nimport forEach from 'lodash.foreach';\nimport slugify from 'slug';\n\nconst defaultState = {\n  step: 0,\n  openedProperties: [],\n  data: {\n    type: '',\n    title: '',\n    properties: []\n  }\n};\n\nfunction getUniqueId (properties, idParam, count = 0) {\n  let id = idParam;\n  if (id === '') {\n    id = 'unnamed';\n  }\n  id = slugify(id).toLowerCase();\n\n  let currentId = count === 0 ? id : `${id}-${count}`;\n\n  // ensure unique\n  forEach(properties, property => {\n    if (property.id === currentId) {\n      currentId = getUniqueId(properties, id, count + 1);\n      return false;\n    }\n  });\n\n  return currentId;\n}\n\nfunction findPropertyBydId (properties, id) {\n  let result = false;\n\n  forEach(properties, (property, index) => {\n    if (property.id === id) {\n      result = {\n        property,\n        index\n      };\n      return false;\n    }\n  });\n\n  return result;\n}\n\nexport default function schemaReducer (state = defaultState, action = {}) {\n  switch (action.type) {\n    case actionTypes.changeSchemaToDefault:\n      return Object.assign({}, state, defaultState);\n    case actionTypes.changeSchemaType:\n      return Object.assign({}, state, {\n        step: 1,\n        data: Object.assign({}, state.data, {type: action.schemaType})\n      });\n    case actionTypes.changeSchemaTitle:\n      return Object.assign({}, state, {\n        data: Object.assign({}, state.data, {title: action.title})\n      });\n    case actionTypes.schemaStepBack:\n      return Object.assign({}, state, {\n        step: state.step - 1\n      });\n    case actionTypes.schemaStepForward:\n      return Object.assign({}, state, {\n        step: state.step + 1\n      });\n    case actionTypes.schemaAddProperty: {\n      const newId = getUniqueId(state.data.properties, 'New Property');\n      return Object.assign({}, state, {\n        openedProperties: [...state.openedProperties, newId],\n        data: Object.assign({}, state.data, {\n          properties: [...state.data.properties, {\n            id: newId,\n            title: 'New Property',\n            type: 'String',\n            required: false\n          }]\n        })\n      });\n    }\n    case actionTypes.schemaToggleProperty: {\n      let resultState = state;\n      const propertyFound = findPropertyBydId(state.data.properties, action.id);\n      if (propertyFound) {\n        const openedIndex = state.openedProperties.indexOf(action.id);\n        if (openedIndex !== -1) {\n          // remove it\n          const newOpenedProperties = state.openedProperties.slice(0);\n          newOpenedProperties.splice(openedIndex, 1);\n          resultState = Object.assign({}, state, {\n            openedProperties: newOpenedProperties\n          });\n        } else {\n          // add it\n          resultState = Object.assign({}, state, {\n            openedProperties: [...state.openedProperties, action.id]\n          });\n        }\n      }\n      return resultState;\n    }\n    case actionTypes.schemaChangePropertySetting: {\n      let resultState = state;\n      const propertyFound = findPropertyBydId(state.data.properties, action.id);\n      if (propertyFound) {\n        const properties = state.data.properties.slice(0);\n        let openedProperties = state.openedProperties;\n        const changes = {\n          [action.settingId]: action.value\n        };\n\n        if (action.settingId === 'title') {\n          const newId = getUniqueId(state.data.properties, action.value);\n\n          const openedIndex = openedProperties.indexOf(action.id);\n          if (openedIndex !== -1) {\n            openedProperties = openedProperties.slice(0);\n            openedProperties[openedIndex] = newId;\n          }\n\n          changes.id = newId;\n        }\n\n        properties[propertyFound.index] = Object.assign(\n          {},\n          properties[propertyFound.index],\n          changes\n        );\n\n        resultState = Object.assign({}, state, {\n          openedProperties,\n          data: Object.assign({}, state.data, {\n            properties\n          })\n        });\n      }\n      return resultState;\n    }\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "lib/shared/reducers/session.js",
    "content": "import actionTypes from 'actions';\n\nconst defaultState = {\n  userId: null\n};\n\nexport default function sessionReducer (state = defaultState, action = {}) {\n  switch (action.type) {\n    case actionTypes.authenticate:\n      return Object.assign({}, state, {userId: action.data.userId});\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "lib/shared/reducers/settings.js",
    "content": "import actionTypes from 'actions';\nimport forEach from 'lodash.foreach';\n\nconst defaultState = {\n  data: {},\n  errors: null\n};\n\nfunction parseSettings (_settings) {\n  const settings = {};\n\n  forEach(_settings, (setting) => {\n    settings[setting._id] = setting.value;\n  });\n\n  return settings;\n}\n\nexport default function settingsReducer (state = defaultState, action = {}) {\n  switch (action.type) {\n    case actionTypes.graphql:\n      if (action.data.settings) {\n        return Object.assign({}, state, {\n          data: parseSettings(action.data.settings),\n          errors: action.errors\n        });\n      }\n      return state;\n    case actionTypes.changeSettingValue:\n      return Object.assign({}, state, {\n        data: Object.assign({}, state.data, {[action.id]: action.value}),\n        errors: action.errors\n      });\n    case actionTypes.saveSettings:\n      return Object.assign({}, state, {\n        data: Object.assign({}, state.data),\n        errors: action.errors\n      });\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "lib/shared/reducers/styles.js",
    "content": "import actionTypes from 'actions';\nimport filter from 'lodash.filter';\nimport find from 'lodash.find';\nimport forEach from 'lodash.foreach';\nimport parseFields from 'helpers/parse-fields';\nimport Relate from 'relate-js';\n\nconst defaultState = {\n  data: [],\n  errors: null\n};\n\nconst parsableFields = ['options', 'displayOptions'];\n\nexport default function stylesReducer (state = defaultState, action = {}) {\n  switch (action.type) {\n    case Relate.actionTypes.query:\n      if (action.data.styles) {\n        const styles = [];\n        forEach(action.data.styles, (style) => {\n          styles.push(parseFields(style, parsableFields));\n        });\n        return Object.assign({}, state, {\n          data: styles,\n          errors: action.errors\n        });\n      }\n      return state;\n    case actionTypes.saveStyle: {\n      const newStyle = parseFields(action.data.addStyle, parsableFields);\n      return Object.assign({}, state, {\n        data: [...state.data, newStyle],\n        errors: action.errors\n      });\n    }\n    case actionTypes.changeStyleProp: {\n      const data = state.data.slice(0);\n      const style = find(data, {_id: action.styleId});\n\n      if (action.display === 'desktop') {\n        Object.assign(style, {\n          options: Object.assign({}, style.options, {\n            [action.property]: action.value\n          })\n        });\n      } else {\n        Object.assign(style, {\n          displayOptions: Object.assign({}, style.displayOptions || {}, {\n            [action.display]: Object.assign(\n              {},\n              style.displayOptions && style.displayOptions[action.display] || {},\n              {\n                [action.property]: action.value\n              }\n            )\n          })\n        });\n      }\n\n      return Object.assign({}, state, {\n        data\n      });\n    }\n    case actionTypes.removeStyle:\n      return Object.assign({}, state, {\n        data: filter(state.data, (styleIt) => (styleIt._id !== action.data.removeStyle._id)),\n        errors: action.errors\n      });\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "lib/shared/reducers/symbols.js",
    "content": "import actionTypes from 'actions';\nimport forEach from 'lodash.foreach';\nimport parseFields from 'helpers/parse-fields';\n\nconst parsableFields = ['data'];\nconst defaultState = {};\n\nexport default function symbolsReducer (state = defaultState, action = {}) {\n  switch (action.type) {\n    case actionTypes.graphql:\n      if (action.data.symbols) {\n        const changes = {};\n\n        forEach(action.data.symbols, (symbol) => {\n          if (state[symbol._id]) {\n            changes[symbol._id] = Object.assign({}, state[symbol._id], symbol);\n          } else {\n            changes[symbol._id] = symbol;\n          }\n        });\n\n        return Object.assign({}, state, changes);\n      }\n      return state;\n    case actionTypes.makeElementSymbol: {\n      const _id = action.data.addSymbol._id;\n      const data = Object.assign({}, action.data.addSymbol, {\n        data: JSON.parse(action.data.addSymbol.data)\n      });\n      return Object.assign({}, state, {\n        [_id]: Object.assign({}, state[_id] || {}, data)\n      });\n    }\n    case actionTypes.getSymbol: {\n      return Object.assign({}, state, {\n        [action.data.symbol._id]: Object.assign(\n          {},\n          state[action.data.symbol._id] || {},\n          parseFields(action.data.symbol, parsableFields)\n        )\n      });\n    }\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "lib/shared/routers/admin.js",
    "content": "import request from 'superagent';\nimport Admin from 'screens/admin';\nimport AnalyticsSettings from 'screens/admin/screens/settings/screens/analytics';\nimport Colors from 'screens/admin/screens/colors';\nimport DataSettings from 'screens/admin/screens/settings/screens/data';\nimport EmailSettings from 'screens/admin/screens/settings/screens/email';\nimport Fonts from 'screens/admin/screens/fonts';\nimport GeneralSettings from 'screens/admin/screens/settings/screens/general';\nimport Media from 'screens/admin/screens/media';\nimport MediaMenu from 'screens/admin/screens/media/menu';\nimport Menu from 'screens/admin/screens/menus/screens/menu';\nimport Menus from 'screens/admin/screens/menus';\nimport MenusMenu from 'screens/admin/screens/menus/menu';\nimport Page from 'screens/admin/screens/pages/screens/page';\nimport Pages from 'screens/admin/screens/pages';\nimport PagesMenu from 'screens/admin/screens/pages/menu';\nimport React from 'react';\nimport Schema from 'screens/admin/screens/schemas/screens/schema';\nimport SchemaMenu from 'screens/admin/screens/schemas/screens/schema/menu';\nimport SchemasNew from 'screens/admin/screens/schemas/screens/new';\nimport SettingsMenu from 'screens/admin/screens/settings/menu';\nimport Users from 'screens/admin/screens/users';\nimport {Route, IndexRoute} from 'react-router';\n\nfunction authenticate (nextState, replaceState, callback) {\n  if (typeof window !== 'undefined') {\n    request\n      .post('/graphql')\n      .set('Content-Type', 'application/json')\n      .set('Accept', 'application/json')\n      .send({\n        query: 'query { session }'\n      })\n      .end((error, result) => {\n        if (error || !result.body.data.session) {\n          window.location.href = '/admin/login';\n        } else {\n          callback();\n        }\n      });\n  } else {\n    callback();\n  }\n}\n\nexport default [\n  <Route name='admin' path='/admin' component={Admin} onEnter={authenticate}>\n    <Route name='adminSettings' path='settings' menu={SettingsMenu} onEnter={authenticate}>\n      <IndexRoute name='adminGeneralSettings' component={GeneralSettings} onEnter={authenticate} />\n      <Route name='adminEmailSettings' path='email' component={EmailSettings} onEnter={authenticate} />\n      <Route name='adminAnalyticsSettings' path='analytics' component={AnalyticsSettings} onEnter={authenticate} />\n      <Route name='adminDataSettings' path='data' component={DataSettings} onEnter={authenticate} />\n    </Route>\n    <Route name='adminPages' path='pages' component={Pages} menu={PagesMenu} onEnter={authenticate}>\n      <Route name='adminPage' path=':id' component={Page} onEnter={authenticate} />\n    </Route>\n    <Route name='adminMenus' path='menus' component={Menus} menu={MenusMenu} onEnter={authenticate}>\n      <Route name='adminMenu' path=':id' component={Menu} onEnter={authenticate} />\n    </Route>\n    <Route name='adminSchemas' path='schemas'>\n      <Route name='adminSchemasNew' path='new' component={SchemasNew} onEnter={authenticate} />\n      <Route name='adminSchema' path=':id' component={Schema} menu={SchemaMenu} onEnter={authenticate} />\n    </Route>\n    <Route name='adminMedia' path='media' component={Media} menu={MediaMenu} onEnter={authenticate} />\n    <Route name='adminColors' path='colors' component={Colors} onEnter={authenticate} />\n    <Route name='adminUsers' path='users' component={Users} onEnter={authenticate} />\n    <Route name='adminFonts' path='fonts' component={Fonts} onEnter={authenticate} />\n  </Route>\n];\n"
  },
  {
    "path": "lib/shared/routers/auth.js",
    "content": "import gaSend from 'helpers/ga-send';\nimport Auth from 'screens/auth';\nimport Init from 'screens/auth/screens/init';\nimport Login from 'screens/auth/screens/login';\nimport React from 'react';\nimport {Route} from 'react-router';\n\nexport default [\n  <Route component={Auth}>\n    <Route path='/admin/init' component={Init} onEnter={gaSend} />\n    <Route path='/admin/login' component={Login} onEnter={gaSend} />\n  </Route>\n];\n"
  },
  {
    "path": "lib/shared/routers/public.js",
    "content": "// import React from 'react';\n// import {Route} from 'react-router';\n\nexport default [];\n"
  },
  {
    "path": "lib/shared/screens/admin/components/admin/index.jsx",
    "content": "import cx from 'classnames';\nimport forEach from 'lodash.foreach';\nimport velocity from 'velocity-animate';\nimport Component from 'components/component';\nimport PageBuilderMenu from 'components/page-builder-menu';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\nimport Menu from '../menu';\nimport TopBar from '../top-bar';\n\nexport default class Admin extends Component {\n  static propTypes = {\n    children: PropTypes.node,\n    routes: PropTypes.array.isRequired,\n    location: PropTypes.object.isRequired,\n    previewing: PropTypes.bool.isRequired,\n    toggleEditing: PropTypes.func.isRequired\n  };\n\n  getInitState () {\n    const {location} = this.props;\n    return {\n      build: location.query.build && true\n    };\n  }\n\n  componentWillReceiveProps (nextProps) {\n    const {location} = this.props;\n    const oldBuild = location.query.build;\n    const currentBuild = nextProps.location.query.build;\n    const config = {\n      duration: 800,\n      display: null,\n      easing: 'easeOutExpo'\n    };\n\n    if (oldBuild !== currentBuild) {\n      if (currentBuild) {\n        velocity.hook(this.refs.content, 'translateX', '0px');\n        velocity(this.refs.content, {translateX: '-290px'}, config);\n      } else {\n        velocity.hook(this.refs.content, 'translateX', '-290px');\n        velocity(this.refs.content, {translateX: '0px'}, config);\n      }\n    }\n\n    if (nextProps.previewing !== this.props.previewing) {\n      if (nextProps.previewing) {\n        velocity(this.refs.content, {top: '0px'}, config);\n      } else {\n        velocity(this.refs.content, {top: '45px'}, config);\n      }\n    }\n  }\n\n  render () {\n    const {previewing, toggleEditing} = this.props;\n    return (\n      <div className={styles.root}>\n        <TopBar previewing={previewing} toggleEditing={toggleEditing} />\n        <div className={cx(styles.content, this.state.build && styles.build)} ref='content'>\n          <Menu>\n            {this.renderMenuContent()}\n          </Menu>\n          <div className={cx(styles.pageContent, previewing && styles.pagePreviewing)}>\n            {this.props.children}\n          </div>\n          <PageBuilderMenu previewing={previewing} />\n        </div>\n      </div>\n    );\n  }\n\n  renderMenuContent () {\n    const {routes} = this.props;\n    if (routes.length >= 2) {\n      let MenuTag = false;\n      forEach(routes, route => {\n        if (route.menu) {\n          MenuTag = route.menu;\n        }\n      });\n\n      if (MenuTag) {\n        return <MenuTag />;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/admin/index.less",
    "content": "@import '~styles/sizes.less';\n\n:global {\n  body {\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    overflow: hidden;\n    font-family: 'Open Sans';\n  }\n}\n\n.root {\n  position: absolute;\n  top: 0; left: 0; bottom: 0; right: 0;\n}\n\n.content {\n  position: absolute;\n  top: @topMenuHeight;\n  left: 0;\n  bottom: 0;\n  right: 0;\n}\n\n.pageContent {\n  position: absolute;\n  top: 0;\n  left: @menuWidth;\n  right: 0;\n  bottom: 0;\n}\n\n.pagePreviewing {\n  right: -290px;\n}\n\n.build {\n  transform: translateX(-290px);\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/loading/index.jsx",
    "content": "import cx from 'classnames';\nimport React from 'react';\nimport Component from 'components/component';\n\nimport styles from './index.less';\n\nexport default class Loading extends Component {\n  render () {\n    return (\n      <div className={cx(styles.loading)} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/loading/index.less",
    "content": ".loading {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  background: url('/images/admin/loading.gif') center center no-repeat;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/menu/content-types.jsx",
    "content": "import cx from 'classnames';\nimport A from 'components/a';\nimport Button from 'components/menu-button';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './content-types.less';\n\nexport default class ContentTypes extends Component {\n  static fragments = {\n    schemas: {\n      _id: 1,\n      title: 1,\n      type: 1\n    }\n  };\n\n  static propTypes = {\n    active: PropTypes.string,\n    onActiveClick: PropTypes.func.isRequired,\n    schemas: PropTypes.array.isRequired\n  };\n\n  render () {\n    const {schemas} = this.props;\n    return (\n      <div className={styles.contentTypes}>\n        <div className={styles.header}>\n          <span className={styles.text}>Content Types</span>\n          <A href='/admin/schemas/new' className={styles.button}>\n            <i className='nc-icon-mini ui-1_circle-bold-add'></i>\n          </A>\n        </div>\n        {schemas.map(this.renderSchema, this)}\n      </div>\n    );\n  }\n\n  renderSchema (schema) {\n    const {active, onActiveClick} = this.props;\n    return (\n      <Button\n        link={`/admin/schemas/${schema._id}`}\n        label={schema.title}\n        icon={cx(\n          'nc-icon-outline',\n          schema.type === 'single' ? 'design_webpage' : 'files_single-copy-04'\n        )}\n        active={active === schema._id}\n        onActiveClick={onActiveClick}\n        dark\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/menu/content-types.less",
    "content": "@import '~styles/colors.less';\n\n.contentTypes {\n  margin-top: 10px;\n}\n\n.header {\n  padding: 0 15px;\n}\n\n.text {\n  display: inline-block;\n  vertical-align: top;\n  text-transform: uppercase;\n  font-size: 12px;\n  line-height: 40px;\n  font-weight: 600;\n  color: @adminText;\n}\n\n.button {\n  float: right;\n  display: inline-block;\n  vertical-align: top;\n\n  :global i {\n    color: @adminText;\n    font-size: 16px;\n    line-height: 40px;\n  }\n\n  &:hover :global i {\n    color: @primarySub;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/menu/index.js",
    "content": "import * as adminMenuActions from 'actions/admin-menu';\n\nimport bind from 'decorators/bind';\nimport forEach from 'lodash.foreach';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport Menu from './menu';\n\n@dataConnect(\n  (state) => ({\n    adminMenuOpened: state.adminMenu,\n    routes: state.router.routes,\n    params: state.router.params\n  }),\n  (dispatch) => bindActionCreators(adminMenuActions, dispatch),\n  () => ({\n    fragments: Menu.fragments,\n    mutations: {\n      addSchema: [{\n        type: 'APPEND',\n        field: 'schemas'\n      }]\n    }\n  })\n)\nexport default class MenuContainer extends Component {\n  static propTypes = {\n    fetchData: PropTypes.func.isRequired,\n    adminMenuOpened: PropTypes.bool.isRequired,\n    openAdminMenu: PropTypes.func.isRequired,\n    routes: PropTypes.array.isRequired,\n    params: PropTypes.object.isRequired,\n    children: PropTypes.node\n  };\n\n  static defaultProps = {\n    schemas: []\n  };\n\n  static menuData = [\n    {\n      name: 'adminSettings',\n      label: 'General Settings',\n      icon: 'nc-icon-outline ui-1_preferences-container',\n      link: '/admin/settings'\n    },\n    'sep',\n    {\n      name: 'adminPages',\n      label: 'Pages',\n      icon: 'nc-icon-outline design_window-paragraph',\n      link: '/admin/pages'\n    },\n    {\n      name: 'adminTemplates',\n      label: 'Templates',\n      icon: 'nc-icon-outline ui-2_webpage',\n      link: '/admin/templates'\n    },\n    'sep',\n    {\n      name: 'adminMedia',\n      label: 'Media',\n      icon: 'nc-icon-outline media-1_album',\n      link: '/admin/media'\n    },\n    {\n      name: 'adminMenus',\n      label: 'Menus',\n      icon: 'nc-icon-outline design_bullet-list-67',\n      link: '/admin/menus'\n    },\n    {\n      name: 'adminFonts',\n      label: 'Fonts',\n      icon: 'nc-icon-outline design_text',\n      link: '/admin/fonts'\n    },\n    {\n      name: 'adminColors',\n      label: 'Colors',\n      icon: 'nc-icon-outline design_palette',\n      link: '/admin/colors'\n    },\n    {\n      name: 'adminUsers',\n      label: 'Users',\n      icon: 'nc-icon-outline users_multiple-19',\n      link: '/admin/users'\n    }\n  ];\n\n  @bind\n  onActiveClick () {\n    this.props.openAdminMenu();\n  }\n\n  render () {\n    const {routes} = this.props;\n    let active = false;\n    if (routes.length >= 2) {\n      forEach(MenuContainer.menuData, (entry) => {\n        if (entry !== 'sep' && entry.name === routes[1].name) {\n          active = entry.label;\n        }\n      });\n\n      if (routes.length > 2 && routes[2].name === 'adminSchema') {\n        const {params} = this.props;\n        active = params.id;\n      }\n    }\n\n    const opened = this.props.adminMenuOpened && active && this.props.children && true;\n\n    return (\n      <Menu\n        menuData={MenuContainer.menuData}\n        active={active}\n        onActiveClick={this.onActiveClick}\n        opened={opened}\n        {...this.props}\n      >\n        {this.props.children}\n      </Menu>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/menu/menu.jsx",
    "content": "import cx from 'classnames';\nimport velocity from 'velocity-animate';\nimport Button from 'components/menu-button';\nimport Component from 'components/component';\nimport Scrollable from 'components/scrollable';\nimport React, {PropTypes} from 'react';\nimport {mergeFragments} from 'relate-js';\n\nimport styles from './menu.less';\nimport ContentTypes from './content-types';\nimport User from './user';\n\nexport default class Menu extends Component {\n  static fragments = mergeFragments(\n    ContentTypes.fragments,\n    User.fragments\n  );\n\n  static propTypes = {\n    active: PropTypes.string,\n    opened: PropTypes.bool,\n    menuData: PropTypes.array.isRequired,\n    schemas: PropTypes.array.isRequired,\n    onActiveClick: PropTypes.func.isRequired,\n    children: PropTypes.node\n  };\n\n  static defaultProps = {\n    opened: false\n  };\n\n  getInitState () {\n    return {\n      opened: this.props.opened\n    };\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (nextProps.opened !== this.props.opened) {\n      const config = {\n        duration: 800,\n        display: null,\n        easing: 'easeOutExpo'\n      };\n      if (nextProps.opened) {\n        velocity.hook(this.refs.menu, 'translateX', '0%');\n        velocity.hook(this.refs.content, 'translateX', '100%');\n        velocity(this.refs.menu, {translateX: '-100%'}, config);\n        velocity(this.refs.content, {translateX: '0%'}, config);\n      } else {\n        velocity.hook(this.refs.menu, 'translateX', '-100%');\n        velocity.hook(this.refs.content, 'translateX', '0%');\n        velocity(this.refs.menu, {translateX: '0%'}, config);\n        velocity(this.refs.content, {translateX: '100%'}, config);\n      }\n    }\n  }\n\n  render () {\n    const {menuData, schemas, active, onActiveClick, user} = this.props;\n    return (\n      <div className={cx(styles.root, this.state.opened && styles.opened)}>\n        <div className={styles.menu} ref='menu'>\n          <Scrollable className={styles.menuContent}>\n            {menuData.map(this.renderEntry, this)}\n            <ContentTypes\n              schemas={schemas}\n              key='content-types'\n              active={active}\n              onActiveClick={onActiveClick}\n            />\n          </Scrollable>\n        </div>\n        <div className={styles.content} ref='content'>\n          {this.props.children}\n        </div>\n        <User user={user} />\n      </div>\n    );\n  }\n\n  renderEntry (entry, key) {\n    let result;\n    if (entry === 'sep') {\n      result = <div className={styles.sepperator} />;\n    } else {\n      const {active, onActiveClick} = this.props;\n      result = (\n        <Button\n          {...entry}\n          active={active === entry.label}\n          key={key}\n          onActiveClick={onActiveClick}\n        />\n      );\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/menu/menu.less",
    "content": "@import '~styles/sizes.less';\n@import '~styles/colors.less';\n\n.root {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: @menuWidth;\n  border-right: 1px solid @adminBorders;\n  overflow: hidden;\n}\n\n.menu {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: -1px;\n  bottom: 80px;\n  transform: translateX(0%);\n  border-right: 1px solid @adminBorders;\n  z-index: 1;\n}\n\n.content {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: -1px;\n  bottom: 80px;\n  transform: translateX(100%);\n}\n\n.opened {\n  .menu {\n    transform: translateX(-100%);\n  }\n  .content {\n    transform: translateX(0%);\n  }\n}\n\n.menuContent {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0px;\n  overflow-y: auto;\n  overflow-x: hidden;\n}\n\n.sepperator {\n  display: block;\n  height: 0px;\n  width: 100%;\n  border-bottom: 1px solid @adminBorders;\n  margin: 0;\n  padding: 0;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/menu/user.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport getGravatarImage from 'helpers/get-gravatar-image';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {Link} from 'react-router';\n\nimport styles from './user.less';\n\nexport default class User extends Component {\n  static fragments = {\n    user: {\n      _id: 1,\n      email: 1,\n      name: 1\n    }\n  };\n\n  static propTypes = {\n    user: PropTypes.object.isRequired\n  };\n\n  getInitState () {\n    return {\n      opened: false\n    };\n  }\n\n  @bind\n  toggleOpened () {\n    this.setState({\n      opened: !this.state.opened\n    });\n  }\n\n  render () {\n    const {email, name} = this.props.user || {};\n    const {opened} = this.state;\n    const url = getGravatarImage(email, 50);\n\n    return (\n      <div className={cx(styles.root, opened && styles.opened)}>\n        <div className={styles.head} onClick={this.toggleOpened}>\n          <div className={styles.thumbnail}>\n            <div className={styles.blurred}>\n              <img src={url} role='presentation' />\n            </div>\n            <div className={styles.image}>\n              <img src={url} role='presentation' />\n            </div>\n          </div>\n          <div className={styles.info}>\n            <div className={styles.name}>{name}</div>\n            <div className={styles.role}>Administrator</div>\n          </div>\n          <div className={styles.toggle}>\n            <i className={cx('nc-icon-mini', opened ? 'arrows-1_minimal-up' : 'arrows-1_minimal-down')}></i>\n          </div>\n        </div>\n        <div className={styles.actions}>\n          <Link to='/admin/users' className={styles.action}>\n            <i className='nc-icon-mini users_circle-08'></i>\n            <span>My Profile</span>\n          </Link>\n          <a href='https://github.com/relax/relax/issues' className={styles.action}>\n            <i className='nc-icon-mini design_bug'></i>\n            <span>Help</span>\n          </a>\n          <a href='/admin/logout' className={styles.action}>\n            <i className='nc-icon-mini arrows-1_log-out'></i>\n            <span>Logout</span>\n          </a>\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/menu/user.less",
    "content": "@import '~styles/colors.less';\n\n@height: 80px;\n\n.root {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: @height;\n  overflow: hidden;\n  border-top: 1px solid @adminBorders;\n  background-color: #ffffff;\n  z-index: 1;\n  transition: height 0.2s ease-out;\n}\n\n.head {\n  height: @height;\n  cursor: pointer;\n  padding: 17px;\n}\n\n.opened {\n  height: @height + 100px;\n}\n\n.thumbnail {\n  display: inline-block;\n  vertical-align: top;\n  width: 46px;\n  height: 46px;\n  position: relative;\n}\n\n.blurred {\n  display: inline-block;\n  vertical-align: top;\n  width: 46px;\n  height: 46px;\n  border-radius: 50%;\n  overflow: hidden;\n\n  :global img {\n    width: 46px;\n    -webkit-filter: blur(6px);\n    -moz-filter: blur(6px);\n    -o-filter: blur(6px);\n    -ms-filter: blur(6px);\n    filter: blur(6px);\n  }\n}\n\n.image {\n  display: inline-block;\n  vertical-align: top;\n  width: 40px;\n  height: 40px;\n  border-radius: 50%;\n  overflow: hidden;\n  position: absolute;\n  top: 3px;\n  left: 3px;\n\n  :global img {\n    width: 40px;\n  }\n}\n\n.info {\n  display: inline-block;\n  vertical-align: top;\n  padding: 5px 13px;\n}\n\n.name {\n  color: @adminTextHighlight;\n  font-size: 15px;\n}\n\n.role {\n  color: @adminText;\n  font-size: 10px;\n}\n\n.toggle {\n  display: inline-block;\n  height: @height;\n  text-align: center;\n  position: absolute;\n  top: 0;\n  right: 0;\n  padding: 0 17px;\n\n  :global i {\n    color: @adminText;\n    font-size: 12px;\n    line-height: @height;\n  }\n}\n\n.actions {\n  padding: 0px 20px;\n  padding-left: 73px;\n  padding-bottom: 20px;\n}\n\n.action {\n  display: block;\n  text-decoration: none;\n  margin-bottom: 7px;\n\n  :global {\n    i, span {\n      display: inline-block;\n      vertical-align: top;\n      font-size: 12px;\n      color: @primary;\n      line-height: 20px;\n    }\n    i {\n      margin-right: 7px;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/actions/actions.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './actions.less';\nimport Back from './back';\nimport Displays from './displays';\nimport RightMenu from './right-menu';\nimport Statuses from './statuses';\n\nexport default class Actions extends Component {\n  static propTypes = {\n    location: PropTypes.object.isRequired,\n    display: PropTypes.string.isRequired,\n    changeDisplay: PropTypes.func.isRequired,\n    draftHasChanges: PropTypes.bool.isRequired,\n    state: PropTypes.string,\n    stateMessage: PropTypes.string,\n    toggleEditing: PropTypes.func.isRequired,\n    building: PropTypes.bool.isRequired\n  };\n\n  render () {\n    const {location, building} = this.props;\n    return (\n      <div className={styles.root}>\n        {this.renderDisplay()}\n        <Back link={location.pathname} />\n        {building && this.renderStatuses()}\n        {this.renderRightMenu()}\n      </div>\n    );\n  }\n\n  renderDisplay () {\n    const {display, changeDisplay} = this.props;\n    return (\n      <Displays display={display} onChange={changeDisplay} />\n    );\n  }\n\n  renderStatuses () {\n    const {draftHasChanges, state, stateMessage} = this.props;\n    return (\n      <Statuses\n        draftHasChanges={draftHasChanges}\n        state={state}\n        stateMessage={stateMessage}\n      />\n    );\n  }\n\n  renderRightMenu () {\n    const {toggleEditing, building} = this.props;\n    return (\n      <RightMenu toggleEditing={toggleEditing} building={building} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/actions/actions.less",
    "content": "@import '~styles/sizes.less';\n@import '~styles/colors.less';\n\n.root {\n  height: @actionsHeight;\n  border-bottom: 1px solid @chromeBordersColor;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/actions/back.jsx",
    "content": "import A from 'components/a';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './back.less';\n\nexport default class Back extends Component {\n  static propTypes = {\n    link: PropTypes.string.isRequired\n  };\n\n  static defaultProps = {\n    link: '#'\n  };\n\n  render () {\n    return (\n      <A href={this.props.link} className={styles.root}>\n        <img src='/images/admin/logo@2x.png' className={styles.logo} role='presentation' />\n        <img src='/images/admin/relax@2x.png' className={styles.lettering} role='presentation' />\n      </A>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/actions/back.less",
    "content": "@import '~styles/sizes.less';\n\n.root {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  height: @actionsHeight;\n}\n\n.logo {\n  width: 15px;\n  top: 4.5px;\n  margin-left: 6px;\n  position: relative;\n  display: inline-block;\n}\n\n.lettering {\n  position: relative;\n  margin-left: 4px;\n  display: inline-block;\n  top: 4px;\n  height: 13px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/actions/display.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './display.less';\n\nexport default class DisplayButton extends Component {\n  static propTypes = {\n    onChange: PropTypes.func.isRequired,\n    display: PropTypes.string.isRequired,\n    icon: PropTypes.string.isRequired,\n    active: PropTypes.bool.isRequired\n  };\n\n  @bind\n  onClick () {\n    const {onChange, display} = this.props;\n    onChange(display);\n  }\n\n  render () {\n    const {icon, active} = this.props;\n    return (\n      <button\n        className={cx(styles.button, !active && styles.unfocus)}\n        onClick={this.onClick}\n      >\n        <i className={icon}></i>\n      </button>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/actions/display.less",
    "content": "@import '~styles/colors.less';\n@import '~styles/sizes.less';\n\n.button {\n  :global {\n    i {\n      width: @actionsHeight;\n      font-size: 13px;\n      line-height: @actionsHeight;\n      color: @chromeTextColor;\n    }\n  }\n  &:nth-child(2) :global i {\n    font-size: 11px;\n  }\n  &:nth-child(3) :global i {\n    font-size: 10px;\n  }\n}\n\n.unfocus {\n\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/actions/displays.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './displays.less';\nimport Display from './display';\n\nexport default class Displays extends Component {\n  static propTypes = {\n    display: PropTypes.string.isRequired,\n    disabled: PropTypes.bool.isRequired,\n    onChange: PropTypes.func.isRequired\n  };\n\n  static defaultProp = {\n    disabled: false\n  };\n\n  static displaysArr = [\n    {\n      display: 'desktop',\n      icon: 'nc-icon-mini tech_desktop-screen'\n    },\n    {\n      display: 'tablet',\n      icon: 'nc-icon-mini tech_tablet-button'\n    },\n    {\n      display: 'mobile',\n      icon: 'nc-icon-mini tech_mobile-button'\n    }\n  ];\n\n  render () {\n    const {display, disabled} = this.props;\n    const positions = {\n      desktop: 0,\n      tablet: -25,\n      mobile: -50\n    };\n    const centerMenuStyle = {\n      left: positions[display]\n    };\n\n    return (\n      <div className={cx(styles.root, disabled && styles.disabled)}>\n        <div className={styles.wrapper}>\n          <div className={styles.slider} style={centerMenuStyle}>\n            {Displays.displaysArr.map(this.renderButton, this)}\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n  renderButton ({display, icon}) {\n    const {onChange} = this.props;\n    return (\n      <Display\n        onChange={onChange}\n        icon={icon}\n        display={display}\n        active={this.props.display === display}\n        key={display}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/actions/displays.less",
    "content": "@import '~styles/sizes.less';\n@import '~styles/colors.less';\n\n@numberDisplays: 3;\n\n.root {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0px;\n  height: @actionsHeight;\n  overflow: hidden;\n}\n\n.wrapper {\n  position: absolute;\n  left: 50%;\n  width: @actionsHeight;\n  height: @actionsHeight;\n  overflow: hidden;\n  transform: translateX(-(@actionsHeight / 2));\n  transition: all 0.2s ease-out;\n\n  &:hover {\n    width: @actionsHeight * @numberDisplays * 2;\n    @translate: @actionsHeight * @numberDisplays + @actionsHeight / 2;\n    transform: translateX(-@translate);\n    .slider {\n      transform: translateX(@actionsHeight * @numberDisplays);\n    }\n  }\n}\n\n.slider {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: @actionsHeight * @numberDisplays;\n  transition: all 0.2s ease-out;\n  transform: translateX(0);\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/actions/index.js",
    "content": "import * as displayActions from 'actions/display';\nimport * as draftActions from 'actions/draft';\n\nimport bind from 'decorators/bind';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {toggleEditing} from 'actions/page-builder';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport Actions from './actions';\n\n// import * as pageActions from 'actions/page';\n\n@dataConnect(\n  (state) => ({\n    draftID: state.router.params.id,\n    display: state.display,\n    location: state.router.location,\n    draftHasChanges: state.pageBuilder.actions.length > 0,\n    draftActionsNumb: state.pageBuilder.actions.length,\n    building: state.router.location.query.build\n  }),\n  (dispatch) => bindActionCreators({\n    ...displayActions,\n    ...draftActions,\n    toggleEditing\n  }, dispatch),\n  (props) => {\n    let result = {};\n\n    if (props.draftID) {\n      result = {\n        fragments: {\n          draft: {\n            _id: {\n              _id: 1,\n              _userId: 1\n            },\n            __v: 1\n          }\n        },\n        variablesTypes: {\n          draft: {\n            id: 'ID!'\n          }\n        },\n        initialVariables: {\n          draft: {\n            id: props.draftID\n          }\n        }\n      };\n    }\n\n    return result;\n  }\n)\nexport default class ActionsContainer extends Component {\n  static propTypes = {\n    saveDraft: PropTypes.object.isRequired,\n    dropDraft: PropTypes.object.isRequired,\n    pageActions: PropTypes.object.isRequired,\n    pageBuilderActions: PropTypes.object.isRequired,\n    activePanelType: PropTypes.string.isRequired,\n    changeDisplay: PropTypes.func.isRequired,\n    draftActionsNumb: PropTypes.number.isRequired,\n    draftID: PropTypes.string\n  };\n\n  getInitState () {\n    this.preventNavigationBind = ::this.preventNavigation;\n\n    if (this.isClient()) {\n      window.addEventListener('beforeunload', this.preventNavigationBind);\n    }\n\n    return {\n      state: null,\n      stateMessage: ''\n    };\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (nextProps.draftActionsNumb !== this.props.draftActionsNumb &&\n        nextProps.draftID === this.props.draftID &&\n        nextProps.building) {\n      clearTimeout(this.saveTimeout);\n      this.saveTimeout = setTimeout(this.autosave, 2000);\n    }\n  }\n\n  componentWillUnmount () {\n    this.saveDraft();\n    window.removeEventListener('beforeunload', this.preventNavigationBind);\n  }\n\n  preventNavigation (event) {\n    if (this.saveTimeout) {\n      const confirmationMessage = 'Your draft has not been saved yet!';\n      event.returnValue = confirmationMessage;\n      return confirmationMessage;\n    }\n  }\n\n  saveDraft () {\n    if (this.saveTimeout) {\n      clearTimeout(this.saveTimeout);\n      this.saveTimeout = false;\n      this.props.saveDraft();\n    }\n  }\n\n  @bind\n  async autosave () {\n    if (this.props.draftID) {\n      this.setState({\n        state: 'loading',\n        stateMessage: 'Auto saving draft'\n      });\n      clearTimeout(this.saveTimeout);\n      this.saveTimeout = false;\n\n      try {\n        await this.props.saveDraft();\n        this.setState({\n          state: 'success',\n          stateMessage: 'Autosave successful'\n        });\n        this.successTimeout = setTimeout(this.outSuccess, 2000);\n      } catch (err) {\n        this.setState({\n          state: 'error',\n          stateMessage: 'Error auto saving draft'\n        });\n      }\n    }\n  }\n\n  // async savePage (event, publish = false) {\n  //   event.preventDefault();\n  //   event.stopPropagation();\n  //   clearTimeout(this.successTimeout);\n  //\n  //   this.setState({\n  //     state: 'loading',\n  //     stateMessage: 'Saving page'\n  //   });\n  //\n  //   try {\n  //     await this.props.pageActions.savePageFromDraft(publish);\n  //     this.setState({\n  //       state: 'success',\n  //       stateMessage: 'Page saved successfully'\n  //     });\n  //     this.successTimeout = setTimeout(::this.outSuccess, 2000);\n  //   } catch (err) {\n  //     this.setState({\n  //       state: 'error',\n  //       stateMessage: 'Error saving page'\n  //     });\n  //   }\n  // }\n  //\n  // publishPage (event) {\n  //   this.savePage(event, true);\n  // }\n  //\n  // async fetchCurrent (event) {\n  //   if (event && event.preventDefault) {\n  //     event.preventDefault();\n  //   }\n  //   clearTimeout(this.successTimeout);\n  //\n  //   this.setState({\n  //     state: 'loading',\n  //     stateMessage: 'Dropping draft changes'\n  //   });\n  //\n  //   try {\n  //     await this.props.draftActions.dropDraft(this.props.draft._id._id);\n  //     this.setState({\n  //       state: 'success',\n  //       stateMessage: 'Draft dropped successfully'\n  //     });\n  //     this.successTimeout = setTimeout(::this.outSuccess, 2000);\n  //   } catch (err) {\n  //     this.setState({\n  //       state: 'error',\n  //       stateMessage: 'Error dropping draft'\n  //     });\n  //   }\n  // }\n\n  // async onRestore (__v) {\n  //   this.setState({\n  //     state: 'loading',\n  //     stateMessage: 'Restoring revisions'\n  //   });\n  //\n  //   try {\n  //     const page = await this.props.pageActions.restorePage(this.props.page._id, __v);\n  //\n  //     this.setState({\n  //       state: 'success',\n  //       stateMessage: 'Revisions restored successfully'\n  //     });\n  //\n  //     history.pushState({}, '', `/admin/page/${page.restorePage._id}`);\n  //     this.successTimeout = setTimeout(::this.outSuccess, 3000);\n  //   } catch (err) {\n  //     this.setState({\n  //       state: 'error',\n  //       stateMessage: 'Error restoring revisions'\n  //     });\n  //   }\n  // }\n\n  @bind\n  outSuccess () {\n    if (this.state.state === 'success') {\n      this.setState({\n        state: null\n      });\n    }\n  }\n\n  // previewToggle () {\n  //   this.props.pageBuilderActions.toggleEditing();\n  // }\n  //\n  // hasRevisions () {\n  //   return this.props.page && this.props.page.__v > 0;\n  // }\n  //\n  // isPublished () {\n  //   return this.props.page && this.props.page.state === 'published';\n  // }\n\n  render () {\n    return (\n      <Actions\n        {...this.props}\n        {...this.state}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/actions/right-menu.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './right-menu.less';\n\nexport default class RightMenu extends Component {\n  static propTypes = {\n    toggleEditing: PropTypes.func.isRequired,\n    building: PropTypes.bool.isRequired\n  };\n\n  render () {\n    const {toggleEditing, building} = this.props;\n\n    return (\n      <div className={cx(styles.root, !building && styles.disabled)}>\n        <button className={cx(styles.button, styles.iconButton)}>\n          <i className='nc-icon-mini ui-2_time-clock'></i>\n        </button>\n        <button className={cx(styles.button, styles.iconButton)}>\n          <i className='nc-icon-mini ui-1_settings-gear-64'></i>\n        </button>\n        <button className={cx(styles.button, styles.textButton)} onClick={toggleEditing}>\n          Preview\n        </button>\n        <button className={cx(styles.button, styles.textButton, styles.primaryButton)}>\n          Save\n        </button>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/actions/right-menu.less",
    "content": "@import '~styles/sizes.less';\n@import '~styles/colors.less';\n\n.root {\n  float: right;\n  position: relative;\n  padding: 0 6px;\n}\n\n.disabled {\n  opacity: 0.3;\n  &:after {\n    content: '';\n    display: inline-block;\n    position: absolute;\n    top: 0; left: 0; right: 0; bottom: 0;\n    background-color: transparent;\n  }\n}\n\n.button {\n  display: inline-block;\n  vertical-align: top;\n  margin-left: 10px;\n}\n\n.iconButton {\n  line-height: @actionsHeight;\n  height: @actionsHeight;\n\n  :global i {\n    width: @actionsHeight;\n    font-size: 12px;\n    line-height: @actionsHeight;\n    color: @chromeTextColor;\n  }\n\n  :hover :global i {\n    color: @chromeTextColorHighlight;\n  }\n}\n\n.textButton {\n  margin-top: 4px;\n  margin-left: 20px;\n  line-height: @actionsHeight - 9;\n  height: @actionsHeight - 9;\n  color: @chromeTextColor;\n  font-size: 9px;\n  text-transform: uppercase;\n}\n\n.primaryButton {\n  background-color: @primary;\n  color: #ffffff;\n  border-radius: 3px;\n  padding: 0 15px;\n\n  &:hover{\n    background-color: @primaryDarker;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/actions/statuses.jsx",
    "content": "import cx from 'classnames';\nimport Animate from 'components/animate';\nimport Component from 'components/component';\nimport Spinner from 'components/spinner';\nimport React, {PropTypes} from 'react';\n\nimport styles from './statuses.less';\n\nexport default class Statuses extends Component {\n  static propTypes = {\n    state: PropTypes.string,\n    stateMessage: PropTypes.string,\n    behindVersion: PropTypes.bool.isRequired,\n    draftHasChanges: PropTypes.bool.isRequired\n  };\n\n  render () {\n    const {state, behindVersion, draftHasChanges} = this.props;\n    let result;\n\n    if (state) {\n      result = this.renderState();\n    } else if (behindVersion) {\n      result = this.renderBehind();\n    } else if (draftHasChanges) {\n      result = this.renderEditing();\n    } else {\n      result = this.renderPublished();\n    }\n\n    return result;\n  }\n\n  renderState () {\n    const {state, stateMessage} = this.props;\n    let result;\n\n    if (state === 'loading') {\n      result = (\n        <Animate transition='slideDownIn' key='loading'>\n          <div className={cx(styles.state, styles.loading)}>\n            <Spinner small className={styles.spinner} />\n            <span>{stateMessage}</span>\n          </div>\n        </Animate>\n      );\n    } else if (state === 'success') {\n      result = (\n        <Animate transition='slideDownIn' key='success'>\n          <div className={cx(styles.state, styles.success)}>\n            <i className='nc-icon-outline ui-1_check-small' />\n            <span>{stateMessage}</span>\n          </div>\n        </Animate>\n      );\n    } else if (state === 'error') {\n      result = (\n        <Animate transition='slideDownIn' key='error'>\n          <div className={cx(styles.state, styles.error)}>\n            <i className='nc-icon-outline ui-2_small-remove' />\n            <span>{stateMessage}</span>\n          </div>\n        </Animate>\n      );\n    }\n\n    return result;\n  }\n\n  renderBehind () {\n    return (\n      <Animate transition='slideDownIn' key='behind'>\n        <div className={styles.root}>\n          <span className={styles.text}>Your draft is behind current revision - </span>\n          <button className={styles.button}> Fetch current</button>\n        </div>\n      </Animate>\n    );\n  }\n\n  renderEditing () {\n    return (\n      <Animate transition='slideDownIn' key='editing'>\n        <div className={styles.root}>\n          <span className={styles.text}>Editing your draft - </span>\n          <button className={styles.button}> Drop changes</button>\n        </div>\n      </Animate>\n    );\n  }\n\n  renderPublished () {\n    return (\n      <Animate transition='slideDownIn' key='published'>\n        <div className={styles.root}>\n          <span className={styles.text}>Seeing published version</span>\n        </div>\n      </Animate>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/actions/statuses.less",
    "content": "@import '~styles/sizes.less';\n@import '~styles/colors.less';\n\n.root {\n  display: inline-block;\n  vertical-align: top;\n  position: relative;\n  height: @actionsHeight;\n  padding: 0 16px;\n  line-height: @actionsHeight;\n}\n\n.text {\n  color: @primary;\n  font-size: 9px;\n}\n\n.button {\n  color: @chromeTextColor;\n  font-size: 9px;\n\n  &:hover {\n    color: @chromeTextColorHighlight;\n  }\n}\n\n.state {\n  display: inline-block;\n  vertical-align: top;\n  padding: 0 16px;\n  line-height: @actionsHeight;\n  height: @actionsHeight;\n\n  :global {\n    i, span {\n      display: inline-block;\n      vertical-align: top;\n      line-height: @actionsHeight;\n    }\n    i {\n      font-size: 20px;\n    }\n    span {\n      margin-left: 7px;\n      color: @primary;\n      font-size: 9px;\n    }\n  }\n}\n\n.spinner {\n  margin-top: 5px;\n}\n\n.success {\n  :global {\n    i, span {\n      color: @success;\n    }\n  }\n}\n\n.error {\n  :global {\n    i, span {\n      color: @alert;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/index.jsx",
    "content": "import velocity from 'velocity-animate';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\nimport Actions from './actions';\nimport Tabs from './tabs';\n\nexport default class TopBar extends Component {\n  static propTypes = {\n    previewing: PropTypes.bool.isRequired,\n    toggleEditing: PropTypes.func.isRequired\n  };\n\n  componentWillReceiveProps (nextProps) {\n    const config = {\n      duration: 800,\n      display: null,\n      easing: 'easeOutExpo'\n    };\n\n    if (nextProps.previewing !== this.props.previewing) {\n      if (nextProps.previewing) {\n        velocity(this.refs.content, {translateY: '-45px'}, config);\n        velocity(this.refs.preview, {translateX: '-110px'}, config);\n      } else {\n        velocity(this.refs.content, {translateY: '0'}, config);\n        velocity(this.refs.preview, {translateX: '-0'}, config);\n      }\n    }\n  }\n\n  render () {\n    const {toggleEditing} = this.props;\n    return (\n      <div>\n        <div className={styles.root} ref='content'>\n          <Actions />\n          <Tabs />\n        </div>\n        <div className={styles.closePreview} ref='preview' onClick={toggleEditing}>\n          Close preview\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/index.less",
    "content": "@import '~styles/colors.less';\n@import '~styles/sizes.less';\n\n.root {\n  position: absolute;\n  left: 0px; right: 0; top: 0;\n\n  height: @topMenuHeight;\n  background-color: @chromeBackgroundColor;\n  border-bottom: 1px solid @chromeBordersColor;\n\n  z-index: 2;\n}\n\n.closePreview {\n  position: absolute;\n  display: inline-block;\n  background-color: @chromeBackgroundColor;\n  border-radius: 3px;\n  color: @chromeTextColor;\n  left: 100%;\n  top: 5px;\n  font-size: 11px;\n  text-transform: uppercase;\n  padding: 5px 10px;\n  z-index: 1000;\n  white-space: nowrap;\n  cursor: pointer;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/tabs/index.js",
    "content": "import * as tabsActions from 'actions/tabs';\n\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport Tabs from './tabs';\n\n@dataConnect(\n  (state) => ({\n    pathname: state.router.location.pathname\n  }),\n  (dispatch) => bindActionCreators(tabsActions, dispatch),\n  () => ({\n    fragments: Tabs.fragments,\n    mutations: {\n      addTab: [{\n        type: 'APPEND',\n        field: 'tabs'\n      }]\n    }\n  })\n)\nexport default class TabsContainer extends Component {\n  static propTypes = {\n    fetchData: PropTypes.func.isRequired,\n    tabs: PropTypes.array.isRequired,\n    removeTab: PropTypes.func.isRequired,\n    pathname: PropTypes.string.isRequired\n  };\n\n  static defaultProps = {\n    tabs: []\n  };\n\n  render () {\n    const {tabs, removeTab, pathname} = this.props;\n    return (\n      <Tabs tabs={tabs} removeTab={removeTab} pathname={pathname} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/tabs/tab.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {Link} from 'react-router';\n\nimport styles from './tab.less';\n\nexport default class Tab extends Component {\n  static fragments = {\n    tab: {\n      _id: 1,\n      type: 1,\n      item: {\n        _id: 1,\n        title: 1\n      }\n    }\n  };\n\n  static propTypes = {\n    activePanelType: PropTypes.string,\n    tab: PropTypes.object,\n    tabsCount: PropTypes.number,\n    removeTab: PropTypes.func,\n    pathname: PropTypes.string.isRequired\n  };\n\n  @bind\n  onCloseTab (event) {\n    event.preventDefault();\n    event.stopPropagation();\n    const {tab = {}, pathname, removeTab} = this.props;\n    const to = this.getLink();\n    const active = pathname === to;\n\n    removeTab(tab._id, active && to);\n  }\n\n  getLink () {\n    const {tab = {}} = this.props;\n    const {item = {}} = tab;\n\n    let to;\n    switch (tab.type) {\n      case 'page':\n        to = `/admin/pages/${item._id}`;\n        break;\n      case 'schema':\n        to = `/admin/schemas/${item._id}`;\n        break;\n      default:\n        to = '#';\n    }\n\n    return to;\n  }\n\n  render () {\n    const {tab = {}, pathname} = this.props;\n    const {item = {}} = tab;\n    const to = this.getLink();\n\n    const active = pathname === to;\n    const deduct = 35 / this.props.tabsCount;\n    const style = {\n      maxWidth: `calc(${100 / this.props.tabsCount}% - ${deduct}px)`\n    };\n\n    return (\n      <Link to={to} query={{build: 1}} className={cx(styles.tab, active && styles.active)} style={style}>\n        <span>{item.title}</span>\n        <span className={styles.close} onClick={this.onCloseTab}>\n          <i className='nc-icon-mini ui-1_simple-remove'></i>\n        </span>\n      </Link>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/tabs/tab.less",
    "content": "@import '~styles/colors.less';\n@import '~styles/sizes.less';\n\n.tab {\n  height: @tabsHeight;\n  border-right: 1px solid @chromeBordersColor;\n  display: inline-block;\n  vertical-align: top;\n  text-decoration: none;\n  color: @chromeTextColor;\n\n  font-size: 10px;\n  line-height: @tabsHeight;\n  width: 200px;\n\n  margin: 0 -1px;\n  padding: 0 7.5px;\n  padding-right: 30px;\n\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  position: relative;\n\n  i {\n    vertical-align: top;\n    font-size: 11px;\n    line-height: @tabsHeight;\n  }\n\n  &:hover{\n    color: @chromeTextColorHighlight;\n  }\n}\n\n.active {\n  z-index: 1;\n  background-color: #3f4249;\n  color: @chromeTextColorHighlight;\n}\n\n.close {\n  position: absolute;\n  width: 13px;\n  height: 13px;\n  border-radius: 9px;\n  text-align: center;\n  top: 4px;\n  right: 7px;\n\n  i {\n    font-size: 6px;\n    line-height: 13px;\n    vertical-align: top;\n    color: #999999;\n  }\n\n  &:hover {\n    background-color: #DD6050;\n\n    i {\n      color: #ffffff;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/tabs/tabs.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './tabs.less';\nimport Tab from './tab';\n\nexport default class Tabs extends Component {\n  static fragments = {\n    tabs: Tab.fragments.tab\n  };\n\n  static propTypes = {\n    tabs: PropTypes.array.isRequired,\n    removeTab: PropTypes.func.isRequired,\n    pathname: PropTypes.string.isRequired\n  };\n\n  render () {\n    return (\n      <div className={styles.root}>\n        {this.props.tabs.map(this.renderTab, this)}\n        <button className={styles.addButton} key='add'>\n          <i className='nc-icon-mini ui-1_bold-add'></i>\n        </button>\n      </div>\n    );\n  }\n\n  renderTab (tab, key) {\n    const {removeTab, pathname} = this.props;\n    return (\n      <Tab\n        tab={tab}\n        tabsCount={this.props.tabs.length}\n        removeTab={removeTab}\n        pathname={pathname}\n        key={key}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/components/top-bar/tabs/tabs.less",
    "content": "@import '~styles/sizes.less';\n@import '~styles/colors.less';\n\n.root {\n  height: @tabsHeight;\n}\n\n.addButton {\n  height: @tabsHeight;\n  display: inline-block;\n  vertical-align: top;\n  text-decoration: none;\n  color: @chromeTextColor;\n  padding: 0 8px;\n\n  :global i {\n    font-size: 8px;\n    line-height: @tabsHeight;\n  }\n\n  &:hover{\n    color: @chromeTextColorHighlight;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/index.js",
    "content": "import 'styles/normalize.less';\nimport 'styles/nucleo/index.less';\n\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {toggleEditing} from 'actions/page-builder';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport {rootDataConnect} from 'relate-js';\n\nimport Admin from './components/admin';\n\n@rootDataConnect()\n@connect(\n  (state) => ({\n    previewing: !state.pageBuilder.editing\n  }),\n  (dispatch) => bindActionCreators({toggleEditing}, dispatch)\n)\nexport default class AdminContainer extends Component {\n  static propTypes = {\n    children: PropTypes.node.isRequired\n  };\n\n  render () {\n    return (\n      <Admin {...this.props}>\n        {this.props.children}\n      </Admin>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/colors/components/colors.jsx",
    "content": "import Component from 'components/component';\nimport Content from 'components/content';\nimport ContentHeader from 'components/content-header';\nimport ContentHeaderActions from 'components/content-header-actions';\nimport ContentNew from 'components/content-new';\nimport ContentSearch from 'components/content-search';\nimport React, {PropTypes} from 'react';\n\nimport List from './list';\n\nexport default class Colors extends Component {\n  static fragments = List.fragments;\n\n  static propTypes = {\n    colors: PropTypes.array.isRequired,\n    search: PropTypes.string.isRequired,\n    searchChange: PropTypes.func.isRequired,\n    duplicateColor: PropTypes.func.isRequired,\n    removeColor: PropTypes.func.isRequired\n  };\n\n  render () {\n    const {colors, search, searchChange, duplicateColor, removeColor} = this.props;\n\n    return (\n      <div>\n        <ContentHeader>\n          <ContentSearch value={search} onChange={searchChange} />\n          <ContentHeaderActions>\n            <ContentNew>Add new color</ContentNew>\n          </ContentHeaderActions>\n        </ContentHeader>\n        <Content>\n          <List\n            colors={colors}\n            search={search}\n            duplicateColor={duplicateColor}\n            removeColor={removeColor}\n          />\n        </Content>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/colors/components/entry.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './entry.less';\n\nexport default class Entry extends Component {\n  static fragments = {\n    color: {\n      _id: 1,\n      label: 1,\n      value: 1\n    }\n  };\n\n  static propTypes = {\n    color: PropTypes.object.isRequired,\n    duplicateColor: PropTypes.func.isRequired,\n    removeColor: PropTypes.func.isRequired\n  };\n\n  duplicate () {\n    const {duplicateColor, color} = this.props;\n    duplicateColor(color._id);\n  }\n\n  remove () {\n    const {removeColor, color} = this.props;\n    removeColor(color._id);\n  }\n\n  render () {\n    const {color} = this.props;\n    const colorStyle = {\n      backgroundColor: color.value\n    };\n\n    return (\n      <div className={styles.root}>\n        <div className={cx(styles.color, color.value === '#ffffff' && styles.white)} style={colorStyle}></div>\n        <div className={styles.info}>\n          <div className={styles.title}>{color.label}</div>\n          <div className={styles.value}>{color.value}</div>\n        </div>\n        <div className={styles.actions}>\n          <button className={styles.button} onClick={::this.duplicate}>Duplicate</button>\n          <button className={cx(styles.button, styles.remove)} onClick={::this.remove}>Delete Color</button>\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/colors/components/entry.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  width: 21.25%;\n  margin-right: 5%;\n  display: inline-block;\n  vertical-align: top;\n  margin-bottom: 60px;\n  border: 1px solid transparent;\n}\n\n@media screen and (min-width: 1501px) {\n  .root {\n    width: 16%;\n    &:nth-child(5n+5) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 1500px) and (min-width: 1101px) {\n  .root {\n    &:nth-child(4n+4) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 1100px) and (min-width: 851px) {\n  .root {\n    width: 30%;\n    &:nth-child(3n+3) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 850px) and (min-width: 751px) {\n  .root {\n    width: 45%;\n    margin-right: 10%;\n    &:nth-child(2n+2) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 750px) {\n  .root {\n    width: 100%;\n    margin-right: 0%;\n  }\n}\n\n.color {\n  height: 125px;\n  margin: -1px;\n  margin-bottom: 0;\n  position: relative;\n\n  &.white:before {\n    content: '';\n    display: block;\n    position: absolute;\n    top: 0; bottom: 0;\n    left: 0; right: 0;\n    border: 1px solid @adminBorders;\n    z-index: 1;\n  }\n}\n\n.info {\n  padding: 15px;\n  height: 65px;\n  text-align: center;\n}\n\n.title {\n  color: @adminTextHighlight;\n  font-size: 16px;\n  line-height: 19px;\n}\n\n.value {\n  color: @adminText;\n  font-size: 14px;\n  font-weight: 300;\n  text-transform: uppercase;\n}\n\n.actions {\n  visibility: hidden;\n  border-top: 1px solid @adminBorders;\n}\n\n.button {\n  height: 39px;\n  line-height: 39px;\n  font-size: 12px;\n  text-transform: uppercase;\n  width: 50%;\n  border-right: 1px solid @adminBorders;\n  color: @adminText;\n}\n\n.remove {\n  color: @alert;\n}\n\n.root:hover {\n  border: 1px solid @adminBorders;\n  .actions {\n    visibility: visible;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/colors/components/list.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {mergeFragments} from 'relax-fragments';\n\nimport Entry from './entry';\n\nexport default class List extends Component {\n  static fragments = mergeFragments({\n    colors: Entry.fragments.color\n  }, {\n    colors: {\n      _id: 1,\n      label: 1\n    }\n  });\n\n  static propTypes = {\n    colors: PropTypes.array.isRequired,\n    search: PropTypes.string,\n    duplicateColor: PropTypes.func.isRequired,\n    removeColor: PropTypes.func.isRequired\n  };\n\n  render () {\n    const {colors} = this.props;\n    return (\n      <div>\n        {colors.map(this.renderEntry, this)}\n      </div>\n    );\n  }\n\n  renderEntry (color) {\n    const {search, duplicateColor, removeColor} = this.props;\n    let valid = true;\n\n    if (search) {\n      valid = color.label.toLowerCase().indexOf(search.toLowerCase()) >= 0;\n    }\n\n    if (valid) {\n      return (\n        <Entry color={color} key={color._id} duplicateColor={duplicateColor} removeColor={removeColor} />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/colors/index.js",
    "content": "import * as colorsActions from 'actions/colors';\n\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport Colors from './components/colors.jsx';\n\n@dataConnect(\n  null,\n  (dispatch) => bindActionCreators(colorsActions, dispatch),\n  () => ({\n    fragments: Colors.fragments,\n    mutations: {\n      duplicateColor: [{\n        type: 'APPEND',\n        field: 'colors'\n      }],\n      addColor: [{\n        type: 'APPEND',\n        field: 'colors'\n      }]\n    }\n  })\n)\nexport default class ColorsContainer extends Component {\n  static propTypes = {\n    colors: PropTypes.array.isRequired,\n    duplicateColor: PropTypes.func.isRequired,\n    removeColor: PropTypes.func.isRequired\n  };\n\n  static defaultProps = {\n    colors: []\n  };\n\n  getInitState () {\n    return {\n      search: ''\n    };\n  }\n\n  searchChange (search) {\n    this.setState({\n      search\n    });\n  }\n\n  render () {\n    const {colors, duplicateColor, removeColor} = this.props;\n    return (\n      <Colors\n        colors={colors}\n        searchChange={::this.searchChange}\n        duplicateColor={duplicateColor}\n        removeColor={removeColor}\n        {...this.state}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/fonts/components/entry.jsx",
    "content": "import cx from 'classnames';\nimport utils from 'helpers/utils';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './entry.less';\n\nexport default class Entry extends Component {\n  static propTypes = {\n    family: PropTypes.string.isRequired,\n    fvd: PropTypes.string.isRequired,\n    text: PropTypes.string.isRequired,\n    display: PropTypes.oneOf(['grid', 'list']).isRequired\n  };\n\n  render () {\n    const {family, fvd, text, display} = this.props;\n    const style = {\n      fontFamily: family\n    };\n    utils.processFVD(style, fvd);\n\n    return (\n      <div className={cx(styles.root, styles[display])}>\n        <div className={styles.text} style={style}>{text}</div>\n        <div className={styles.info}>\n          <div className={styles.title}>{utils.filterFontFamily(family)}</div>\n          <div className={styles.value}>{utils.filterFVD(fvd)}</div>\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/fonts/components/entry.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  width: 21.25%;\n  margin-right: 5%;\n  display: inline-block;\n  vertical-align: top;\n  margin-bottom: 60px;\n  border: 1px solid transparent;\n}\n\n@media screen and (min-width: 1501px) {\n  .grid.root {\n    width: 12.5%;\n    &:nth-child(6n+6) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 1500px) and (min-width: 1301px) {\n  .grid.root {\n    width: 16%;\n    &:nth-child(5n+5) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 1300px) and (min-width: 1051px) {\n  .grid.root {\n    &:nth-child(4n+4) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 1050px) and (min-width: 851px) {\n  .grid.root {\n    width: 30%;\n    &:nth-child(3n+3) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 850px) and (min-width: 751px) {\n  .grid.root {\n    width: 45%;\n    margin-right: 10%;\n    &:nth-child(2n+2) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 750px) {\n  .grid.root {\n    width: 100%;\n    margin-right: 0%;\n  }\n}\n\n.text {\n  margin-top: 10px;\n  line-height: 125px;\n  font-size: 90px;\n  text-align: center;\n  color: @adminTextHighlight;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: clip;\n}\n\n.info {\n  padding: 15px;\n  height: 65px;\n  text-align: center;\n}\n\n.title {\n  color: @adminText;\n  font-size: 16px;\n  line-height: 19px;\n}\n\n.value {\n  color: @adminText;\n  font-size: 14px;\n  font-weight: 300;\n  text-transform: uppercase;\n}\n\n.list {\n  width: 100%;\n  margin-right: 0%;\n\n  .text {\n    text-align: left;\n  }\n\n  .info {\n    padding: 15px 0;\n    text-align: left;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/fonts/components/fonts.jsx",
    "content": "import Component from 'components/component';\nimport Content from 'components/content';\nimport ContentDisplays from 'components/content-displays';\nimport ContentHeader from 'components/content-header';\nimport ContentHeaderActions from 'components/content-header-actions';\nimport ContentNew from 'components/content-new';\nimport Modal from 'components/modal';\nimport React, {PropTypes} from 'react';\n\nimport List from './list';\nimport Manage from './manage';\nimport PreviewText from './preview-text';\n\nexport default class Fonts extends Component {\n  static fragments = List.fragments;\n\n  static propTypes = {\n    fonts: PropTypes.object.isRequired,\n    previewText: PropTypes.string.isRequired,\n    changePreviewText: PropTypes.string.isRequired,\n    changeDisplay: PropTypes.func.isRequired,\n    display: PropTypes.string.isRequired,\n    manage: PropTypes.bool.isRequired,\n    openManage: PropTypes.func.isRequired,\n    closeManage: PropTypes.func.isRequired,\n    fontsActions: PropTypes.object.isRequired\n  };\n\n  render () {\n    const {fonts, previewText, changePreviewText, changeDisplay, display, openManage} = this.props;\n\n    return (\n      <div>\n        <ContentHeader>\n          <PreviewText value={previewText} onChange={changePreviewText} />\n          <ContentHeaderActions>\n            <ContentDisplays display={display} onChange={changeDisplay} />\n            <ContentNew onClick={openManage}>Manage fonts</ContentNew>\n          </ContentHeaderActions>\n        </ContentHeader>\n        <Content>\n          <List fonts={fonts} previewText={previewText} display={display} />\n        </Content>\n        {this.renderManage()}\n      </div>\n    );\n  }\n\n  renderManage () {\n    const {manage, closeManage, fonts, fontsActions} = this.props;\n\n    if (manage) {\n      return (\n        <Modal onClose={closeManage} subTitle='Manage fonts' title='Where should we fetch them from?'>\n          <Manage fonts={fonts} fontsActions={fontsActions} closeManage={closeManage} />\n        </Modal>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/fonts/components/list.jsx",
    "content": "import forEach from 'lodash.foreach';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport Entry from './entry';\n\nexport default class List extends Component {\n  static propTypes = {\n    fonts: PropTypes.object.isRequired,\n    previewText: PropTypes.string.isRequired,\n    display: PropTypes.oneOf(['grid', 'list']).isRequired\n  };\n\n  render () {\n    const {fonts, previewText, display} = this.props;\n    const list = [];\n    let result;\n\n    if (fonts.fonts) {\n      forEach(fonts.fonts, (variants, family) => {\n        variants.map((fvd, ind) => {\n          const key = (family + fvd).replace(/ /g, '_');\n          list.push(\n            <Entry\n              key={key}\n              family={family}\n              fvd={fvd}\n              text={previewText || (display === 'grid' ? 'Abc' : 'Relax the fonts up')}\n              display={display}\n            />\n          );\n        }, this);\n      });\n    }\n\n    if (list.length > 0) {\n      result = (\n        <div>\n          {list}\n        </div>\n      );\n    } else {\n      result = (\n        <div>\n          No fonts yet\n        </div>\n      );\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/fonts/components/manage/index.js",
    "content": "import Component from 'components/component';\nimport React from 'react';\n\nimport Manage from './manage';\n\nconst tabs = [\n  {\n    title: 'Google Fonts',\n    lib: 'google',\n    placeholder: 'Google Fonts Link'\n  },\n  {\n    title: 'Typekit',\n    lib: 'typekit',\n    placeholder: 'Typekit kit id'\n  },\n  {\n    title: 'Fonts.com',\n    lib: 'monotype',\n    placeholder: 'Fonts.com project id'\n  },\n  {\n    title: 'Font Deck',\n    lib: 'fontdeck',\n    placeholder: 'Fontdeck project id'\n  },\n  {\n    title: 'Custom Fonts',\n    lib: 'custom'\n  }\n];\n\nexport default class ManageContainer extends Component {\n  getInitState () {\n    return {\n      tab: 0\n    };\n  }\n\n  changeTab (tab) {\n    this.setState({\n      tab\n    });\n  }\n\n  render () {\n    return (\n      <Manage\n        {...this.props}\n        {...this.state}\n        tabs={tabs}\n        changeTab={::this.changeTab}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/fonts/components/manage/manage.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport ModalInput from 'components/modal-input';\nimport React, {PropTypes} from 'react';\n\nimport styles from './manage.less';\n\nexport default class Manage extends Component {\n  static propTypes = {\n    tabs: PropTypes.array.isRequired,\n    tab: PropTypes.number.isRequired,\n    changeTab: PropTypes.func.isRequired,\n    fonts: PropTypes.object.isRequired,\n    fontsActions: PropTypes.object.isRequired,\n    closeManage: PropTypes.func.isRequired\n  };\n\n  changeTab (tab) {\n    this.props.changeTab(tab);\n  }\n\n  render () {\n    const {tabs, closeManage} = this.props;\n\n    return (\n      <div className={styles.root}>\n        <div className={styles.tabs}>\n          {tabs.map(this.renderTabButton, this)}\n        </div>\n        <div className={styles.content}>\n          {this.renderContent()}\n          <button className={styles.done} onClick={closeManage}>Done</button>\n        </div>\n      </div>\n    );\n  }\n\n  renderTabButton (tabButton, index) {\n    const {tab} = this.props;\n    return (\n      <button\n        className={cx(styles.tab, tab === index && styles.active)}\n        onClick={this.changeTab.bind(this, index)}\n        key={index}\n      >\n        {tabButton.title}\n      </button>\n    );\n  }\n\n  renderContent () {\n    const {tab, tabs, fonts, fontsActions} = this.props;\n    const currentTab = tabs[tab];\n    let result;\n\n    if (currentTab.lib !== 'custom') {\n      const lib = currentTab.lib;\n      const input = fonts.input[lib];\n\n      result = (\n        <div className={styles.inputArea}>\n          <ModalInput\n            invalid={!input.valid && input.input}\n            value={input.input}\n            onChange={fontsActions.changeFontInputAndUpdate.bind(this, tab)}\n            placeholder={currentTab.placeholder}\n          />\n        </div>\n      );\n    } else {\n      result = (\n        <div>custom</div>\n      );\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/fonts/components/manage/manage.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  padding: 30px;\n  padding-top: 5px;\n}\n\n.tabs {\n  text-align: center;\n}\n\n.tab {\n  position: relative;\n  font-size: 16px;\n  line-height: 39px;\n  color: @adminText;\n  margin-bottom: 15px;\n  display: inline-block;\n  margin-right: 55px;\n  font-weight: 600;\n\n  &:hover, &.active {\n    color: @primary;\n  }\n\n  &.active {\n    &:after {\n    content: '';\n      position: absolute;\n      bottom: 0;\n      left: 0;\n      right: 0;\n      height: 0;\n      border-bottom: 1px solid @primary;\n    }\n  }\n\n  &:last-child {\n    margin-right: 0;\n  }\n}\n\n.inputArea {\n  padding: 0 70px;\n  padding-top: 50px;\n}\n\n.content {\n  text-align: center;\n}\n\n.done {\n  text-transform: uppercase;\n  font-size: 16px;\n  color: @primary;\n  text-align: center;\n  margin-top: 30px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/fonts/components/preview-text.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './preview-text.less';\n\nexport default class PreviewText extends Component {\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    onChange: PropTypes.func.isRequired\n  };\n\n  onChange (event) {\n    this.props.onChange(event.target.value);\n  }\n\n  render () {\n    const {value} = this.props;\n    return (\n      <input className={styles.root} value={value} onChange={::this.onChange} placeholder='Preview Text' />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/fonts/components/preview-text.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  display: inline-block;\n  vertical-align: top;\n\n  color: @adminText;\n  font-size: 20px;\n  line-height: 30px;\n  font-weight: 300;\n  background-color: transparent;\n  border: 0;\n  outline: 0;\n  padding: 0;\n  margin: 0;\n  width: 250px;\n\n  &::-webkit-input-placeholder {\n    color: @adminTextSub;\n  }\n  &:-moz-placeholder {\n    color: @adminTextSub;\n  }\n  &::-moz-placeholder {\n    color: @adminTextSub;\n  }\n  &:-ms-input-placeholder {\n    color: @adminTextSub;\n  }\n  &::-ms-input-placeholder {\n    color: @adminTextSub;\n  }\n  &:placeholder-shown {\n    color: @adminTextSub;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/fonts/index.js",
    "content": "import * as fontsActions from 'actions/fonts';\n\nimport {dataConnect} from 'relate-js';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {bindActionCreators} from 'redux';\n\nimport Fonts from './components/fonts.jsx';\n\n@dataConnect(\n  (state) => ({\n    fonts: state.fonts.data\n  }),\n  (dispatch) => ({\n    fontsActions: bindActionCreators(fontsActions, dispatch)\n  }),\n  () => ({\n    fragments: {\n      settings: {\n        _id: 1,\n        value: 1\n      }\n    },\n    variablesTypes: {\n      settings: {\n        ids: '[String]!'\n      }\n    },\n    initialVariables: {\n      settings: {\n        ids: ['fonts']\n      }\n    }\n  })\n)\nexport default class FontsContainer extends Component {\n  static propTypes = {\n    fonts: PropTypes.object.isRequired\n  };\n\n  getInitState () {\n    return {\n      previewText: '',\n      display: 'grid',\n      manage: false\n    };\n  }\n\n  changeDisplay (display) {\n    this.setState({\n      display\n    });\n  }\n\n  changePreviewText (value) {\n    this.setState({\n      previewText: value\n    });\n  }\n\n  openManage () {\n    this.setState({\n      manage: true\n    });\n  }\n\n  closeManage () {\n    this.setState({\n      manage: false\n    });\n  }\n\n  render () {\n    return (\n      <Fonts\n        {...this.props}\n        {...this.state}\n        changePreviewText={::this.changePreviewText}\n        changeDisplay={::this.changeDisplay}\n        openManage={::this.openManage}\n        closeManage={::this.closeManage}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/components/entry.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport moment from 'moment';\nimport Component from 'components/component';\nimport MediaItemPreview from 'components/media-item-preview';\nimport React, {PropTypes} from 'react';\nimport {mergeFragments} from 'relate-js';\n\nimport styles from './entry.less';\n\nexport default class MediaEntry extends Component {\n  static fragments = mergeFragments({\n    mediaItem: {\n      _id: 1,\n      name: 1,\n      date: 1,\n      size: 1,\n      dimension: {\n        width: 1,\n        height: 1\n      }\n    }\n  }, MediaItemPreview.fragments);\n\n  static propTypes = {\n    onClick: PropTypes.func.isRequired,\n    mediaItem: PropTypes.object.isRequired,\n    selected: PropTypes.bool.isRequired,\n    display: PropTypes.string.isRequired\n  };\n\n  @bind\n  onClick () {\n    const {onClick, mediaItem} = this.props;\n    onClick(mediaItem._id);\n  }\n\n  render () {\n    const {mediaItem, selected, display} = this.props;\n    const momentDate = moment(mediaItem.date);\n\n    const sizes = display === 'list' ? {width: 250, height: 125} : {width: 300, height: 150};\n\n    return (\n      <div className={cx(styles[display], selected && styles.selected)} onClick={this.onClick}>\n        <div className={styles.preview}>\n          <MediaItemPreview mediaItem={mediaItem} {...sizes} />\n        </div>\n        <div className={styles.info}>\n          <div className={styles.title}>{mediaItem.name}</div>\n          <div className={styles.date}>{momentDate.fromNow()}</div>\n          {this.renderExtraInfo()}\n        </div>\n      </div>\n    );\n  }\n\n  renderExtraInfo () {\n    const {display, mediaItem} = this.props;\n    if (display === 'list') {\n      const {size, dimension} = mediaItem;\n      return (\n        <div className={styles.extras}>\n          {size && <div className={styles.extra}>{size}</div>}\n          {dimension && <div className={styles.extra}>{`${dimension.width}x${dimension.height}`}</div>}\n        </div>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/components/entry.less",
    "content": "@import '~styles/colors.less';\n\n.grid {\n  display: inline-block;\n  vertical-align: top;\n\n  width: 21.25%;\n  margin-right: 5%;\n\n  margin-bottom: 60px;\n  border: 1px solid transparent;\n\n  cursor: pointer;\n}\n\n@media screen and (min-width: 1501px) {\n  .grid {\n    width: 16%;\n    &:nth-child(5n+5) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 1500px) and (min-width: 1101px) {\n  .grid {\n    &:nth-child(4n+4) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 1100px) and (min-width: 851px) {\n  .grid {\n    width: 30%;\n    &:nth-child(3n+3) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 850px) and (min-width: 751px) {\n  .grid {\n    width: 45%;\n    margin-right: 10%;\n    &:nth-child(2n+2) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 750px) {\n  .grid {\n    width: 100%;\n    margin-right: 0%;\n  }\n}\n\n.preview {\n  width: 100%;\n  height: 125px;\n  background-color: @adminBorders;\n}\n\n.info {\n  padding: 15px;\n  height: 65px;\n  text-align: center;\n}\n\n.title {\n  color: @adminTextHighlight;\n  font-size: 16px;\n  line-height: 19px;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.date {\n  color: @adminText;\n  font-size: 12px;\n  font-weight: 300;\n  text-transform: uppercase;\n}\n\n.extras {\n  margin-top: 10px;\n}\n\n.extra {\n  color: @adminText;\n  font-size: 12px;\n}\n\n.grid:hover, .list:hover {\n  border: 1px solid @adminBorders;\n}\n\n.grid.selected, .list.selected {\n  border: 1px solid @primary;\n}\n\n.list {\n  display: block;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  cursor: pointer;\n\n  .preview {\n    display: table-cell;\n    vertical-align: top;\n    width: 300px;\n    height: 150px;\n  }\n  .info {\n    display: table-cell;\n    vertical-align: middle;\n    text-align: left;\n    padding: 10px 30px;\n  }\n  .title {\n    font-size: 18px;\n    line-height: 24px;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/components/list.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport Entry from './entry';\n\nexport default class MediaList extends Component {\n  static fragments = {\n    media: Entry.fragments.mediaItem\n  };\n\n  static propTypes = {\n    media: PropTypes.array.isRequired,\n    toggleMediaSelection: PropTypes.func.isRequired,\n    selected: PropTypes.array.isRequired,\n    display: PropTypes.string.isRequired\n  };\n\n  render () {\n    const {media} = this.props;\n\n    return (\n      <div>\n        {media.map(this.renderEntry, this)}\n      </div>\n    );\n  }\n\n  renderEntry (mediaItem) {\n    const {toggleMediaSelection, selected, display} = this.props;\n    return (\n      <Entry\n        mediaItem={mediaItem}\n        onClick={toggleMediaSelection}\n        selected={selected.indexOf(mediaItem._id) !== -1}\n        display={display}\n        key={mediaItem._id}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/components/media.jsx",
    "content": "import Animate from 'components/animate';\nimport Component from 'components/component';\nimport Content from 'components/content';\nimport ContentDisplays from 'components/content-displays';\nimport ContentHeader from 'components/content-header';\nimport ContentHeaderActions from 'components/content-header-actions';\nimport ContentSearch from 'components/content-search';\nimport ModalDelete from 'components/modal-delete';\nimport Upload from 'components/upload';\nimport React, {PropTypes} from 'react';\nimport {mergeFragments} from 'relate-js';\n\nimport styles from './media.less';\nimport List from './list';\nimport Sorting from './sorting';\nimport Uploading from './uploading';\n\nexport default class Media extends Component {\n  static fragments = mergeFragments(\n    List.fragments,\n    {\n      mediaCount: 1\n    }\n  );\n\n  static propTypes = {\n    media: PropTypes.array.isRequired,\n    mediaCount: PropTypes.number,\n    uploadMediaFiles: PropTypes.func.isRequired,\n    uploadsVisible: PropTypes.bool.isRequired,\n    search: PropTypes.string.isRequired,\n    searchChange: PropTypes.func.isRequired,\n    sort: PropTypes.string.isRequired,\n    order: PropTypes.string.isRequired,\n    location: PropTypes.object.isRequired,\n    toggleMediaSelection: PropTypes.func.isRequired,\n    selected: PropTypes.array.isRequired,\n    display: PropTypes.string.isRequired,\n    changeMediaDisplay: PropTypes.func.isRequired,\n    unselectAll: PropTypes.func.isRequired,\n    onRemoveSelected: PropTypes.func.isRequired,\n    deleteConfirm: PropTypes.bool.isRequired,\n    cancelRemoveSelected: PropTypes.func.isRequired,\n    removeSelected: PropTypes.func.isRequired\n  };\n\n  render () {\n    const {uploadsVisible} = this.props;\n    return (\n      <div>\n        {this.renderContent()}\n        {uploadsVisible && <Uploading />}\n      </div>\n    );\n  }\n\n  renderContent () {\n    const {mediaCount} = this.props;\n    let result;\n    if (mediaCount === 0) {\n      result = this.renderNoContent();\n    } else {\n      result = this.renderHasContent();\n    }\n    return result;\n  }\n\n  renderNoContent () {\n    const {uploadMediaFiles} = this.props;\n    return (\n      <Upload clickable={false} infos onFiles={uploadMediaFiles}>\n        <div className={styles.none}>\n          <div className={styles.noneContent}>\n            <div className={styles.noneTitle}>\n              You haven’t uploaded any media!\n            </div>\n            <div className={styles.noneText}>\n              Just drag it into this window or click the upload button bellow.\n            </div>\n            <div className={styles.noneText}>\n              Just worry about the upload, we’ll take care of categorizing it for you.\n            </div>\n            <Upload showInfos={false} className={styles.uploadButton} onFiles={uploadMediaFiles}>\n              <i className='nc-icon-outline arrows-1_cloud-upload-94'></i>\n              <span>Upload</span>\n            </Upload>\n          </div>\n        </div>\n      </Upload>\n    );\n  }\n\n  renderHasContent () {\n    const {\n      media,\n      uploadMediaFiles,\n      location,\n      sort,\n      order,\n      toggleMediaSelection,\n      selected,\n      display,\n      changeMediaDisplay\n    } = this.props;\n    return (\n      <Upload clickable={false} infos onFiles={uploadMediaFiles}>\n        <ContentHeader>\n          {this.renderSearchOrSelect()}\n          <ContentHeaderActions>\n            <Sorting\n              location={location}\n              sort={sort}\n              order={order}\n            />\n          <ContentDisplays display={display} onChange={changeMediaDisplay} />\n          </ContentHeaderActions>\n        </ContentHeader>\n        <Content>\n          <List media={media} toggleMediaSelection={toggleMediaSelection} selected={selected} display={display} />\n        </Content>\n        {this.renderDeleteConfirm()}\n      </Upload>\n    );\n  }\n\n  renderSearchOrSelect () {\n    const {selected, search, searchChange, unselectAll, onRemoveSelected} = this.props;\n    const len = selected.length;\n    let result;\n\n    if (len) {\n      result = (\n        <Animate key='selected'>\n          <div className={styles.selected}>\n            <span className={styles.selectedText}>{`You've selected ${len} items`}</span>\n            <button className={styles.unselect} onClick={unselectAll}>Unselect</button>\n            <button className={styles.remove} onClick={onRemoveSelected}>Remove</button>\n          </div>\n        </Animate>\n      );\n    } else {\n      result = (\n        <Animate key='nonselected'>\n          <ContentSearch value={search} onChange={searchChange} />\n        </Animate>\n      );\n    }\n\n    return result;\n  }\n\n  renderDeleteConfirm () {\n    const {deleteConfirm, cancelRemoveSelected, removeSelected, selected} = this.props;\n    if (deleteConfirm) {\n      return (\n        <ModalDelete\n          title={`Are you sure you want to remove the ${selected.length} selected items?`}\n          cancel={cancelRemoveSelected}\n          submit={removeSelected}\n        />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/components/media.less",
    "content": "@import '~styles/sizes.less';\n@import '~styles/colors.less';\n\n.none {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.noneContent {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -70%);\n  text-align: center;\n  width: 100%;\n  padding: 0 40px;\n}\n\n.noneTitle {\n  font-size: 31px;\n  color: @adminText;\n  font-weight: 300;\n  line-height: 50px;\n}\n\n.noneText {\n  font-size: 15px;\n  color: @adminText;\n  font-weight: 300;\n}\n\n.uploadButton {\n  display: inline-block;\n  margin-top: 30px;\n  cursor: pointer;\n\n  :global {\n    i, span {\n      display: inline-block;\n      vertical-align: top;\n      color: @primary;\n      line-height: 25px;\n    }\n    span {\n      font-size: 16px;\n      text-transform: uppercase;\n    }\n    i {\n      font-size: 22px;\n      margin-right: 7px;\n    }\n  }\n}\n\n.selected {\n  display: inline-block;\n  vertical-align: top;\n}\n\n.selectedText {\n  font-size: 13px;\n  color: @adminText;\n}\n\n.unselect, .remove {\n  display: inline-block;\n  vertical-align: top;\n  font-size: 13px;\n  margin-left: 10px;\n}\n\n.unselect {\n  color: @primary;\n}\n\n.remove {\n  color: @alert;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/components/menu.jsx",
    "content": "import Button from 'components/menu-button';\nimport Component from 'components/component';\nimport ListHeader from 'components/list-header';\nimport Scrollable from 'components/scrollable';\nimport SubButton from 'components/menu-sub-button';\nimport Upload from 'components/upload';\nimport React, {PropTypes} from 'react';\n\nimport styles from './menu.less';\n\nexport default class MediaMenu extends Component {\n  static propTypes = {\n    children: PropTypes.node,\n    pages: PropTypes.array.isRequired,\n    onBack: PropTypes.func.isRequired,\n    uploadMediaFiles: PropTypes.func.isRequired,\n    location: PropTypes.object.isRequired\n  };\n\n  getQuery (type) {\n    const {location} = this.props;\n    return Object.assign(\n      {},\n      location.query,\n      {\n        filter: type\n      }\n    );\n  }\n\n  render () {\n    const {onBack, uploadMediaFiles, location} = this.props;\n    const {filter = 'all'} = location.query;\n\n    return (\n      <div>\n        <ListHeader\n          title='Media'\n          onBack={onBack}\n        >\n          <Upload showInfos={false} onFiles={uploadMediaFiles}>\n            <button className={styles.uploadButton}>\n              <i className='nc-icon-outline arrows-1_cloud-upload-94'></i>\n            </button>\n          </Upload>\n        </ListHeader>\n        <Scrollable className={styles.list}>\n          <div>\n            <Button\n              link={location}\n              query={this.getQuery('all')}\n              label='All'\n              icon='nc-icon-outline files_single-copies'\n              active={filter === 'all'}\n            />\n            <Button\n              link={location}\n              query={this.getQuery('image')}\n              label='Images'\n              icon='nc-icon-outline media-1_image-02'\n              active={filter.indexOf('image') !== -1 || filter === 'favicon'}\n            >\n              <SubButton\n                link={location}\n                query={this.getQuery('image/jpeg')}\n                label='JPEG'\n                active={filter === 'image/jpeg'}\n              />\n              <SubButton\n                link={location}\n                query={this.getQuery('image/png')}\n                label='PNG'\n                active={filter === 'image/png'}\n              />\n              <SubButton\n                link={location}\n                query={this.getQuery('favicon')}\n                label='ICO'\n                active={filter === 'favicon'}\n              />\n            </Button>\n            <Button\n              link={location}\n              query={this.getQuery('video')}\n              label='Video'\n              icon='nc-icon-outline media-1_play-69'\n              active={filter === 'video'}\n            />\n            <Button\n              link={location}\n              query={this.getQuery('audio')}\n              label='Audio'\n              icon='nc-icon-outline media-1_volume-98'\n              active={filter === 'audio'}\n            />\n          </div>\n        </Scrollable>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/components/menu.less",
    "content": "@import '~styles/colors.less';\n\n.list {\n  position: absolute;\n  top: 70px;\n  bottom: 0; left: 0; right: 0;\n}\n\n.uploadButton {\n  position: absolute;\n  top: 0;\n  right: 0;\n  padding: 0 10px;\n  :global {\n    i {\n      color: @adminText;\n      line-height: 70px;\n      font-size: 22px;\n    }\n  }\n  &:hover :global i {\n    color: @primary;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/components/sorting.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {Link} from 'react-router';\n\nimport styles from './sorting.less';\n\nexport default class Sorting extends Component {\n  static propTypes = {\n    location: PropTypes.object.isRequired,\n    sort: PropTypes.string.isRequired,\n    order: PropTypes.string.isRequired\n  };\n\n  reverseOrder (order) {\n    return order === 'asc' ? 'desc' : 'asc';\n  }\n\n  render () {\n    return (\n      <div className={styles.root}>\n        <span className={styles.label}>Sort by: </span>\n        {this.renderSort('Date', '_id')}\n        {this.renderSort('Size', 'filesize')}\n        {this.renderSort('Dimension', 'dimension')}\n      </div>\n    );\n  }\n\n  renderSort (label, property) {\n    const {location, sort, order} = this.props;\n    const active = sort === property;\n    const query = Object.assign({}, location.query, {\n      sort: property,\n      order: active ? this.reverseOrder(order) : order\n    });\n\n    return (\n      <Link to={location} query={query} className={cx(styles.button, active && styles.active)}>\n        <span>{label}</span>\n        {\n          active &&\n          <i\n            className={cx(\n              'nc-icon-outline',\n              order === 'asc' ? 'arrows-1_small-triangle-up' : 'arrows-1_small-triangle-down'\n            )}\n          />\n        }\n      </Link>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/components/sorting.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  display: inline-block;\n  vertical-align: top;\n}\n\n.label {\n  display: inline-block;\n  vertical-align: top;\n  color: @adminText;\n  font-size: 12px;\n  margin-right: 20px;\n  line-height: 30px;\n}\n\n.button {\n  display: inline-block;\n  vertical-align: top;\n  color: @adminText;\n  font-size: 14px;\n  font-weight: 600;\n  text-decoration: none;\n  margin-right: 25px;\n  line-height: 30px;\n  border: 0;\n  outline: 0;\n\n  :global {\n    i, span {\n      display: inline-block;\n      vertical-align: top;\n      line-height: 30px;\n    }\n    i {\n      margin-left: 5px;\n    }\n  }\n\n  &.active {\n    color: @primary;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/components/uploading/index.js",
    "content": "import bind from 'decorators/bind';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {connect} from 'react-redux';\n\nimport Uploading from './uploading';\n\n@connect(\n  (state) => ({\n    uploads: state.media.uploads\n  })\n)\nexport default class UploadingContainer extends Component {\n  static propTypes = {\n    uploads: PropTypes.array.isRequired\n  };\n\n  getInitState () {\n    return {\n      opened: true\n    };\n  }\n\n  @bind\n  toggleOpened () {\n    this.setState({\n      opened: !this.state.opened\n    });\n  }\n\n  render () {\n    const {uploads} = this.props;\n    const {opened} = this.state;\n    return (\n      <Uploading\n        uploads={uploads}\n        opened={opened}\n        toggleOpened={this.toggleOpened}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/components/uploading/item.jsx",
    "content": "import cx from 'classnames';\nimport Animate from 'components/animate';\nimport Component from 'components/component';\nimport Spinner from 'components/spinner';\nimport React, {PropTypes} from 'react';\n\nimport styles from './item.less';\n\nexport default class UploadItem extends Component {\n  static propTypes = {\n    name: PropTypes.string.isRequired,\n    status: PropTypes.string.isRequired\n  };\n\n  render () {\n    const {name} = this.props;\n    return (\n      <div className={styles.root}>\n        <div className={styles.name}>{name}</div>\n        {this.renderStatus()}\n      </div>\n    );\n  }\n\n  renderStatus () {\n    const {status} = this.props;\n    let result;\n\n    if (status === 'queue') {\n      result = <i className='nc-icon-mini ui-2_hourglass'></i>;\n    } else if (status === 'uploading') {\n      result = <Spinner />;\n    } else if (status === 'success') {\n      result = <i className='nc-icon-mini ui-1_check'></i>;\n    } else if (status === 'error') {\n      result = <i className='nc-icon-mini ui-1_simple-remove'></i>;\n    }\n\n    return (\n      <Animate key={status}>\n        <div className={cx(styles.status, styles[status])}>\n          {result}\n        </div>\n      </Animate>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/components/uploading/item.less",
    "content": "@import '~styles/colors.less';\n@height: 40px;\n\n.root {\n  height: @height;\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n}\n\n.name, .status {\n  display: table-cell;\n  vertical-align: top;\n  line-height: @height;\n}\n\n.name {\n  color: @adminText;\n  font-size: 12px;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.status {\n  text-align: center;\n  width: 35px;\n\n  :global i {\n    font-size: 10px;\n    line-height: @height;\n  }\n}\n\n.uploading {\n  padding-top: 8px;\n}\n\n.success {\n  :global i {\n    color: @success;\n  }\n}\n\n.queue {\n  :global i {\n    color: @adminText;\n  }\n}\n\n.error {\n  :global i {\n    color: @alert;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/components/uploading/uploading.jsx",
    "content": "import velocity from 'velocity-animate';\nimport Animate from 'components/animate';\nimport Component from 'components/component';\nimport Scrollable from 'components/scrollable';\nimport React, {PropTypes} from 'react';\n\nimport styles from './uploading.less';\nimport Item from './item';\n\nexport default class Uploading extends Component {\n  static propTypes = {\n    uploads: PropTypes.array.isRequired,\n    opened: PropTypes.bool.isRequired,\n    toggleOpened: PropTypes.func.isRequired\n  };\n\n  componentWillReceiveProps (nextProps) {\n    if (this.props.opened !== nextProps.opened) {\n      const config = {\n        duration: 500,\n        easing: 'easeOutExpo'\n      };\n\n      if (nextProps.opened) {\n        velocity(this.refs.root, {translateY: '0%'}, config);\n      } else {\n        velocity(this.refs.root, {translateY: '100%'}, config);\n      }\n    }\n  }\n\n  render () {\n    const {uploads, toggleOpened} = this.props;\n    const uploadsFinished = uploads.reduce((previousValue, current) => {\n      const isFinished = current.status !== 'queue' && current.status !== 'uploading';\n      return previousValue + (isFinished ? 1 : 0);\n    }, 0);\n    return (\n      <Animate>\n        <div className={styles.root} ref='root'>\n          <div className={styles.header} onClick={toggleOpened}>\n            <span className={styles.title}>Uploads</span>\n            <span className={styles.progress}>\n              <span>{uploadsFinished}</span>\n              <span> / </span>\n              <span>{uploads.length}</span>\n            </span>\n          </div>\n          <Scrollable className={styles.list}>\n            <div className={styles.listContent}>\n              {uploads.map(this.renderUpload, this)}\n            </div>\n          </Scrollable>\n        </div>\n      </Animate>\n    );\n  }\n\n  renderUpload (item) {\n    return (\n      <Item {...item} key={item.id} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/components/uploading/uploading.less",
    "content": "@import '~styles/colors.less';\n\n@headerHeight: 45px;\n@contentHeight: 280px;\n\n.root {\n  position: absolute;\n  right: 7%;\n  bottom: 0;\n  width: 370px;\n  border: 1px solid @adminBorders;\n  background-color: #fff;\n}\n\n.header {\n  height: @headerHeight;\n  padding: 0 20px;\n  position: absolute;\n  top: -@headerHeight;\n  left: -1px; right: -1px;\n  border: 1px solid @adminBorders;\n  cursor: pointer;\n  background-color: #f8f8f8;\n  border-radius: 3px 3px 0 0;\n}\n\n.title {\n  font-size: 14px;\n  font-weight: 400;\n  color: @adminText;\n  line-height: @headerHeight;\n}\n\n.progress {\n  float: right;\n  font-size: 13px;\n  font-weight: 400;\n  color: @primary;\n  line-height: @headerHeight;\n}\n\n.list {\n  height: @contentHeight;\n}\n\n.listContent {\n  padding: 20px 30px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/index.js",
    "content": "import * as mediaActions from 'actions/media';\n\nimport bind from 'decorators/bind';\nimport debounce from 'decorators/debounce';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {getMimeTypes} from 'helpers/mime-types';\nimport {bindActionCreators} from 'redux';\nimport {pushState} from 'redux-router';\nimport {dataConnect} from 'relate-js';\n\nimport Media from './components/media.jsx';\n\n@dataConnect(\n  (state) => ({\n    uploadsVisible: state.media.uploads.length > 0,\n    display: state.media.display,\n    location: state.router.location,\n    sort: state.router.location.query.sort || '_id',\n    order: state.router.location.query.order || 'desc',\n    search: state.router.location.query.s || '',\n    filter: state.router.location.query.filter || 'all'\n  }),\n  (dispatch) => bindActionCreators(mediaActions, dispatch),\n  (props) => {\n    const filter = props.filter;\n    let filters = [];\n    if (filter !== 'all') {\n      let type = getMimeTypes(filter);\n      let op = 'in';\n      if (!type) {\n        op = 'eq';\n        type = filter;\n      }\n      filters = [{\n        property: 'type',\n        op: {\n          [op]: type\n        }\n      }];\n    }\n\n    return {\n      fragments: Media.fragments,\n      variablesTypes: {\n        media: {\n          sort: 'String',\n          order: 'String',\n          search: 'String',\n          s: 'String',\n          filters: '[Filter]'\n        }\n      },\n      initialVariables: {\n        media: {\n          sort: props.sort,\n          order: props.order,\n          search: 'name',\n          s: props.search,\n          filters\n        }\n      },\n      mutations: {\n        addMedia: [\n          {\n            type: 'PREPEND',\n            field: 'media'\n          },\n          {\n            type: 'INCREMENT',\n            field: 'mediaCount'\n          }\n        ]\n      }\n    };\n  }\n)\nexport default class MediaContainer extends Component {\n  static propTypes = {\n    media: PropTypes.array.isRequired,\n    sort: PropTypes.string.isRequired,\n    order: PropTypes.string.isRequired,\n    search: PropTypes.string.isRequired,\n    filter: PropTypes.string.isRequired,\n    location: PropTypes.object.isRequired,\n    changeMediaDisplay: PropTypes.func.isRequired\n  };\n\n  static contextTypes = {\n    store: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    media: []\n  };\n\n  getInitState () {\n    return {\n      search: this.props.search,\n      selected: [],\n      deleteConfirm: false\n    };\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (nextProps.sort !== this.props.sort ||\n        nextProps.order !== this.props.order ||\n        nextProps.search !== this.props.search ||\n        nextProps.filter !== this.props.filter) {\n      this.updateMedia(nextProps);\n    }\n  }\n\n  updateMedia (props) {\n    const {relate, sort, order, search, filter} = props;\n    const mediaVariables = {\n      sort,\n      order,\n      search: 'name',\n      s: search\n    };\n\n    if (filter !== 'all') {\n      let type = getMimeTypes(filter);\n      let op = 'in';\n      if (!type) {\n        op = 'eq';\n        type = filter;\n      }\n      mediaVariables.filters = [{\n        property: 'type',\n        op: {\n          [op]: type\n        }\n      }];\n    }\n\n    relate.setVariables({\n      media: mediaVariables\n    });\n  }\n\n  @bind\n  toggleMediaSelection (id) {\n    const {selected} = this.state;\n    const index = selected.indexOf(id);\n\n    if (index === -1) {\n      this.setState({\n        selected: [...selected, id]\n      });\n    } else {\n      const newSelected = selected.slice(0);\n      newSelected.splice(index, 1);\n      this.setState({\n        selected: newSelected\n      });\n    }\n  }\n\n  @bind\n  unselectAll () {\n    this.setState({\n      selected: []\n    });\n  }\n\n  @bind\n  searchChange (search) {\n    this.setState({\n      search\n    });\n    this.updateSearch();\n  }\n\n  @debounce(300)\n  updateSearch () {\n    const {location} = this.props;\n    const query = Object.assign({}, location.query, {\n      s: this.state.search\n    });\n    this.context.store.dispatch(pushState(null, location, query));\n  }\n\n  @bind\n  onRemoveSelected () {\n    this.setState({\n      deleteConfirm: true\n    });\n  }\n\n  @bind\n  cancelRemoveSelected () {\n    this.setState({\n      deleteConfirm: false\n    });\n  }\n\n  @bind\n  removeSelected () {\n    this.props\n      .removeMediaItems(this.state.selected)\n      .then(() => {\n        this.setState({\n          selected: [],\n          deleteConfirm: false\n        });\n      });\n  }\n\n  render () {\n    const {\n      media,\n      mediaCount,\n      uploadMediaFiles,\n      uploadsVisible,\n      location,\n      sort,\n      order,\n      display,\n      changeMediaDisplay\n    } = this.props;\n    return (\n      <Media\n        {...this.state}\n        media={media}\n        mediaCount={mediaCount}\n        uploadMediaFiles={uploadMediaFiles}\n        uploadsVisible={uploadsVisible}\n        searchChange={this.searchChange}\n        location={location}\n        sort={sort}\n        order={order}\n        toggleMediaSelection={this.toggleMediaSelection}\n        unselectAll={this.unselectAll}\n        display={display}\n        changeMediaDisplay={changeMediaDisplay}\n        onRemoveSelected={this.onRemoveSelected}\n        cancelRemoveSelected={this.cancelRemoveSelected}\n        removeSelected={this.removeSelected}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/media/menu.js",
    "content": "import * as adminMenuActions from 'actions/admin-menu';\nimport * as mediaActions from 'actions/media';\n\nimport bind from 'decorators/bind';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport Menu from './components/menu';\n\n@connect(\n  (state) => ({\n    location: state.router.location\n  }),\n  (dispatch) => ({\n    ...bindActionCreators(adminMenuActions, dispatch),\n    ...bindActionCreators(mediaActions, dispatch)\n  })\n)\nexport default class MediaMenuContainer extends Component {\n  static propTypes = {\n    closeAdminMenu: PropTypes.func.isRequired,\n    openAdminMenu: PropTypes.func.isRequired,\n    uploadMediaFiles: PropTypes.func.isRequired,\n    location: PropTypes.object.isRequired\n  };\n\n  componentDidMount () {\n    this.props.openAdminMenu();\n  }\n\n  @bind\n  onBack () {\n    this.props.closeAdminMenu();\n  }\n\n  render () {\n    const {uploadMediaFiles, location} = this.props;\n    return (\n      <Menu\n        uploadMediaFiles={uploadMediaFiles}\n        onBack={this.onBack}\n        location={location}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/components/content.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './content.less';\nimport New from './new';\n\nexport default class Content extends Component {\n  static propTypes = {\n    children: PropTypes.node,\n    count: PropTypes.number\n  };\n\n  render () {\n    let result;\n\n    if (this.props.count === 0) {\n      result = this.renderNoMenus();\n    } else if (this.props.children) {\n      result = this.props.children;\n    } else {\n      result = this.renderEmpty();\n    }\n\n    return result;\n  }\n\n  renderEmpty () {\n    return (\n      <div className={styles.empty}>\n        <i className='nc-icon-outline media-1_touch'></i>\n        <div className={styles.emptyText}>Relax, select a menu first!</div>\n      </div>\n    );\n  }\n\n  renderNoMenus () {\n    return (\n      <div className={styles.noMenus}>\n        <div className={styles.noTitle}>Create your first menu</div>\n        <New />\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/components/content.less",
    "content": "@import '~styles/sizes.less';\n@import '~styles/colors.less';\n\n.empty {\n  position: absolute;\n  top: 40%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  text-align: center;\n\n  :global i {\n    font-size: 56px;\n    color: @adminTextSub;\n    margin-bottom: 20px;\n    margin-top: 20px;\n  }\n}\n\n.emptyText {\n  font-size: 17px;\n  color: @adminTextSub;\n}\n\n.noMenus {\n  width: 440px;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  text-align: center;\n}\n\n.noTitle {\n  font-size: 36px;\n  font-weight: 300;\n  margin-bottom: 5px;\n  color: @adminText;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/components/entry.jsx",
    "content": "import cx from 'classnames';\nimport moment from 'moment';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {Link} from 'react-router';\n\nimport styles from './entry.less';\n\nexport default class MenuEntry extends Component {\n  static fragments = {\n    menu: {\n      _id: 1,\n      title: 1,\n      date: 1\n    }\n  };\n\n  static propTypes = {\n    menu: PropTypes.object.isRequired,\n    active: PropTypes.bool.isRequired,\n    query: PropTypes.object.isRequired\n  };\n\n  render () {\n    const {menu, active, query} = this.props;\n    const date = moment(menu.date).fromNow();\n    const editLink = '/admin/menus/' + menu._id;\n\n    return (\n      <Link to={editLink} query={query} className={cx(styles.root, active && styles.active)}>\n        <div className={styles.title}>{menu.title}</div>\n        <div className={styles.date}>{date}</div>\n      </Link>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/components/entry.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  height: 70px;\n  border-bottom: 1px solid @adminBorders;\n  padding: 16px 15px;\n  position: relative;\n  display: block;\n  text-decoration: none;\n\n  &:hover {\n    background-color: @primaryBack;\n  }\n}\n\n.title {\n  font-size: 15px;\n  color: @adminTextHighlight;\n}\n\n.date {\n  font-size: 12px;\n  color: @adminText;\n  font-weight: 300;\n}\n\n.active {\n  background-color: @primary;\n\n  .title {\n    color: #ffffff;\n  }\n  .date {\n    color: #ffffff;\n  }\n\n  &:hover {\n    background-color: @primary;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/components/list.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport Entry from './entry';\n\nexport default class MenusList extends Component {\n  static fragments = {\n    menus: Entry.fragments.menu\n  };\n\n  static propTypes = {\n    menus: PropTypes.array.isRequired,\n    activeId: PropTypes.string,\n    query: PropTypes.object.isRequired\n  };\n\n  render () {\n    return (\n      <div>\n        {this.props.menus.map(this.renderEntry, this)}\n      </div>\n    );\n  }\n\n  renderEntry (menu, key) {\n    const {activeId, query} = this.props;\n    return (\n      <Entry menu={menu} key={key} active={activeId === menu._id} query={query} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/components/menu.jsx",
    "content": "import Component from 'components/component';\nimport ListHeader from 'components/list-header';\nimport ListSearchSort from 'components/list-search-sort';\nimport Modal from 'components/modal';\nimport Scrollable from 'components/scrollable';\nimport React, {PropTypes} from 'react';\n\nimport styles from './menu.less';\nimport List from './list';\nimport New from './new';\n\nconst sorts = [\n  {\n    label: 'Date desc',\n    sort: '_id',\n    order: 'desc'\n  },\n  {\n    label: 'Date asc',\n    sort: '_id',\n    order: 'asc'\n  },\n  {\n    label: 'Title A-Z',\n    sort: 'title',\n    order: 'asc'\n  },\n  {\n    label: 'Title Z-A',\n    sort: 'title',\n    order: 'desc'\n  },\n  {\n    label: 'Updated desc',\n    sort: 'updatedDate',\n    order: 'desc'\n  },\n  {\n    label: 'Updated asc',\n    sort: 'updatedDate',\n    order: 'asc'\n  }\n];\n\nexport default class Menu extends Component {\n  static fragments = List.fragments;\n\n  static propTypes = {\n    children: PropTypes.node,\n    menus: PropTypes.array.isRequired,\n    onBack: PropTypes.func.isRequired,\n    newOpened: PropTypes.bool.isRequired,\n    onNew: PropTypes.func.isRequired,\n    closeNew: PropTypes.func.isRequired,\n    activeId: PropTypes.string,\n    sort: PropTypes.string.isRequired,\n    order: PropTypes.string.isRequired,\n    search: PropTypes.string.isRequired,\n    location: PropTypes.object.isRequired\n  };\n\n  render () {\n    const {menus, onBack, onNew, activeId, search, sort, order, location} = this.props;\n\n    return (\n      <div>\n        <ListHeader\n          title='Menus'\n          onBack={onBack}\n          newIcon='nc-icon-outline ui-1_circle-add'\n          onNew={onNew}\n        />\n        <ListSearchSort\n          search={search}\n          sorts={sorts}\n          sort={sort}\n          order={order}\n          location={location}\n        />\n        <Scrollable className={styles.list}>\n          <List menus={menus} activeId={activeId} query={location.query} />\n        </Scrollable>\n        {this.renderNew()}\n      </div>\n    );\n  }\n\n  renderNew () {\n    const {newOpened, closeNew} = this.props;\n    if (newOpened) {\n      return (\n        <Modal small subTitle='New Menu' title='What should we call it?' onClose={closeNew}>\n          <New onClose={closeNew} />\n        </Modal>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/components/menu.less",
    "content": ".list {\n  position: absolute;\n  top: 110px;\n  bottom: 0; left: 0; right: 0;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/components/new/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {addMenu} from 'actions/menu';\n\nimport New from './new';\n\nexport default class NewMenuContainer extends Component {\n  static propTypes = {\n    onClose: PropTypes.func.isRequired\n  };\n\n  static contextTypes = {\n    store: PropTypes.object.isRequired\n  };\n\n  getInitState () {\n    return {\n      title: '',\n      loading: false\n    };\n  }\n\n  changeTitle (title) {\n    this.setState({\n      title\n    });\n  }\n\n  submit () {\n    if (!this.state.loading) {\n      this.setState({\n        loading: true\n      }, () => {\n        const {store} = this.context;\n        const {onClose} = this.props;\n        const {title} = this.state;\n        store.dispatch(addMenu({title}, true)).then(() => {\n          onClose && onClose();\n        });\n      });\n    }\n  }\n\n  render () {\n    return (\n      <New\n        {...this.state}\n        changeTitle={::this.changeTitle}\n        submit={::this.submit}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/components/new/new.jsx",
    "content": "import Component from 'components/component';\nimport ModalInput from 'components/modal-input';\nimport ModalNew from 'components/modal-new';\nimport React, {PropTypes} from 'react';\n\nexport default class NewMenu extends Component {\n  static propTypes = {\n    title: PropTypes.string.isRequired,\n    changeTitle: PropTypes.func.isRequired,\n    submit: PropTypes.func.isRequired,\n    loading: PropTypes.bool\n  };\n\n  render () {\n    const {title, changeTitle, submit, loading} = this.props;\n    return (\n      <ModalNew submit={submit} loading={loading}>\n        <ModalInput\n          focus\n          value={title}\n          placeholder='Name your menu. e.g. Main Navigation'\n          onChange={changeTitle}\n        />\n      </ModalNew>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {dataConnect} from 'relate-js';\n\nimport Content from './components/content.jsx';\n\n@dataConnect(\n  () => ({\n    fragments: {\n      menusCount: true\n    },\n    mutations: {\n      addMenu: [{\n        type: 'INCREMENT',\n        field: 'menusCount'\n      }],\n      removeMenu: [{\n        type: 'DECREMENT',\n        field: 'menusCount'\n      }]\n    }\n  })\n)\nexport default class MenusContainer extends Component {\n  static propTypes = {\n    children: PropTypes.node,\n    menusCount: PropTypes.number\n  };\n\n  render () {\n    const {menusCount} = this.props;\n    return (\n      <Content count={menusCount}>\n        {this.props.children}\n      </Content>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/menu.js",
    "content": "import * as adminMenuActions from 'actions/admin-menu';\n\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport Menu from './components/menu';\n\n@dataConnect(\n  (state) => ({\n    activeId: state.router.params.id,\n    location: state.router.location,\n    sort: state.router.location.query.sort || '_id',\n    order: state.router.location.query.order || 'desc',\n    search: state.router.location.query.s || ''\n  }),\n  (dispatch) => bindActionCreators(adminMenuActions, dispatch),\n  (props) => ({\n    fragments: Menu.fragments,\n    variablesTypes: {\n      menus: {\n        sort: 'String',\n        order: 'String',\n        search: 'String',\n        s: 'String'\n      }\n    },\n    initialVariables: {\n      menus: {\n        sort: props.sort,\n        order: props.order,\n        search: 'title',\n        s: props.search\n      }\n    },\n    mutations: {\n      addMenu: [{\n        type: 'PREPEND',\n        field: 'menus'\n      }]\n    }\n  })\n)\nexport default class MenusMenuContainer extends Component {\n  static propTypes = {\n    menus: PropTypes.array.isRequired,\n    closeAdminMenu: PropTypes.func.isRequired,\n    openAdminMenu: PropTypes.func.isRequired,\n    activeId: PropTypes.string,\n    sort: PropTypes.string.isRequired,\n    order: PropTypes.string.isRequired,\n    search: PropTypes.string.isRequired\n  };\n\n  static defaultProps = {\n    menus: []\n  };\n\n  getInitState () {\n    return {\n      newOpened: false\n    };\n  }\n\n  componentDidMount () {\n    this.props.openAdminMenu();\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (nextProps.sort !== this.props.sort || nextProps.order !== this.props.order || nextProps.search !== this.props.search) {\n      this.props.relate.setVariables({\n        menus: {\n          sort: nextProps.sort,\n          order: nextProps.order,\n          search: 'title',\n          s: nextProps.search\n        }\n      });\n    }\n  }\n\n  onBack () {\n    this.props.closeAdminMenu();\n  }\n\n  onNew () {\n    this.setState({\n      newOpened: true\n    });\n  }\n\n  closeNew () {\n    this.setState({\n      newOpened: false\n    });\n  }\n\n  render () {\n    const {menus, activeId, order, sort, search, location} = this.props;\n    return (\n      <Menu\n        menus={menus}\n        location={location}\n        activeId={activeId}\n        onBack={::this.onBack}\n        onNew={::this.onNew}\n        closeNew={::this.closeNew}\n        sort={sort}\n        order={order}\n        search={search}\n        {...this.state}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/builder.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React from 'react';\nimport Scrollable from 'components/scrollable';\n\nimport styles from './builder.less';\nimport Collapsable from './collapsable';\nimport LinkBuilder from './link';\nimport Menu from './menu';\nimport Pages from './pages';\n\nexport default class MenuBuilder extends Component {\n  render () {\n    return (\n      <div className={styles.root}>\n        <div className={cx(styles.part, styles.left)}>\n          <Scrollable className={styles.leftContent}>\n            <div className={styles.innerScroll}>\n              <Collapsable title='Pages' icon='nc-icon-outline design_window-paragraph'>\n                <Pages />\n              </Collapsable>\n              <Collapsable title='Custom Link' icon='nc-icon-outline ui-2_link-72'>\n                <LinkBuilder />\n              </Collapsable>\n            </div>\n          </Scrollable>\n        </div>\n        <div className={cx(styles.part, styles.center)}>\n          <i className={cx(styles.icon, 'nc-icon-outline arrows-1_tail-right')} />\n        </div>\n        <div className={cx(styles.part, styles.right)}>\n          <Scrollable className={styles.rightContent}>\n            <div className={styles.innerScroll}>\n              <Menu />\n            </div>\n          </Scrollable>\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/builder.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  max-width: 672px;\n  margin: 0 auto;\n}\n\n.part {\n  display: inline-block;\n  vertical-align: top;\n  position: absolute;\n  top: 0;\n  bottom: 0;\n}\n\n.left, .right {\n  width: 50%;\n}\n\n.left {\n  left: 0;\n  margin-right: 50px;\n}\n.leftContent {\n  position: absolute;\n  top: 0;\n  right: 70px;\n  left: 0;\n  bottom: 0;\n\n  .innerScroll {\n    width: 270px;\n    float: right;\n  }\n}\n\n.innerScroll {\n  padding-right: 20px;\n}\n\n.right {\n  right: 0;\n  padding-left: 70px;\n}\n.rightContent {\n  position: absolute;\n  top: 0;\n  left: 70px;\n  right: 0;\n  bottom: 0;\n}\n\n.center {\n  left: 50%;\n  width: 2px;\n  background-color: @adminBorders;\n}\n\n.icon {\n  position: absolute;\n  top: 200px;\n  left: -20px;\n  font-size: 46px;\n  color: @adminBorders;\n\n  &:before {\n    z-index: 1;\n    position: relative;\n  }\n  &:after {\n    content: '';\n    position: absolute;\n    left: 0; right: 0; top: 50%;\n    height: 7px;\n    background-color: #ffffff;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/collapsable.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './collapsable.less';\n\nexport default class Collapsable extends Component {\n  static propTypes = {\n    title: PropTypes.string.isRequired,\n    icon: PropTypes.string.isRequired,\n    children: PropTypes.node.isRequired,\n    defaultOpened: PropTypes.bool.isRequired\n  };\n\n  static defaultProps = {\n    defaultOpened: true\n  };\n\n  getInitState () {\n    return {\n      opened: this.props.defaultOpened\n    };\n  }\n\n  @bind\n  onClick () {\n    this.setState({\n      opened: !this.state.opened\n    });\n  }\n\n  render () {\n    const {opened} = this.state;\n    const {title, icon} = this.props;\n    return (\n      <div className={styles.root}>\n        <div className={styles.header} onClick={this.onClick}>\n          <i className={cx(styles.icon, icon)} />\n          <span className={styles.title}>\n            {title}\n          </span>\n          <i className={cx(\n              styles.headerIcon,\n              'nc-icon-mini', opened ? 'arrows-1_minimal-up' : 'arrows-1_minimal-down'\n            )}\n          />\n        </div>\n        {opened && this.props.children}\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/collapsable.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  margin-bottom: 35px;\n}\n\n.header {\n  cursor: pointer;\n  margin-bottom: 10px;\n}\n\n.icon, .title, .headerIcon {\n  display: inline-block;\n  vertical-align: top;\n  line-height: 30px;\n  color: @adminText;\n}\n\n.icon {\n  font-size: 24px;\n  margin-right: 13px;\n}\n\n.title {\n  font-size: 14px;\n}\n\n.headerIcon {\n  float: right;\n  font-size: 12px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/entry.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport Animate from 'components/animate';\nimport Component from 'components/component';\nimport Draggable from 'components/dnd/draggable';\nimport Droppable from 'components/dnd/droppable';\nimport React, {PropTypes} from 'react';\n\nimport styles from './entry.less';\n\nexport default class MenuEntry extends Component {\n  static propTypes = {\n    item: PropTypes.object.isRequired,\n    children: PropTypes.node,\n    dragging: PropTypes.bool,\n    draggedMenuItem: PropTypes.func,\n    positionInParent: PropTypes.number,\n    draggingSelf: PropTypes.bool\n  };\n\n  static defaultProps = {\n    item: {}\n  };\n\n  render () {\n    const {item, positionInParent, draggingSelf} = this.props;\n    const {label, type} = item;\n    const isNew = !(item.id && true);\n\n    const dragInfo = {\n      type: isNew ? 'new' : 'move',\n      item,\n      id: item.id,\n      parentId: item.parent,\n      positionInParent\n    };\n\n    return (\n      <Draggable dragInfo={dragInfo}>\n        <div className={cx(styles.root, draggingSelf && styles.draggingSelf)}>\n          <div className={cx(styles.info, styles[type])}>\n            {label || type === 'url' && isNew && 'Where Link appears to be dragged'}\n          </div>\n          {!isNew && this.renderChildren()}\n        </div>\n      </Draggable>\n    );\n  }\n\n  renderChildren () {\n    const {item, dragging} = this.props;\n    return (\n      <Droppable\n        className={styles.sub}\n        dropInfo={{\n          id: item.id\n        }}\n        placeholder={dragging}\n        placeholderRender={this.renderPlaceholder}\n        hidePlaceholder\n        minHeight={dragging ? 30 : 0}\n      >\n        {this.props.children}\n      </Droppable>\n    );\n  }\n\n  @bind\n  renderPlaceholder ({isActive}) {\n    let placeholderContent;\n\n    if (isActive) {\n      placeholderContent = (\n        <Animate transition='slideDownIn' key='drop'>\n          <i className={cx('nc-icon-outline weather_drop-12', styles.dropIcon)} />\n        </Animate>\n      );\n    } else {\n      placeholderContent = (\n        <Animate transition='slideUpIn' key='info'>\n          <div className={styles.emptyText}>Drop here for sub link!</div>\n        </Animate>\n      );\n    }\n\n    return (\n      <div className={cx(styles.empty, isActive && styles.active)}>\n        {placeholderContent}\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/entry.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n}\n\n.draggingSelf {\n  opacity: 0.5;\n}\n\n.info {\n  font-size: 14px;\n  padding: 3px 7px;\n  line-height: 24px;\n  border-radius: 4px;\n  margin: 7px 0;\n  cursor: move;\n}\n\n.page {\n  background-color: @primaryBack;\n  color: @primary;\n}\n\n.url {\n  background-color: #FFFBBD;\n  color: #C09F00;\n}\n\n.sub {\n  margin-left: 30px;\n  margin-bottom: 7px;\n}\n\n.empty {\n  display: block;\n  border: 1px solid @adminBorders;\n  border-radius: 2px;\n  line-height: 30px;\n  height: 30px;\n  padding: 0px 7px;\n}\n\n.emptyText {\n  color: @adminText;\n  font-size: 12px;\n}\n\n.dropIcon {\n  font-size: 18px;\n  line-height: 28px;\n  color: @dropSuccess;\n}\n\n.active {\n  background-color: @dropSuccessBack;\n  border-color: @dropSuccess;\n  text-align: center;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/index.js",
    "content": "import Component from 'components/component';\nimport React from 'react';\n\nimport MenuBuilder from './builder';\n\nexport default class MenuBuilderContainer extends Component {\n  render () {\n    return (\n      <MenuBuilder />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/link/index.js",
    "content": "import bind from 'decorators/bind';\nimport Component from 'components/component';\nimport React from 'react';\n\nimport LinkBuilder from './link';\n\nexport default class LinkContainer extends Component {\n  getInitState () {\n    return {\n      label: '',\n      url: ''\n    };\n  }\n\n  @bind\n  changeLabel (label) {\n    this.setState({\n      label\n    });\n  }\n\n  @bind\n  changeUrl (url) {\n    this.setState({\n      url\n    });\n  }\n\n  render () {\n    return (\n      <LinkBuilder\n        changeLabel={this.changeLabel}\n        changeUrl={this.changeUrl}\n        {...this.state}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/link/link.jsx",
    "content": "import Component from 'components/component';\nimport Input from 'components/input-options/input';\nimport React, {PropTypes} from 'react';\n\nimport styles from './link.less';\nimport Entry from '../entry';\n\nexport default class Link extends Component {\n  static propTypes = {\n    label: PropTypes.string.isRequired,\n    url: PropTypes.string.isRequired,\n    changeLabel: PropTypes.func.isRequired,\n    changeUrl: PropTypes.func.isRequired\n  };\n\n  render () {\n    const {changeLabel, changeUrl, label, url} = this.props;\n    const item = {\n      type: 'url',\n      url,\n      label\n    };\n    return (\n      <div>\n        <label className={styles.option}>\n          <div className={styles.label}>Label</div>\n          <Input value={label} onChange={changeLabel} white />\n        </label>\n        <label className={styles.option}>\n          <div className={styles.label}>Link</div>\n          <Input value={url} onChange={changeUrl} white />\n        </label>\n        <Entry item={item} />\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/link/link.less",
    "content": "@import '~styles/colors.less';\n\n.option {\n  display: block;\n  margin-bottom: 15px;\n}\n\n.label {\n  color: @adminText;\n  font-size: 14px;\n  line-height: 32px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/menu/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {draggedMenuItem} from 'actions/menu';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport Menu from './menu';\n\n@dataConnect(\n  (state) => ({\n    menuId: state.router.params.id,\n    dragging: state.dnd.dragging,\n    menuData: state.menu,\n    draggingId: state.dnd.dragInfo.id\n  }),\n  (dispatch) => bindActionCreators({draggedMenuItem}, dispatch),\n  (props) => ({\n    fragments: Menu.fragments,\n    variablesTypes: {\n      menu: {\n        _id: 'ID!'\n      }\n    },\n    initialVariables: {\n      menu: {\n        _id: props.menuId\n      }\n    }\n  })\n)\nexport default class MenuContainer extends Component {\n  static propTypes = {\n    menuId: PropTypes.string.isRequired\n  };\n\n  componentWillReceiveProps (nextProps) {\n    if (this.props.menuId !== nextProps.menuId) {\n      this.props.relate.setVariables({\n        menu: {\n          _id: nextProps.menuId\n        }\n      });\n    }\n  }\n\n  render () {\n    return (\n      <Menu {...this.props} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/menu/menu.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport Animate from 'components/animate';\nimport Component from 'components/component';\nimport Dragger from 'components/dnd/dragger';\nimport Droppable from 'components/dnd/droppable';\nimport React, {PropTypes} from 'react';\n\nimport styles from './menu.less';\nimport Entry from '../entry';\n\nexport default class Menu extends Component {\n  static fragments = {\n    menu: {\n      _id: 1,\n      data: 1\n    }\n  };\n\n  static propTypes = {\n    dragging: PropTypes.bool.isRequired,\n    draggingId: PropTypes.number,\n    draggedMenuItem: PropTypes.func.isRequired,\n    menuData: PropTypes.object.isRequired\n  };\n\n  render () {\n    const {menuData} = this.props;\n    const hasChildren = menuData && menuData.root && menuData.root.children.length > 0;\n    return (\n      <div>\n        <Droppable\n          placeholder\n          placeholderRender={this.renderPlaceholder}\n          dropInfo={{\n            id: 'root'\n          }}\n          minHeight='100%'\n          className={cx(styles.dropArea, hasChildren && styles.items)}\n        >\n          {\n            hasChildren &&\n            this.renderChildren(menuData.root.children)\n          }\n        </Droppable>\n        {this.renderDragger()}\n      </div>\n    );\n  }\n\n  renderChildren (children) {\n    return children.map(this.renderEntry, this);\n  }\n\n  renderEntry (id, index) {\n    const {menuData, dragging, draggingId, draggedMenuItem} = this.props;\n    const item = menuData[id];\n\n    return (\n      <Entry\n        item={item}\n        dragging={dragging}\n        draggingSelf={draggingId === id}\n        draggedMenuItem={draggedMenuItem}\n        positionInParent={index}\n        key={id}\n      >\n        {item.children && this.renderChildren(item.children)}\n      </Entry>\n    );\n  }\n\n  @bind\n  renderPlaceholder ({isActive}) {\n    let placeholderContent;\n\n    if (isActive) {\n      placeholderContent = (\n        <Animate transition='slideDownIn' key='drop'>\n          <i className={cx('nc-icon-outline weather_drop-12', styles.dropIcon)} />\n        </Animate>\n      );\n    } else {\n      placeholderContent = (\n        <Animate transition='slideUpIn' key='info'>\n          <div>\n            <div className={styles.title}>Drop your links here!</div>\n            <div className={styles.text}>\n              Drag pages or custom links from the left and drop them in this\n              section to start building your menu structure.\n            </div>\n            <div className={styles.text}>\n              Remember you can also sort them by moving them above or bellow other items.\n            </div>\n          </div>\n        </Animate>\n      );\n    }\n\n    return (\n      <div className={cx(styles.empty, isActive && styles.active)}>\n        <div className={styles.emptyContent}>\n          {placeholderContent}\n        </div>\n      </div>\n    );\n  }\n\n  renderDragger () {\n    const {dragging, draggedMenuItem} = this.props;\n    if (dragging) {\n      return (\n        <Dragger shadow={false} onStopDrag={draggedMenuItem} />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/menu/menu.less",
    "content": "@import '~styles/colors.less';\n\n.empty {\n  text-align: center;\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  transition: all 0.2s ease-out;\n  background-color: transparent;\n  border: 1px solid transparent;\n\n  .emptyContent {\n    position: absolute;\n    top: 50%;\n    left: 0;\n    right: 0;\n    transform: translateY(-60%);\n  }\n\n  .title {\n    color: @adminText;\n    font-size: 36px;\n    font-weight: 300;\n  }\n  .text {\n    color: @adminText;\n    font-size: 16px;\n    margin-bottom: 20px;\n  }\n}\n\n.items {\n  width: 250px;\n  padding-top: 32px;\n  padding-bottom: 32px;\n}\n\n.dropIcon {\n  font-size: 40px;\n  color: @dropSuccess;\n}\n\n.active {\n  background-color: @dropSuccessBack;\n  border: 1px solid @dropSuccess;\n  border-radius: 2px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/pages/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {dataConnect} from 'relate-js';\n\nimport Pages from './pages';\n\n@dataConnect(\n  () => ({\n    fragments: Pages.fragments\n  })\n)\nexport default class MenuBuilderContainer extends Component {\n  static propTypes = {\n    pages: PropTypes.array\n  };\n\n  static defaultProps = {\n    pages: []\n  };\n\n  render () {\n    return (\n      <Pages {...this.props} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/pages/pages.jsx",
    "content": "import Component from 'components/component';\nimport Spinner from 'components/spinner';\nimport React, {PropTypes} from 'react';\n\nimport styles from './pages.less';\nimport Entry from '../entry';\n\nexport default class PagesList extends Component {\n  static fragments = {\n    pages: {\n      _id: 1,\n      title: 1\n    }\n  };\n\n  static propTypes = {\n    pages: PropTypes.array.isRequired,\n    loading: PropTypes.bool.isRequired\n  };\n\n  render () {\n    return (\n      <div>\n        {this.renderPages()}\n      </div>\n    );\n  }\n\n  renderPages () {\n    const {pages} = this.props;\n    let result;\n\n    if (this.props.loading) {\n      result = (\n        <div className={styles.loading}>\n          <Spinner />\n        </div>\n      );\n    } else if (this.props.pages.length > 0) {\n      result = pages.map(this.renderPage, this);\n    } else {\n      result = (\n        <div className={styles.no}>No pages to show</div>\n      );\n    }\n\n    return result;\n  }\n\n  renderPage (page) {\n    const item = {\n      type: 'page',\n      typeProps: {\n        pageId: page._id\n      },\n      label: page.title\n    };\n    return (\n      <Entry item={item} key={page._id} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu-builder/pages/pages.less",
    "content": "@import '~styles/colors.less';\n\n.no {\n  font-size: 13px;\n  color: @adminText;\n  padding: 15px 0;\n}\n\n.loading {\n  text-align: center;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport ContentHeader from 'components/content-header';\nimport ContentHeaderActions from 'components/content-header-actions';\nimport EditableTitle from 'components/editable-title';\nimport ModalDelete from 'components/modal-delete';\nimport React, {PropTypes} from 'react';\nimport {mergeFragments} from 'relax-fragments';\n\nimport styles from './menu.less';\nimport MenuBuilder from './menu-builder';\nimport State from './state';\n\nexport default class Menu extends Component {\n  static fragments = mergeFragments({\n    menu: {\n      _id: 1,\n      title: 1\n    }\n  });\n\n  static propTypes = {\n    menu: PropTypes.object.isRequired,\n    onDelete: PropTypes.func.isRequired,\n    cancelDelete: PropTypes.func.isRequired,\n    deleteConfirm: PropTypes.bool.isRequired,\n    confirmDelete: PropTypes.func.isRequired,\n    updateTitle: PropTypes.func.isRequired,\n    saveMenu: PropTypes.func.isRequired,\n    state: PropTypes.string\n  };\n\n  render () {\n    const {menu, onDelete, updateTitle} = this.props;\n\n    return (\n      <div className={cx(this.state.build && styles.build)}>\n        <ContentHeader>\n          <div className={styles.info}>\n            <EditableTitle value={menu.title} onSubmit={updateTitle} />\n          </div>\n          <ContentHeaderActions>\n            {this.renderState()}\n            <button className={styles.actionButton} onClick={onDelete}>\n              Delete Menu\n            </button>\n          </ContentHeaderActions>\n        </ContentHeader>\n        <div className={styles.content}>\n          <MenuBuilder />\n        </div>\n        {this.renderDeleteConfirm()}\n      </div>\n    );\n  }\n\n  renderState () {\n    const {saveMenu, state} = this.props;\n    return <State saveMenu={saveMenu} state={state} />;\n  }\n\n  renderDeleteConfirm () {\n    const {deleteConfirm, cancelDelete, confirmDelete, menu} = this.props;\n    if (deleteConfirm) {\n      return (\n        <ModalDelete\n          title={`Are you sure you want to remove \"${menu.title}\" menu?`}\n          cancel={cancelDelete}\n          submit={confirmDelete}\n        />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/menu.less",
    "content": "@import '~styles/colors.less';\n\n.info {\n  display: inline-block;\n  vertical-align: top;\n}\n\n.actionButton {\n  color: @alert;\n  font-weight: 300;\n  font-size: 13px;\n  text-transform: uppercase;\n  margin-left: 20px;\n}\n\n.save {\n  color: @primary;\n}\n\n.state {\n  display: inline-block;\n  vertical-align: top;\n  text-align: center;\n}\n\n.content {\n  position: absolute;\n  top: 70px;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  margin: 50px;\n  margin-bottom: 30px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/state.jsx",
    "content": "import cx from 'classnames';\nimport Animate from 'components/animate';\nimport Component from 'components/component';\nimport Spinner from 'components/spinner';\nimport React, {PropTypes} from 'react';\n\nimport styles from './state.less';\n\nexport default class MenuState extends Component {\n  static propTypes = {\n    state: PropTypes.string,\n    saveMenu: PropTypes.func.isRequired\n  };\n\n  render () {\n    const {state, saveMenu} = this.props;\n    let result;\n\n    if (state === 'saving') {\n      result = (\n        <Animate key={state}>\n          <Spinner />\n        </Animate>\n      );\n    } else if (state === 'success') {\n      result = (\n        <Animate key={state}>\n          <i className={cx(styles.icon, 'nc-icon-outline ui-1_check-small')} />\n        </Animate>\n      );\n    } else {\n      result = (\n        <Animate key='normal'>\n          <button className={cx(styles.actionButton, styles.save)} onClick={saveMenu}>\n            Save Menu\n          </button>\n        </Animate>\n      );\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/components/state.less",
    "content": "@import '~styles/colors.less';\n\n.actionButton {\n  color: @alert;\n  font-weight: 300;\n  font-size: 13px;\n  text-transform: uppercase;\n  margin-left: 20px;\n  line-height: 30px;\n}\n\n.save {\n  color: @primary;\n}\n\n.icon {\n  display: inline-block;\n  vertical-align: top;\n  padding: 0 24px;\n  color: @success;\n  font-size: 22px;\n  line-height: 30px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/menus/screens/menu/index.js",
    "content": "import bind from 'decorators/bind';\nimport debounce from 'decorators/debounce';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {removeMenu, updateMenuTitle, updateMenuData} from 'actions/menu';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport Menu from './components/menu';\n\n@dataConnect(\n  (state) => ({\n    params: state.router.params\n  }),\n  (dispatch) => bindActionCreators({removeMenu, updateMenuTitle, updateMenuData}, dispatch),\n  (props) => ({\n    fragments: Menu.fragments,\n    variablesTypes: {\n      menu: {\n        _id: 'ID!'\n      }\n    },\n    initialVariables: {\n      menu: {\n        _id: props.params.id\n      }\n    }\n  })\n)\nexport default class MenuContainer extends Component {\n  static propTypes = {\n    params: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    menu: {}\n  };\n\n  getInitState () {\n    return {\n      deleteConfirm: false\n    };\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (this.props.params.id !== nextProps.params.id) {\n      this.props.relate.setVariables({\n        menu: {\n          _id: nextProps.params.id\n        }\n      });\n    }\n  }\n\n  @bind\n  onDelete () {\n    this.setState({\n      deleteConfirm: true\n    });\n  }\n\n  @bind\n  cancelDelete () {\n    this.setState({\n      deleteConfirm: false\n    });\n  }\n\n  @bind\n  confirmDelete () {\n    const {params} = this.props;\n    this.props.removeMenu(params.id, true);\n  }\n\n  @bind\n  updateTitle (title) {\n    const {menu} = this.props;\n    return this.props.updateMenuTitle(menu._id, title);\n  }\n\n  @debounce(2000)\n  successOut () {\n    this.setState({\n      state: null\n    });\n  }\n\n  @bind\n  saveMenu () {\n    const {menu} = this.props;\n\n    this.setState({\n      state: 'saving'\n    }, () => {\n      this.props\n        .updateMenuData(menu._id)\n        .then(() => {\n          this.setState({\n            state: 'success'\n          });\n          this.successOut();\n        });\n    });\n  }\n\n  render () {\n    const {menu} = this.props;\n    return (\n      <Menu\n        menu={menu}\n        onDelete={this.onDelete}\n        cancelDelete={this.cancelDelete}\n        confirmDelete={this.confirmDelete}\n        updateTitle={this.updateTitle}\n        saveMenu={this.saveMenu}\n        {...this.state}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/components/entry.jsx",
    "content": "import cx from 'classnames';\nimport moment from 'moment';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {Link} from 'react-router';\n\nimport styles from './entry.less';\n\nexport default class PagesEntry extends Component {\n  static fragments = {\n    page: {\n      _id: 1,\n      title: 1,\n      state: 1,\n      date: 1\n    }\n  };\n\n  static propTypes = {\n    page: PropTypes.object.isRequired,\n    active: PropTypes.bool.isRequired,\n    query: PropTypes.object.isRequired\n  };\n\n  render () {\n    const {page, active, query} = this.props;\n    const date = moment(page.date).fromNow();\n    const editLink = `/admin/pages/${page._id}`;\n\n    return (\n      <Link to={editLink} query={query} className={cx(styles.root, active && styles.active)}>\n        <div className={cx(styles.status, page.state === 'published' && styles.published)}></div>\n        <div className={styles.info}>\n          <div className={styles.title}>{page.title}</div>\n          <div className={styles.date}>{date}</div>\n        </div>\n      </Link>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/components/entry.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  height: 70px;\n  border-bottom: 1px solid @adminBorders;\n  padding: 13px;\n  position: relative;\n  display: block;\n  text-decoration: none;\n\n  &:hover {\n    background-color: @primaryBack;\n  }\n}\n\n.status {\n  position: absolute;\n  left: 13px;\n  top: 30px;\n  width: 10px;\n  height: 10px;\n  background-color: @draft;\n  border-radius: 50%;\n}\n\n.published {\n  background-color: @primary;\n}\n\n.info {\n  padding-left: 25px;\n  padding-top: 3px;\n}\n\n.title {\n  font-size: 15px;\n  color: @adminTextHighlight;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n}\n\n.date {\n  font-size: 12px;\n  color: @adminText;\n  font-weight: 300;\n}\n\n.active {\n  background-color: @primary;\n\n  .status.published {\n    background-color: #ffffff;\n  }\n  .title {\n    color: #ffffff;\n  }\n  .date {\n    color: #ffffff;\n  }\n\n  &:hover {\n    background-color: @primary;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/components/list.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport Entry from './entry';\n\nexport default class PagesList extends Component {\n  static fragments = {\n    pages: Entry.fragments.page\n  };\n\n  static propTypes = {\n    pages: PropTypes.array.isRequired,\n    activePageId: PropTypes.string,\n    query: PropTypes.object.isRequired\n  };\n\n  render () {\n    return (\n      <div>\n        {this.props.pages.map(this.renderEntry, this)}\n      </div>\n    );\n  }\n\n  renderEntry (page, key) {\n    const {activePageId, query} = this.props;\n    return (\n      <Entry page={page} key={key} active={activePageId === page._id} query={query} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/components/menu.jsx",
    "content": "import Component from 'components/component';\nimport ListHeader from 'components/list-header';\nimport ListSearchSort from 'components/list-search-sort';\nimport Modal from 'components/modal';\nimport Scrollable from 'components/scrollable';\nimport React, {PropTypes} from 'react';\n\nimport styles from './menu.less';\nimport List from './list';\nimport New from './new';\n\nconst sorts = [\n  {\n    label: 'Date desc',\n    sort: '_id',\n    order: 'desc'\n  },\n  {\n    label: 'Date asc',\n    sort: '_id',\n    order: 'asc'\n  },\n  {\n    label: 'Title A-Z',\n    sort: 'title',\n    order: 'asc'\n  },\n  {\n    label: 'Title Z-A',\n    sort: 'title',\n    order: 'desc'\n  },\n  {\n    label: 'Updated desc',\n    sort: 'updatedDate',\n    order: 'desc'\n  },\n  {\n    label: 'Updated asc',\n    sort: 'updatedDate',\n    order: 'asc'\n  }\n];\n\nexport default class PagesMenu extends Component {\n  static fragments = List.fragments;\n\n  static propTypes = {\n    children: PropTypes.node,\n    pages: PropTypes.array.isRequired,\n    onBack: PropTypes.func.isRequired,\n    onNew: PropTypes.func.isRequired,\n    closeNew: PropTypes.func.isRequired,\n    activePageId: PropTypes.string,\n    newOpened: PropTypes.bool.isRequired,\n    sort: PropTypes.string.isRequired,\n    order: PropTypes.string.isRequired,\n    search: PropTypes.string.isRequired,\n    location: PropTypes.object.isRequired\n  };\n\n  render () {\n    const {pages, onBack, onNew, activePageId, sort, order, location, search} = this.props;\n\n    return (\n      <div>\n        <ListHeader\n          title='Pages'\n          onBack={onBack}\n          newIcon='nc-icon-outline ui-2_window-add'\n          onNew={onNew}\n        />\n        <ListSearchSort\n          search={search}\n          sorts={sorts}\n          sort={sort}\n          order={order}\n          location={location}\n        />\n        <Scrollable className={styles.list}>\n          <List pages={pages} activePageId={activePageId} query={location.query} />\n        </Scrollable>\n        {this.renderNew()}\n      </div>\n    );\n  }\n\n  renderNew () {\n    const {newOpened, closeNew} = this.props;\n    if (newOpened) {\n      return (\n        <Modal small subTitle='New Page' title='What should we call it?' onClose={closeNew}>\n          <New fragments={PagesMenu.fragments} onClose={closeNew} />\n        </Modal>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/components/menu.less",
    "content": ".list {\n  position: absolute;\n  top: 110px;\n  bottom: 0; left: 0; right: 0;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/components/new/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {addPage} from 'actions/page';\n\nimport New from './new';\n\nexport default class NewPageContainer extends Component {\n  static propTypes = {\n    fragments: PropTypes.object.isRequired,\n    onClose: PropTypes.func.isRequired\n  };\n\n  static contextTypes = {\n    store: PropTypes.object.isRequired\n  };\n\n  getInitState () {\n    return {\n      title: '',\n      loading: false\n    };\n  }\n\n  changeTitle (title) {\n    this.setState({\n      title\n    });\n  }\n\n  submit () {\n    if (!this.state.loading) {\n      this.setState({\n        loading: true\n      }, () => {\n        const {store} = this.context;\n        const {fragments, onClose} = this.props;\n        const {title} = this.state;\n        store.dispatch(addPage(fragments.pages, {title}, true)).then(() => {\n          onClose && onClose();\n        });\n      });\n    }\n  }\n\n  render () {\n    return (\n      <New\n        {...this.state}\n        changeTitle={::this.changeTitle}\n        submit={::this.submit}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/components/new/new.jsx",
    "content": "import Component from 'components/component';\nimport ModalInput from 'components/modal-input';\nimport ModalNew from 'components/modal-new';\nimport React, {PropTypes} from 'react';\n\nexport default class NewPage extends Component {\n  static propTypes = {\n    title: PropTypes.string.isRequired,\n    changeTitle: PropTypes.func.isRequired,\n    submit: PropTypes.func.isRequired,\n    loading: PropTypes.bool\n  };\n\n  render () {\n    const {title, changeTitle, submit, loading} = this.props;\n    return (\n      <ModalNew submit={submit} loading={loading}>\n        <ModalInput\n          focus\n          value={title}\n          placeholder='Name your page. e.g. Homepage'\n          onChange={changeTitle}\n        />\n      </ModalNew>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/components/pages.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './pages.less';\nimport Menu from './menu';\nimport New from './new';\n\nexport default class Pages extends Component {\n  static propTypes = {\n    children: PropTypes.node,\n    count: PropTypes.number.isRequired\n  };\n\n  render () {\n    let result;\n\n    if (this.props.count === 0) {\n      result = this.renderNoPages();\n    } else if (this.props.children) {\n      result = this.props.children;\n    } else {\n      result = this.renderEmpty();\n    }\n\n    return result;\n  }\n\n  renderEmpty () {\n    return (\n      <div className={styles.empty}>\n        <i className='nc-icon-outline media-1_touch'></i>\n        <div className={styles.emptyText}>Relax, select a page first!</div>\n      </div>\n    );\n  }\n\n  renderNoPages () {\n    return (\n      <div className={styles.noPages}>\n        <div className={styles.noTitle}>Oh my!</div>\n        <div className={styles.noText}>\n          <span>You don’t have any pages yet!</span>\n          <br />\n          <span>Lets change that</span>\n        </div>\n        <New fragments={Menu.fragments} />\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/components/pages.less",
    "content": "@import '~styles/sizes.less';\n@import '~styles/colors.less';\n\n.empty {\n  position: absolute;\n  top: 45%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  text-align: center;\n\n  :global i {\n    font-size: 56px;\n    color: @adminTextSub;\n    margin-bottom: 20px;\n    margin-top: 20px;\n  }\n}\n\n.emptyText {\n  font-size: 17px;\n  color: @adminTextSub;\n}\n\n.noPages {\n  width: 440px;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  text-align: center;\n}\n\n.noTitle {\n  font-size: 36px;\n  font-weight: 300;\n  margin-bottom: 5px;\n  color: @adminText;\n}\n\n.noText {\n  font-size: 16px;\n  color: @adminText;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {dataConnect} from 'relate-js';\n\nimport Pages from './components/pages.jsx';\n\n@dataConnect(\n  () => ({\n    fragments: {\n      pagesCount: true\n    }\n  })\n)\nexport default class PagesContainer extends Component {\n  static propTypes = {\n    children: PropTypes.node,\n    pagesCount: PropTypes.number\n  };\n\n  render () {\n    const {pagesCount} = this.props;\n    return (\n      <Pages count={pagesCount}>\n        {this.props.children}\n      </Pages>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/menu.js",
    "content": "import * as adminMenuActions from 'actions/admin-menu';\n\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport Menu from './components/menu';\n\n@dataConnect(\n  (state) => ({\n    params: state.router.params,\n    location: state.router.location,\n    sort: state.router.location.query.sort || '_id',\n    order: state.router.location.query.order || 'desc',\n    search: state.router.location.query.s || ''\n  }),\n  (dispatch) => bindActionCreators(adminMenuActions, dispatch),\n  (props) => ({\n    fragments: Menu.fragments,\n    variablesTypes: {\n      pages: {\n        sort: 'String',\n        order: 'String',\n        search: 'String',\n        s: 'String'\n      }\n    },\n    initialVariables: {\n      pages: {\n        sort: props.sort,\n        order: props.order,\n        search: 'title',\n        s: props.search\n      }\n    },\n    mutations: {\n      addPage: [\n        {\n          type: 'PREPEND',\n          field: 'pages'\n        }\n      ]\n    }\n  })\n)\nexport default class PagesContainer extends Component {\n  static propTypes = {\n    pages: PropTypes.array.isRequired,\n    closeAdminMenu: PropTypes.func.isRequired,\n    openAdminMenu: PropTypes.func.isRequired,\n    params: PropTypes.object.isRequired,\n    sort: PropTypes.string.isRequired,\n    order: PropTypes.string.isRequired,\n    search: PropTypes.string.isRequired\n  };\n\n  static defaultProps = {\n    pages: []\n  };\n\n  getInitState () {\n    return {\n      newOpened: false\n    };\n  }\n\n  componentDidMount () {\n    this.props.openAdminMenu();\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (nextProps.sort !== this.props.sort ||\n        nextProps.order !== this.props.order ||\n        nextProps.search !== this.props.search) {\n      this.props.relate.setVariables({\n        pages: {\n          sort: nextProps.sort,\n          order: nextProps.order,\n          search: 'title',\n          s: nextProps.search\n        }\n      });\n    }\n  }\n\n  onBack () {\n    this.props.closeAdminMenu();\n  }\n\n  onNew () {\n    this.setState({\n      newOpened: true\n    });\n  }\n\n  closeNew () {\n    this.setState({\n      newOpened: false\n    });\n  }\n\n  render () {\n    const {pages, params, sort, order, location, search} = this.props;\n    return (\n      <Menu\n        pages={pages}\n        location={location}\n        onBack={::this.onBack}\n        onNew={::this.onNew}\n        closeNew={::this.closeNew}\n        activePageId={params.id}\n        sort={sort}\n        order={order}\n        search={search}\n        {...this.state}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/screens/page/components/info/index.js",
    "content": "import bind from 'decorators/bind';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {removePage, publishPage, unpublishPage} from 'actions/page';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport PageInfo from './info';\n\n@dataConnect(\n  (state) => ({\n    pageId: state.router.params.id\n  }),\n  (dispatch) => bindActionCreators({removePage, publishPage, unpublishPage}, dispatch),\n  (props) => ({\n    fragments: PageInfo.fragments,\n    variablesTypes: {\n      page: {\n        _id: 'ID!'\n      }\n    },\n    initialVariables: {\n      page: {\n        _id: props.pageId\n      }\n    }\n  })\n)\nexport default class PageInfoContainer extends Component {\n  static propTypes = {\n    pageId: PropTypes.string.isRequired\n  };\n\n  @bind\n  onDelete () {\n    const {pageId} = this.props;\n    this.props.removePage(pageId, true);\n  }\n\n  @bind\n  publishPage () {\n    const {pageId} = this.props;\n    this.props.publishPage(pageId);\n  }\n\n  @bind\n  unpublishPage () {\n    const {pageId} = this.props;\n    this.props.unpublishPage(pageId);\n  }\n\n  render () {\n    const {page} = this.props;\n    return (\n      <PageInfo\n        page={page}\n        onDelete={this.onDelete}\n        publishPage={this.publishPage}\n        unpublishPage={this.unpublishPage}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/screens/page/components/info/info.jsx",
    "content": "import getGravatarImage from 'helpers/get-gravatar-image';\nimport moment from 'moment';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './info.less';\nimport Item from './item';\n\nexport default class PageInfo extends Component {\n  static fragments = {\n    page: {\n      _id: 1,\n      state: 1,\n      date: 1,\n      updatedDate: 1,\n      createdBy: {\n        _id: 1,\n        email: 1,\n        name: 1\n      },\n      updatedBy: {\n        _id: 1,\n        email: 1,\n        name: 1\n      }\n    }\n  };\n\n  static propTypes = {\n    page: PropTypes.object,\n    onDelete: PropTypes.func.isRequired,\n    publishPage: PropTypes.func.isRequired,\n    unpublishPage: PropTypes.func.isRequired\n  };\n\n  static defaultProps = {\n    page: {}\n  };\n\n  render () {\n    const {page, onDelete} = this.props;\n    const date = page.date && moment(page.date).format('LL');\n    const updatedDate = page.updatedDate && moment(page.updatedDate).format('LL');\n\n    const createdByUserImage = getGravatarImage(page.createdBy && page.createdBy.email || 'default', 20);\n    const udpatedByUserImage = getGravatarImage(page.updatedBy && page.updatedBy.email || 'default', 20);\n\n    return (\n      <div className={styles.root}>\n        {this.renderStatus()}\n        <div className={styles.infoList}>\n          <Item label='Created at' value={date} icon='nc-icon-mini ui-1_calendar-60' />\n          <Item label='Updated at' value={updatedDate} icon='nc-icon-mini ui-1_calendar-60' />\n          <Item label='Created by' value={page.createdBy && page.createdBy.name} image={createdByUserImage} />\n          <Item label='Updated by' value={page.updatedBy && page.updatedBy.name} image={udpatedByUserImage} />\n        </div>\n        <div className={styles.bottom}>\n          <button className={styles.actionButton} onClick={onDelete}>\n            Delete Page\n          </button>\n        </div>\n      </div>\n    );\n  }\n\n  renderStatus () {\n    const {page} = this.props;\n    let result;\n\n    if (page.state === 'draft') {\n      return this.renderDraftStatus();\n    } else if (page.state === 'published') {\n      return this.renderPublishedStatus();\n    }\n\n    return result;\n  }\n\n  renderDraftStatus () {\n    const {publishPage} = this.props;\n    return (\n      <div className={styles.draft}>\n        <button className={styles.publishButton} onClick={publishPage}>\n          <i className='nc-icon-mini travel_world' />\n          <span>Publish</span>\n        </button>\n        <div className={styles.label}>This page is still a draft</div>\n      </div>\n    );\n  }\n\n  renderPublishedStatus () {\n    const {unpublishPage} = this.props;\n    return (\n      <div className={styles.draft}>\n        <button className={styles.unpublishButton} onClick={unpublishPage}>\n          <i className='nc-icon-mini arrows-1_back-78' />\n          <span>Unpublish</span>\n        </button>\n        <div className={styles.label}>This page is published</div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/screens/page/components/info/info.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  padding: 30px 25px;\n}\n\n.actionButton {\n  display: inline-block;\n  color: @alert;\n  font-weight: 300;\n  font-size: 13px;\n  text-transform: uppercase;\n}\n\n.bottom {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  padding: 15px 20px;\n  text-align: center;\n  border-top: 1px solid @adminBorders;\n}\n\n.draft {\n  margin-bottom: 45px;\n  text-align: center;\n}\n\n.publishButton {\n  display: inline-block;\n  :global {\n    i, span {\n      display: inline-block;\n      vertical-align: top;\n      color: @primary;\n      line-height: 22px;\n      font-size: 16px;\n    }\n    i {\n      margin-right: 5px;\n    }\n    span {\n      text-transform: uppercase;\n    }\n  }\n}\n\n.unpublishButton {\n  display: inline-block;\n  :global {\n    i, span {\n      display: inline-block;\n      vertical-align: top;\n      color: @draft;\n      line-height: 22px;\n      font-size: 16px;\n    }\n    i {\n      margin-right: 5px;\n    }\n    span {\n      text-transform: uppercase;\n    }\n  }\n}\n\n.label {\n  font-size: 13px;\n  color: @adminText;\n  margin-top: 12px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/screens/page/components/info/item.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './item.less';\n\nexport default class InfoItem extends Component {\n  static propTypes = {\n    icon: PropTypes.string,\n    image: PropTypes.string,\n    label: PropTypes.string.isRequired,\n    value: PropTypes.string.isRequired\n  };\n\n  render () {\n    const {icon, label, value, image} = this.props;\n    return (\n      <div className={styles.root}>\n        <div>\n          {icon && <i className={cx(styles.icon, icon)}></i>}\n          {image && <img className={styles.image} src={image} role='presentation' />}\n          <span className={styles.infoLabel}>\n            {label}\n          </span>\n        </div>\n        <div className={styles.infoValue}>\n          {value}\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/screens/page/components/info/item.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  margin-bottom: 35px;\n}\n\n.icon {\n  font-size: 14px;\n  line-height: 20px;\n  color: @adminText;\n  width: 20px;\n  text-align: center;\n  margin-right: 7px;\n}\n\n.image {\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  border-radius: 50%;\n  overflow: hidden;\n  margin-right: 7px;\n}\n\n.infoLabel {\n  font-size: 13px;\n  color: @adminTextHighlight;\n  line-height: 20px;\n  text-transform: uppercase;\n}\n\n.infoValue {\n  padding-left: 27px;\n  color: @adminText;\n  font-size: 13px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/screens/page/components/page.jsx",
    "content": "import cx from 'classnames';\nimport velocity from 'velocity-animate';\nimport A from 'components/a';\nimport Animate from 'components/animate';\nimport Component from 'components/component';\nimport ContentHeader from 'components/content-header';\nimport ContentHeaderActions from 'components/content-header-actions';\nimport ContentLoading from 'components/content-loading';\nimport ContentSidebar from 'components/content-sidebar';\nimport EditableTitle from 'components/editable-title';\nimport PageBuilder from 'components/page-builder';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nimport styles from './page.less';\nimport Info from './info';\nimport Revisions from './revisions';\n\nexport default class Page extends Component {\n  static fragments = {\n    page: {\n      _id: 1,\n      title: 1,\n      slug: 1\n    }\n  };\n\n  static propTypes = {\n    page: PropTypes.object.isRequired,\n    location: PropTypes.object.isRequired,\n    updateTitle: PropTypes.func.isRequired,\n    updateSlug: PropTypes.func.isRequired,\n    loading: PropTypes.bool.isRequired,\n    togglePageInfo: PropTypes.func.isRequired,\n    togglePageRevisions: PropTypes.func.isRequired,\n    pageId: PropTypes.string.isRequired,\n    sidebar: PropTypes.string\n  };\n\n  static defaultProps = {\n    page: {}\n  };\n\n  getInitState () {\n    const {location} = this.props;\n    return {\n      build: location.query.build && true\n    };\n  }\n\n  componentWillReceiveProps (nextProps) {\n    const {location} = this.props;\n    const oldBuild = location.query.build;\n    const currentBuild = nextProps.location.query.build;\n\n    if (this.props.pageId !== nextProps.pageId) {\n      this.setState({\n        build: location.query.build && true\n      });\n    }\n\n    if (oldBuild !== currentBuild) {\n      const config = {\n        duration: 800,\n        display: null,\n        easing: 'easeOutExpo'\n      };\n      if (currentBuild) {\n        velocity(this.refs.content, {top: '0px'}, config);\n        // velocity(findDOMNode(this.refs.header), {translateY: '-70px'}, config);\n        velocity(findDOMNode(this.refs.cover), {opacity: 0}, Object.assign({}, config, {display: 'none'}));\n      } else {\n        velocity(this.refs.content, {top: '70px'}, config);\n        // velocity(findDOMNode(this.refs.header), {translateY: '0px'}, config);\n        velocity(findDOMNode(this.refs.cover), {opacity: 1}, Object.assign({}, config, {display: 'block'}));\n      }\n    }\n  }\n\n  render () {\n    const {loading, page} = this.props;\n    let result;\n\n    if (loading) {\n      result = (\n        <ContentLoading />\n      );\n    } else if (page) {\n      result = this.renderContent();\n    } else {\n      result = <span></span>;\n    }\n\n    return result;\n  }\n\n  renderContent () {\n    const {page, location, updateTitle, updateSlug, togglePageInfo, togglePageRevisions, sidebar} = this.props;\n\n    return (\n      <Animate transition='fadeIn'>\n        <div className={cx(this.state.build && styles.build)}>\n          <ContentHeader smallPadding ref='header'>\n            <div className={styles.info}>\n              <EditableTitle value={page.title} onSubmit={updateTitle} />\n              <EditableTitle sub value={page.slug} onSubmit={updateSlug} />\n            </div>\n            <ContentHeaderActions>\n              <button\n                className={cx(styles.actionButton, sidebar === 'revisions' && styles.active)}\n                onClick={togglePageRevisions}\n              >\n                <i className='nc-icon-outline ui-2_time'></i>\n              </button>\n              <button\n                className={cx(styles.actionButton, sidebar === 'info' && styles.active)}\n                onClick={togglePageInfo}\n              >\n                <i className='nc-icon-outline travel_info'></i>\n              </button>\n            </ContentHeaderActions>\n          </ContentHeader>\n          <div className={styles.content} ref='content'>\n            <PageBuilder />\n            <A href={location.pathname} query={{build: 1}} className={styles.cover} ref='cover'>\n              <div className={styles.coverContent}>\n                <i className='nc-icon-outline design_design'></i>\n                <div>Click to Build</div>\n              </div>\n            </A>\n            {this.renderSidebar()}\n          </div>\n        </div>\n      </Animate>\n    );\n  }\n\n  renderSidebar () {\n    const {sidebar} = this.props;\n    const opened = sidebar !== null && !this.props.location.query.build;\n    return (\n      <ContentSidebar opened={opened}>\n        {this.renderSidebarContent()}\n      </ContentSidebar>\n    );\n  }\n\n  renderSidebarContent () {\n    const {sidebar} = this.props;\n    let result;\n\n    if (sidebar === 'info') {\n      result = (\n        <Info />\n      );\n    } else if (sidebar === 'revisions') {\n      result = (\n        <Revisions />\n      );\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/screens/page/components/page.less",
    "content": "@import '~styles/colors.less';\n\n.info {\n  display: inline-block;\n  vertical-align: top;\n}\n\n.actionButton {\n  display: inline-block;\n  vertical-align: top;\n  width: 30px;\n  height: 30px;\n  margin: 10px 5px;\n  :global i {\n    font-size: 22px;\n    line-height: 30px;\n    color: @adminText;\n  }\n\n  &.active {\n    :global i {\n      color: @primary;\n    }\n  }\n}\n\n.content {\n  position: absolute;\n  top: 70px;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  overflow: hidden;\n  background-color: #ffffff;\n}\n\n.cover {\n  cursor: pointer;\n  display: block;\n  position: absolute;\n  left: 0; top: 0; right: 0; bottom: 0;\n  background-color: rgba(0, 0, 0, 0.6);\n  z-index: 10;\n  transition: background-color 0.4s ease-out;\n  &:hover {\n    background-color: rgba(0, 0, 0, 0.7);\n  }\n}\n\n.coverContent {\n  display: inline-block;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  text-align: center;\n  border: 2px dotted #ffffff;\n  width: 176px;\n  height: 176px;\n  border-radius: 50%;\n  padding: 35px 0;\n\n  :global {\n    i, div {\n      display: block;\n      color: #ffffff;\n    }\n    i {\n      font-size: 60px;\n    }\n    div {\n      margin-top: 20px;\n      font-size: 16px;\n    }\n  }\n}\n\n.build {\n  .cover {\n    opacity: 0;\n    display: none;\n  }\n  .content {\n    top: 0;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/screens/page/components/revisions/index.js",
    "content": "import Component from 'components/component';\nimport React from 'react';\n\nexport default class PageRevisionsContainer extends Component {\n  render () {\n    return <div>Page Revisions</div>;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/pages/screens/page/index.js",
    "content": "import bind from 'decorators/bind';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {updatePageTitle, updatePageSlug} from 'actions/page';\nimport {addTab} from 'actions/tabs';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport Page from './components/page';\n\n@dataConnect(\n  (state) => ({\n    pageId: state.router.params.id,\n    location: state.router.location\n  }),\n  (dispatch) => bindActionCreators({updatePageTitle, updatePageSlug, addTab}, dispatch),\n  (props) => ({\n    fragments: Page.fragments,\n    variablesTypes: {\n      page: {\n        _id: 'ID!'\n      }\n    },\n    initialVariables: {\n      page: {\n        _id: props.pageId\n      }\n    }\n  })\n)\nexport default class PageContainer extends Component {\n  static propTypes = {\n    relate: PropTypes.object.isRequired,\n    page: PropTypes.object.isRequired,\n    pageId: PropTypes.string.isRequired,\n    location: PropTypes.object.isRequired,\n    updatePage: PropTypes.func.isRequired\n  };\n\n  getInitState () {\n    this.processTab(this.props);\n    return {\n      sidebar: null\n    };\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (this.props.pageId !== nextProps.pageId) {\n      this.setState({\n        sidebar: null\n      });\n      this.props.relate.setVariables({\n        page: {\n          _id: nextProps.pageId\n        }\n      });\n    }\n\n    const oldBuild = this.props.location.query.build;\n    const currentBuild = nextProps.location.query.build;\n    if (oldBuild !== currentBuild || this.props.pageId !== nextProps.pageId) {\n      this.processTab(nextProps);\n    }\n  }\n\n  processTab (props) {\n    const currentBuild = props.location.query.build;\n    if (currentBuild) {\n      this.props.addTab('page', props.pageId);\n    }\n  }\n\n  @bind\n  updateTitle (title) {\n    const {page} = this.props;\n    return this.props.updatePageTitle(page._id, title);\n  }\n\n  @bind\n  updateSlug (slug) {\n    const {page} = this.props;\n    return this.props.updatePageSlug(page._id, slug);\n  }\n\n  @bind\n  togglePageInfo () {\n    const {sidebar} = this.state;\n    this.setState({\n      sidebar: sidebar === 'info' ? null : 'info'\n    });\n  }\n\n  @bind\n  togglePageRevisions () {\n    const {sidebar} = this.state;\n    this.setState({\n      sidebar: sidebar === 'revisions' ? null : 'revisions'\n    });\n  }\n\n  render () {\n    const {page, location, loading, pageId} = this.props;\n    return (\n      <Page\n        {...this.state}\n        page={page}\n        pageId={pageId}\n        location={location}\n        loading={loading}\n        updateTitle={this.updateTitle}\n        updateSlug={this.updateSlug}\n        togglePageInfo={this.togglePageInfo}\n        togglePageRevisions={this.togglePageRevisions}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/builder.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport Model from './model';\nimport Name from './name';\nimport Types from './types';\n\nconst steps = [\n  Types,\n  Name,\n  Model\n];\n\nexport default class SchemaBuilder extends Component {\n  static propTypes = {\n    step: PropTypes.number.isRequired\n  };\n\n  render () {\n    const {step} = this.props;\n    const StepComponent = steps[step];\n\n    return (\n      <StepComponent {...this.props} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/index.js",
    "content": "import * as schemaActions from 'actions/schema';\n\nimport Component from 'components/component';\nimport React from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport Builder from './builder';\n\n@connect(\n  (state) => ({\n    step: state.schema.step,\n    schema: state.schema.data\n  }),\n  (dispatch) => bindActionCreators(schemaActions, dispatch)\n)\nexport default class SchemasBuilder extends Component {\n  render () {\n    return (\n      <Builder\n        {...this.props}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/model.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport Component from 'components/component';\nimport Scrollable from 'components/scrollable';\nimport React, {PropTypes} from 'react';\n\nimport styles from './model.less';\nimport Properties from './properties';\n\nexport default class SchemaModel extends Component {\n  static propTypes = {\n    schema: PropTypes.object.isRequired,\n    schemaStepBack: PropTypes.func.isRequired,\n    schemaStepForward: PropTypes.func.isRequired,\n    addSchema: PropTypes.func.isRequired\n  };\n\n  @bind\n  onDone () {\n    const {schema, addSchema} = this.props;\n    addSchema(schema);\n  }\n\n  render () {\n    const {schema, schemaStepBack} = this.props;\n    return (\n      <Scrollable>\n        <div className={styles.root}>\n          <div>\n            {this.renderSchemaType(schema.type)}\n          </div>\n          <div className={styles.header}>...and now create the content model.</div>\n          <div className={styles.subHeader}>{`What properties will ${schema.title} single contain?`}</div>\n          <Properties />\n          <div className={styles.buttons}>\n            <button className={styles.button} onClick={schemaStepBack}>\n              Back\n            </button>\n            <button className={cx(styles.button, styles.primary)} onClick={this.onDone}>\n              Done\n            </button>\n          </div>\n        </div>\n      </Scrollable>\n    );\n  }\n\n  renderSchemaType (type) {\n    const {schema} = this.props;\n    let result;\n    if (type === 'single') {\n      result = (\n        <div className={styles.option}>\n          <i className={'nc-icon-outline design_webpage'} />\n          <div className={styles.title}>{schema.title}</div>\n        </div>\n      );\n    } else if (type === 'data') {\n      result = (\n        <div className={styles.option}>\n          <i className={'nc-icon-outline files_single-copy-04'} />\n          <div className={styles.title}>{schema.title}</div>\n        </div>\n      );\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/model.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  text-align: center;\n  padding: 30px;\n\n  width: 800px;\n  max-width: 100%;\n  padding-bottom: 40px;\n  margin: 0 auto;\n}\n\n.header {\n  font-size: 36px;\n  color: @adminText;\n}\n\n.subHeader {\n  font-size: 16px;\n  color: @adminText;\n}\n\n.option {\n  display: inline-block;\n  vertical-align: top;\n  margin-top: 40px;\n  margin-bottom: 70px;\n\n  :global i {\n    color: @adminText;\n    font-size: 40px;\n    margin-bottom: 10px;\n  }\n}\n\n.title {\n  font-size: 26px;\n  color: @primary;\n}\n\n.buttons {\n  margin: 40px 0;\n}\n\n.button {\n  font-size: 16px;\n  text-transform: uppercase;\n  color: @adminText;\n  margin: 0 10px;\n}\n\n.primary {\n  color: @primary;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/name.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport Input from 'components/modal-input';\nimport React, {PropTypes} from 'react';\n\nimport styles from './name.less';\n\nexport default class SchemaName extends Component {\n  static propTypes = {\n    schema: PropTypes.object.isRequired,\n    schemaStepBack: PropTypes.func.isRequired,\n    schemaStepForward: PropTypes.func.isRequired,\n    changeSchemaTitle: PropTypes.func.isRequired\n  };\n\n  render () {\n    const {schema, schemaStepBack, schemaStepForward, changeSchemaTitle} = this.props;\n    return (\n      <div className={styles.root}>\n        <div>\n          {this.renderSchemaType(schema.type)}\n        </div>\n        <div className={styles.holder}>\n          <div className={styles.header}>Let's give it a name!</div>\n          <Input\n            value={schema.title}\n            onChange={changeSchemaTitle}\n            focus\n            placeholder='Content type name'\n          />\n          <div className={styles.buttons}>\n            <button className={styles.button} onClick={schemaStepBack}>\n              Back\n            </button>\n            <button className={cx(styles.button, styles.primary)} onClick={schemaStepForward}>\n              Next\n            </button>\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n  renderSchemaType (type) {\n    let result;\n    if (type === 'single') {\n      result = (\n        <div className={styles.option}>\n          <i className={'nc-icon-outline design_webpage'} />\n          <div className={styles.title}>With URL</div>\n          <div className={styles.subTitle}>Single Page</div>\n        </div>\n      );\n    } else if (type === 'data') {\n      result = (\n        <div className={styles.option}>\n          <i className={'nc-icon-outline files_single-copy-04'} />\n          <div className={styles.title}>Without URL</div>\n          <div className={styles.subTitle}>Multiple Table Entries</div>\n        </div>\n      );\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/name.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  text-align: center;\n  padding: 30px;\n  position: absolute;\n  width: 100%;\n  left: 50%;\n  transform: translate(-50%, 0%);\n}\n\n.holder {\n  display: inline-block;\n  width: 330px;\n  padding-bottom: 40px;\n}\n\n.header {\n  font-size: 36px;\n  margin-bottom: 30px;\n  color: @adminText;\n}\n\n.option {\n  display: inline-block;\n  vertical-align: top;\n  width: 180px;\n  height: 180px;\n  border-radius: 50%;\n  border: 1px solid @adminTextSub;\n  margin-top: 40px;\n  margin-bottom: 60px;\n\n  :global i {\n    color: @adminText;\n    font-size: 40px;\n    margin-bottom: 10px;\n    margin-top: 45px;\n  }\n}\n\n.title {\n  font-size: 16px;\n  font-weight: 600;\n  color: @adminText;\n}\n\n.subTitle {\n  font-size: 12px;\n  color: @adminTextSub;\n}\n\n.buttons {\n  margin: 40px 0;\n}\n\n.button {\n  font-size: 16px;\n  text-transform: uppercase;\n  color: @adminText;\n  margin: 0 10px;\n}\n\n.primary {\n  color: @primary;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/properties/index.js",
    "content": "import * as schemaActions from 'actions/schema';\n\nimport Component from 'components/component';\nimport React from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport Properties from './properties';\n\n@connect(\n  (state) => ({\n    openedProperties: state.schema.openedProperties,\n    properties: state.schema.data.properties\n  }),\n  (dispatch) => bindActionCreators(schemaActions, dispatch)\n)\nexport default class SchemasBuilderPropertiesContainer extends Component {\n  render () {\n    return (\n      <Properties\n        {...this.props}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/properties/properties.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {singleFixedProperties} from 'helpers/data-types';\n\nimport styles from './properties.less';\nimport Property from './property';\n\nexport default class SchemaProperties extends Component {\n  static propTypes = {\n    openedProperties: PropTypes.array.isRequired,\n    properties: PropTypes.array.isRequired,\n    addProperty: PropTypes.func.isRequired,\n    toggleProperty: PropTypes.func.isRequired,\n    changePropertySetting: PropTypes.func.isRequired\n  };\n\n  render () {\n    const {properties, addProperty} = this.props;\n    return (\n      <div className={styles.root}>\n        {singleFixedProperties.map(this.renderProperty, this)}\n        {properties.map(this.renderProperty, this)}\n        <button className={styles.addNew} onClick={addProperty}>\n          Add new property\n        </button>\n      </div>\n    );\n  }\n\n  renderProperty (property, key) {\n    const {openedProperties, toggleProperty, changePropertySetting} = this.props;\n    return (\n      <Property\n        property={property}\n        opened={openedProperties.indexOf(property.id) !== -1}\n        toggleProperty={toggleProperty}\n        changePropertySetting={changePropertySetting}\n        key={key}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/properties/properties.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  margin-top: 50px;\n}\n\n.addNew {\n  text-transform: uppercase;\n  font-size: 14px;\n  color: @adminText;\n  display: block;\n  width: 100%;\n  text-align: center;\n  line-height: 70px;\n\n  &:hover {\n    color: @primary;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/properties/property-options.jsx",
    "content": "import bind from 'decorators/bind';\nimport Component from 'components/component';\nimport OptionsList from 'components/options-list';\nimport React, {PropTypes} from 'react';\nimport {propertyOptions} from 'helpers/data-types';\n\nimport styles from './property-options.less';\n\nexport default class SchemaPropertyOptions extends Component {\n  static propTypes = {\n    property: PropTypes.object.isRequired,\n    changePropertySetting: PropTypes.func.isRequired\n  };\n\n  @bind\n  onChange (id, value) {\n    const {changePropertySetting, property} = this.props;\n    changePropertySetting(property.id, id, value);\n  }\n\n  render () {\n    const {property} = this.props;\n    return (\n      <div className={styles.root}>\n        <OptionsList\n          options={propertyOptions}\n          values={property}\n          onChange={this.onChange}\n          white\n        />\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/properties/property-options.less",
    "content": ".root {\n  text-align: left;\n  padding: 20px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/properties/property.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './property.less';\nimport PropertyOptions from './property-options';\n\nexport default class SchemaProperty extends Component {\n  static propTypes = {\n    property: PropTypes.object.isRequired,\n    opened: PropTypes.bool.isRequired,\n    toggleProperty: PropTypes.func.isRequired,\n    changePropertySetting: PropTypes.func.isRequired\n  };\n\n  @bind\n  onToggle () {\n    const {toggleProperty, property} = this.props;\n    toggleProperty(property.id);\n  }\n\n  render () {\n    const {property} = this.props;\n    return (\n      <div className={cx(styles.root, property.locked && styles.locked)}>\n        <div className={styles.header} onClick={this.onToggle}>\n          <div className={styles.info}>\n            <div className={styles.title}>{property.title}</div>\n            <div className={styles.id}>{property.id}</div>\n          </div>\n          <div className={styles.right}>\n            <div className={styles.type}>{property.type}</div>\n            {this.renderIcon()}\n          </div>\n        </div>\n        {this.renderOpened()}\n      </div>\n    );\n  }\n\n  renderIcon () {\n    const {opened, property} = this.props;\n    let result;\n    if (property.locked) {\n      result = (\n        <i className={cx(styles.icon, 'nc-icon-mini business_pin')} />\n      );\n    } else {\n      result = (\n        <i className={cx(\n            styles.icon,\n            'nc-icon-mini',\n            opened ? 'arrows-1_minimal-up' : 'arrows-1_minimal-down'\n          )}\n        />\n      );\n    }\n    return result;\n  }\n\n  renderOpened () {\n    const {opened, property} = this.props;\n    if (opened && !property.locked) {\n      const {changePropertySetting} = this.props;\n      return (\n        <PropertyOptions\n          property={property}\n          changePropertySetting={changePropertySetting}\n        />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/properties/property.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  border: 1px solid @adminBorders;\n  margin-top: -1px;\n}\n\n.header {\n  padding: 15px 25px;\n  height: 70px;\n  text-align: left;\n  cursor: pointer;\n\n  &:hover {\n    background-color: #fefefe;\n  }\n}\n\n.locked .header {\n  cursor: default;\n  &:hover {\n    background-color: fadeout(@alert, 99%);\n  }\n}\n\n.info {\n  display: inline-block;\n  vertical-align: top;\n  float: left;\n}\n\n.title {\n  font-size: 15px;\n  line-height: 22px;\n  color: @adminTextHighlight;\n}\n\n.id {\n  font-size: 12px;\n  color: @adminText;\n}\n\n.right {\n  display: inline-block;\n  vertical-align: top;\n  float: right;\n}\n\n.icon, .type {\n  display: inline-block;\n  vertical-align: top;\n  line-height: 40px;\n}\n\n.icon {\n  color: @adminText;\n  font-size: 10px;\n  margin-left: 10px;\n}\n\n.locked .icon {\n  color: fadeout(@alert, 60%);\n}\n\n.type {\n  font-size: 15px;\n  color: @adminText;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/type.jsx",
    "content": "import bind from 'decorators/bind';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './type.less';\n\nexport default class SchemaType extends Component {\n  static propTypes = {\n    changeSchemaType: PropTypes.func.isRequired,\n    type: PropTypes.string.isRequired,\n    image: PropTypes.string.isRequired,\n    title: PropTypes.string.isRequired,\n    subTitle: PropTypes.string.isRequired\n  };\n\n  @bind\n  onClick () {\n    const {changeSchemaType, type} = this.props;\n    changeSchemaType(type);\n  }\n\n  render () {\n    const {image, title, subTitle} = this.props;\n    return (\n      <button className={styles.option} onClick={this.onClick}>\n        <img className={styles.icon} src={image} width='64' />\n        <div className={styles.title}>{title}</div>\n        <div className={styles.subTitle}>{subTitle}</div>\n      </button>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/type.less",
    "content": "@import '~styles/colors.less';\n\n.option {\n  display: inline-block;\n  vertical-align: top;\n  width: 320px;\n  height: 320px;\n  border-radius: 50%;\n  border: 1px solid @adminTextSub;\n\n  &:hover {\n    border-color: @primary;\n  }\n}\n\n.icon {\n  margin-bottom: 20px;\n}\n\n.title {\n  font-size: 36px;\n  font-weight: 600;\n  color: @adminText;\n}\n\n.subTitle {\n  font-size: 16px;\n  color: @adminTextSub;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/types.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './types.less';\nimport Type from './type';\n\nexport default class SchemaTypes extends Component {\n  static propTypes = {\n    changeSchemaType: PropTypes.func.isRequired\n  };\n\n  render () {\n    const {changeSchemaType} = this.props;\n    return (\n      <div className={styles.root}>\n        <div className={styles.subHeader}>Let's create some new content types!</div>\n        <div className={styles.header}>What type of content is this?</div>\n        <div className={styles.options}>\n          <Type\n            changeSchemaType={changeSchemaType}\n            image='/images/admin/url-schema-icon.png'\n            title='With URL'\n            subTitle='Single Page'\n            type='single'\n          />\n          <div className={styles.or}>or</div>\n          <Type\n            changeSchemaType={changeSchemaType}\n            image='/images/admin/data-schema-icon.png'\n            title='Without URL'\n            subTitle='Multiple Table Entries'\n            type='data'\n          />\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/components/builder/types.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  text-align: center;\n  padding: 30px;\n  position: absolute;\n  width: 100%;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n}\n\n.subHeader {\n  font-size: 16px;\n  color: @adminText;\n}\n\n.header {\n  font-size: 36px;\n  color: @primary;\n  font-weight: 300;\n}\n\n.options {\n  margin-top: 80px;\n}\n\n.or {\n  display: inline-block;\n  vertical-align: top;\n  line-height: 320px;\n  font-size: 26px;\n  font-weight: 600;\n  color: @adminText;\n  padding: 0 50px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/new/index.js",
    "content": "import Component from 'components/component';\nimport React from 'react';\n\nimport Builder from './components/builder';\n\nexport default class SchemasNewContainer extends Component {\n  render () {\n    return (\n      <Builder new />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/schema/components/entry.jsx",
    "content": "import cx from 'classnames';\nimport moment from 'moment';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {Link} from 'react-router';\n\nimport styles from './entry.less';\n\nexport default class SchemaEntry extends Component {\n  static fragments = {\n    schemaEntry: {\n      _id: 1,\n      title: 1,\n      state: 1,\n      date: 1\n    }\n  };\n\n  static propTypes = {\n    schemaEntry: PropTypes.object.isRequired,\n    active: PropTypes.bool.isRequired,\n    query: PropTypes.object.isRequired\n  };\n\n  render () {\n    const {schemaEntry, active, query} = this.props;\n    const date = moment(schemaEntry.date).fromNow();\n    const editLink = '/admin/schemas/entry/' + schemaEntry._id; // TODO fix\n\n    return (\n      <Link to={editLink} query={query} className={cx(styles.root, active && styles.active)}>\n        <div className={cx(styles.status, schemaEntry.state === 'published' && styles.published)}></div>\n        <div className={styles.info}>\n          <div className={styles.title}>{schemaEntry.title}</div>\n          <div className={styles.date}>{date}</div>\n        </div>\n      </Link>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/schema/components/entry.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  height: 70px;\n  border-bottom: 1px solid @adminBorders;\n  padding: 13px;\n  position: relative;\n  display: block;\n  text-decoration: none;\n\n  &:hover {\n    background-color: @primaryBack;\n  }\n}\n\n.status {\n  position: absolute;\n  left: 13px;\n  top: 30px;\n  width: 10px;\n  height: 10px;\n  background-color: #F7CF00;\n  border-radius: 50%;\n}\n\n.published {\n  background-color: @primary;\n}\n\n.info {\n  padding-left: 25px;\n  padding-top: 3px;\n}\n\n.title {\n  font-size: 15px;\n  color: @adminTextHighlight;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n}\n\n.date {\n  font-size: 12px;\n  color: @adminText;\n  font-weight: 300;\n}\n\n.active {\n  background-color: @primary;\n\n  .status.published {\n    background-color: #ffffff;\n  }\n  .title {\n    color: #ffffff;\n  }\n  .date {\n    color: #ffffff;\n  }\n\n  &:hover {\n    background-color: @primary;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/schema/components/list.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport Entry from './entry';\n\nexport default class SchemaEntriesList extends Component {\n  static fragments = {\n    schemaList: Entry.fragments.schemaEntry\n  };\n\n  static propTypes = {\n    schemaList: PropTypes.array.isRequired,\n    activeSchemaEntryId: PropTypes.string,\n    query: PropTypes.object.isRequired\n  };\n\n  render () {\n    return (\n      <div>\n        {this.props.schemaList.map(this.renderEntry, this)}\n      </div>\n    );\n  }\n\n  renderEntry (schemaEntry, key) {\n    const {activeSchemaEntryId, query} = this.props;\n    return (\n      <Entry\n        schemaEntry={schemaEntry}\n        key={key}\n        active={activeSchemaEntryId === schemaEntry._id}\n        query={query}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/schema/components/menu.jsx",
    "content": "import Component from 'components/component';\nimport ListHeader from 'components/list-header';\nimport ListSearchSort from 'components/list-search-sort';\nimport Modal from 'components/modal';\nimport Scrollable from 'components/scrollable';\nimport React, {PropTypes} from 'react';\nimport {mergeFragments} from 'relate-js';\n\nimport styles from './menu.less';\nimport List from './list';\nimport New from './new';\n\nconst sorts = [\n  {\n    label: 'Date desc',\n    sort: '_id',\n    order: 'desc'\n  },\n  {\n    label: 'Date asc',\n    sort: '_id',\n    order: 'asc'\n  },\n  {\n    label: 'Title A-Z',\n    sort: 'title',\n    order: 'asc'\n  },\n  {\n    label: 'Title Z-A',\n    sort: 'title',\n    order: 'desc'\n  },\n  {\n    label: 'Updated desc',\n    sort: 'updatedDate',\n    order: 'desc'\n  },\n  {\n    label: 'Updated asc',\n    sort: 'updatedDate',\n    order: 'asc'\n  }\n];\n\nexport default class SchemaMenu extends Component {\n  static fragments = mergeFragments(\n    List.fragments,\n    {\n      schema: {\n        _id: 1,\n        title: 1\n      }\n    }\n  );\n\n  static propTypes = {\n    schemaList: PropTypes.array.isRequired,\n    schema: PropTypes.object.isRequired,\n    onBack: PropTypes.func.isRequired,\n    onNew: PropTypes.func.isRequired,\n    closeNew: PropTypes.func.isRequired,\n    activeSchemaEntryId: PropTypes.string,\n    newOpened: PropTypes.bool.isRequired,\n    sort: PropTypes.string.isRequired,\n    order: PropTypes.string.isRequired,\n    search: PropTypes.string.isRequired,\n    location: PropTypes.object.isRequired\n  };\n\n  render () {\n    const {schemaList, schema, onBack, onNew, activeSchemaEntryId, sort, order, location, search} = this.props;\n\n    return (\n      <div>\n        <ListHeader\n          title={schema.title}\n          onBack={onBack}\n          newIcon='nc-icon-outline ui-2_window-add'\n          onNew={onNew}\n        />\n        <ListSearchSort\n          search={search}\n          sorts={sorts}\n          sort={sort}\n          order={order}\n          location={location}\n        />\n        <Scrollable className={styles.list}>\n          <List\n            schemaList={schemaList}\n            activeSchemaEntryId={activeSchemaEntryId}\n            query={location.query}\n          />\n        </Scrollable>\n        {this.renderNew()}\n      </div>\n    );\n  }\n\n  renderNew () {\n    const {newOpened, closeNew, schema} = this.props;\n    if (newOpened) {\n      return (\n        <Modal small subTitle={`New ${schema.title} entry`} title='What should we call it?' onClose={closeNew}>\n          <New onClose={closeNew} schemaId={schema._id} />\n        </Modal>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/schema/components/menu.less",
    "content": ".list {\n  position: absolute;\n  top: 110px;\n  bottom: 0; left: 0; right: 0;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/schema/components/new/index.js",
    "content": "import bind from 'decorators/bind';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {addSchemaEntry} from 'actions/schema-entry';\n\nimport New from './new';\n\nexport default class NewSchemaEntryContainer extends Component {\n  static propTypes = {\n    onClose: PropTypes.func.isRequired,\n    schemaId: PropTypes.string.isRequired\n  };\n\n  static contextTypes = {\n    store: PropTypes.object.isRequired\n  };\n\n  getInitState () {\n    return {\n      title: '',\n      loading: false\n    };\n  }\n\n  @bind\n  changeTitle (title) {\n    this.setState({\n      title\n    });\n  }\n\n  @bind\n  submit () {\n    if (!this.state.loading) {\n      this.setState({\n        loading: true\n      }, () => {\n        const {store} = this.context;\n        const {onClose, schemaId} = this.props;\n        const {title} = this.state;\n        store.dispatch(addSchemaEntry(schemaId, {title}, true)).then(() => {\n          onClose && onClose();\n        });\n      });\n    }\n  }\n\n  render () {\n    return (\n      <New\n        {...this.state}\n        changeTitle={this.changeTitle}\n        submit={this.submit}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/schema/components/new/new.jsx",
    "content": "import Component from 'components/component';\nimport ModalInput from 'components/modal-input';\nimport ModalNew from 'components/modal-new';\nimport React, {PropTypes} from 'react';\n\nexport default class NewSchemaEntry extends Component {\n  static propTypes = {\n    title: PropTypes.string.isRequired,\n    changeTitle: PropTypes.func.isRequired,\n    submit: PropTypes.func.isRequired,\n    loading: PropTypes.bool\n  };\n\n  render () {\n    const {title, changeTitle, submit, loading} = this.props;\n    return (\n      <ModalNew submit={submit} loading={loading}>\n        <ModalInput\n          focus\n          value={title}\n          placeholder='Name your new entry. e.g. \"My first post\"'\n          onChange={changeTitle}\n        />\n      </ModalNew>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/schema/components/schema.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './schema.less';\nimport New from './new';\n\nexport default class Schema extends Component {\n  static propTypes = {\n    children: PropTypes.node,\n    count: PropTypes.number.isRequired,\n    schemaId: PropTypes.string.isRequired\n  };\n\n  render () {\n    let result;\n\n    if (this.props.count === 0) {\n      result = this.renderNoPages();\n    } else if (this.props.children) {\n      result = this.props.children;\n    } else {\n      result = this.renderEmpty();\n    }\n\n    return result;\n  }\n\n  renderEmpty () {\n    return (\n      <div className={styles.empty}>\n        <i className='nc-icon-outline media-1_touch'></i>\n        <div className={styles.emptyText}>Relax, select an entry first!</div>\n      </div>\n    );\n  }\n\n  renderNoPages () {\n    const {schemaId} = this.props;\n    return (\n      <div className={styles.noEntries}>\n        <div className={styles.noTitle}>Oh my!</div>\n        <div className={styles.noText}>\n          <span>You don’t have any entries yet!</span>\n          <br />\n          <span>Lets change that</span>\n        </div>\n        <New schemaId={schemaId} />\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/schema/components/schema.less",
    "content": "@import '~styles/sizes.less';\n@import '~styles/colors.less';\n\n.empty {\n  position: absolute;\n  top: 45%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  text-align: center;\n\n  :global i {\n    font-size: 56px;\n    color: @adminTextSub;\n    margin-bottom: 20px;\n    margin-top: 20px;\n  }\n}\n\n.emptyText {\n  font-size: 17px;\n  color: @adminTextSub;\n}\n\n.noEntries {\n  width: 440px;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  text-align: center;\n}\n\n.noTitle {\n  font-size: 36px;\n  font-weight: 300;\n  margin-bottom: 5px;\n  color: @adminText;\n}\n\n.noText {\n  font-size: 16px;\n  color: @adminText;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/schema/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {dataConnect} from 'relate-js';\n\nimport Schema from './components/schema';\n\n@dataConnect(\n  (state) => ({\n    schemaId: state.router.params.id\n  }),\n  (props) => ({\n    fragments: {\n      schemaListCount: true\n    },\n    variablesTypes: {\n      schemaListCount: {\n        schemaId: 'ID!'\n      }\n    },\n    initialVariables: {\n      schemaListCount: {\n        schemaId: props.schemaId\n      }\n    },\n    mutations: {\n      addSchemaEntry: [\n        {\n          type: 'INCREMENT',\n          field: 'schemaListCount'\n        }\n      ]\n    }\n  })\n)\nexport default class SchemaContainer extends Component {\n  static propTypes = {\n    children: PropTypes.node,\n    schemaId: PropTypes.string.isRequired\n  };\n\n  render () {\n    const {schemaListCount, schemaId} = this.props;\n    return (\n      <Schema count={schemaListCount} schemaId={schemaId}>\n        {this.props.children}\n      </Schema>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/schemas/screens/schema/menu.js",
    "content": "import * as adminMenuActions from 'actions/admin-menu';\n\nimport bind from 'decorators/bind';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport Menu from './components/menu';\n\n@dataConnect(\n  (state) => ({\n    params: state.router.params,\n    location: state.router.location,\n    sort: state.router.location.query.sort || '_id',\n    order: state.router.location.query.order || 'desc',\n    search: state.router.location.query.s || ''\n  }),\n  (dispatch) => bindActionCreators(adminMenuActions, dispatch),\n  (props) => ({\n    fragments: Menu.fragments,\n    variablesTypes: {\n      schema: {\n        _id: 'ID!'\n      },\n      schemaList: {\n        schemaId: 'ID!',\n        sort: 'String',\n        order: 'String',\n        search: 'String',\n        s: 'String'\n      }\n    },\n    initialVariables: {\n      schema: {\n        _id: props.params.id\n      },\n      schemaList: {\n        schemaId: props.params.id,\n        sort: props.sort,\n        order: props.order,\n        search: 'title',\n        s: props.search\n      }\n    },\n    mutations: {\n      addSchemaEntry: [\n        {\n          type: 'PREPEND',\n          field: 'schemaList'\n        }\n      ]\n    }\n  })\n)\nexport default class SchemaMenuContainer extends Component {\n  static propTypes = {\n    children: PropTypes.node,\n    schemaList: PropTypes.array,\n    schema: PropTypes.object,\n    closeAdminMenu: PropTypes.func.isRequired,\n    openAdminMenu: PropTypes.func.isRequired,\n    params: PropTypes.object.isRequired,\n    sort: PropTypes.string.isRequired,\n    order: PropTypes.string.isRequired,\n    search: PropTypes.string.isRequired\n  };\n\n  static defaultProps = {\n    schemaList: [],\n    schema: {}\n  };\n\n  getInitState () {\n    return {\n      newOpened: false\n    };\n  }\n\n  componentDidMount () {\n    this.props.openAdminMenu();\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (nextProps.sort !== this.props.sort ||\n        nextProps.order !== this.props.order ||\n        nextProps.search !== this.props.search) {\n      this.props.relate.setVariables({\n        schema: {\n          _id: nextProps.params.id\n        },\n        schemaList: {\n          schemaId: nextProps.params.id,\n          sort: nextProps.sort,\n          order: nextProps.order,\n          search: 'title',\n          s: nextProps.search\n        }\n      });\n    }\n  }\n\n  @bind\n  onBack () {\n    this.props.closeAdminMenu();\n  }\n\n  @bind\n  onNew () {\n    this.setState({\n      newOpened: true\n    });\n  }\n\n  @bind\n  closeNew () {\n    this.setState({\n      newOpened: false\n    });\n  }\n\n  render () {\n    const {schemaList, schema, params, sort, order, search, location} = this.props;\n    return (\n      <Menu\n        schemaList={schemaList}\n        schema={schema}\n        location={location}\n        onBack={this.onBack}\n        onNew={this.onNew}\n        closeNew={this.closeNew}\n        activeSchemaEntryId={params.entryId}\n        sort={sort}\n        order={order}\n        search={search}\n        {...this.state}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/settings/components/menu.jsx",
    "content": "import Button from 'components/menu-button';\nimport Component from 'components/component';\nimport ListHeader from 'components/list-header';\nimport Scrollable from 'components/scrollable';\nimport React, {PropTypes} from 'react';\n\nimport styles from './menu.less';\n\nexport default class SettingsMenu extends Component {\n  static propTypes = {\n    onBack: PropTypes.func.isRequired,\n    pathname: PropTypes.string.isRequired\n  };\n\n  render () {\n    const {onBack, pathname} = this.props;\n    return (\n      <div>\n        <ListHeader\n          title='Settings'\n          onBack={onBack}\n        />\n        <Scrollable className={styles.list}>\n          <Button\n            link='/admin/settings'\n            label='General'\n            icon='nc-icon-outline ui-1_preferences-circle-rotate'\n            active={pathname === '/admin/settings'}\n          />\n          <Button\n            link='/admin/settings/email'\n            label='Email'\n            icon='nc-icon-outline ui-1_email-85'\n            active={pathname === '/admin/settings/email'}\n          />\n          <Button\n            link='/admin/settings/analytics'\n            label='Analytics'\n            icon='nc-icon-outline ui-1_analytics-88'\n            active={pathname === '/admin/settings/analytics'}\n          />\n          <Button\n            link='/admin/settings/data'\n            label='Import/Export'\n            icon='nc-icon-outline arrows-1_bold-direction'\n            active={pathname === '/admin/settings/data'}\n          />\n        </Scrollable>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/settings/components/menu.less",
    "content": ".list {\n  position: absolute;\n  top: 70px;\n  bottom: 0; left: 0; right: 0;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/settings/menu.js",
    "content": "import * as adminMenuActions from 'actions/admin-menu';\n\nimport bind from 'decorators/bind';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport Menu from './components/menu';\n\n@connect(\n  (state) => ({\n    pathname: state.router.location.pathname\n  }),\n  (dispatch) => bindActionCreators(adminMenuActions, dispatch)\n)\nexport default class SettingsMenuContainer extends Component {\n  static propTypes = {\n    closeAdminMenu: PropTypes.func.isRequired,\n    openAdminMenu: PropTypes.func.isRequired,\n    pathname: PropTypes.string.isRequired\n  };\n\n  componentDidMount () {\n    this.props.openAdminMenu();\n  }\n\n  @bind\n  onBack () {\n    this.props.closeAdminMenu();\n  }\n\n  render () {\n    const {pathname} = this.props;\n    return (\n      <Menu\n        onBack={this.onBack}\n        pathname={pathname}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/settings/screens/analytics/components/analytics.jsx",
    "content": "import Component from 'components/component';\nimport OptionsList from 'components/options-list';\nimport SettingsContent from 'components/settings-content';\nimport React, {PropTypes} from 'react';\n\nexport default class AnalyticsSettings extends Component {\n  static propTypes = {\n    options: PropTypes.array.isRequired\n  };\n\n  render () {\n    const {options} = this.props;\n    return (\n      <div>\n        <SettingsContent>\n          <OptionsList options={options} values={{}} white />\n        </SettingsContent>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/settings/screens/analytics/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport AnalyticsSettings from './components/analytics';\n\nconst options = [\n  {\n    label: 'Google analytics tracking ID',\n    type: 'String',\n    id: 'googleAnalytics',\n    props: {\n      placeholder: 'UA-XXXXX-Y'\n    }\n  }\n];\n\nexport default class AnalyticsSettingsContainer extends Component {\n  static propTypes = {};\n\n  render () {\n    return (\n      <AnalyticsSettings options={options} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/settings/screens/data/components/data.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nexport default class DataSettings extends Component {\n  static propTypes = {};\n\n  render () {\n    return (\n      <div>Data Settings</div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/settings/screens/data/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport DataSettings from './components/data';\n\nexport default class DataSettingsContainer extends Component {\n  static propTypes = {};\n\n  render () {\n    return (\n      <DataSettings />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/settings/screens/email/components/email.jsx",
    "content": "import Component from 'components/component';\nimport OptionsList from 'components/options-list';\nimport SettingsContent from 'components/settings-content';\nimport React, {PropTypes} from 'react';\n\nexport default class EmailSettings extends Component {\n  static propTypes = {\n    options: PropTypes.array.isRequired\n  };\n\n  render () {\n    const {options} = this.props;\n    return (\n      <div>\n        <SettingsContent>\n          <OptionsList options={options} values={{}} white />\n        </SettingsContent>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/settings/screens/email/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport EmailSettings from './components/email';\n\nconst options = [\n  {\n    label: 'Mail service',\n    type: 'Select',\n    id: 'mailService',\n    props: {\n      values: [\n        '1und1',\n        'AOL',\n        'DebugMail.io',\n        'DynectEmail',\n        'FastMail',\n        'GandiMail',\n        'Gmail',\n        'Godaddy',\n        'GodaddyAsia',\n        'GodaddyEurope',\n        'hot.ee',\n        'Hotmail',\n        'iCloud',\n        'mail.ee',\n        'Mail.ru',\n        'Mailgun',\n        'Mailjet',\n        'Mandrill',\n        'Naver',\n        'Postmark',\n        'QQ',\n        'QQex',\n        'SendCloud',\n        'SendGrid',\n        'SES',\n        'Sparkpost',\n        'Yahoo',\n        'Yandex',\n        'Zoho'\n      ]\n    }\n  },\n  {\n    label: 'Mail user/email',\n    type: 'String',\n    id: 'mailUser'\n  },\n  {\n    label: 'Mail user password',\n    type: 'String',\n    id: 'mailPass',\n    props: {\n      password: true\n    }\n  },\n  {\n    label: 'Send emails to',\n    type: 'String',\n    id: 'mailTo'\n  }\n];\n\nexport default class EmailSettingsContainer extends Component {\n  static propTypes = {};\n\n  render () {\n    return (\n      <EmailSettings options={options} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/settings/screens/general/components/general.jsx",
    "content": "import Component from 'components/component';\nimport OptionsList from 'components/options-list';\nimport SettingsContent from 'components/settings-content';\nimport React, {PropTypes} from 'react';\n\nexport default class GeneralSettings extends Component {\n  static propTypes = {\n    options: PropTypes.array.isRequired\n  };\n\n  render () {\n    const {options} = this.props;\n    return (\n      <div>\n        <SettingsContent>\n          <OptionsList options={options} values={{}} white />\n        </SettingsContent>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/settings/screens/general/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport GeneralSettings from './components/general';\n\nconst options = [\n  {\n    label: 'Site Title',\n    type: 'String',\n    id: 'title',\n    default: ''\n  },\n  // {\n  //   label: 'Frontpage',\n  //   type: 'PagePicker',\n  //   id: 'frontpage'\n  // },\n  // {\n  //   label: 'Favicon',\n  //   type: 'Image',\n  //   id: 'favicon',\n  //   props: {\n  //     width: 50,\n  //     height: 50,\n  //     type: 'favicon'\n  //   }\n  // },\n  // {\n  //   label: 'Webclip',\n  //   type: 'Image',\n  //   id: 'webclip',\n  //   props: {\n  //     width: 114,\n  //     height: 114\n  //   }\n  // }\n];\n\nexport default class GeneralSettingsContainer extends Component {\n  static propTypes = {};\n\n  render () {\n    return (\n      <GeneralSettings options={options} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/settings/shared/components/settings-content/index.jsx",
    "content": "import Component from 'components/component';\nimport Scrollable from 'components/scrollable';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class SettingsContent extends Component {\n  static propTypes = {\n    children: PropTypes.node.isRequired\n  };\n\n  render () {\n    return (\n      <Scrollable className={styles.root}>\n        <div className={styles.content}>\n          {this.props.children}\n        </div>\n      </Scrollable>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/settings/shared/components/settings-content/index.less",
    "content": ".root {\n  position: absolute;\n  top: 0px;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.content {\n  padding: 50px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/users/components/entry.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport getGravatarImage from 'helpers/get-gravatar-image';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './entry.less';\n\nexport default class Entry extends Component {\n  static fragments = {\n    user: {\n      _id: 1,\n      name: 1,\n      email: 1\n    }\n  };\n\n  static propTypes = {\n    user: PropTypes.object.isRequired,\n    onDelete: PropTypes.func.isRequired\n  };\n\n  @bind\n  onDeleteClick () {\n    const {user, onDelete} = this.props;\n    onDelete(user);\n  }\n\n  render () {\n    const {user} = this.props;\n    const url = getGravatarImage(user.email, 125);\n\n    return (\n      <div className={styles.root}>\n        <div className={styles.user}>\n          <img src={url} role='presentation' />\n        </div>\n        <div className={styles.info}>\n          <div className={styles.title}>{user.name}</div>\n          <div className={styles.value}>{user.email}</div>\n        </div>\n        <div className={styles.actions}>\n          <button className={cx(styles.button, styles.remove)} onClick={this.onDeleteClick}>Delete User</button>\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/users/components/entry.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  width: 21.25%;\n  margin-right: 5%;\n  display: inline-block;\n  vertical-align: top;\n  margin-bottom: 60px;\n  border: 1px solid transparent;\n  text-align: center;\n}\n\n@media screen and (min-width: 1501px) {\n  .root {\n    width: 16%;\n    &:nth-child(5n+5) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 1500px) and (min-width: 1101px) {\n  .root {\n    &:nth-child(4n+4) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 1100px) and (min-width: 851px) {\n  .root {\n    width: 30%;\n    &:nth-child(3n+3) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 850px) and (min-width: 751px) {\n  .root {\n    width: 45%;\n    margin-right: 10%;\n    &:nth-child(2n+2) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 750px) {\n  .root {\n    width: 100%;\n    margin-right: 0%;\n  }\n}\n\n.user {\n  width: 125px;\n  height: 125px;\n  display: inline-block;\n  vertical-align: top;\n  border-radius: 50%;\n  overflow: hidden;\n  margin-top: 10px;\n}\n\n.info {\n  padding: 15px;\n  height: 65px;\n  text-align: center;\n}\n\n.title {\n  color: @adminTextHighlight;\n  font-size: 16px;\n  line-height: 19px;\n}\n\n.value {\n  color: @adminText;\n  font-size: 14px;\n  font-weight: 300;\n}\n\n.actions {\n  visibility: hidden;\n  border-top: 1px solid @adminBorders;\n}\n\n.button {\n  height: 39px;\n  line-height: 39px;\n  font-size: 12px;\n  text-transform: uppercase;\n  color: @adminText;\n}\n\n.remove {\n  color: @alert;\n}\n\n.root:hover {\n  border: 1px solid @adminBorders;\n  .actions {\n    visibility: visible;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/users/components/list.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport Entry from './entry';\n\nexport default class List extends Component {\n  static fragments = {\n    users: Entry.fragments.user\n  };\n\n  static propTypes = {\n    users: PropTypes.array.isRequired,\n    onDelete: PropTypes.func.isRequired,\n    search: PropTypes.string.isRequired\n  };\n\n  render () {\n    const {users} = this.props;\n    return (\n      <div>\n        {users.map(this.renderEntry, this)}\n      </div>\n    );\n  }\n\n  renderEntry (user) {\n    const {onDelete, search} = this.props;\n    const inSearch = !search || user.name.toLowerCase().indexOf(search.toLowerCase()) !== -1;\n    if (inSearch) {\n      return (\n        <Entry user={user} onDelete={onDelete} key={user._id} />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/users/components/new/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {addUser} from 'actions/users';\n\nimport New from './new';\n\nexport default class NewUserContainer extends Component {\n  static propTypes = {\n    fragments: PropTypes.object.isRequired,\n    onClose: PropTypes.func.isRequired\n  };\n\n  static contextTypes = {\n    store: PropTypes.object.isRequired\n  };\n\n  getInitState () {\n    return {\n      username: '',\n      password: '',\n      email: '',\n      name: '',\n      loading: false\n    };\n  }\n\n  submit () {\n    if (!this.state.loading) {\n      this.setState({\n        loading: true\n      }, () => {\n        const {store} = this.context;\n        const {fragments, onClose} = this.props;\n        const {username, password, email, name} = this.state;\n        store.dispatch(addUser(fragments, {username, password, email, name}, true)).then(() => {\n          onClose && onClose();\n        });\n      });\n    }\n  }\n\n  changeField (field, value) {\n    this.setState({\n      [field]: value\n    });\n  }\n\n  render () {\n    return (\n      <New\n        {...this.state}\n        submit={::this.submit}\n        changeField={::this.changeField}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/users/components/new/new.jsx",
    "content": "import Component from 'components/component';\nimport ModalInput from 'components/modal-input';\nimport ModalNew from 'components/modal-new';\nimport React, {PropTypes} from 'react';\n\nexport default class NewUser extends Component {\n  static propTypes = {\n    username: PropTypes.string.isRequired,\n    password: PropTypes.string.isRequired,\n    name: PropTypes.string.isRequired,\n    email: PropTypes.string.isRequired,\n    changeField: PropTypes.func.isRequired,\n    submit: PropTypes.func.isRequired,\n    loading: PropTypes.bool\n  };\n\n  changeField (field, value) {\n    this.props.changeField(field, value);\n  }\n\n  render () {\n    const {username, password, name, email, submit, loading} = this.props;\n    return (\n      <ModalNew submit={submit} loading={loading}>\n        <ModalInput\n          focus\n          value={username}\n          placeholder='Username'\n          onChange={this.changeField.bind(this, 'username')}\n        />\n        <ModalInput\n          focus\n          value={password}\n          type='password'\n          placeholder='Password'\n          onChange={this.changeField.bind(this, 'password')}\n        />\n        <ModalInput\n          focus\n          value={name}\n          placeholder='Name'\n          onChange={this.changeField.bind(this, 'name')}\n        />\n        <ModalInput\n          focus\n          value={email}\n          placeholder='Email'\n          onChange={this.changeField.bind(this, 'email')}\n        />\n      </ModalNew>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/users/components/users.jsx",
    "content": "import Component from 'components/component';\nimport Content from 'components/content';\nimport ContentDisplays from 'components/content-displays';\nimport ContentHeader from 'components/content-header';\nimport ContentHeaderActions from 'components/content-header-actions';\nimport ContentNew from 'components/content-new';\nimport ContentSearch from 'components/content-search';\nimport Modal from 'components/modal';\nimport ModalDelete from 'components/modal-delete';\nimport React, {PropTypes} from 'react';\n\nimport List from './list';\nimport New from './new';\n\nexport default class Users extends Component {\n  static fragments = List.fragments;\n\n  static propTypes = {\n    users: PropTypes.array.isRequired,\n    openNew: PropTypes.func.isRequired,\n    newOpened: PropTypes.bool.isRequired,\n    closeNew: PropTypes.func.isRequired,\n    onDelete: PropTypes.func.isRequired,\n    deleteConfirm: PropTypes.bool,\n    deleteConfirmUser: PropTypes.object,\n    cancelDelete: PropTypes.func.isRequired,\n    confirmDelete: PropTypes.func.isRequired,\n    deletingUser: PropTypes.bool,\n    search: PropTypes.string.isRequired,\n    searchChange: PropTypes.func.isRequired\n  };\n\n  render () {\n    const {users, openNew, onDelete, search, searchChange} = this.props;\n\n    return (\n      <div>\n        <ContentHeader>\n          <ContentSearch value={search} onChange={searchChange} />\n          <ContentHeaderActions>\n            <ContentDisplays display='grid' />\n            <ContentNew onClick={openNew}>Add new user</ContentNew>\n          </ContentHeaderActions>\n        </ContentHeader>\n        <Content>\n          <List users={users} onDelete={onDelete} search={search} />\n        </Content>\n        {this.renderNew()}\n        {this.renderDeleteConfirm()}\n      </div>\n    );\n  }\n\n  renderNew () {\n    const {newOpened, closeNew} = this.props;\n    if (newOpened) {\n      return (\n        <Modal small subTitle='New User' title='Make the introductions!' onClose={closeNew}>\n          <New fragments={Users.fragments} onClose={closeNew} />\n        </Modal>\n      );\n    }\n  }\n\n  renderDeleteConfirm () {\n    const {deleteConfirm, deleteConfirmUser, cancelDelete, confirmDelete, deletingUser} = this.props;\n    if (deleteConfirm) {\n      return (\n        <ModalDelete\n          title={`Are you sure you want to remove the user \"${deleteConfirmUser.name}\"?`}\n          cancel={cancelDelete}\n          submit={confirmDelete}\n          loading={deletingUser}\n        />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/screens/users/index.js",
    "content": "import bind from 'decorators/bind';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {removeUser} from 'actions/users';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport Users from './components/users.jsx';\n\n@dataConnect(\n  () => ({}),\n  (dispatch) => bindActionCreators({removeUser}, dispatch),\n  () => ({\n    fragments: Users.fragments,\n    mutations: {\n      addUser: [{\n        type: 'APPEND',\n        field: 'users'\n      }]\n    }\n  })\n)\nexport default class UsersContainer extends Component {\n  static propTypes = {\n    users: PropTypes.array.isRequired,\n    location: PropTypes.object.isRequired,\n    removeUser: PropTypes.func.isRequired\n  };\n\n  static defaultProps = {\n    users: []\n  };\n\n  getInitState () {\n    return {\n      newOpened: false,\n      search: ''\n    };\n  }\n\n  @bind\n  openNew () {\n    this.setState({\n      newOpened: true\n    });\n  }\n\n  @bind\n  closeNew () {\n    this.setState({\n      newOpened: false\n    });\n  }\n\n  @bind\n  searchChange (search) {\n    this.setState({\n      search\n    });\n  }\n\n  @bind\n  onDelete (user) {\n    this.setState({\n      deleteConfirm: true,\n      deleteConfirmUser: user\n    });\n  }\n\n  @bind\n  cancelDelete () {\n    this.setState({\n      deleteConfirm: false,\n      deleteConfirmUser: null,\n      deletingUser: false\n    });\n  }\n\n  @bind\n  confirmDelete () {\n    const {deleteConfirmUser} = this.state;\n    this.setState({\n      deletingUser: true\n    });\n    this.props.removeUser(deleteConfirmUser._id).then(() => {\n      this.cancelDelete();\n    });\n  }\n\n  render () {\n    const {users} = this.props;\n    return (\n      <Users\n        users={users}\n        {...this.state}\n        openNew={this.openNew}\n        closeNew={this.closeNew}\n        onDelete={this.onDelete}\n        cancelDelete={this.cancelDelete}\n        confirmDelete={this.confirmDelete}\n        searchChange={this.searchChange}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/balloon/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport Portal from 'components/portal';\nimport Stick from 'components/stick';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class Balloon extends Component {\n  static propTypes = {\n    children: PropTypes.node.isRequired,\n    element: PropTypes.any.isRequired,\n    stickOptions: PropTypes.object,\n    white: PropTypes.bool,\n    small: PropTypes.bool,\n    unpadded: PropTypes.bool\n  };\n\n  render () {\n    const {stickOptions, white, small, unpadded} = this.props;\n    const stickProps = Object.assign({\n      verticalPosition: 'bottom',\n      horizontalPosition: 'left',\n      transition: 'slideUpIn',\n      horizontalOffset: -9\n    }, stickOptions);\n\n    return (\n      <Portal>\n        <Stick element={this.props.element} {...stickProps}>\n          <div className={cx(\n            styles.balloon,\n            white && styles.white,\n            small && styles.small,\n            unpadded && styles.unpadded\n          )}\n          >\n            <span className={styles.triangle} />\n            <div>\n              {this.props.children}\n            </div>\n          </div>\n        </Stick>\n      </Portal>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/balloon/index.less",
    "content": ".balloon {\n  position: relative;\n  width: 270px;\n  padding: 11px;\n  border-radius: 4px;\n  background-color: #ffffff;\n  z-index: 1;\n\n  -webkit-box-shadow: 0px 5px 25px 0px rgba(0,0,0,0.5);\n  -moz-box-shadow: 0px 5px 25px 0px rgba(0,0,0,0.5);\n  box-shadow: 0px 5px 25px 0px rgba(0,0,0,0.5);\n\n  transform: translateY(3px);\n\n  &.white {\n    -webkit-box-shadow: 0px 5px 20px 0px rgba(0,0,0,0.2);\n    -moz-box-shadow: 0px 5px 20px 0px rgba(0,0,0,0.2);\n    box-shadow: 0px 5px 20px 0px rgba(0,0,0,0.2);\n  }\n\n  &.small {\n    width: 200px;\n  }\n\n  &.unpadded {\n    padding: 11px 0;\n  }\n}\n\n.triangle {\n  position: absolute;\n  background-color: #ffffff;\n  text-align: left;\n  display: inline-block;\n  top: -9px;\n  left: 50%;\n\n  transform: translateX(-5px) rotate(-60deg) skewX(-30deg) scale(1,.866);\n\n  &.right {\n    left: auto;\n    right: 100px;\n  }\n\n  &:before, &:after {\n    content: '';\n    position: absolute;\n    background-color: inherit;\n  }\n\n  &, &:before, &:after {\n    width:  10px;\n    height: 10px;\n    border-top-right-radius: 40%;\n  }\n\n  &:before {\n    transform: rotate(-135deg) skewX(-45deg) scale(1.414,.707) translate(0,-50%);\n  }\n\n  &:after {\n    transform: rotate(135deg) skewY(-45deg) scale(.707,1.414) translate(50%);\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content/index.jsx",
    "content": "import Component from 'components/component';\nimport Scrollable from 'components/scrollable';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class Content extends Component {\n  static propTypes = {\n    children: PropTypes.node.isRequired\n  };\n\n  render () {\n    return (\n      <Scrollable className={styles.root}>\n        <div className={styles.content}>\n          {this.props.children}\n        </div>\n      </Scrollable>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content/index.less",
    "content": ".root {\n  position: absolute;\n  top: 70px;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.content {\n  padding: 50px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content-displays/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class ContentDisplays extends Component {\n  static propTypes = {\n    display: PropTypes.oneOf(['grid', 'list']).isRequired,\n    onChange: PropTypes.func.isRequired\n  };\n\n  init () {\n    this.onGridClick = this.onClick.bind(this, 'grid');\n    this.onListClick = this.onClick.bind(this, 'list');\n  }\n\n  onClick (to) {\n    this.props.onChange(to);\n  }\n\n  render () {\n    const {display} = this.props;\n    return (\n      <div className={styles.root}>\n        <button\n          className={cx(styles.button, display === 'grid' && styles.active)}\n          onClick={this.onGridClick}\n        >\n          <i className='nc-icon-outline media-1_grid'></i>\n        </button>\n        <button\n          className={cx(styles.button, display === 'list' && styles.active)}\n          onClick={this.onListClick}\n        >\n          <i className='nc-icon-outline design_bullet-list-69'></i>\n        </button>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content-displays/index.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  display: inline-block;\n  vertical-align: top;\n  padding: 0 15px;\n}\n\n.button {\n  display: inline-block;\n  vertical-align: top;\n  width: 30px;\n  height: 30px;\n  margin: 0 5px;\n  :global i {\n    font-size: 22px;\n    line-height: 30px;\n    color: @adminText;\n  }\n}\n\n.active {\n  :global i {\n    color: @primary;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content-header/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class ContentHeader extends Component {\n  static propTypes = {\n    children: PropTypes.node.isRequired,\n    smallPadding: PropTypes.bool\n  };\n\n  static defaultProps = {\n    smallPadding: false\n  };\n\n  render () {\n    const {smallPadding} = this.props;\n    return (\n      <div className={cx(styles.root, smallPadding && styles.smallPadding)}>\n        {this.props.children}\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content-header/index.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  height: 70px;\n  border-bottom: 1px solid @adminBorders;\n  padding: 20px 20px;\n  line-height: 30px;\n}\n\n.smallPadding {\n  padding: 10px 20px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content-header-actions/index.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class ContentHeaderActions extends Component {\n  static propTypes = {\n    children: PropTypes.node.isRequired\n  };\n\n  render () {\n    return (\n      <div className={styles.root}>\n        {this.props.children}\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content-header-actions/index.less",
    "content": ".root {\n  float: right;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content-loading/index.jsx",
    "content": "import Animate from 'components/animate';\nimport Component from 'components/component';\nimport React from 'react';\nimport Spinner from 'components/spinner';\n\nimport styles from './index.less';\n\nexport default class ContentLoading extends Component {\n  render () {\n    return (\n      <div className={styles.root}>\n        <div className={styles.center}>\n          <Animate>\n            <Spinner />\n          </Animate>\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content-loading/index.less",
    "content": ".root {\n  position: absolute;\n  top: 0; left: 0; right: 0; bottom: 0;\n}\n\n.center {\n  display: inline-block;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content-new/index.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class ContentNew extends Component {\n  static propTypes = {\n    children: PropTypes.node.isRequired,\n    onClick: PropTypes.func.isRequired\n  };\n\n  render () {\n    const {children, onClick} = this.props;\n    return (\n      <button className={styles.button} onClick={onClick}>\n        {children}\n      </button>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content-new/index.less",
    "content": "@import '~styles/colors.less';\n\n.button {\n  display: inline-block;\n  vertical-align: top;\n  padding: 0 20px;\n  color: @adminText;\n  text-transform: uppercase;\n  font-size: 12px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content-search/index.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class ContentSearch extends Component {\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    onChange: PropTypes.func.isRequired\n  };\n\n  onChange (event) {\n    this.props.onChange(event.target.value);\n  }\n\n  render () {\n    const {value} = this.props;\n    return (\n      <label className={styles.root}>\n        <i className='nc-icon-outline ui-1_zoom'></i>\n        <input\n          className={styles.input}\n          type='text'\n          value={value}\n          placeholder='Search'\n          onChange={::this.onChange}\n        />\n      </label>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content-search/index.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  display: inline-block;\n  vertical-align: top;\n\n  :global i {\n    font-size: 24px;\n    line-height: 30px;\n    color: @adminTextSub;\n    margin-right: 10px;\n  }\n}\n\n.input {\n  display: inline-block;\n  vertical-align: top;\n  color: @adminTextSub;\n  font-size: 20px;\n  line-height: 30px;\n  font-weight: 300;\n  background-color: transparent;\n  border: 0;\n  outline: 0;\n  padding: 0;\n  margin: 0;\n  width: 200px;\n\n  &::-webkit-input-placeholder {\n    color: @adminTextSub;\n  }\n  &:-moz-placeholder {\n    color: @adminTextSub;\n  }\n  &::-moz-placeholder {\n    color: @adminTextSub;\n  }\n  &:-ms-input-placeholder {\n    color: @adminTextSub;\n  }\n  &::-ms-input-placeholder {\n    color: @adminTextSub;\n  }\n  &:placeholder-shown {\n    color: @adminTextSub;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content-sidebar/index.jsx",
    "content": "import velocity from 'velocity-animate';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class ContentSidebar extends Component {\n  static propTypes = {\n    children: PropTypes.node.isRequired,\n    opened: PropTypes.bool.isRequired\n  };\n\n  componentWillReceiveProps (nextProps) {\n    if (this.props.opened !== nextProps.opened) {\n      const config = {\n        duration: 800,\n        display: null,\n        easing: 'easeOutExpo'\n      };\n      if (nextProps.opened) {\n        velocity(this.refs.root, {right: '0px'}, config);\n      } else {\n        velocity(this.refs.root, {right: '-290px'}, config);\n      }\n    }\n  }\n\n  render () {\n    return (\n      <div className={styles.root} ref='root'>\n        {this.props.children}\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/content-sidebar/index.less",
    "content": "@import '~styles/colors.less';\n@import '~styles/sizes.less';\n\n.root {\n  position: absolute;\n  border-top: 1px solid @adminBorders;\n  border-left: 1px solid @adminBorders;\n  top: -1px; right: -@menuWidth; bottom: 0;\n  width: @menuWidth;\n  background-color: #ffffff;\n  z-index: 11;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/editable-title/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class EditableTitle extends Component {\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    sub: PropTypes.bool,\n    onSubmit: PropTypes.func.isRequired\n  };\n\n  getInitState () {\n    return {\n      editing: false\n    };\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (this.state.editing && nextProps.value !== this.props.value) {\n      this.setState({\n        editing: false\n      });\n    }\n  }\n\n  componentDidUpdate (prevProps, prevState) {\n    if (!prevState.editing && this.state.editing) {\n      const input = this.refs.input;\n\n      if (input) {\n        input.focus && input.focus();\n        const len = this.state.editValue.length;\n        input.setSelectionRange && input.setSelectionRange(len, len);\n      }\n    }\n  }\n\n  onClick () {\n    this.setState({\n      editing: true,\n      editValue: this.props.value\n    });\n  }\n\n  onChange (event) {\n    this.setState({\n      editValue: event.target.value\n    });\n  }\n\n  cancel (event) {\n    event.preventDefault();\n    this.setState({\n      editing: false,\n      editValue: ''\n    });\n  }\n\n  onSubmit (event) {\n    event.preventDefault();\n    this.props\n      .onSubmit(this.state.editValue)\n      .then(() => {\n        this.setState({\n          editing: false\n        });\n      });\n  }\n\n  render () {\n    const {sub} = this.props;\n    return (\n      <div className={sub && styles.sub}>\n        {this.renderContent()}\n      </div>\n    );\n  }\n\n  renderContent () {\n    const {editing} = this.state;\n    const {value} = this.props;\n    let result;\n\n    if (!editing) {\n      result = (\n        <button className={styles.editButton} onClick={::this.onClick}>\n          <div className={styles.title}>{value}</div>\n          <i className='nc-icon-outline ui-1_edit-74'></i>\n        </button>\n      );\n    } else {\n      result = (\n        <form onSubmit={::this.onSubmit}>\n          <input\n            value={this.state.editValue}\n            onChange={::this.onChange}\n            type='text'\n            placeholder={value}\n            className={cx(styles.title, styles.input)}\n            ref='input'\n          />\n          <button className={cx(styles.formButton, styles.confirmButton)}>Ok</button>\n          <button className={cx(styles.formButton, styles.cancelButton)} onClick={::this.cancel}>Cancel</button>\n        </form>\n      );\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/editable-title/index.less",
    "content": "@import '~styles/colors.less';\n\n.title {\n  display: inline-block;\n\n  font-weight: 300;\n  font-size: 18px;\n  line-height: 26px;\n  height: 26px;\n  color: @adminTextHighlight;\n}\n\n.editButton {\n  :global i {\n    color: @adminText;\n    font-size: 16px;\n    line-height: 26px;\n    margin-left: 10px;\n    opacity: 0;\n    transition: all 0.1s ease-out;\n  }\n\n  &:hover :global i {\n    opacity: 1;\n  }\n}\n\n.input {\n  display: inline-block;\n  vertical-align: top;\n  border: 0;\n  outline: 0;\n  padding: 0;\n  width: 350px;\n  margin-right: 10px;\n}\n\n.formButton {\n  display: inline-block;\n  vertical-align: top;\n  text-transform: uppercase;\n  font-size: 11px;\n  margin-left: 10px;\n  line-height: 26px;\n  height: 26px;\n}\n\n.confirmButton {\n  color: @primary;\n}\n\n.cancelButton {\n  color: @adminText;\n\n  &:hover {\n    color: @alert;\n  }\n}\n\n.sub {\n  .title {\n    font-size: 12px;\n    line-height: 25px;\n    height: 25px;\n    color: @adminText;\n  }\n  .editButton {\n    :global i {\n      font-size: 13px;\n      line-height: 25px;\n    }\n  }\n  .formButton {\n    line-height: 25px;\n    height: 25px;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/border/index.jsx",
    "content": "import cx from 'classnames';\nimport BorderStyle from 'components/input-options/border-style';\nimport ColorPicker from 'components/input-options/color';\nimport Component from 'components/component';\nimport NumberInput from 'components/input-options/number';\nimport React from 'react';\n\nimport styles from './index.less';\n\nexport default class BorderPicker extends Component {\n  static propTypes = {\n    value: React.PropTypes.object.isRequired,\n    onChange: React.PropTypes.func.isRequired\n  };\n\n  getInitState () {\n    this.onWidhtChange = this.onInputChange.bind(this, 'width');\n    this.onColorChange = this.onInputChange.bind(this, 'color');\n    this.onStyleChange = this.onInputChange.bind(this, 'style');\n\n    return {\n      selected: 'center',\n      values: this.parseValue(this.props.value)\n    };\n  }\n\n  componentWillReceiveProps (nextProps) {\n    this.setState({\n      values: this.parseValue(nextProps.value)\n    });\n  }\n\n  onInputChange (id, value) {\n    if (this.state.selected === 'center') {\n      this.state.values.top[id] = value;\n      this.state.values.right = Object.assign({}, this.state.values.top);\n      this.state.values.bottom = Object.assign({}, this.state.values.top);\n      this.state.values.left = Object.assign({}, this.state.values.top);\n      this.state.values.equal = true;\n    } else {\n      this.state.values[this.state.selected][id] = value;\n    }\n    this.props.onChange(Object.assign({}, this.state.values));\n  }\n\n  parseValue (value) {\n    const result = {\n      top: {\n        style: 'solid',\n        width: 1,\n        color: {\n          value: '#000000',\n          opacity: 100\n        }\n      },\n      left: {\n        style: 'solid',\n        width: 1,\n        color: {\n          value: '#000000',\n          opacity: 100\n        }\n      },\n      right: {\n        style: 'solid',\n        width: 1,\n        color: {\n          value: '#000000',\n          opacity: 100\n        }\n      },\n      bottom: {\n        style: 'solid',\n        width: 1,\n        color: {\n          value: '#000000',\n          opacity: 100\n        }\n      },\n      equal: false\n    };\n\n    if (value) {\n      result.top = value.top || result.top;\n      result.left = value.left || result.left;\n      result.right = value.right || result.right;\n      result.bottom = value.bottom || result.bottom;\n    }\n\n    if (this.equal(result.top, result.right) &&\n        this.equal(result.top, result.bottom) &&\n        this.equal(result.top, result.left)) {\n      result.equal = true;\n    } else {\n      result.equal = false;\n    }\n\n    return result;\n  }\n\n  equal (comp1, comp2) {\n    return (\n      comp1.style === comp2.style &&\n      comp1.width === comp2.width &&\n      comp1.color.value === comp2.color.value &&\n      comp1.color.opacity === comp2.color.opacity\n    );\n  }\n\n  changeSelected (selected, event) {\n    event.preventDefault();\n    this.setState({\n      selected\n    });\n  }\n\n  render () {\n    const values = this.state.values;\n    let value = 0;\n    let inactive = false;\n\n    if (this.state.selected !== 'center') {\n      value = values[this.state.selected];\n    } else {\n      inactive = !values.equal;\n      value = values.top;\n\n      if (inactive) {\n        value.style = 'solid';\n      }\n    }\n\n    return (\n      <div>\n        <div className={styles.toggles}>\n          {this.renderToggleButton('top', !values.equal)}\n          {this.renderToggleButton('left', !values.equal)}\n          {this.renderToggleButton('right', !values.equal)}\n          {this.renderToggleButton('bottom', !values.equal)}\n          {this.renderToggleButton('center', values.equal)}\n        </div>\n        <NumberInput\n          className={styles.option}\n          small\n          value={value.width}\n          onChange={this.onWidhtChange}\n          inactive={inactive}\n        />\n        <ColorPicker\n          className={cx(styles.option, styles.colorPicker)}\n          value={value.color}\n          onChange={this.onColorChange}\n          side='right'\n        />\n        <BorderStyle\n          className={styles.borderStyle}\n          value={value.style}\n          onChange={this.onStyleChange}\n        />\n      </div>\n    );\n  }\n\n  renderToggleButton (pos, active) {\n    const changeSelected = this.changeSelected.bind(this, pos);\n    return (\n      <div\n        className={cx(\n          styles.toggle,\n          styles[pos],\n          this.state.selected === pos && styles.selected,\n          active && styles.active\n        )}\n        onClick={changeSelected}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/border/index.less",
    "content": "@import '~styles/colors.less';\n\n@total: 42px;\n@btnSize: 20px;\n@nonActive: #979797;\n\n.toggles {\n  display: inline-block;\n  vertical-align: top;\n}\n\n.toggles {\n  position: relative;\n  height: @total;\n  width: @total;\n}\n\n.option {\n  display: inline-block;\n  vertical-align: right;\n  margin-left: 10px;\n}\n.colorPicker {\n  width: 110px;\n}\n\n.borderStyle {\n  margin-top: 15px;\n  text-align: right;\n}\n\n// Toggle buttons\n.toggle {\n  position: absolute;\n  text-align: center;\n  display: inline-block;\n  cursor: pointer;\n  width: @btnSize;\n  height: @btnSize;\n\n  @center: 11px;\n\n  &.top {\n    left: @center;\n    top: 0;\n    border-top: 2px solid @nonActive;\n  }\n  &.left {\n    left: 0;\n    top: @center;\n    border-left: 2px solid @nonActive;\n  }\n  &.center {\n    left: @center + 3px;\n    top: @center + 3px;\n    width: 14px;\n    height: 14px;\n    border: 2px solid @nonActive;\n  }\n  &.right {\n    right: 0;\n    top: @center;\n    border-right: 2px solid @nonActive;\n  }\n  &.bottom {\n    left: @center;\n    bottom: 0;\n    border-bottom: 2px solid @nonActive;\n  }\n\n  &.selected {\n    border-color: @primary;\n  }\n  &.active {\n    border-color: #ffffff;\n  }\n  &.selected.active {\n    border-color: @primary;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/border-style/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class BorderStyle extends Component {\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    onChange: PropTypes.func.isRequired,\n    className: PropTypes.string\n  };\n\n  onClick (type, event) {\n    event.preventDefault();\n    this.props.onChange(type);\n  }\n\n  render () {\n    return (\n      <div className={this.props.className}>\n        {this.renderOption('solid')}\n        {this.renderOption('dashed')}\n        {this.renderOption('dotted')}\n        {this.renderOption('double')}\n      </div>\n    );\n  }\n\n  renderOption (type) {\n    const {value} = this.props;\n    const onClick = this.onClick.bind(this, type);\n    return (\n      <div\n        className={cx(styles.option, styles[type], value === type && styles.active)}\n        onClick={onClick}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/border-style/index.less",
    "content": "@import '~styles/colors.less';\n@btnsSize: 16px;\n@btnsSpacing: 14px;\n@nonActive: #979797;\n@active: #ffffff;\n\n.option {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  width: @btnsSize;\n  height: @btnsSize;\n  margin-right: @btnsSpacing;\n  border: 1px solid @chromeBordersColor;\n  cursor: pointer;\n  text-align: center;\n\n  &:last-child {\n    margin-right: 0;\n  }\n\n  &:hover {\n    border-color: @active;\n  }\n}\n\n.dashed {\n  border-style: dashed;\n}\n\n.dotted {\n  border-style: dotted;\n}\n\n.double {\n  border-width: 3px;\n  border-style: double;\n}\n\n.active {\n  border-color: @active;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/box-shadow/edit.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nexport default class Edit extends Component {\n  static propTypes = {\n    shadow: PropTypes.object.isRequired,\n    changeShadow: PropTypes.func.isRequired,\n    OptionsList: PropTypes.object.isRequired\n  };\n\n  static options = [\n    {\n      type: 'Columns',\n      options: [\n        {\n          label: 'Color',\n          type: 'Color',\n          id: 'color'\n        },\n        {\n          label: 'Blur',\n          type: 'Pixels',\n          id: 'blur'\n        }\n      ]\n    },\n    {\n      type: 'Columns',\n      options: [\n        {\n          label: 'X',\n          type: 'Pixels',\n          id: 'x'\n        },\n        {\n          label: 'Y',\n          type: 'Pixels',\n          id: 'y'\n        }\n      ]\n    },\n    {\n      type: 'Columns',\n      options: [\n        {\n          label: 'Spread',\n          type: 'Pixels',\n          id: 'spread'\n        },\n        {\n          label: 'Inset/Outset',\n          type: 'ShadowPosition',\n          id: 'type'\n        }\n      ]\n    }\n  ];\n\n  render () {\n    const {shadow, OptionsList, changeShadow} = this.props;\n\n    return (\n      <div>\n        <OptionsList white tight options={Edit.options} values={shadow} onChange={changeShadow} />\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/box-shadow/index.jsx",
    "content": "import cloneDeep from 'lodash.clonedeep';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\nimport Shadow from './shadow';\n\nexport default class BoxShadow extends Component {\n  static propTypes = {\n    value: PropTypes.array.isRequired,\n    onChange: PropTypes.func.isRequired\n  };\n\n  static defaultProps = {\n    value: []\n  };\n\n  getInitState () {\n    return {\n      editingShadow: false\n    };\n  }\n\n  addNewClick () {\n    this.props.onChange([...this.props.value, {\n      type: 'outset',\n      color: '#000000',\n      spread: '2px',\n      blur: '2px',\n      x: '2px',\n      y: '2px'\n    }]);\n    this.setState({\n      editingShadow: this.props.value.length\n    });\n  }\n\n  changeShadow (key, value) {\n    if (this.state.editingShadow !== false) {\n      const newValue = cloneDeep(this.props.value);\n      newValue[this.state.editingShadow][key] = value;\n      this.props.onChange(newValue);\n    }\n  }\n\n  selectShadow (index) {\n    if (this.state.editingShadow === index) {\n      this.setState({\n        editingShadow: false\n      });\n    } else {\n      this.setState({\n        editingShadow: index\n      });\n    }\n  }\n\n  removeShadow (index) {\n    const newValue = cloneDeep(this.props.value);\n    newValue.splice(index, 1);\n    this.props.onChange(newValue);\n  }\n\n  render () {\n    return (\n      <div>\n        {this.props.value.map(this.renderEntry, this)}\n        <div className={styles.addButton} onClick={::this.addNewClick}>Add new shadow</div>\n      </div>\n    );\n  }\n\n  renderEntry (shadow, index) {\n    return (\n      <Shadow\n        index={index}\n        editing={this.state.editingShadow === index}\n        shadow={shadow}\n        changeShadow={::this.changeShadow}\n        selectShadow={::this.selectShadow}\n        removeShadow={::this.removeShadow}\n        {...this.props}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/box-shadow/index.less",
    "content": "@import '~styles/colors.less';\n\n.addButton {\n  font-size: 10px;\n  color: #dbdbdb;\n  cursor: pointer;\n  line-height: 20px;\n  text-align: center;\n  text-transform: uppercase;\n  margin-top: 15px;\n\n  &:hover {\n    color: @primary;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/box-shadow/shadow.jsx",
    "content": "import Balloon from 'components/balloon';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {getColor} from 'helpers/colors';\n\nimport styles from './shadow.less';\nimport Edit from './edit';\n\nexport default class Shadow extends Component {\n  static propTypes = {\n    shadow: PropTypes.object.isRequired,\n    editing: PropTypes.bool.isRequired,\n    new: PropTypes.bool.isRequired,\n    selectShadow: PropTypes.func.isRequired,\n    removeShadow: PropTypes.func.isRequired,\n    index: PropTypes.number.isRequired\n  };\n\n  onClick () {\n    this.props.selectShadow(this.props.index);\n  }\n\n  onRemove (event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.props.removeShadow(this.props.index);\n  }\n\n  render () {\n    const {shadow} = this.props;\n    const colorLabel = getColor(shadow.color).label;\n\n    return (\n      <div className={styles.root}>\n        <div className={styles.content} onClick={::this.onClick} ref={(ref) => {\n          this.ref = ref;\n          !this.state.ready && this.setState({ready: true});\n        }}\n        >\n          <div>\n            {`${shadow.type}, ${colorLabel}, ${shadow.x} ${shadow.y}, ${shadow.blur}, ${shadow.spread}`}\n          </div>\n          <div className={styles.removeButton} onClick={::this.onRemove}>\n            <i className='nc-icon-mini ui-1_trash-simple'></i>\n          </div>\n        </div>\n        {this.renderEditing()}\n      </div>\n    );\n  }\n\n  renderEditing () {\n    if (this.props.editing && this.state.ready) {\n      return (\n        <Balloon element={this.ref}>\n          <Edit {...this.props} />\n        </Balloon>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/box-shadow/shadow.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  position: relative;\n}\n\n.content {\n  position: relative;\n  border: 1px solid @chromeBordersColor;\n  padding: 12px;\n  font-size: 10px;\n  line-height: 14px;\n  color: @chromeTextColor;\n  border-radius: 4px;\n  cursor: pointer;\n  margin-bottom: 8px;\n\n  &:hover {\n    border-color: @primary;\n\n    .removeButton {\n      visibility: visible;\n    }\n  }\n}\n\n.removeButton {\n  position: absolute;\n  right: 1px; top: 1px; bottom: 1px;\n  width: 30px;\n  text-align: center;\n  visibility: hidden;\n  background: -moz-linear-gradient(left, rgba(51,54,59,0) 0%, rgba(51,54,59,1) 23%, rgba(51,54,59,1) 100%);\n  background: -webkit-linear-gradient(left, rgba(51,54,59,0) 0%,rgba(51,54,59,1) 23%,rgba(51,54,59,1) 100%);\n  background: linear-gradient(to right, rgba(51,54,59,0) 0%,rgba(51,54,59,1) 23%,rgba(51,54,59,1) 100%);\n\n  :global i {\n    color: @chromeTextSubColor;\n    line-height: 36px;\n    font-size: 11px;\n  }\n\n  &:hover {\n    :global i {\n      color: #ffffff;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/button/index.js",
    "content": "import * as pageBuilderActionsArr from 'actions/page-builder';\n\nimport Button from 'components/button';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\n@connect(\n  (state) => ({\n    selectedId: state.pageBuilder.selectedId\n  }),\n  (dispatch) => ({\n    pageBuilderActions: bindActionCreators(pageBuilderActionsArr, dispatch)\n  })\n)\nexport default class ButtonContainer extends Component {\n  static propTypes = {\n    label: PropTypes.node.isRequired,\n    action: PropTypes.string.isRequired,\n    actionProps: PropTypes.object.isRequired,\n    pageBuilderActions: PropTypes.object.isRequired,\n    selectedId: PropTypes.string\n  };\n\n  onClick (event) {\n    event.preventDefault();\n    const {action, actionProps, pageBuilderActions, selectedId} = this.props;\n\n    if (action === 'addElement') {\n      pageBuilderActions.addElementAt(actionProps, {\n        id: selectedId,\n        position: 0\n      });\n    } else if (action === 'linkData') {\n      pageBuilderActions.linkDataMode(selectedId);\n    } else if (action === 'linkFormData') {\n      pageBuilderActions.linkFormDataMode(selectedId);\n    }\n  }\n\n  render () {\n    return (\n      <Button full onClick={::this.onClick}>\n        {this.props.label}\n      </Button>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/checkbox/index.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport Component from 'components/component';\nimport React from 'react';\n\nimport styles from './index.less';\n\nexport default class Checkbox extends Component {\n  static propTypes = {\n    value: React.PropTypes.bool.isRequired,\n    onChange: React.PropTypes.func.isRequired,\n    disabled: React.PropTypes.bool,\n    white: React.PropTypes.bool\n  };\n\n  @bind\n  toggle (event) {\n    event.preventDefault();\n    const {disabled, onChange, value} = this.props;\n\n    if (!disabled && onChange) {\n      onChange(!value);\n    }\n  }\n\n  render () {\n    const {disabled, value, white} = this.props;\n    return (\n      <span\n        className={cx(\n          styles.checkbox,\n          white && styles.white,\n          disabled && styles.disabled\n        )}\n        onClick={this.toggle}\n      >\n        {value && <i className='nc-icon-mini ui-1_check'></i>}\n      </span>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/checkbox/index.less",
    "content": "@import '~styles/colors.less';\n@size: 15px;\n\n.checkbox {\n  display: inline-block;\n  width: @size;\n  height: @size;\n  text-align: center;\n  border: 1px solid @chromeTextSubColor;\n  border-radius: 3px;\n  cursor: pointer;\n\n  :global i {\n    font-size: 9px;\n    color: #ffffff;\n    line-height: @size - 2px;\n  }\n\n  &:hover {\n    border-color: @primary;\n  }\n}\n\n.white.checkbox {\n  :global i {\n    color: @primary;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/color-palette-picker.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport Portal from 'components/portal';\nimport Stick from 'components/stick';\nimport React, {PropTypes} from 'react';\nimport {applyBackground} from 'helpers/colors';\n\nimport styles from './color-palette-picker.less';\nimport Edit from './edit';\n\nexport default class ColorPicker extends Component {\n  static propTypes = {\n    value: PropTypes.object,\n    onChange: PropTypes.func,\n    toggleOpened: PropTypes.func.isRequired,\n    className: PropTypes.string,\n    colr: PropTypes.object.isRequired,\n    opacity: PropTypes.number.isRequired,\n    colors: PropTypes.array.isRequired,\n    opened: PropTypes.bool.isRequired,\n    label: PropTypes.string.isRequired,\n    type: PropTypes.string.isRequired,\n    white: PropTypes.bool\n  };\n\n  toggleOpen (event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.props.toggleOpened();\n  }\n\n  render () {\n    const {colors, value, type, white} = this.props;\n    const colorStyle = {};\n    applyBackground(colorStyle, value, colors);\n\n    let label = this.props.label;\n    if (type === 'linear') {\n      label = 'Linear Grad.';\n    } else if (type === 'radial') {\n      label = 'Radial Grad.';\n    }\n\n    return (\n      <div className={cx(white && styles.white, this.props.className)}>\n        <div className={styles.info} onClick={::this.toggleOpen} ref={(ref) => {this.ref = ref;}}>\n          <div className={styles.preview}>\n            <span className={styles.color} style={colorStyle} />\n          </div>\n          <span className={styles.label}>{label}</span>\n        </div>\n        {this.renderContent()}\n      </div>\n    );\n  }\n\n  renderContent () {\n    if (this.props.opened) {\n      return (\n        <Portal>\n          <Stick\n            element={this.ref}\n            verticalPosition='bottom'\n            horizontalPosition='left'\n            transition='slideUpIn'\n            horizontalOffset={-9}\n          >\n            <Edit {...this.props} infoElement={this.ref} />\n          </Stick>\n        </Portal>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/color-palette-picker.less",
    "content": "@import '~styles/colors.less';\n\n.info {\n  max-width: 130px;\n  height: 38px;\n  border: 1px solid @chromeBordersColor;\n  border-radius: 3px;\n  overflow: hidden;\n  background-color: @chromeBackgroundDarkerColor;\n  cursor: pointer;\n\n  &:hover {\n    border-color: @primary;\n  }\n}\n\n.preview {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  width: 36px;\n  height: 36px;\n\n  &:before {\n    content: '';\n    position: absolute;\n    top: 0; right: 0; bottom: 0; left: 0;\n    background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAChJREFUeNpiPHPmDAMMGBsbw9lMDDgA6RKM%2F%2F%2F%2Fh3POnj1LCzsAAgwAQtYIcFfEyzkAAAAASUVORK5CYII%3D');\n  }\n}\n\n.color {\n  position: relative;\n  display: block;\n  width: 100%;\n  height: 100%;\n}\n\n.label {\n  display: inline-block;\n  vertical-align: top;\n  line-height: 36px;\n  padding: 0 14px;\n  font-size: 10px;\n  color: @chromeTextColor;\n}\n\n.white {\n  .info {\n    background-color: transparent;\n    border-color: @adminInputBorders;\n\n    &:hover {\n      border-color: @primary;\n    }\n  }\n\n  .label {\n    color: @adminText;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/color-picker.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './color-picker.less';\nimport Hue from './hue';\nimport SatLight from './sat-light';\n\nexport default class ColorPicker extends Component {\n  static propTypes = {\n    colr: PropTypes.object.isRequired\n  };\n\n  render () {\n    const {colr} = this.props;\n    const hsv = colr.toHsvObject();\n\n    return (\n      <div className={styles.root}>\n        <SatLight {...this.props} hsv={hsv} />\n        <Hue {...this.props} hsv={hsv} />\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/color-picker.less",
    "content": ".root {\n  position: relative;\n  width: 100%;\n  height: 184px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/color.jsx",
    "content": "import Component from 'components/component';\nimport Portal from 'components/portal';\nimport Stick from 'components/stick';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nimport styles from './color.less';\n\nexport default class Color extends Component {\n  static fragments = {\n    color: {\n      _id: 1,\n      label: 1,\n      value: 1\n    }\n  };\n\n  static propTypes = {\n    color: PropTypes.object.isRequired,\n    selectColor: PropTypes.func.isRequired,\n    addOverlay: PropTypes.func.isRequired,\n    closeOverlay: PropTypes.func.isRequired\n  };\n\n  getInitState () {\n    return {\n      overed: false\n    };\n  }\n\n  onClick () {\n    this.props.selectColor(this.props.color._id);\n  }\n\n  onMouseEnter () {\n    this.setState({\n      overed: true,\n      element: findDOMNode(this)\n    });\n  }\n\n  onMouseLeave () {\n    this.setState({\n      overed: false\n    });\n  }\n\n  render () {\n    const style = {\n      backgroundColor: this.props.color.value\n    };\n\n    return (\n      <div\n        className={styles.color}\n        style={style}\n        onClick={::this.onClick}\n        onMouseEnter={::this.onMouseEnter}\n        onMouseLeave={::this.onMouseLeave}\n      >\n        {this.renderInfo()}\n      </div>\n    );\n  }\n\n  renderInfo () {\n    const {color} = this.props;\n    if (this.state.overed) {\n      return (\n        <Portal>\n          <Stick\n            element={this.state.element}\n            verticalPosition='top'\n            horizontalPosition='center'\n            verticalOffset={3}\n            className={styles.colorTitleBallon}\n          >\n            <div className={styles.colorTitle}>\n              <span className={styles.triangle} />\n              <span className={styles.label}>{color.label}</span>\n            </div>\n          </Stick>\n        </Portal>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/color.less",
    "content": ".color {\n  width: 20px;\n  height: 20px;\n  display: inline-block;\n  vertical-align: top;\n  border-radius: 4px;\n  margin-right: 6px;\n  margin-top: 6px;\n  cursor: pointer;\n\n  border: 1px solid rgba(0, 0, 0, 0.2);\n}\n\n.colorTitleBallon {\n  pointer-events: none;\n}\n\n.colorTitle {\n  background-color: #ffffff;\n  min-width: 70px;\n  height: 22px;\n  border: 1px solid #dbdbdb;\n  text-align: center;\n  line-height: 20px;\n  border-radius: 4px;\n  font-size: 10px;\n  color: #999999;\n  pointer-events: none;\n}\n\n.label {\n  position: relative;\n}\n\n.triangle {\n  position: absolute;\n  background-color: #ffffff;\n  border: 1px solid #dbdbdb;\n  text-align: left;\n  display: inline-block;\n  top: 17px;\n  left: 50%;\n\n  transform: translateX(-4px) rotate(120deg) skewX(-30deg) scale(1,.866);\n\n  &:before, &:after {\n    content: '';\n    position: absolute;\n    background-color: inherit;\n  }\n\n  &, &:before, &:after {\n    width:  8px;\n    height: 8px;\n    border-top-right-radius: 40%;\n  }\n\n  &:before {\n    transform: rotate(-135deg) skewX(-45deg) scale(1.414,.707) translate(0,-50%);\n  }\n\n  &:after {\n    transform: rotate(135deg) skewY(-45deg) scale(.707,1.414) translate(50%);\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/colors-collection.jsx",
    "content": "import Component from 'components/component';\nimport Input from 'components/input-options/input';\nimport React, {PropTypes} from 'react';\n\nimport styles from './colors-collection.less';\nimport Color from './color';\n\nexport default class ColorsCollection extends Component {\n  static propTypes = {\n    colors: PropTypes.array.isRequired,\n    selectColor: PropTypes.func.isRequired,\n    addOverlay: PropTypes.func.isRequired,\n    closeOverlay: PropTypes.func.isRequired,\n    addingColor: PropTypes.bool.isRequired,\n    addingColorName: PropTypes.string.isRequired,\n    changeAddingColor: PropTypes.func.isRequired,\n    toggleAddingColor: PropTypes.func.isRequired,\n    addColor: PropTypes.func.isRequired\n  };\n\n  onSubmit (event) {\n    event.preventDefault();\n    this.props.addColor();\n  }\n\n  render () {\n    return (\n      <div className={styles.root}>\n        <div className={styles.label}>Color Collection</div>\n        <div>\n          {this.props.colors.map(this.renderColor, this)}\n          <span className={styles.addButton} key='add' onClick={this.props.toggleAddingColor}>\n            <i className='nc-icon-mini ui-1_simple-add'></i>\n          </span>\n        </div>\n        {this.renderAdding()}\n      </div>\n    );\n  }\n\n  renderColor (color) {\n    return (\n      <Color\n        color={color}\n        key={color._id}\n        selectColor={this.props.selectColor}\n        addOverlay={this.props.addOverlay}\n        closeOverlay={this.props.closeOverlay}\n      />\n    );\n  }\n\n  renderAdding () {\n    if (this.props.addingColor) {\n      return (\n        <form className={styles.adding} onSubmit={::this.onSubmit}>\n          <Input\n            className={styles.input}\n            placeholder='Color name'\n            white\n            value={this.props.addingColorName}\n            onChange={this.props.changeAddingColor}\n            focused\n          />\n          <div className={styles.saveButton} onClick={::this.onSubmit}>Save</div>\n        </form>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/colors-collection.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  border-top: 2px solid #dbdbdb;\n  padding-top: 12px;\n}\n\n.label {\n  font-size: 10px;\n  text-transform: uppercase;\n  color: #999999;\n  line-height: 13px;\n  margin-bottom: 4px;\n}\n\n.addButton {\n  width: 20px;\n  height: 20px;\n  display: inline-block;\n  vertical-align: top;\n  margin-right: 6px;\n  margin-top: 6px;\n  cursor: pointer;\n\n  :global i {\n    font-size: 18px;\n    line-height: 20px;\n    text-align: center;\n    color: #999999;\n  }\n\n  &:hover :global i {\n    color: @primary;\n  }\n}\n\n.adding {\n  margin: 0;\n  display: block;\n  margin-top: 6px;\n}\n\n.input {\n  display: inline-block;\n  width: 75%;\n\n  :global input {\n    line-height: 28px;\n  }\n}\n\n.saveButton {\n  display: inline-block;\n  vertical-align: top;\n  width: 25%;\n  line-height: 30px;\n  color: @primary;\n  font-size: 12px;\n  text-transform: uppercase;\n  font-weight: 800;\n  text-align: center;\n  cursor: pointer;\n\n  &:hover {\n    color: #333333;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/edit.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nimport styles from './edit.less';\nimport ColorPicker from './color-picker';\nimport ColorsCollection from './colors-collection';\nimport GradientPoints from './gradient-points';\nimport Inputs from './inputs';\nimport LinearGradient from './linear-gradient';\nimport Opacity from './opacity';\nimport RadialGradient from './radial-gradient';\nimport RadialRadius from './radial-radius';\nimport Types from './types';\n\nexport default class Edit extends Component {\n  static propTypes = {\n    type: PropTypes.string.isRequired,\n    colr: PropTypes.object.isRequired,\n    opacity: PropTypes.number.isRequired,\n    editingPoint: PropTypes.number.isRequired,\n    hsvChange: PropTypes.func.isRequired,\n    rgbChange: PropTypes.func.isRequired,\n    hexChange: PropTypes.func.isRequired,\n    opacityChange: PropTypes.func.isRequired,\n    inputType: PropTypes.string.isRequired,\n    previousInputType: PropTypes.func.isRequired,\n    nextInputType: PropTypes.func.isRequired,\n    gradients: PropTypes.bool.isRequired,\n    side: PropTypes.string.isRequired,\n    changeToSolid: PropTypes.func.isRequired,\n    changeToLinear: PropTypes.func.isRequired,\n    changeToRadial: PropTypes.func.isRequired,\n    value: PropTypes.object.isRequired,\n    colors: PropTypes.array.isRequired,\n    changeEditingPoint: PropTypes.func.isRequired,\n    pointPercChange: PropTypes.func.isRequired,\n    toggleOpened: PropTypes.func.isRequired,\n    infoElement: PropTypes.any,\n    changeAngle: PropTypes.func.isRequired,\n    changeRadius: PropTypes.func.isRequired,\n    changeCenter: PropTypes.func.isRequired,\n    addPoint: PropTypes.func.isRequired,\n    removePoint: PropTypes.func.isRequired\n  };\n\n  componentDidMount () {\n    this.onCloseBind = ::this.onClose;\n    document.body.addEventListener('mousedown', this.onCloseBind, false);\n  }\n\n  componentWillUnmount () {\n    document.body.removeEventListener('mousedown', this.onCloseBind, false);\n  }\n\n  onClose (event) {\n    const holderRect = findDOMNode(this.refs.holder).getBoundingClientRect();\n    const outOfHolder =\n      (event.pageX < holderRect.left || event.pageX > holderRect.left + holderRect.width) ||\n      (event.pageY < holderRect.top || event.pageY > holderRect.top + holderRect.height);\n\n    let outOfGradient = true;\n    if (this.refs.linearGradient) {\n      const gradientRect = findDOMNode(this.refs.linearGradient).getBoundingClientRect();\n      outOfGradient =\n        (event.pageX < gradientRect.left - 10 || event.pageX > gradientRect.left + gradientRect.width + 10) ||\n        (event.pageY < gradientRect.top - 10 || event.pageY > gradientRect.top + gradientRect.height + 10);\n    }\n\n    let outOfRadial = true;\n    if (this.refs.radialGradient) {\n      const gradientRect = findDOMNode(this.refs.radialGradient).getBoundingClientRect();\n      outOfRadial =\n        (event.pageX < gradientRect.left - 10 || event.pageX > gradientRect.left + gradientRect.width + 10) ||\n        (event.pageY < gradientRect.top - 10 || event.pageY > gradientRect.top + gradientRect.height + 10);\n    }\n\n    let outOfInfo = true;\n    if (this.props.infoElement) {\n      const infoRect = findDOMNode(this.props.infoElement).getBoundingClientRect();\n      outOfInfo =\n        (event.pageX < infoRect.left || event.pageX > infoRect.left + infoRect.width) ||\n        (event.pageY < infoRect.top || event.pageY > infoRect.top + infoRect.height);\n    }\n\n    if (outOfHolder && outOfGradient && outOfInfo && outOfRadial) {\n      event.preventDefault();\n      event.stopPropagation();\n      this.props.toggleOpened();\n    }\n  }\n\n  render () {\n    const {\n      type,\n      colr,\n      opacity,\n      gradients,\n      hsvChange,\n      rgbChange,\n      hexChange,\n      opacityChange,\n      inputType,\n      previousInputType,\n      nextInputType,\n      editingPoint\n    } = this.props;\n    const isGradient = (type === 'linear' || type === 'radial');\n\n    return (\n      <div className={styles.root} ref='holder'>\n        <span className={cx(styles.triangle, this.props.side)} />\n        {gradients &&\n          <Types\n            type={type}\n            changeToSolid={this.props.changeToSolid}\n            changeToLinear={this.props.changeToLinear}\n            changeToRadial={this.props.changeToRadial}\n          />\n        }\n        {isGradient &&\n          <GradientPoints\n            editingPoint={editingPoint}\n            value={this.props.value}\n            colors={this.props.colors}\n            changeEditingPoint={this.props.changeEditingPoint}\n            pointPercChange={this.props.pointPercChange}\n            addPoint={this.props.addPoint}\n            removePoint={this.props.removePoint}\n          />\n        }\n        <ColorPicker colr={colr} hsvChange={hsvChange} />\n        <Opacity colr={colr} opacity={opacity} opacityChange={opacityChange} />\n        <Inputs\n          colr={colr}\n          opacity={opacity}\n          inputType={inputType}\n          previousInputType={previousInputType}\n          nextInputType={nextInputType}\n          hsvChange={hsvChange}\n          rgbChange={rgbChange}\n          hexChange={hexChange}\n          opacityChange={opacityChange}\n        />\n        {type === 'radial' &&\n          <RadialRadius\n            radius={this.props.value.radius}\n            changeRadius={this.props.changeRadius}\n          />\n        }\n        <ColorsCollection {...this.props} />\n        {type === 'linear' &&\n          <LinearGradient\n            ref='linearGradient'\n            editingPoint={editingPoint}\n            value={this.props.value}\n            colors={this.props.colors}\n            changeEditingPoint={this.props.changeEditingPoint}\n            pointPercChange={this.props.pointPercChange}\n            changeAngle={this.props.changeAngle}\n            addPoint={this.props.addPoint}\n          />\n        }\n        {type === 'radial' &&\n          <RadialGradient\n            ref='radialGradient'\n            editingPoint={editingPoint}\n            value={this.props.value}\n            colors={this.props.colors}\n            changeEditingPoint={this.props.changeEditingPoint}\n            pointPercChange={this.props.pointPercChange}\n            changeCenter={this.props.changeCenter}\n            addPoint={this.props.addPoint}\n          />\n        }\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/edit.less",
    "content": ".root {\n  position: relative;\n  width: 270px;\n  padding: 6px;\n  border-radius: 4px;\n  background-color: #ffffff;\n  z-index: 1;\n\n  -webkit-box-shadow: 0px 5px 25px 0px rgba(0,0,0,0.5);\n  -moz-box-shadow: 0px 5px 25px 0px rgba(0,0,0,0.5);\n  box-shadow: 0px 5px 25px 0px rgba(0,0,0,0.5);\n\n  transform: translateY(3px);\n}\n\n.triangle {\n  position: absolute;\n  background-color: #ffffff;\n  text-align: left;\n  display: inline-block;\n  top: -9px;\n  left: 24px;\n\n  transform: rotate(-60deg) skewX(-30deg) scale(1,.866);\n\n  &:before, &:after {\n    content: '';\n    position: absolute;\n    background-color: inherit;\n  }\n\n  &, &:before, &:after {\n    width:  10px;\n    height: 10px;\n    border-top-right-radius: 40%;\n  }\n\n  &:before {\n    transform: rotate(-135deg) skewX(-45deg) scale(1.414,.707) translate(0,-50%);\n  }\n\n  &:after {\n    transform: rotate(135deg) skewY(-45deg) scale(.707,1.414) translate(50%);\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/gradient-points.jsx",
    "content": "import cx from 'classnames';\nimport utils from 'helpers/utils';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {applyBackground, getColorString} from 'helpers/colors';\n\nimport styles from './gradient-points.less';\n\nexport default class GradientPoints extends Component {\n  static propTypes = {\n    editingPoint: PropTypes.number.isRequired,\n    value: PropTypes.object.isRequired,\n    colors: PropTypes.array.isRequired,\n    changeEditingPoint: PropTypes.func.isRequired,\n    pointPercChange: PropTypes.func.isRequired,\n    addPoint: PropTypes.func.isRequired,\n    removePoint: PropTypes.func.isRequired\n  };\n\n  constructor (props, children) {\n    super(props, children);\n    this.onMouseUpListener = this.onMouseUp.bind(this);\n    this.onMouseMoveListener = this.onMouseMove.bind(this);\n  }\n\n  componentWillUnmount () {\n    document.removeEventListener('mouseup', this.onMouseUpListener);\n    document.removeEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  onMouseDown (index, event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this.activePoint = index;\n\n    document.addEventListener('mouseup', this.onMouseUpListener);\n    document.addEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  onMouseMove (event) {\n    event.preventDefault();\n\n    const bounds = utils.getOffsetRect(this.refs.bar);\n    const perc = utils.limitNumber((event.pageX - bounds.left) / bounds.width, 0, 1);\n\n    if (this.props.value.points.length > 2) {\n      const verticalOffset = Math.abs(event.pageY - bounds.top);\n\n      if (verticalOffset > 50) {\n        this.activePointDelete = true;\n      } else {\n        this.activePointDelete = false;\n      }\n    }\n\n    this.props.pointPercChange(this.activePoint, utils.roundSnap(perc * 100, [0, 25, 50, 75, 100]));\n  }\n\n  onMouseUp (event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.componentWillUnmount();\n    if (this.activePointDelete) {\n      this.activePointDelete = false;\n      this.props.removePoint(this.activePoint);\n    }\n  }\n\n  markerClicked (number, event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.props.changeEditingPoint(number);\n  }\n\n  addPoint (event) {\n    const bounds = utils.getOffsetRect(this.refs.bar);\n    const perc = utils.limitNumber((event.pageX - bounds.left) / bounds.width, 0, 1);\n\n    this.props.addPoint(Math.round(perc * 100));\n  }\n\n  render () {\n    const gradStyle = {};\n    applyBackground(gradStyle, Object.assign({}, this.props.value, {angle: 0, type: 'linear'}), this.props.colors);\n\n    return (\n      <div className={styles.root}>\n        <div className={styles.points} ref='bar' onClick={::this.addPoint}>\n          <div className={styles.gradient} style={gradStyle} />\n          {this.props.value.points.map(this.renderPoint, this)}\n        </div>\n      </div>\n    );\n  }\n\n  renderPoint (colorObj, index) {\n    const markerStyle = {\n      left: `${colorObj.perc}%`,\n      transform: `translate(${-colorObj.perc}%, -50%)`\n    };\n    const selected = this.props.editingPoint === index;\n    if (selected) {\n      markerStyle.backgroundColor = getColorString(colorObj, this.props.colors);\n    }\n    if (this.activePoint === index && this.activePointDelete) {\n      markerStyle.visibility = 'hidden';\n    }\n    const onClick = this.markerClicked.bind(this, index);\n    const onMouseDown = this.onMouseDown.bind(this, index);\n\n    return (\n      <span\n        className={cx(styles.marker, selected && styles.selected)}\n        style={markerStyle}\n        key={index}\n        onClick={onClick}\n        onMouseDown={onMouseDown}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/gradient-points.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  width: 100%;\n  height: 10px;\n  margin-top: 10px;\n  margin-bottom: 4px;\n  position: relative;\n}\n\n.points {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 14px;\n  border-radius: 4px;\n\n  &:before {\n    content: '';\n    position: absolute;\n    top: 0; right: 0; bottom: 0; left: 0;\n    opacity: 0.5;\n    background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAChJREFUeNpiPHPmDAMMGBsbw9lMDDgA6RKM%2F%2F%2F%2Fh3POnj1LCzsAAgwAQtYIcFfEyzkAAAAASUVORK5CYII%3D');\n  }\n\n  &:after {\n    content: '';\n    position: absolute;\n    display: block;\n    border-radius: 4px;\n    top: 0px; right: 0px; bottom: 0px; left: 0px;\n    border: 1px solid rgba(0, 0, 0, 0.2);\n    pointer-events: none;\n  }\n}\n\n.gradient {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  border-radius: 4px;\n  background: -moz-linear-gradient(left, rgba(255,0,0,0) 0%, rgba(255,0,0,1) 100%);\n  background: -webkit-linear-gradient(left, rgba(255,0,0,0) 0%,rgba(255,0,0,1) 100%);\n  background: linear-gradient(to right, rgba(255,0,0,0) 0%,rgba(255,0,0,1) 100%);\n  cursor: copy;\n}\n\n.marker {\n  position: absolute;\n  display: inline-block;\n  width: 8px;\n  height: 12px;\n  border: 1px solid rgba(0, 0, 0, 0.4);\n  background-color: #ffffff;\n  border-radius: 2px;\n  z-index: 1;\n  transform: translate(-50%, -50%);\n  top: 50%;\n  left: 50%;\n  cursor: pointer;\n\n  &.selected {\n    width: 14px;\n    height: 14px;\n    border: 2px solid #ffffff;\n\n    -webkit-box-shadow: 0px 0px 0px 1px rgba(0,0,0,0.4);\n    -moz-box-shadow: 0px 0px 0px 1px rgba(0,0,0,0.4);\n    box-shadow: 0px 0px 0px 1px rgba(0,0,0,0.4);\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/hue.jsx",
    "content": "import utils from 'helpers/utils';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nimport styles from './hue.less';\n\nexport default class Hue extends Component {\n  static propTypes = {\n    colr: PropTypes.object.isRequired,\n    hsv: PropTypes.object.isRequired,\n    hsvChange: PropTypes.func.isRequired\n  };\n\n  constructor (props, children) {\n    super(props, children);\n    this.onMouseUpListener = this.onMouseUp.bind(this);\n    this.onMouseMoveListener = this.onMouseMove.bind(this);\n  }\n\n  componentWillUnmount () {\n    document.removeEventListener('mouseup', this.onMouseUpListener);\n    document.removeEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  onMouseDown (event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this.onMouseMove(event);\n\n    document.addEventListener('mouseup', this.onMouseUpListener);\n    document.addEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  onMouseMove (event) {\n    event.preventDefault();\n\n    const bounds = utils.getOffsetRect(findDOMNode(this));\n    const perc = utils.limitNumber((event.pageY - bounds.top) / bounds.height, 0, 1);\n\n    this.props.hsvChange({\n      h: perc * 360,\n      s: this.props.hsv.s,\n      v: this.props.hsv.v\n    });\n  }\n\n  onMouseUp (event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.componentWillUnmount();\n  }\n\n  render () {\n    const {hsv} = this.props;\n    const perc = (hsv.h / 360 * 100);\n    const markerStyle = {\n      top: `${perc}%`,\n      transform: `translate(-50%, ${-perc}%)`\n    };\n\n    return (\n      <div className={styles.root} onMouseDown={::this.onMouseDown}>\n        <span className={styles.marker} style={markerStyle} />\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/hue.less",
    "content": ".root {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  right: 0;\n  width: 10px;\n  border-radius: 4px;\n  background: linear-gradient(to top, #FF0000 0%, #FF0099 10%, #CD00FF 20%, #3200FF 30%, #0066FF 40%, #00FFFD 50%, #00FF66 60%, #35FF00 70%, #CDFF00 80%, #FF9900 90%, #FF0000 100%);\n    \n  &:after {\n    content: '';\n    position: absolute;\n    display: block;\n    border-radius: 4px;\n    top: 0px; right: 0px; bottom: 0px; left: 0px;\n    border: 1px solid rgba(0, 0, 0, 0.2);\n  }\n}\n\n.marker {\n  position: absolute;\n  display: inline-block;\n  width: 12px;\n  height: 8px;\n  border: 1px solid rgba(0, 0, 0, 0.4);\n  background-color: #ffffff;\n  border-radius: 2px;\n  z-index: 1;\n  transform: translate(-50%, -50%);\n  top: 50%;\n  left: 50%;\n  cursor: pointer;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/index.js",
    "content": "import * as colorsActions from 'actions/colors';\n\nimport forEach from 'lodash.foreach';\nimport sortBy from 'lodash.sortby';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {getColor} from 'helpers/colors';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport ColorPalettePicker from './color-palette-picker';\n\nconst INPUT_TYPES = ['hex', 'rgba', 'hsva'];\n\n@dataConnect(\n  null,\n  (dispatch) => ({\n    colorsActions: bindActionCreators(colorsActions, dispatch)\n  }),\n  () => ({\n    fragments: {\n      colors: {\n        _id: 1,\n        label: 1,\n        value: 1\n      }\n    }\n  })\n)\nexport default class ColorPalettePickerContainer extends Component {\n  static propTypes = {\n    value: PropTypes.object.isRequired,\n    onChange: PropTypes.func.isRequired,\n    colors: PropTypes.array,\n    colorsActions: PropTypes.object.isRequired,\n    gradients: PropTypes.bool.isRequired,\n    white: PropTypes.bool,\n    className: PropTypes.string\n  };\n\n  static defaultProps = {\n    colors: [],\n    gradients: false\n  };\n\n  getInitState () {\n    return {\n      opened: false,\n      inputType: 0,\n      addingColor: false,\n      addingColorName: '',\n      editingPoint: 0\n    };\n  }\n\n  onChange (changes) {\n    this.props.onChange(Object.assign({}, this.props.value || {}, changes));\n  }\n\n  selectColor (id) {\n    this.valueChange('palette', id);\n  }\n\n  hsvChange (hsv) {\n    this.valueChange('hsv', hsv);\n  }\n\n  hexChange (hex) {\n    this.valueChange('hex', hex);\n  }\n\n  rgbChange (rgb) {\n    this.valueChange('rgb', rgb);\n  }\n\n  valueChange (valueType, value) {\n    const type = this.props.value && this.props.value.type || 'hex';\n\n    if (type !== 'radial' && type !== 'linear') {\n      const currentColor = this.getCurrentColor();\n      this.props.onChange({\n        type: valueType,\n        value,\n        opacity: currentColor.opacity\n      });\n    } else {\n      const editingPoint = Math.min(this.state.editingPoint, this.props.value.points.length);\n      const points = [];\n      forEach(this.props.value.points, (point, index) => {\n        if (index === editingPoint) {\n          points.push(Object.assign({}, point, {\n            type: valueType,\n            value\n          }));\n        } else {\n          points.push(point);\n        }\n      });\n      this.props.onChange(Object.assign({}, this.props.value, {points}));\n    }\n  }\n\n  opacityChange (opacity) {\n    const type = this.props.value && this.props.value.type || 'hex';\n\n    if (type !== 'radial' && type !== 'linear') {\n      this.props.onChange({\n        type: this.props.value && this.props.value.type || 'hex',\n        value: this.props.value && this.props.value.value || '#000000',\n        opacity\n      });\n    } else {\n      const editingPoint = Math.min(this.state.editingPoint, this.props.value.points.length);\n      const points = [];\n      forEach(this.props.value.points, (point, index) => {\n        if (index === editingPoint) {\n          points.push(Object.assign({}, point, {\n            opacity\n          }));\n        } else {\n          points.push(point);\n        }\n      });\n      this.props.onChange(Object.assign({}, this.props.value, {points}));\n    }\n  }\n\n  toggleOpened () {\n    this.setState({\n      opened: !this.state.opened\n    });\n  }\n\n  previousInputType () {\n    this.setState({\n      inputType: this.state.inputType === 0 ? INPUT_TYPES.length - 1 : this.state.inputType - 1\n    });\n  }\n\n  nextInputType () {\n    this.setState({\n      inputType: this.state.inputType === INPUT_TYPES.length - 1 ? 0 : this.state.inputType + 1\n    });\n  }\n\n  toggleAddingColor () {\n    this.setState({\n      addingColor: !this.state.addingColor\n    });\n  }\n\n  changeAddingColor (addingColorName) {\n    this.setState({\n      addingColorName\n    });\n  }\n\n  addColor () {\n    if (this.state.addingColorName) {\n      const color = getColor(this.props.value || {\n        type: 'hex',\n        value: '#000000',\n        opacity: 100\n      }, this.props.colors);\n\n      this.props.colorsActions\n        .addColor({\n          color: {\n            _id: 1,\n            label: 1,\n            value: 1\n          }\n        }, {\n          label: this.state.addingColorName,\n          value: color.colr.toHex()\n        })\n        .then((result) => {\n          this.selectColor(result.addColor._id);\n          this.setState({\n            addingColor: false,\n            addingColorName: ''\n          });\n        });\n    }\n  }\n\n  changeToSolid () {\n    if (this.props.value.type === 'linear' || this.props.value.type === 'radial') {\n      if (this.props.value.type === 'linear') {\n        this.previousLinear = this.props.value;\n      } else {\n        this.previousRadial = this.props.value;\n      }\n      this.props.onChange({\n        type: this.props.value.points[0].type,\n        value: this.props.value.points[0].value,\n        opacity: this.props.value.points[0].opacity\n      });\n    }\n  }\n\n  changeToLinear () {\n    if (this.props.value.type !== 'linear') {\n      this.setState({\n        editingPoint: 0\n      }, () => {\n        if (this.props.value.type !== 'radial' && this.previousLinear) {\n          this.props.onChange(this.previousLinear);\n        } else {\n          let points = [];\n          if (this.props.value.type === 'radial') {\n            points = this.props.value.points;\n          } else {\n            points = [\n              Object.assign({perc: 0}, this.props.value),\n              Object.assign({perc: 100}, this.props.value)\n            ];\n          }\n\n          this.props.onChange({\n            type: 'linear',\n            angle: 0,\n            points\n          });\n        }\n      });\n    }\n  }\n\n  changeToRadial () {\n    if (this.props.value.type !== 'radial') {\n      if (this.props.value.type !== 'linear' && this.previousRadial) {\n        this.props.onChange(this.previousRadial);\n      } else {\n        let points = [];\n        if (this.props.value.type === 'linear') {\n          points = this.props.value.points;\n        } else {\n          points = [\n            Object.assign({perc: 0}, this.props.value),\n            Object.assign({perc: 100}, this.props.value)\n          ];\n        }\n\n        this.props.onChange({\n          type: 'radial',\n          radius: 'fs',\n          center: {\n            top: 50,\n            left: 50\n          },\n          points\n        });\n      }\n    }\n  }\n\n  changeAngle (angle) {\n    this.props.onChange(Object.assign({}, this.props.value, {angle}));\n  }\n\n  changeRadius (radius) {\n    this.props.onChange(Object.assign({}, this.props.value, {radius}));\n  }\n\n  changeCenter (center) {\n    this.props.onChange(Object.assign({}, this.props.value, {center}));\n  }\n\n  changeEditingPoint (editingPoint) {\n    this.setState({\n      editingPoint\n    });\n  }\n\n  pointPercChange (editingPoint, perc) {\n    const points = [];\n    forEach(this.props.value.points, (point, index) => {\n      if (index === editingPoint) {\n        points.push(Object.assign({}, point, {\n          perc\n        }));\n      } else {\n        points.push(point);\n      }\n    });\n    this.props.onChange(Object.assign({}, this.props.value, {points}));\n  }\n\n  addPoint (perc) {\n    const orderedPoints = sortBy(this.props.value.points, 'perc');\n    let to = 0;\n    forEach(orderedPoints, (point, index) => {\n      if (point.perc < perc) {\n        to = index + 1;\n      } else {\n        return false;\n      }\n    });\n\n    let newPoint;\n    if (to === 0) {\n      newPoint = Object.assign({}, orderedPoints[0], {perc});\n    } else if (to === orderedPoints.length) {\n      newPoint = Object.assign({}, orderedPoints[orderedPoints.length - 1], {perc});\n    } else {\n      newPoint = Object.assign({}, orderedPoints[to - 1], {perc});\n    }\n    const newPoints = this.props.value.points.slice(0);\n    newPoints.splice(to, 0, newPoint);\n    this.props.onChange(Object.assign({}, this.props.value, {\n      points: newPoints\n    }));\n    this.setState({\n      editingPoint: to\n    });\n  }\n\n  removePoint (index) {\n    if (this.props.value.points.length > 2) {\n      const newPoints = this.props.value.points.slice(0);\n      newPoints.splice(index, 1);\n      this.props.onChange(Object.assign({}, this.props.value, {\n        points: newPoints\n      }));\n      this.setState({\n        editingPoint: 0\n      });\n    }\n  }\n\n  getCurrentColor () {\n    return getColor(this.props.value || {\n      type: 'hex',\n      value: '#000000',\n      opacity: 100\n    }, this.props.colors);\n  }\n\n  render () {\n    const type = this.props.value && this.props.value.type || 'hex';\n    let color;\n\n    if (type !== 'linear' && type !== 'radial') {\n      color = this.getCurrentColor();\n    } else {\n      color = getColor(\n        this.props.value.points[Math.min(this.state.editingPoint, this.props.value.points.length)],\n        this.props.colors\n      );\n    }\n\n    return (\n      <ColorPalettePicker\n        white={this.props.white}\n        className={this.props.className}\n        type={type}\n        colr={color.colr}\n        opacity={color.opacity}\n        label={color.label}\n        value={this.props.value}\n        editingPoint={this.state.editingPoint}\n        colors={this.props.colors}\n        gradients={this.props.gradients}\n        opened={this.state.opened}\n        onChange={::this.onChange}\n        toggleOpened={::this.toggleOpened}\n        colorsActions={this.props.colorsActions}\n        hsvChange={::this.hsvChange}\n        hexChange={::this.hexChange}\n        rgbChange={::this.rgbChange}\n        opacityChange={::this.opacityChange}\n        inputType={INPUT_TYPES[this.state.inputType]}\n        previousInputType={::this.previousInputType}\n        nextInputType={::this.nextInputType}\n        selectColor={::this.selectColor}\n        addingColor={this.state.addingColor}\n        addingColorName={this.state.addingColorName}\n        toggleAddingColor={::this.toggleAddingColor}\n        changeAddingColor={::this.changeAddingColor}\n        addColor={::this.addColor}\n        changeToSolid={::this.changeToSolid}\n        changeToLinear={::this.changeToLinear}\n        changeToRadial={::this.changeToRadial}\n        changeEditingPoint={::this.changeEditingPoint}\n        pointPercChange={::this.pointPercChange}\n        changeAngle={::this.changeAngle}\n        changeRadius={::this.changeRadius}\n        changeCenter={::this.changeCenter}\n        addPoint={::this.addPoint}\n        removePoint={::this.removePoint}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/input.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './input.less';\n\nexport default class Inputs extends Component {\n  static propTypes = {\n    small: PropTypes.bool,\n    value: PropTypes.string.isRequired,\n    label: PropTypes.string.isRequired,\n    onChange: PropTypes.func.isRequired\n  };\n\n  getInitState () {\n    return {\n      focused: false\n    };\n  }\n\n  onFocus () {\n    this.setState({\n      focused: true,\n      value: this.props.value\n    });\n  }\n\n  onBlur () {\n    this.setState({\n      focused: false\n    });\n  }\n\n  onChange (event) {\n    this.setState({\n      value: event.target.value\n    });\n    this.props.onChange(event.target.value);\n  }\n\n  render () {\n    const {small, value, label} = this.props;\n    return (\n      <div\n        className={cx(styles.input, small && styles.small)}\n        onFocus={::this.onFocus}\n        onBlur={::this.onBlur}\n        onChange={::this.onChange}\n      >\n        <input className={styles.inputField} type='text' value={this.state.focused ? this.state.value : value} />\n        <div className={styles.label}>{label}</div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/input.less",
    "content": "@import '~styles/colors.less';\n\n.input {\n  display: inline-block;\n  width: 70px;\n  margin: 0 4.5px;\n}\n\n.small {\n  width: 38px;\n}\n\n.inputField {\n  width: 100%;\n  text-align: center;\n  background-color: #ffffff;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  padding: 3.5px;\n  font-size: 12px;\n  line-height: 15px;\n  color: #999999;\n\n  &:focus {\n    border-color: @primary;\n  }\n}\n\n.label {\n  font-size: 8px;\n  color: #999999;\n  line-height: 17px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/inputs.jsx",
    "content": "import utils from 'helpers/utils';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {hexIsValid} from 'helpers/colors';\n\nimport styles from './inputs.less';\nimport Input from './input';\n\nexport default class Inputs extends Component {\n  static propTypes = {\n    colr: PropTypes.object.isRequired,\n    opacity: PropTypes.number.isRequired,\n    previousInputType: PropTypes.func.isRequired,\n    nextInputType: PropTypes.func.isRequired,\n    inputType: PropTypes.string.isRequired,\n    hexChange: PropTypes.func.isRequired,\n    hsvChange: PropTypes.func.isRequired,\n    rgbChange: PropTypes.func.isRequired,\n    opacityChange: PropTypes.func.isRequired\n  };\n\n  init () {\n    this.onRChange = this.onRGBChange.bind(this, 'r');\n    this.onGChange = this.onRGBChange.bind(this, 'g');\n    this.onBChange = this.onRGBChange.bind(this, 'b');\n    this.onHChange = this.onHSVChange.bind(this, 'h');\n    this.onSChange = this.onHSVChange.bind(this, 's');\n    this.onVChange = this.onHSVChange.bind(this, 'v');\n  }\n\n  onHexChange (value) {\n    if (hexIsValid(value)) {\n      this.props.hexChange(value);\n    }\n  }\n\n  onRGBChange (prop, value) {\n    const number = parseInt(value, 10);\n\n    if (!isNaN(number)) {\n      const rgb = this.props.colr.toRgbObject();\n      rgb[prop] = utils.limitNumber(number, 0, 255);\n      this.props.rgbChange(rgb);\n    }\n  }\n\n  onHSVChange (prop, value) {\n    const number = parseInt(value, 10);\n\n    if (!isNaN(number)) {\n      const hsv = this.props.colr.toHsvObject();\n      if (prop === 'h') {\n        hsv[prop] = utils.limitNumber(number, 0, 360);\n      } else {\n        hsv[prop] = utils.limitNumber(number, 0, 100);\n      }\n      this.props.hsvChange(hsv);\n    }\n  }\n\n  onOpacityChange (value) {\n    const opacity = parseInt(value, 10);\n\n    if (!isNaN(opacity)) {\n      this.props.opacityChange(utils.limitNumber(opacity, 0, 100));\n    }\n  }\n\n  render () {\n    return (\n      <div className={styles.root}>\n        <span className={styles.previous} onClick={this.props.previousInputType}>\n          <i className='nc-icon-mini arrows-2_small-left'></i>\n        </span>\n        {this.renderInputs()}\n        <span className={styles.next} onClick={this.props.nextInputType}>\n          <i className='nc-icon-mini arrows-2_small-right'></i>\n        </span>\n      </div>\n    );\n  }\n\n  renderInputs () {\n    const {inputType, opacity, colr} = this.props;\n\n    if (inputType === 'hex') {\n      const hex = colr.toHex();\n      return (\n        <div className={styles.inputs}>\n          <Input value={hex} label='HEX' onChange={::this.onHexChange} />\n          <Input small value={opacity} label='A' onChange={::this.onOpacityChange} />\n        </div>\n      );\n    } else if (inputType === 'rgba') {\n      const rgb = colr.toRgbObject();\n      return (\n        <div className={styles.inputs}>\n          <Input small value={rgb.r} label='R' onChange={this.onRChange} />\n          <Input small value={rgb.g} label='G' onChange={this.onGChange} />\n          <Input small value={rgb.b} label='B' onChange={this.onBChange} />\n          <Input small value={opacity} label='A' onChange={::this.onOpacityChange} />\n        </div>\n      );\n    } else if (inputType === 'hsva') {\n      const hsv = colr.toHsvObject();\n      return (\n        <div className={styles.inputs}>\n          <Input small value={hsv.h} label='H' onChange={this.onHChange} />\n          <Input small value={hsv.s} label='S' onChange={this.onSChange} />\n          <Input small value={hsv.v} label='V' onChange={this.onVChange} />\n          <Input small value={opacity} label='A' onChange={::this.onOpacityChange} />\n        </div>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/inputs.less",
    "content": ".root {\n  position: relative;\n  padding-top: 12px;\n  padding-bottom: 4px;\n}\n\n.previous, .next {\n  position: absolute;\n  display: inline-block;\n  top: 50%;\n  transform: translateY(-50%);\n  width: 12px;\n  height: 12px;\n  cursor: pointer;\n\n  :global i {\n    font-size: 12px;\n    color: #999999;\n    line-height: 12px;\n  }\n\n  &:hover :global i {\n    color: #333333;\n  }\n}\n.previous {\n  left: 0;\n}\n.next {\n  right: 0;\n}\n\n.inputs {\n  padding: 0 12px;\n  text-align: center;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/linear-gradient.jsx",
    "content": "import cx from 'classnames';\nimport sortBy from 'lodash.sortby';\nimport utils from 'helpers/utils';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {applyBackground, getColorString} from 'helpers/colors';\n\nimport styles from './linear-gradient.less';\n\nexport default class LinearGradient extends Component {\n  static propTypes = {\n    editingPoint: PropTypes.number.isRequired,\n    value: PropTypes.object.isRequired,\n    colors: PropTypes.array.isRequired,\n    changeEditingPoint: PropTypes.func.isRequired,\n    pointPercChange: PropTypes.func.isRequired,\n    addPoint: PropTypes.func.isRequired,\n    changeAngle: PropTypes.func.isRequired\n  };\n\n  constructor (props, children) {\n    super(props, children);\n    this.onMouseUpListener = this.onMouseUp.bind(this);\n    this.onMouseMoveListener = this.onMouseMove.bind(this);\n  }\n\n  getInitState () {\n    return {\n      dragging: false\n    };\n  }\n\n  componentWillUnmount () {\n    document.removeEventListener('mouseup', this.onMouseUpListener);\n    document.removeEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  markerClicked (number) {\n    this.props.changeEditingPoint(number);\n  }\n\n  onMouseDown (index, event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    const orderedPoints = sortBy(this.props.value.points, 'perc');\n    this.activePoint = index;\n    this.activeFirst = orderedPoints[0] === this.props.value.points[index];\n    this.activeLast = orderedPoints[orderedPoints.length - 1] === this.props.value.points[index];\n\n    this.setState({\n      dragging: true\n    });\n\n    document.addEventListener('mouseup', this.onMouseUpListener);\n    document.addEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  onMouseMove (event) {\n    event.preventDefault();\n\n    const bounds = utils.getOffsetRect(this.refs.holder);\n    const point = {\n      x: utils.limitNumber((event.pageX - bounds.left) / bounds.width, 0, 1),\n      y: 1 - utils.limitNumber((event.pageY - bounds.top) / bounds.height, 0, 1)\n    };\n\n    if (this.activeFirst || this.activeLast) {\n      // point.y = 1 - point.y;\n      const center = {\n        x: 0.5,\n        y: 0.5\n      };\n      const lineAngle = this.getLineAngle(center, point);\n\n      let newAngle;\n      if (lineAngle > 359 && lineAngle < 360) {\n        newAngle = 0;\n      } else {\n        newAngle = utils.roundSnap(lineAngle, [0, 45, 90, 135, 180, 225, 270, 315]);\n      }\n\n      if (this.activeFirst) {\n        newAngle -= 180;\n        if (newAngle < 0) {\n          newAngle += 360;\n        }\n      }\n      this.props.changeAngle(newAngle);\n    }\n    const pointA = this.getRectPoint(this.props.value.angle, 158);\n    const pointB = {\n      x: -pointA.x,\n      y: -pointA.y\n    };\n\n    const newPoint = {\n      x: ((point.x - 0.5) * 2) * 156,\n      y: ((point.y - 0.5) * 2) * 156\n    };\n\n    const xDelta = pointA.x - pointB.x;\n    const yDelta = pointA.y - pointB.y;\n    const u =\n      ((newPoint.x - pointB.x) * xDelta + (newPoint.y - pointB.y) * yDelta) /\n      (xDelta * xDelta + yDelta * yDelta);\n\n    let closestPoint;\n    if (u < 0) {\n      closestPoint = {\n        x: pointB.x,\n        y: pointB.y\n      };\n    } else if (u > 1) {\n      closestPoint = {\n        x: pointA.x,\n        y: pointA.y\n      };\n    } else {\n      closestPoint = {\n        x: Math.round(pointB.x + u * xDelta),\n        y: Math.round(pointB.y + u * yDelta)\n      };\n    }\n    const total = utils.pointsDistance(pointA, pointB);\n    const dist = utils.pointsDistance(pointB, closestPoint);\n\n    this.props.pointPercChange(this.activePoint, utils.roundSnap(dist / total * 100, [0, 25, 50, 75, 100]));\n  }\n\n  onMouseUp (event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.componentWillUnmount();\n\n    this.setState({\n      dragging: false\n    });\n  }\n\n  onLineClick (event) {\n    event.preventDefault();\n\n    const bounds = utils.getOffsetRect(this.refs.holder);\n    const point = {\n      x: utils.limitNumber((event.pageX - bounds.left) / bounds.width, 0, 1),\n      y: 1 - utils.limitNumber((event.pageY - bounds.top) / bounds.height, 0, 1)\n    };\n\n    const pointA = this.getRectPoint(this.props.value.angle, 158);\n    const pointB = {\n      x: -pointA.x,\n      y: -pointA.y\n    };\n    const newPoint = {\n      x: ((point.x - 0.5) * 2) * 156,\n      y: ((point.y - 0.5) * 2) * 156\n    };\n\n    const total = utils.pointsDistance(pointA, pointB);\n    const dist = utils.pointsDistance(pointB, newPoint);\n\n    this.props.addPoint(Math.round(dist / total * 100));\n  }\n\n  getLineAngle (pointA, pointB) {\n    const dy = pointB.y - pointA.y;\n    const dx = pointB.x - pointA.x;\n    let theta = Math.atan2(dy, dx) * 180 / Math.PI; // range (-180, 180)\n    if (theta < 0) {\n      theta += 360;\n    }\n    return theta;\n  }\n\n  getRectPoint (angle, radius) {\n    const result = {\n      x: 0,\n      y: 0\n    };\n    if (angle >= 0 && angle <= 45) {\n      result.x = radius;\n      result.y = radius * Math.tan(angle * Math.PI / 180);\n    } else if (angle > 45 && angle <= 90) {\n      result.x = radius * Math.tan((45 - (angle - 45)) * Math.PI / 180);\n      result.y = radius;\n    } else if (angle > 90 && angle <= 180) {\n      const calc = this.getRectPoint(angle - 90, radius);\n      result.x = -calc.y;\n      result.y = calc.x;\n    } else if (angle > 180 && angle <= 270) {\n      const calc = this.getRectPoint(angle - 180, radius);\n      result.x = -calc.x;\n      result.y = -calc.y;\n    } else if (angle > 270 && angle <= 360) {\n      const calc = this.getRectPoint(angle - 270, radius);\n      result.x = calc.y;\n      result.y = -calc.x;\n    }\n    return result;\n  }\n\n  render () {\n    return (\n      <div className={styles.root} ref='holder'>\n        {this.renderContent()}\n      </div>\n    );\n  }\n\n  renderContent () {\n    const gradStyle = {};\n    applyBackground(gradStyle, this.props.value, this.props.colors);\n\n    const angle = this.props.value.angle;\n    const pointA = this.getRectPoint(angle, 158);\n    const pointB = {\n      x: -pointA.x,\n      y: -pointA.y\n    };\n\n    // relative to html axis\n    pointA.x = pointA.x + 158;\n    pointA.y = 158 - pointA.y;\n    pointB.x = pointB.x + 158;\n    pointB.y = 158 - pointB.y;\n\n    const orderedPoints = sortBy(this.props.value.points, 'perc');\n    const firstPointPosition = utils.getPointInLineByPerc(\n      pointB,\n      pointA,\n      orderedPoints[0].perc\n    );\n    const lastPointPosition = utils.getPointInLineByPerc(\n      pointB,\n      pointA,\n      orderedPoints[orderedPoints.length - 1].perc\n    );\n\n    return (\n      <div className={styles.content} style={gradStyle}>\n        <svg className={styles.lineSVG} key='lineSvg'>\n          <line\n            className={styles.line}\n            x1={firstPointPosition.x}\n            y1={firstPointPosition.y}\n            x2={lastPointPosition.x}\n            y2={lastPointPosition.y}\n            strokeWidth='2'\n            stroke='#ffffff'\n            onClick={::this.onLineClick}\n          />\n        </svg>\n        {this.props.value.points.map(this.renderPoint.bind(this, pointA, pointB))}\n        {this.renderAngle()}\n      </div>\n    );\n  }\n\n  renderPoint (pointA, pointB, colorObj, index) {\n    const pointPosition = utils.getPointInLineByPerc(pointB, pointA, colorObj.perc);\n    const selected = this.props.editingPoint === index;\n    const style = {\n      left: pointPosition.x,\n      top: pointPosition.y,\n      backgroundColor: getColorString(colorObj, this.props.colors)\n    };\n    const onClick = this.markerClicked.bind(this, index);\n    const onMouseDown = this.onMouseDown.bind(this, index);\n\n    return (\n      <div\n        key={index}\n        className={cx(style.point, selected && style.selected)}\n        style={style}\n        onClick={onClick}\n        onMouseDown={onMouseDown}\n      />\n    );\n  }\n\n  renderAngle () {\n    if (this.state.dragging && (this.activeFirst || this.activeLast)) {\n      const angle = this.props.value.angle;\n      return (\n        <div className={styles.angleInfo} key='angle'>\n          {`${angle}º`}\n        </div>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/linear-gradient.less",
    "content": ".root {\n  position: absolute;\n  display: inline-block;\n  top: 30px;\n  width: 316px;\n  height: 316px;\n  left: -336px;\n  background-color: #ffffff;\n\n  -webkit-box-shadow: 0px 5px 25px 0px rgba(0,0,0,0.5);\n  -moz-box-shadow: 0px 5px 25px 0px rgba(0,0,0,0.5);\n  box-shadow: 0px 5px 25px 0px rgba(0,0,0,0.5);\n\n  &:before {\n    content: '';\n    position: absolute;\n    top: 0; right: 0; bottom: 0; left: 0;\n    opacity: 0.5;\n    background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAChJREFUeNpiPHPmDAMMGBsbw9lMDDgA6RKM%2F%2F%2F%2Fh3POnj1LCzsAAgwAQtYIcFfEyzkAAAAASUVORK5CYII%3D');\n  }\n}\n\n.content {\n  position: absolute;\n  top: 0; right: 0; bottom: 0; left: 0;\n}\n\n.lineSVG {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  top: 0;\n  left: 0;\n  -webkit-filter: drop-shadow(0px 0px 1px rgba(0,0,0,0.24));\n  filter: drop-shadow(0px 0px 1px rgba(0,0,0,0.24));\n}\n\n.line {\n  cursor: copy;\n}\n\n.point {\n  position: absolute;\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  border: 2px solid #ffffff;\n  transform: translate(-50%, -50%);\n  border-radius: 5px;\n  cursor: pointer;\n\n  -webkit-box-shadow: 0px 0px 1px 1px rgba(0,0,0,0.22);\n  -moz-box-shadow: 0px 0px 1px 1px rgba(0,0,0,0.22);\n  box-shadow: 0px 0px 1px 1px rgba(0,0,0,0.22);\n\n  &.selected {\n    width: 14px;\n    height: 14px;\n    border-radius: 7px;\n  }\n}\n\n.angleInfo {\n  position: absolute;\n  top: 50%; left: 50%;\n  transform: translate(-50%, -50%);\n  background-color: #333333;\n  width: 22px;\n  height: 22px;\n  border-radius: 11px;\n  text-align: center;\n  display: inline-block;\n  color: #efefef;\n  font-size: 10px;\n  line-height: 22px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/opacity.jsx",
    "content": "import utils from 'helpers/utils';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './opacity.less';\n\nexport default class Opacity extends Component {\n  static propTypes = {\n    opacity: PropTypes.number.isRequired,\n    opacityChange: PropTypes.func.isRequired,\n    colr: PropTypes.object.isRequired\n  };\n\n  constructor (props, children) {\n    super(props, children);\n    this.onMouseUpListener = this.onMouseUp.bind(this);\n    this.onMouseMoveListener = this.onMouseMove.bind(this);\n  }\n\n  componentWillUnmount () {\n    document.removeEventListener('mouseup', this.onMouseUpListener);\n    document.removeEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  onMouseDown (event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this.onMouseMove(event);\n\n    document.addEventListener('mouseup', this.onMouseUpListener);\n    document.addEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  onMouseMove (event) {\n    event.preventDefault();\n\n    const bounds = utils.getOffsetRect(this.refs.bar);\n    const perc = utils.limitNumber((event.pageX - bounds.left) / bounds.width, 0, 1);\n\n    this.props.opacityChange(Math.round(perc * 100));\n  }\n\n  onMouseUp (event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.componentWillUnmount();\n  }\n\n  render () {\n    const {opacity, colr} = this.props;\n    const markerStyle = {\n      left: `${opacity}%`,\n      transform: `translate(${-opacity}%, -50%)`\n    };\n    const rgb = colr.toRgbObject();\n    const gradStyle = {\n      background:\n        `linear-gradient(to right, rgba(${rgb.r},${rgb.g},${rgb.b},0) 0%,rgba(${rgb.r},${rgb.g},${rgb.b},1) 100%)`\n    };\n\n    return (\n      <div className={styles.root}>\n        <div className={styles.opacity} onMouseDown={::this.onMouseDown} ref='bar'>\n          <span className={styles.gradient} style={gradStyle} />\n          <span className={styles.marker} style={markerStyle} />\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/opacity.less",
    "content": ".root {\n  width: 100%;\n  height: 10px;\n  margin-top: 4px;\n  position: relative;\n}\n\n.opacity {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 14px;\n  border-radius: 4px;\n\n  &:before {\n    content: '';\n    position: absolute;\n    top: 0; right: 0; bottom: 0; left: 0;\n    opacity: 0.5;\n    background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAChJREFUeNpiPHPmDAMMGBsbw9lMDDgA6RKM%2F%2F%2F%2Fh3POnj1LCzsAAgwAQtYIcFfEyzkAAAAASUVORK5CYII%3D');\n  }\n\n  &:after {\n    content: '';\n    position: absolute;\n    display: block;\n    border-radius: 4px;\n    top: 0px; right: 0px; bottom: 0px; left: 0px;\n    border: 1px solid rgba(0, 0, 0, 0.2);\n  }\n}\n\n.gradient {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  border-radius: 4px;\n  background: -moz-linear-gradient(left, rgba(255,0,0,0) 0%, rgba(255,0,0,1) 100%);\n  background: -webkit-linear-gradient(left, rgba(255,0,0,0) 0%,rgba(255,0,0,1) 100%);\n  background: linear-gradient(to right, rgba(255,0,0,0) 0%,rgba(255,0,0,1) 100%);\n}\n\n.marker {\n  position: absolute;\n  display: inline-block;\n  width: 8px;\n  height: 12px;\n  border: 1px solid rgba(0, 0, 0, 0.4);\n  background-color: #ffffff;\n  border-radius: 2px;\n  z-index: 1;\n  transform: translate(-50%, -50%);\n  top: 50%;\n  left: 50%;\n  cursor: pointer;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/radial-gradient.jsx",
    "content": "import cx from 'classnames';\nimport forEach from 'lodash.foreach';\nimport sortBy from 'lodash.sortby';\nimport utils from 'helpers/utils';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {applyBackground, getColorString} from 'helpers/colors';\n\nimport styles from './radial-gradient.less';\n\nconst size = 316;\n\nexport default class RadialGradient extends Component {\n  static propTypes = {\n    editingPoint: PropTypes.number.isRequired,\n    value: PropTypes.object.isRequired,\n    colors: PropTypes.array.isRequired,\n    changeEditingPoint: PropTypes.func.isRequired,\n    pointPercChange: PropTypes.func.isRequired,\n    addPoint: PropTypes.func.isRequired,\n    changeCenter: PropTypes.func.isRequired\n  };\n\n  constructor (props, children) {\n    super(props, children);\n    this.onMouseUpListener = this.onMouseUp.bind(this);\n    this.onMouseMoveListener = this.onMouseMove.bind(this);\n  }\n\n  getInitState () {\n    return {\n      dragging: false\n    };\n  }\n\n  componentWillUnmount () {\n    document.removeEventListener('mouseup', this.onMouseUpListener);\n    document.removeEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  markerClicked (number) {\n    this.props.changeEditingPoint(number);\n  }\n\n  onMouseDown (index, event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    const orderedPoints = sortBy(this.props.value.points, 'perc');\n    this.activePoint = index;\n    this.activeFirst = orderedPoints[0] === this.props.value.points[index];\n    this.activeLast = orderedPoints[orderedPoints.length - 1] === this.props.value.points[index];\n\n    this.setState({\n      dragging: true\n    });\n\n    document.addEventListener('mouseup', this.onMouseUpListener);\n    document.addEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  onMouseMove (event) {\n    event.preventDefault();\n\n    const bounds = utils.getOffsetRect(this.refs.holder);\n    const point = {\n      x: utils.limitNumber((event.pageX - bounds.left) / bounds.width, 0, 1),\n      y: utils.limitNumber((event.pageY - bounds.top) / bounds.height, 0, 1)\n    };\n\n    if (this.activeFirst) {\n      this.props.changeCenter({\n        top: utils.roundSnap(point.y * 100, [0, 25, 50, 75, 100]),\n        left: utils.roundSnap(point.x * 100, [0, 25, 50, 75, 100])\n      });\n    } else {\n      const {pointA, pointB} = this.getRadialLine();\n\n      const newPoint = {\n        x: point.x * size,\n        y: point.y * size\n      };\n\n      const xDelta = pointA.x - pointB.x;\n      const yDelta = pointA.y - pointB.y;\n      const u =\n        1 -\n        ((newPoint.x - pointB.x) * xDelta + (newPoint.y - pointB.y) * yDelta) /\n        (xDelta * xDelta + yDelta * yDelta);\n\n      let closestPoint;\n      if (u < 0) {\n        closestPoint = {\n          x: pointB.x,\n          y: pointB.y\n        };\n      } else if (u > 1) {\n        closestPoint = {\n          x: pointA.x,\n          y: pointA.y\n        };\n      } else {\n        closestPoint = {\n          x: Math.round(pointB.x + u * xDelta),\n          y: Math.round(pointB.y + u * yDelta)\n        };\n      }\n      const total = utils.pointsDistance(pointA, pointB);\n      const dist = utils.pointsDistance(pointB, closestPoint);\n\n      this.props.pointPercChange(this.activePoint, utils.roundSnap(dist / total * 100, [0, 25, 50, 75, 100]));\n    }\n  }\n\n  onMouseUp (event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.componentWillUnmount();\n\n    this.setState({\n      dragging: false\n    });\n  }\n\n  onLineClick (event) {\n    event.preventDefault();\n\n    const bounds = utils.getOffsetRect(this.refs.holder);\n    const point = {\n      x: utils.limitNumber((event.pageX - bounds.left) / bounds.width, 0, 1),\n      y: utils.limitNumber((event.pageY - bounds.top) / bounds.height, 0, 1)\n    };\n\n    const {pointA, pointB} = this.getRadialLine();\n    const newPoint = {\n      x: point.x * size,\n      y: point.y * size\n    };\n\n    const total = utils.pointsDistance(pointA, pointB);\n    const dist = utils.pointsDistance(pointA, newPoint);\n\n    this.props.addPoint(Math.round(dist / total * 100));\n  }\n\n  getRadialLine () {\n    const radius = this.props.value.radius;\n    const center = this.props.value.center;\n\n    const pointA = {\n      x: size * center.left / 100,\n      y: size * center.top / 100\n    };\n    let pointB;\n\n    if (radius[1] === 'c') {\n      let closestPoint;\n      let closestDistance = 999;\n      let farthestPoint;\n      let farthestDistance = 0;\n\n      const corners = [\n        {x: 0, y: 0},\n        {x: size, y: 0},\n        {x: size, y: size},\n        {x: 0, y: size}\n      ];\n\n      forEach(corners, (cornerPoint) => {\n        const distance = utils.pointsDistance(pointA, cornerPoint);\n        if (distance > farthestDistance) {\n          farthestDistance = distance;\n          farthestPoint = cornerPoint;\n        }\n        if (distance < closestDistance) {\n          closestDistance = distance;\n          closestPoint = cornerPoint;\n        }\n      });\n\n      if (radius === 'fc') {\n        pointB = farthestPoint;\n      } else {\n        pointB = closestPoint;\n      }\n    } else {\n      let closestPoint;\n      let closestDistance = 999;\n      let farthestPoint;\n      let farthestDistance = 0;\n\n      const sides = [\n        {x: 0, y: pointA.y},\n        {x: pointA.x, y: 0},\n        {x: size, y: pointA.y},\n        {x: pointA.x, y: size}\n      ];\n\n      forEach(sides, (sidePoint) => {\n        const distance = utils.pointsDistance(pointA, sidePoint);\n        if (distance > farthestDistance) {\n          farthestDistance = distance;\n          farthestPoint = sidePoint;\n        }\n        if (distance < closestDistance) {\n          closestDistance = distance;\n          closestPoint = sidePoint;\n        }\n      });\n\n      if (radius === 'fs') {\n        pointB = farthestPoint;\n      } else {\n        pointB = closestPoint;\n      }\n    }\n\n    return {\n      pointA,\n      pointB\n    };\n  }\n\n  render () {\n    return (\n      <div className={styles.root} ref='holder'>\n        {this.renderContent()}\n      </div>\n    );\n  }\n\n  renderContent () {\n    const gradStyle = {};\n    applyBackground(gradStyle, this.props.value, this.props.colors);\n\n    const radialLine = this.getRadialLine();\n\n    const orderedPoints = sortBy(this.props.value.points, 'perc');\n    const firstPointPosition = utils.getPointInLineByPerc(\n      radialLine.pointA,\n      radialLine.pointB,\n      orderedPoints[0].perc\n    );\n    const lastPointPosition = utils.getPointInLineByPerc(\n      radialLine.pointA,\n      radialLine.pointB,\n      orderedPoints[orderedPoints.length - 1].perc\n    );\n\n    return (\n      <div className={styles.content} style={gradStyle} key={this.props.value.radius}>\n        <svg className={styles.lineSVG} key='lineSvg'>\n          <line\n            className={styles.line}\n            x1={firstPointPosition.x}\n            y1={firstPointPosition.y}\n            x2={lastPointPosition.x}\n            y2={lastPointPosition.y}\n            strokeWidth='2'\n            stroke='#ffffff'\n            onClick={::this.onLineClick}\n          />\n        </svg>\n        {this.props.value.points.map(this.renderPoint.bind(this, radialLine.pointA, radialLine.pointB))}\n      </div>\n    );\n  }\n\n  renderPoint (pointA, pointB, colorObj, index) {\n    const pointPosition = utils.getPointInLineByPerc(pointA, pointB, colorObj.perc);\n    const selected = this.props.editingPoint === index;\n    const style = {\n      left: pointPosition.x,\n      top: pointPosition.y,\n      backgroundColor: getColorString(colorObj, this.props.colors)\n    };\n    const onClick = this.markerClicked.bind(this, index);\n    const onMouseDown = this.onMouseDown.bind(this, index);\n    return (\n      <div\n        key={index}\n        className={cx(styles.point, selected && styles.selected)}\n        style={style}\n        onClick={onClick}\n        onMouseDown={onMouseDown}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/radial-gradient.less",
    "content": ".root {\n  position: absolute;\n  display: inline-block;\n  top: 30px;\n  width: 316px;\n  height: 316px;\n  left: -336px;\n  background-color: #ffffff;\n\n  -webkit-box-shadow: 0px 5px 25px 0px rgba(0,0,0,0.5);\n  -moz-box-shadow: 0px 5px 25px 0px rgba(0,0,0,0.5);\n  box-shadow: 0px 5px 25px 0px rgba(0,0,0,0.5);\n\n  &:before {\n    content: '';\n    position: absolute;\n    top: 0; right: 0; bottom: 0; left: 0;\n    opacity: 0.5;\n    background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAChJREFUeNpiPHPmDAMMGBsbw9lMDDgA6RKM%2F%2F%2F%2Fh3POnj1LCzsAAgwAQtYIcFfEyzkAAAAASUVORK5CYII%3D');\n  }\n}\n\n.content {\n  position: absolute;\n  top: 0; right: 0; bottom: 0; left: 0;\n}\n\n.lineSVG {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  top: 0;\n  left: 0;\n  -webkit-filter: drop-shadow(0px 0px 1px rgba(0,0,0,0.24));\n  filter: drop-shadow(0px 0px 1px rgba(0,0,0,0.24));\n}\n\n.line {\n  cursor: copy;\n}\n\n.point {\n  position: absolute;\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  border: 2px solid #ffffff;\n  transform: translate(-50%, -50%);\n  border-radius: 5px;\n  cursor: pointer;\n\n  -webkit-box-shadow: 0px 0px 1px 1px rgba(0,0,0,0.22);\n  -moz-box-shadow: 0px 0px 1px 1px rgba(0,0,0,0.22);\n  box-shadow: 0px 0px 1px 1px rgba(0,0,0,0.22);\n\n  &.selected {\n    width: 14px;\n    height: 14px;\n    border-radius: 7px;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/radial-radius.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './radial-radius.less';\n\nexport default class RadialRadius extends Component {\n  static propTypes = {\n    radius: PropTypes.string.isRequired,\n    changeRadius: PropTypes.func.isRequired\n  };\n\n  init () {\n    this.onCCClick = this.onClick.bind(this, 'cc');\n    this.onFCClick = this.onClick.bind(this, 'fc');\n    this.onCSClick = this.onClick.bind(this, 'cs');\n    this.onFSClick = this.onClick.bind(this, 'fs');\n  }\n\n  onClick (radius, event) {\n    event.preventDefault();\n    this.props.changeRadius(radius);\n  }\n\n  render () {\n    const radialCenterX = 6.25;\n    const radialCenterY = 9;\n    const {radius} = this.props;\n\n    return (\n      <div className={styles.root}>\n        <div className={styles.label}>Radius</div>\n        <div\n          className={cx(styles.option, styles.cc, radius === 'cc' && styles.active)}\n          onClick={this.onCCClick}\n        >\n          <svg>\n            <line\n              x1={radialCenterX}\n              y1={radialCenterY}\n              x2={0}\n              y2={0}\n              strokeWidth='1'\n              stroke={radius === 'cc' ? '#12a5ff' : '#4a4a4a'}\n            />\n            <circle\n              cx={radialCenterX}\n              cy={radialCenterY}\n              r='1.5'\n              fill={radius === 'cc' ? '#12a5ff' : '#4a4a4a'}\n            />\n            <circle\n              cx={0}\n              cy={0}\n              r='1'\n              fill={radius === 'cc' ? '#12a5ff' : '#4a4a4a'}\n            />\n          </svg>\n        </div>\n        <div\n          className={cx(styles.option, styles.fc, radius === 'fc' && styles.active)}\n          onClick={this.onFCClick}\n        >\n          <svg>\n            <line\n              x1={radialCenterX}\n              y1={radialCenterY}\n              x2={25}\n              y2={0}\n              strokeWidth='1'\n              stroke={radius === 'fc' ? '#12a5ff' : '#4a4a4a'}\n            />\n            <circle\n              cx={radialCenterX}\n              cy={radialCenterY}\n              r='1.5'\n              fill={radius === 'fc' ? '#12a5ff' : '#4a4a4a'}\n            />\n            <circle\n              cx={24}\n              cy={0}\n              r='1'\n              fill={radius === 'fc' ? '#12a5ff' : '#4a4a4a'}\n            />\n          </svg>\n        </div>\n        <div\n          className={cx(styles.option, styles.cs, radius === 'cs' && styles.active)}\n          onClick={this.onCSClick}\n        >\n          <svg>\n            <line\n              x1={radialCenterX}\n              y1={radialCenterY}\n              x2={0}\n              y2={radialCenterY}\n              strokeWidth='1'\n              stroke={radius === 'cs' ? '#12a5ff' : '#4a4a4a'}\n            />\n            <circle\n              cx={radialCenterX}\n              cy={radialCenterY}\n              r='1.5'\n              fill={radius === 'cs' ? '#12a5ff' : '#4a4a4a'}\n            />\n            <circle\n              cx={0}\n              cy={radialCenterY}\n              r='1'\n              fill={radius === 'cs' ? '#12a5ff' : '#4a4a4a'}\n            />\n          </svg>\n        </div>\n        <div\n          className={cx(styles.option, styles.fs, radius === 'fs' && styles.active)}\n          onClick={this.onFSClick}\n        >\n          <svg>\n            <line\n              x1={radialCenterX}\n              y1={radialCenterY}\n              x2={24}\n              y2={radialCenterY}\n              strokeWidth='1'\n              stroke={radius === 'fs' ? '#12a5ff' : '#4a4a4a'}\n            />\n            <circle\n              cx={radialCenterX}\n              cy={radialCenterY}\n              r='1.5'\n              fill={radius === 'fs' ? '#12a5ff' : '#4a4a4a'}\n            />\n            <circle\n              cx={24}\n              cy={radialCenterY}\n              r='1'\n              fill={radius === 'fs' ? '#12a5ff' : '#4a4a4a'}\n            />\n          </svg>\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/radial-radius.less",
    "content": ".root {\n  border-top: 2px solid #dbdbdb;\n  padding: 10px 0;\n}\n\n.label {\n  display: inline-block;\n  vertical-align: top;\n  font-size: 10px;\n  text-transform: uppercase;\n  color: #999999;\n  line-height: 18px;\n  margin-right: 13px;\n}\n\n.option {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  cursor: pointer;\n\n  width: 25px;\n  height: 18px;\n  margin-right: 8px;\n\n  :global svg {\n    width: 100%;\n    height: 100%;\n  }\n\n  &:after {\n    content: '';\n    position: absolute;\n    top: 0; right: 0; bottom: 0; left: 0;\n    border: 1px solid rgba(0, 0, 0, 0.4);\n  }\n}\n\n.cc {\n  background: radial-gradient(circle closest-corner at 25% 50% , #848484, #ededed 100%);\n}\n.fc {\n  background: radial-gradient(circle farthest-corner at 25% 50% , #848484, #ededed 100%);\n}\n.cs {\n  background: radial-gradient(circle closest-side at 25% 50% , #848484, #ededed 100%);\n}\n.fs {\n  background: radial-gradient(circle farthest-side at 25% 50% , #848484, #ededed 100%);\n}\n\n.active {\n  &.cc {\n    background: radial-gradient(circle closest-corner at 25% 50% , #ffffff, #a0dbff 100%);\n  }\n  &.fc {\n    background: radial-gradient(circle farthest-corner at 25% 50% , #ffffff, #a0dbff 100%);\n  }\n  &.cs {\n    background: radial-gradient(circle closest-side at 25% 50% , #ffffff, #a0dbff 100%);\n  }\n  &.fs {\n    background: radial-gradient(circle farthest-side at 25% 50% , #ffffff, #a0dbff 100%);\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/sat-light.jsx",
    "content": "import utils from 'helpers/utils';\nimport Colr from 'colr';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nimport styles from './sat-light.less';\n\nexport default class SatLight extends Component {\n  static propTypes = {\n    colr: PropTypes.object.isRequired,\n    hsv: PropTypes.object.isRequired,\n    hsvChange: PropTypes.func.isRequired\n  };\n\n  constructor (props, children) {\n    super(props, children);\n    this.onMouseUpListener = this.onMouseUp.bind(this);\n    this.onMouseMoveListener = this.onMouseMove.bind(this);\n  }\n\n  componentWillUnmount () {\n    document.removeEventListener('mouseup', this.onMouseUpListener);\n    document.removeEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  onMouseDown (event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this.onMouseMove(event);\n\n    document.addEventListener('mouseup', this.onMouseUpListener);\n    document.addEventListener('mousemove', this.onMouseMoveListener);\n  }\n\n  onMouseMove (event) {\n    event.preventDefault();\n\n    const bounds = utils.getOffsetRect(findDOMNode(this));\n    const percY = utils.limitNumber((event.pageY - bounds.top) / bounds.height, 0, 1);\n    const percX = utils.limitNumber((event.pageX - bounds.left) / bounds.width, 0, 1);\n\n    this.props.hsvChange({\n      h: this.props.hsv.h,\n      s: percX * 100,\n      v: 100 - percY * 100\n    });\n  }\n\n  onMouseUp (event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.componentWillUnmount();\n  }\n\n  render () {\n    const {hsv} = this.props;\n    const markerStyle = {\n      top: `${100 - hsv.v}%`,\n      left: `${hsv.s}%`\n    };\n    const backStyle = {\n      backgroundColor: Colr.fromHsv(hsv.h, 100, 100).toHex()\n    };\n\n    if (hsv.v > 50 && hsv.s < 50) {\n      markerStyle.borderColor = '#000000';\n    }\n\n    return (\n      <div className={styles.root} style={backStyle} onMouseDown={::this.onMouseDown} >\n        <span className={styles.border} />\n        <span className={styles.marker} style={markerStyle} />\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/sat-light.less",
    "content": ".root {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 14px;\n  background-color: #ff0000;\n  border-radius: 4px;\n\n  &:before, &:after {\n    content: '';\n    position: absolute;\n    display: block;\n    border-radius: 4px;\n    top: 0px; right: 0px; bottom: 0px; left: 0px;\n  }\n  &:before {\n    background: -moz-linear-gradient(left, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%);\n    background: -webkit-linear-gradient(left, rgba(255,255,255,1) 0%,rgba(255,255,255,0) 100%);\n    background: linear-gradient(to right, rgba(255,255,255,1) 0%,rgba(255,255,255,0) 100%);\n  }\n  &:after {\n    background: -moz-linear-gradient(top, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 100%);\n    background: -webkit-linear-gradient(top, rgba(0,0,0,0) 0%,rgba(0,0,0,1) 100%);\n    background: linear-gradient(to bottom, rgba(0,0,0,0) 0%,rgba(0,0,0,1) 100%);\n  }\n}\n\n.border {\n  position: absolute;\n  display: block;\n  border-radius: 4px;\n  z-index: 1;\n  top: 0px; right: 0px; bottom: 0px; left: 0px;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n}\n\n.marker {\n  position: absolute;\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  border: 2px solid #ffffff;\n  border-radius: 5px;\n  z-index: 1;\n  transform: translate(-50%, -50%);\n  top: 50%;\n  left: 50%;\n  cursor: pointer;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/types.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './types.less';\n\nexport default class Types extends Component {\n  static propTypes = {\n    type: PropTypes.string.isRequired,\n    changeToSolid: PropTypes.func.isRequired,\n    changeToLinear: PropTypes.func.isRequired,\n    changeToRadial: PropTypes.func.isRequired\n  };\n\n  render () {\n    const {type} = this.props;\n\n    return (\n      <div className={styles.types}>\n        <div\n          className={cx(styles.type, styles.solid, type !== 'linear' && type !== 'radial' && styles.active)}\n          onClick={this.props.changeToSolid}\n        />\n        <div\n          className={cx(styles.type, styles.linear, type === 'linear' && styles.active)}\n          onClick={this.props.changeToLinear}\n        />\n        <div\n          className={cx(styles.type, styles.radial, type === 'radial' && styles.active)}\n          onClick={this.props.changeToRadial}\n        />\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/color/types.less",
    "content": "@import '~styles/colors.less';\n\n.types {\n  text-align: right;\n  margin-bottom: 6px;\n}\n\n.type {\n  display: inline-block;\n  position: relative;\n  width: 26px;\n  height: 26px;\n  margin-left: 16px;\n  border-radius: 4px;\n  cursor: pointer;\n\n  &:after {\n    content: ' ';\n    position: absolute;\n    top: 0; left: 0; right: 0; bottom: 0;\n    border: 1px solid rgba(0, 0, 0, 0.20);\n    border-radius: 4px;\n  }\n\n  &:hover {\n    &:after {\n      border-color: @primary;\n    }\n  }\n}\n\n.solid {\n  background-color: #999999;\n\n  &.active {\n    background-color: @primary;\n\n    &:after {\n      border-color: @primary;\n    }\n  }\n}\n\n.linear {\n  background: -moz-linear-gradient(top, #ffffff 0%, #999999 100%);\n  background: -webkit-linear-gradient(top, #ffffff 0%,#999999 100%);\n  background: linear-gradient(to bottom, #ffffff 0%,#999999 100%);\n\n  &.active {\n    background: -moz-linear-gradient(top, #ffffff 0%, @primary 100%);\n    background: -webkit-linear-gradient(top, #ffffff 0%, @primary 100%);\n    background: linear-gradient(to bottom, #ffffff 0%, @primary 100%);\n\n    &:after {\n      border-color: @primary;\n    }\n  }\n}\n\n.radial {\n  background: -moz-radial-gradient(center, ellipse cover, #ffffff 0%, #999999 100%);\n  background: -webkit-radial-gradient(center, ellipse cover, #ffffff 0%,#999999 100%);\n  background: radial-gradient(ellipse at center, #ffffff 0%,#999999 100%);\n\n  &.active {\n    background: -moz-radial-gradient(center, ellipse cover, #ffffff 0%, @primary 100%);\n    background: -webkit-radial-gradient(center, ellipse cover, #ffffff 0%, @primary 100%);\n    background: radial-gradient(ellipse at center, #ffffff 0%, @primary 100%);\n\n    &:after {\n      border-color: @primary;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/columns/column.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './column.less';\n\nexport default class Column extends Component {\n  static propTypes = {\n    selected: PropTypes.bool.isRequired,\n    width: PropTypes.string,\n    widthPerc: PropTypes.string,\n    id: PropTypes.string.isRequired,\n    onClick: PropTypes.func.isRequired,\n    className: PropTypes.string\n  };\n\n  @bind\n  onClick () {\n    const {id, onClick} = this.props;\n    onClick(id);\n  }\n\n  render () {\n    const {selected, width, widthPerc, className} = this.props;\n\n    const style = {};\n    if (width === 'custom') {\n      style.width = `${widthPerc}`;\n    }\n\n    return (\n      <div\n        style={style}\n        className={cx(styles.root, className, selected && styles.active)}\n        onClick={this.onClick}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/columns/column.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  position: relative;\n  cursor: pointer;\n  height: 22px;\n\n  &:after {\n    content: \" \";\n    position: absolute;\n    top: 2px;\n    right: 2px;\n    bottom: 2px;\n    left: 2px;\n    background-color: @chromeBackgroundDarkerColor;\n    border: 1px solid @chromeBordersColor;\n    border-radius: 3px;\n  }\n\n  &:hover {\n    &:after {\n      background-color: #ccc;\n    }\n  }\n  &.active {\n    &:after {\n      background-color: @primary;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/columns/columns-manager.jsx",
    "content": "import bind from 'decorators/bind';\nimport cloneDeep from 'lodash.clonedeep';\nimport utils from 'helpers/utils';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './columns-manager.less';\nimport Column from './column';\n\nexport default class ColumnsManager extends Component {\n  static propTypes = {\n    value: PropTypes.array.isRequired,\n    onChange: PropTypes.func.isRequired,\n    OptionsList: PropTypes.any.isRequired,\n    multiRows: PropTypes.bool,\n    selectedElement: PropTypes.object,\n    columnOptions: PropTypes.array.isRequired,\n    columnOptionsSingleRow: PropTypes.array.isRequired,\n    breakOptions: PropTypes.array.isRequired\n  };\n\n  static defaultProps = {\n    multiRows: true\n  };\n\n  getInitState () {\n    return {\n      selected: false\n    };\n  }\n\n  parseValue (value, idChanged = -1) {\n    const {selectedElement, multiRows} = this.props;\n    return utils.parseColumnsDisplay(value, selectedElement.children.length, multiRows, idChanged);\n  }\n\n  @bind\n  onClick (key) {\n    if (this.state.selected === key) {\n      this.setState({\n        selected: false\n      });\n    } else {\n      this.setState({\n        selected: key\n      });\n    }\n  }\n\n  onChange (id, value) {\n    const valueParsed = cloneDeep(this.parseValue(this.props.value));\n    valueParsed[this.state.selected][id] = value;\n    const result = this.parseValue(valueParsed, this.state.selected);\n    this.props.onChange(result);\n  }\n\n  render () {\n    return (\n      <div>\n        {this.renderChildren()}\n        {this.renderOptions()}\n      </div>\n    );\n  }\n\n  renderChildren () {\n    const {value, selectedElement} = this.props;\n    const valueParsed = this.parseValue(value);\n    const children = [];\n    const numChildren = selectedElement.children.length;\n    let i;\n\n    for (i = 0; i < numChildren; i++) {\n      if (valueParsed[i].width === 'block') {\n        children.push(this.renderColumn(i, valueParsed[i]));\n      } else {\n        const columns = [];\n        for (i; i < numChildren; i++) {\n          if (valueParsed[i].width !== 'block' && !(columns.length > 0 && valueParsed[i].break)) {\n            columns.push(this.renderColumn(i, valueParsed[i]));\n          } else {\n            i--;\n            break;\n          }\n        }\n        children.push(\n          <div className={styles.row} key={i}>\n            {columns}\n          </div>\n        );\n      }\n    }\n\n    return children;\n  }\n\n  renderColumn (id, value) {\n    return (\n      <Column\n        id={id}\n        width={value.width}\n        widthPerc={value.widthPerc}\n        onClick={this.onClick}\n        selected={this.state.selected === id}\n        className={styles.column}\n        key={id}\n      />\n    );\n  }\n\n  renderOptions () {\n    if (this.state.selected !== false) {\n      const {multiRows, OptionsList, columnOptions, columnOptionsSingleRow, breakOptions} = this.props;\n      const value = this.parseValue(this.props.value);\n      const values = value[this.state.selected];\n      const breakable = (\n        multiRows &&\n        values.width !== 'block' &&\n        this.state.selected >= 2 &&\n        this.state.selected < value.length - 1 &&\n        value[this.state.selected - 1].width !== 'block' &&\n        value[this.state.selected - 2].width !== 'block'\n      );\n\n      return (\n        <div className={styles.options}>\n          <OptionsList\n            options={multiRows ? columnOptions : columnOptionsSingleRow}\n            values={values}\n            onChange={::this.onChange}\n          />\n          {breakable && <OptionsList options={breakOptions} values={values} onChange={::this.onChange} />}\n        </div>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/columns/columns-manager.less",
    "content": "@import '~styles/colors.less';\n\n.row {\n  display: table;\n  table-layout: fixed;\n  width: 100%;\n\n  .column {\n    display: table-cell;\n    vertical-align: top;\n  }\n}\n\n.options {\n  margin: 5px 0;\n  padding: 10px;\n  border-left: 2px solid @primary;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/columns/index.js",
    "content": "import Component from 'components/component';\nimport React from 'react';\nimport {connect} from 'react-redux';\n\nimport ColumnsManager from './columns-manager';\n\n@connect(\n  (state) => ({\n    selectedElement: state.pageBuilder.selectedElement\n  })\n)\nexport default class ColumnsManagerContainer extends Component {\n  static columnOptions = [\n    {\n      label: 'Width',\n      type: 'Select',\n      id: 'width',\n      props: {\n        labels: ['Block', 'Column auto', 'Column custom'],\n        values: ['block', 'auto', 'custom']\n      },\n      unlocks: {\n        custom: [\n          {\n            label: 'Width (%)',\n            type: 'Percentage',\n            id: 'widthPerc'\n          }\n        ]\n      }\n    }\n  ];\n\n  static columnOptionsSingleRow = [\n    {\n      label: 'Width',\n      type: 'Select',\n      id: 'width',\n      props: {\n        labels: ['Column auto', 'Column custom'],\n        values: ['auto', 'custom']\n      },\n      unlocks: {\n        custom: [\n          {\n            label: 'Width (%)',\n            type: 'Percentage',\n            id: 'widthPerc'\n          }\n        ]\n      }\n    }\n  ];\n\n  static breakOptions = [\n    {\n      label: 'To next line',\n      type: 'Boolean',\n      id: 'break',\n      default: false\n    }\n  ];\n\n  render () {\n    return (\n      <ColumnsManager\n        {...this.props}\n        columnOptions={ColumnsManagerContainer.columnOptions}\n        columnOptionsSingleRow={ColumnsManagerContainer.columnOptionsSingleRow}\n        breakOptions={ColumnsManagerContainer.breakOptions}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/combobox/index.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport forEach from 'lodash.foreach';\nimport Component from 'components/component';\nimport React from 'react';\n\nimport styles from './index.less';\n\nexport default class Combobox extends Component {\n  static propTypes = {\n    labels: React.PropTypes.array,\n    values: React.PropTypes.array.isRequired,\n    value: React.PropTypes.string.isRequired,\n    onChange: React.PropTypes.func.isRequired,\n    className: React.PropTypes.string,\n    style: React.PropTypes.object,\n    white: React.PropTypes.bool\n  };\n\n  getInitState () {\n    return {\n      opened: false\n    };\n  }\n\n  @bind\n  toggle () {\n    this.setState({\n      opened: !this.state.opened\n    });\n  }\n\n  optionClicked (value, event) {\n    event.preventDefault();\n\n    if (this.props.onChange) {\n      this.props.onChange(value);\n    }\n\n    this.setState({\n      opened: false\n    });\n  }\n\n  render () {\n    const {values, labels, value, className, style, white} = this.props;\n    let label = '';\n    forEach(values, (valueIt, key) => {\n      if (value === valueIt) {\n        label = labels && labels[key] || valueIt;\n      }\n    });\n\n    return (\n      <div className={cx(styles.combobox, white && styles.white, className)} style={style}>\n        <div className={cx(styles.holder, this.state.opened && styles.opened)}>\n          <div className={styles.header} onClick={this.toggle}>\n            <div className={styles.selectedText}>{label}</div>\n            <div className={styles.button}>\n              <i className={cx(\n                  'nc-icon-mini',\n                  this.state.opened ? 'arrows-1_minimal-up' : 'arrows-1_minimal-down'\n                )}\n              />\n            </div>\n          </div>\n          <div className={styles.options}>\n            {(labels || values).map(this.renderOption, this)}\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n  renderOption (option, i) {\n    const onClick = this.optionClicked.bind(this, this.props.values[i]);\n    return (\n      <div\n        key={i}\n        className={styles.option}\n        onClick={onClick}\n      >\n        {option}\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/combobox/index.less",
    "content": "@import '~styles/colors.less';\n\n@comboboxHeight: 38px;\n\n.combobox {\n  position: relative;\n  display: inline-block;\n  cursor: pointer;\n  width: 100%;\n  max-width: 480px;\n  font-size: 10px;\n\n  &:hover {\n    .holder {\n      border-color: @primary;\n    }\n  }\n\n  &.small {\n    max-width: 120px;\n  }\n}\n\n.holder {\n  height: @comboboxHeight;\n  position: relative;\n  border: solid 1px @chromeBordersColor;\n  background-color: @chromeBackgroundDarkerColor;\n  overflow: hidden;\n\n  border-radius: 3px;\n  transition: all 0.3s ease-out;\n\n  .button {\n    color: @chromeTextColor;\n    text-align: center;\n  }\n\n  &.opened {\n    height: auto;\n  }\n}\n\n.header {\n  overflow: hidden;\n\n  .selectedText {\n    position: relative;\n    padding: 0px 12px;\n    line-height: @comboboxHeight;\n    font-size: 10px;\n    display: inline-block;\n    float: left;\n    color: @chromeTextColor;\n  }\n\n  .button {\n    display: inline-block;\n    float: right;\n    width: @comboboxHeight;\n    height: @comboboxHeight;\n\n    :global i {\n      line-height: @comboboxHeight;\n      font-size: 11px;\n    }\n  }\n}\n\n.options {\n  position: relative;\n  left: 0;\n  display: block;\n  max-height: 155px;\n  overflow-y: auto;\n  border-top: solid 1px @chromeBordersColor;\n}\n\n.option {\n  color: @chromeTextColor;\n  padding: 6px 12px;\n  display: block;\n  font-size: 10px;\n  transition: all 0.2s ease-out;\n\n  &:hover {\n    background-color: @primary;\n    color: @chromeTextColorHighlight;\n  }\n}\n\n// White areas\n.white {\n  .holder {\n    background-color: transparent;\n    border-color: @adminInputBorders;\n    color: @adminText;\n  }\n\n  .header {\n    .selectedText {\n      color: @adminText;\n    }\n    .button {\n      color: @adminText;\n      border-color: @adminInputBorders;\n    }\n  }\n\n  .options {\n    border-color: @adminInputBorders;\n  }\n\n  .option {\n    color: @adminText;\n\n    &:hover {\n      color: @adminTextHighlight;\n    }\n  }\n\n  &:hover {\n    .combobox-holder {\n      border-color: @primary;\n\n      .button {\n        color: @adminText;\n      }\n    }\n\n    .header {\n      .button {\n        background-color: transparent;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/corners/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport NumberInput from 'components/input-options/number';\nimport React from 'react';\n\nexport default class CornersPicker extends Component {\n  static propTypes = {\n    value: React.PropTypes.string.isRequired,\n    onChange: React.PropTypes.func.isRequired,\n    type: React.PropTypes.string.isRequired\n  };\n\n  getInitState () {\n    return {\n      selected: 'center',\n      values: this.parseValue(this.props.value)\n    };\n  }\n\n  componentWillReceiveProps (nextProps) {\n    this.setState({\n      values: this.parseValue(nextProps.value)\n    });\n  }\n\n  onInputChange (value) {\n    if (this.state.selected === 'center') {\n      this.state.values.tl = value;\n      this.state.values.tr = value;\n      this.state.values.br = value;\n      this.state.values.bl = value;\n    } else {\n      this.state.values[this.state.selected] = value;\n    }\n    this.props.onChange(this.getValuesString(this.state.values));\n  }\n\n  getValuesString (values) {\n    return `${values.tl || '0'}px ${values.tr || '0'}px ${values.br || '0'}px ${values.bl || '0'}px`;\n  }\n\n  parseValue (value) {\n    const values = value.split(' ');\n    const result = {\n      tl: 0,\n      bl: 0,\n      tr: 0,\n      br: 0,\n      equal: false\n    };\n\n    if (values.length === 1) {\n      const parsedValue = parseInt(values[0], 10);\n      result.tl = parsedValue;\n      result.br = parsedValue;\n      result.bl = parsedValue;\n      result.tr = parsedValue;\n    } else if (values.length === 2) {\n      result.tl = parseInt(values[0], 10);\n      result.tr = parseInt(values[1], 10);\n      result.br = parseInt(values[0], 10);\n      result.bl = parseInt(values[1], 10);\n    } else if (values.length === 4) {\n      result.tl = parseInt(values[0], 10);\n      result.tr = parseInt(values[1], 10);\n      result.br = parseInt(values[2], 10);\n      result.bl = parseInt(values[3], 10);\n    }\n\n    if (result.tl === result.tr && result.tl === result.br && result.tl === result.bl) {\n      result.equal = true;\n    } else {\n      result.equal = false;\n    }\n\n    return result;\n  }\n\n  changeSelected (selected, event) {\n    event.preventDefault();\n    this.setState({\n      selected\n    });\n  }\n\n  render () {\n    const values = this.state.values;\n    let inactive = false;\n    let value = 0;\n\n    if (this.state.selected !== 'center') {\n      value = values[this.state.selected];\n    } else {\n      inactive = !values.equal;\n      value = values.equal ? values.tl : Math.round((values.tl + values.tr + values.br + values.bl) / 4);\n    }\n\n    return (\n      <div className={cx('corners-picker', this.props.type)}>\n        <div className='toggles'>\n          {this.renderToggleButton('tl', !values.equal)}\n          {this.renderToggleButton('bl', !values.equal)}\n          {this.renderToggleButton('tr', !values.equal)}\n          {this.renderToggleButton('br', !values.equal)}\n          {this.renderToggleButton('center', values.equal)}\n        </div>\n        <div className='inputs'>\n          <NumberInput\n            className='micro'\n            value={value}\n            onChange={::this.onInputChange}\n            inactive={inactive}\n            label='px'\n          />\n        </div>\n      </div>\n    );\n  }\n\n  renderToggleButton (pos, active) {\n    const onClick = this.changeSelected.bind(this, pos);\n    return (\n      <div\n        className={cx('toggle', pos, this.state.selected === pos && 'selected', active && 'active')}\n        onClick={onClick}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/filters/edit.jsx",
    "content": "import cx from 'classnames';\nimport find from 'lodash.find';\nimport forEach from 'lodash.foreach';\nimport getFilterDefaultOptions from 'helpers/schema-filter-default-options';\nimport Combobox from 'components/input-options/combobox';\nimport Component from 'components/component';\nimport Input from 'components/input-options/input';\nimport NumberInput from 'components/input-options/number';\nimport React, {PropTypes} from 'react';\n\nexport default class Edit extends Component {\n  static propTypes = {\n    schema: PropTypes.object,\n    filter: PropTypes.object.isRequired,\n    new: PropTypes.bool,\n    onPropertyChange: PropTypes.func.isRequired,\n    onOptionChange: PropTypes.func.isRequired,\n    cancelEdit: PropTypes.func.isRequired,\n    submitEdit: PropTypes.func.isRequired,\n    schemaProperties: PropTypes.array.isRequired\n  };\n\n  onOptionChange (key, value) {\n    this.props.onOptionChange(key, value);\n  }\n\n  render () {\n    const {filter, schemaProperties} = this.props;\n    const labels = [];\n    const values = [];\n\n    forEach(schemaProperties, (property) => {\n      labels.push(property.title);\n      values.push(property.id);\n    });\n\n    return (\n      <div className='filter-picker-edit white-options'>\n        <div className='filter-submit-wrapper'>\n          <div className='filter-cancel' onClick={this.props.cancelEdit}>cancel</div>\n          <div className='filter-submit' onClick={this.props.submitEdit}>\n            {this.props.new ? 'Create new filter' : 'Ok'}\n          </div>\n        </div>\n        <Combobox labels={labels} values={values} value={filter.prop} onChange={this.props.onPropertyChange} />\n        {this.renderOptions()}\n      </div>\n    );\n  }\n\n  renderOptions () {\n    let result;\n\n    const {filter, schemaProperties} = this.props;\n    const property = find(schemaProperties, 'id', filter.prop);\n\n    if (property) {\n      const options = Object.assign({}, getFilterDefaultOptions(property.type), filter.options);\n\n      switch (property.type) {\n        case 'Date':\n          result = ([\n            <div className='filter-option' key='operation'>\n              <div className='filter-label'>From</div>\n              <NumberInput\n                className='micro inline-block'\n                value={options.fromValue}\n                onChange={this.onOptionChange.bind(this, 'fromValue')}\n              />\n              <Combobox\n                className='small'\n                labels={['Days', 'Weeks', 'Months']}\n                values={['day', 'week', 'month']}\n                value={options.fromGran}\n                onChange={this.onOptionChange.bind(this, 'fromGran')}\n                style={{\n                  maxWidth: 126,\n                  marginLeft: 10\n                }}\n              />\n            </div>,\n            <div className='filter-option' key='value'>\n              <div className='filter-label'>To</div>\n              {\n                options.toGran !== 'present' &&\n                <NumberInput\n                  className='micro inline-block'\n                  value={options.toValue}\n                  onChange={this.onOptionChange.bind(this, 'toValue')}\n                />\n              }\n              <Combobox\n                className={cx(options.toGran !== 'present' && 'small')}\n                labels={['Present', 'Days', 'Weeks', 'Months']}\n                values={['present', 'day', 'week', 'month']}\n                value={options.toGran}\n                onChange={this.onOptionChange.bind(this, 'toGran')}\n                style={options.toGran !== 'present' && {\n                  maxWidth: 126,\n                  marginLeft: 10\n                } || {}}\n              />\n            </div>\n          ]);\n          break;\n        case 'String':\n          result = [\n            <div className='filter-option' key='operation'>\n              <div className='filter-label'>Operation</div>\n              <Combobox\n                labels={['Equal', 'Not equal', 'Is set', 'Is not set']}\n                values={['equal', 'not-equal', 'set', 'not-set']}\n                value={options.op}\n                onChange={this.onOptionChange.bind(this, 'op')}\n              />\n            </div>\n          ];\n          if (options.op === 'equal' || options.op === 'not-equal') {\n            result.push(\n              <div className='filter-option' key='value'>\n                <div className='filter-label'>Value</div>\n                <Input\n                  value={options.value}\n                  onChange={this.onOptionChange.bind(this, 'value')}\n                />\n              </div>\n            );\n          }\n          break;\n        case 'Boolean':\n          result = (\n            <div className='filter-option'>\n              <div className='filter-label'>Value</div>\n              <Combobox\n                labels={['True', 'False']}\n                values={['true', 'false']}\n                value={options.value}\n                onChange={this.onOptionChange.bind(this, 'value')}\n              />\n            </div>\n          );\n          break;\n        default:\n          result = (\n            <div className='filter-option'>\n              <div className='filter-label'>Set</div>\n              <Combobox\n                labels={['Is set', 'Is not set']}\n                values={['set', 'not-set']}\n                value={options.op}\n                onChange={this.onOptionChange.bind(this, 'op')}\n              />\n            </div>\n          );\n      }\n    } else {\n      result = (\n        <div className='filter-error'>\n          Invalid filter\n        </div>\n      );\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/filters/filter.jsx",
    "content": "import find from 'lodash.find';\nimport getFilterDefaultOptions from 'helpers/schema-filter-default-options';\nimport Balloon from 'components/balloon';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport Edit from './edit';\n\nexport default class Filter extends Component {\n  static propTypes = {\n    editing: PropTypes.bool.isRequired,\n    filter: PropTypes.object.isRequired,\n    schemaProperties: PropTypes.array.isRequired,\n    index: PropTypes.number.isRequired,\n    selectFilter: PropTypes.func.isRequired,\n    removeFilter: PropTypes.func.isRequired,\n    new: PropTypes.bool\n  };\n\n  getDateString (gran, value) {\n    let str;\n    if (gran === 'present') {\n      str = 'present';\n    } else {\n      str = `${value} ${gran}${value !== 1 && 's' || ''}`;\n    }\n    return str;\n  }\n\n  onClick () {\n    if (!this.props.new) {\n      this.props.selectFilter(this.props.index);\n    }\n  }\n\n  onRemove (event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.props.removeFilter(this.props.index);\n  }\n\n  render () {\n    return (\n      <div className='filter-item white-options'>\n        <div className='filter' onClick={::this.onClick} ref={(ref) => {\n          this.ref = ref;\n          !this.state.ready && this.setState({ready: true});\n        }}\n        >\n          {this.renderContent()}\n          {\n            !this.props.new &&\n            <div className='filter-remove' onClick={::this.onRemove}>\n              <i className='material-icons'>delete</i>\n            </div>\n          }\n        </div>\n        {this.renderEditing()}\n      </div>\n    );\n  }\n\n  renderContent () {\n    let result;\n    const {filter, schemaProperties} = this.props;\n    const property = find(schemaProperties, 'id', filter.prop);\n\n    if (property) {\n      const options = Object.assign({}, getFilterDefaultOptions(property.type), filter.options);\n\n      switch (property.type) {\n        case 'Date':\n          result = (\n            <div>\n              <span>{property.title}</span>\n              <span> from </span>\n              <span className='highlight'>{this.getDateString(options.fromGran, options.fromValue)}</span>\n              <span> up to </span>\n              <span className='highlight'>{this.getDateString(options.toGran, options.toValue)}</span>\n            </div>\n          );\n          break;\n        case 'Boolean':\n          result = (\n            <div>\n              <span>{property.title}</span>\n              <span> is </span>\n              <span className='highlight'>{options.value}</span>\n            </div>\n          );\n          break;\n        default:\n          if (options.op === 'equal') {\n            result = (\n              <div>\n                <span>{property.title}</span>\n                <span className='highlight'> equals</span>\n                <span> to </span>\n                <span className='highlight'>{options.value}</span>\n              </div>\n            );\n          } else if (options.op === 'not-equal') {\n            result = (\n              <div>\n                <span>{property.title}</span>\n                <span className='highlight'> differs</span>\n                <span> from </span>\n                <span className='highlight'>{options.value}</span>\n              </div>\n            );\n          } else if (options.op === 'set') {\n            result = (\n              <div>\n                <span>{property.title}</span>\n                <span> is </span>\n                <span className='highlight'>set</span>\n              </div>\n            );\n          } else if (options.op === 'not-set') {\n            result = (\n              <div>\n                <span>{property.title}</span>\n                <span> is </span>\n                <span className='highlight'>not set</span>\n              </div>\n            );\n          }\n      }\n    }\n\n    return result;\n  }\n\n  renderEditing () {\n    if (this.props.editing && this.state.ready) {\n      return (\n        <Balloon element={this.ref}>\n          <Edit {...this.props} />\n        </Balloon>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/filters/filters.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport Filter from './filter';\n\nexport default class Filters extends Component {\n  static fragments = {\n    schema: {\n      _id: 1,\n      title: 1,\n      properties: 1\n    }\n  };\n\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    openNew: PropTypes.func.isRequired,\n    newOpened: PropTypes.bool.isRequired,\n    schema: PropTypes.object.isRequired,\n    editingFilter: PropTypes.object,\n    editOpened: PropTypes.bool,\n    editIndex: PropTypes.number\n  };\n\n  render () {\n    return (\n      <div className='filters'>\n        {this.props.value.map(this.renderFilter, this)}\n        {this.renderNew()}\n        <div className='add-new' onClick={this.props.openNew}>Add new filter condition</div>\n      </div>\n    );\n  }\n\n  renderFilter (filter, index) {\n    const editing = this.props.editOpened && this.props.editIndex === index;\n    return (\n      <Filter\n        editing={editing}\n        {...this.props}\n        index={index}\n        filter={editing ? this.props.editingFilter : filter}\n      />\n    );\n  }\n\n  renderNew () {\n    if (this.props.newOpened) {\n      return (\n        <Filter editing new {...this.props} filter={this.props.editingFilter} />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/filters/index.js",
    "content": "import * as elementsActions from 'actions/elements';\n\nimport cloneDeep from 'lodash.clonedeep';\nimport forEach from 'lodash.foreach';\nimport staticProperties from 'helpers/schema-static-properties';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport {buildQueryAndVariables} from 'relax-fragments';\n\nimport Filters from './filters';\n\n@connect(\n  (state) => ({\n    elements: state.elements,\n    selectedId: state.pageBuilder.selectedId,\n    selectedElement: state.pageBuilder.selectedElement\n  }),\n  (dispatch) => bindActionCreators(elementsActions, dispatch)\n)\nexport default class FiltersContainer extends Component {\n  static fragments = Filters.fragments;\n\n  static propTypes = {\n    value: PropTypes.array.isRequired,\n    onChange: PropTypes.func.isRequired,\n    elements: PropTypes.object.isRequired,\n    selectedId: PropTypes.string.isRequired,\n    selectedElement: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    value: []\n  };\n\n  getInitState () {\n    this.fetchData(this.props);\n    return {\n      newOpened: false\n    };\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (this.getSelectedSchemaId(nextProps) !== this.getSelectedSchemaId(this.props)) {\n      this.fetchData(nextProps);\n    }\n  }\n\n  getSelectedSchemaId (props) {\n    const {selectedElement} = props;\n    return selectedElement && selectedElement.props && selectedElement.props.schemaId;\n  }\n\n  fetchData (props) {\n    const {selectedId} = props;\n    const schemaId = this.getSelectedSchemaId(props);\n    if (schemaId) {\n      props.getElementData(selectedId, buildQueryAndVariables(\n        this.constructor.fragments,\n        {\n          schema: {\n            _id: {\n              value: schemaId,\n              type: 'ID!'\n            }\n          }\n        }\n      ));\n    }\n  }\n\n  openNew () {\n    this.setState({\n      newOpened: true,\n      editingFilter: {\n        prop: 'publishedDate',\n        type: 'Date',\n        options: {}\n      }\n    });\n  }\n\n  onPropertyChange (prop) {\n    this.setState({\n      editingFilter: Object.assign({}, this.state.editingFilter, {\n        prop\n      })\n    });\n  }\n\n  onOptionChange (key, value) {\n    this.setState({\n      editingFilter: Object.assign({}, this.state.editingFilter, {\n        options: Object.assign({}, this.state.editingFilter.options, {\n          [key]: value\n        })\n      })\n    });\n  }\n\n  cancelEdit () {\n    this.setState({\n      newOpened: false,\n      editOpened: false,\n      editIndex: null\n    });\n  }\n\n  submitEdit () {\n    let newFilters = this.props.value;\n\n    if (this.state.newOpened) {\n      newFilters = [...newFilters, this.state.editingFilter];\n    } else if (this.state.editOpened) {\n      newFilters = [...newFilters];\n      newFilters[this.state.editIndex] = this.state.editingFilter;\n    }\n\n    this.props.onChange(newFilters);\n    this.setState({\n      newOpened: false,\n      editOpened: false,\n      editIndex: null\n    });\n  }\n\n  selectFilter (index) {\n    if (this.state.editOpened && this.state.editIndex === index) {\n      this.setState({\n        editOpened: false,\n        editIndex: null\n      });\n    } else {\n      this.setState({\n        editOpened: true,\n        editIndex: index,\n        editingFilter: cloneDeep(this.props.value[index])\n      });\n    }\n  }\n\n  removeFilter (index) {\n    const newFilters = [...this.props.value];\n    newFilters.splice(index, 1);\n    this.props.onChange(newFilters);\n  }\n\n  render () {\n    const {selectedId, elements} = this.props;\n    const elementData = elements[selectedId];\n    const schema = elementData && elementData.schema || null;\n\n    const schemaProperties = schema && schema.properties || [];\n    const properties = [...staticProperties];\n\n    forEach(schemaProperties, (customProperty) => {\n      properties.push(Object.assign({}, customProperty, {\n        id: `properties#${customProperty.id}`\n      }));\n    });\n\n    return (\n      <Filters\n        {...this.props}\n        {...this.state}\n        schema={schema}\n        schemaProperties={properties}\n        openNew={::this.openNew}\n        onPropertyChange={::this.onPropertyChange}\n        onOptionChange={::this.onOptionChange}\n        cancelEdit={::this.cancelEdit}\n        submitEdit={::this.submitEdit}\n        selectFilter={::this.selectFilter}\n        removeFilter={::this.removeFilter}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/font/dropdown.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './dropdown.less';\n\nexport default class Dropdown extends Component {\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    label: PropTypes.string.isRequired,\n    entries: PropTypes.array.isRequired,\n    onChange: PropTypes.func.isRequired,\n    tempChange: PropTypes.func.isRequired,\n    tempRevert: PropTypes.func.isRequired,\n    className: PropTypes.string\n  };\n\n  getInitState () {\n    return {\n      opened: false\n    };\n  }\n\n  onEntryClick (value, event) {\n    event.preventDefault();\n    this.props.onChange(value);\n  }\n\n  toggle () {\n    this.setState({\n      opened: !this.state.opened\n    });\n  }\n\n  render () {\n    const {className, label} = this.props;\n    return (\n      <div className={cx(styles.root, className)} onClick={::this.toggle}>\n        {this.renderCollapsable()}\n        <span className={styles.info}>\n          {label}\n          <i className='nc-icon-mini arrows-1_small-triangle-down'></i>\n        </span>\n      </div>\n    );\n  }\n\n  renderCollapsable () {\n    if (this.state.opened) {\n      return (\n        <div className={styles.collapsable}>\n          {this.props.entries.map(this.renderEntry, this)}\n        </div>\n      );\n    }\n  }\n\n  renderEntry (entry) {\n    const onClick = this.onEntryClick.bind(this, entry.value);\n    return (\n      <button\n        className={styles.entry}\n        onClick={onClick}\n      >\n        {entry.label}\n      </button>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/font/dropdown.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  position: relative;\n  display: inline-block;\n  margin: 0;\n  box-sizing: border-box;\n  text-decoration: none;\n  padding: 6px 8px;\n  vertical-align: top;\n  border-radius: 3px;\n  z-index: 1;\n\n  height: 30px;\n  font-size: 13px;\n  color: @chromeTextColor;\n\n  :global {\n    i {\n      content: \"\";\n      float: right;\n      width: 10px;\n      line-height: 21px;\n      position: relative;\n    }\n  }\n\n  &:hover{\n    background-color: @chromeBackgroundActive;\n  }\n}\n\n.info {\n  position: relative;\n  display: inline-block;\n  max-width: 125px;\n  width: 100%;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.collapsable {\n  position: absolute;\n  top: 0; left: 0; right: 0;\n  border: 1px solid @chromeBordersColor;\n  background-color: @chromeBackgroundActive;\n  padding-top: 29px;\n  margin-bottom: 30px;\n  border-radius: 3px;\n}\n\n.entry {\n  font-size: 13px;\n  padding: 5px 7px;\n  color: @chromeTextColor;\n  display: block;\n  width: 100%;\n  text-decoration: none;\n  border-top: 1px solid @chromeBordersColor;\n  text-align: left;\n\n  &:hover{\n    color: @primary;\n    background-color: @chromeBackgroundActive;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/font/font-picker.jsx",
    "content": "import clone from 'lodash.clone';\nimport forEach from 'lodash.foreach';\nimport Component from 'components/component';\nimport Utils from 'helpers/utils';\nimport React, {PropTypes} from 'react';\n\nimport styles from './font-picker.less';\nimport Dropdown from './dropdown';\nimport Font from './font';\n\nexport default class FontPicker extends Component {\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    onChange: PropTypes.func.isRequired,\n    fonts: PropTypes.object.isRequired\n  };\n\n  init () {\n    this.onFamilyChange = this.onChange.bind(this, 'family');\n    this.onFVDChange = this.onChange.bind(this, 'fvd');\n  }\n\n  getChangedValue (key, value) {\n    const newValue = clone(this.props.value || {});\n\n    newValue[key] = value;\n\n    if (key === 'family') {\n      // check if current fvd exists\n      const family = value;\n      const fvds = this.props.fonts.fonts[family];\n\n      if (fvds.indexOf(newValue.fvd) === -1) {\n        newValue.fvd = fvds[0];\n      }\n    }\n\n    return newValue;\n  }\n\n  onChange (key, value) {\n    const newValue = this.getChangedValue(key, value);\n    this.props.onChange(newValue);\n  }\n\n  render () {\n    return (\n      <div className={styles.root}>\n        {this.renderFont()}\n        {this.renderOptions()}\n      </div>\n    );\n  }\n\n  renderOptions () {\n    const families = [];\n    const fvds = [];\n    const value = this.props.value;\n\n    if (this.props.fonts && typeof this.props.fonts.fonts === 'object') {\n      forEach(this.props.fonts.fonts, (fvdsArray, family) => {\n        families.push({\n          label: family,\n          value: family\n        });\n\n        if (value.family && value.family === family) {\n          forEach(fvdsArray, (fvd) => {\n            fvds.push({\n              label: fvd,\n              value: fvd\n            });\n          });\n        }\n      });\n    }\n\n    return (\n      <div className={styles.options}>\n        <Dropdown\n          entries={families}\n          value={value.family}\n          label={Utils.filterFontFamily(value.family || '')}\n          onChange={this.onFamilyChange}\n          className={styles.fontsDropdown}\n        />\n      <span className={styles.sep}></span>\n        <Dropdown\n          entries={fvds}\n          value={value.fvd}\n          label={value.fvd}\n          onChange={this.onFVDChange}\n          className={styles.typeDropdown}\n        />\n      </div>\n    );\n  }\n\n  renderFont () {\n    let result;\n\n    if (typeof this.props.value === 'object' && this.props.value.family && this.props.value.fvd) {\n      result = (\n        <Font\n          family={this.props.value.family}\n          fvd={this.props.value.fvd}\n          text={'Abc'}\n        />\n      );\n    } else {\n      result = (\n        <div className={styles.warning}>No font selected yet</div>\n      );\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/font/font-picker.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  width: 100%;\n  border: 1px solid @chromeBordersColor;\n  border-radius: 3px;\n}\n\n.warning {\n  color: @chromeTextColor;\n  line-height: 77px;\n  text-align: center;\n  margin: 0;\n}\n\n.options {\n  background-color: @chromeBackgroundDarkerColor;\n  padding: 5px 5px;\n  position: relative;\n  height: 40px;\n}\n\n.fontsDropdown {\n  width: 67%;\n  margin-right: 3%;\n  text-transform: capitalize;\n}\n\n.typeDropdown {\n  width: 27%;\n  margin-left:3%;\n}\n\n.sep {\n  height: 24px;\n  width: 0;\n  border-left: 1px solid @chromeBordersColor;\n  position: absolute;\n  top: 8px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/font/font.jsx",
    "content": "import utils from 'helpers/utils';\nimport Component from 'components/component';\nimport React from 'react';\n\nimport styles from './font.less';\n\nexport default class Font extends Component {\n  static propTypes = {\n    input: React.PropTypes.bool,\n    style: React.PropTypes.object,\n    family: React.PropTypes.string,\n    fvd: React.PropTypes.string,\n    onChange: React.PropTypes.func,\n    text: React.PropTypes.string\n  };\n\n  render () {\n    const style = Object.assign({}, this.props.style);\n    style.fontFamily = this.props.family;\n    utils.processFVD(style, this.props.fvd);\n\n    return (\n      <div\n        className={styles.font}\n        style={style}\n      >\n        {this.props.text}\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/font/font.less",
    "content": "@import '~styles/colors.less';\n\n.font {\n  color: @chromeTextColor;\n  font-size: 55px;\n  line-height: 77px;\n  height: 77px;\n  text-align: center;\n  max-width: 100%;\n  border: 0;\n  box-shadow: none;\n  padding: 0;\n  margin: 0;\n  padding-left: 7px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/font/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {dataConnect} from 'relate-js';\n\nimport FontPicker from './font-picker';\n\n@dataConnect(\n  (state) => ({\n    fonts: state.fonts.data\n  }),\n  null,\n  () => ({\n    fragments: {\n      settings: {\n        _id: 1,\n        value: 1\n      }\n    },\n    variablesTypes: {\n      settings: {\n        ids: '[String]!'\n      }\n    },\n    initialVariables: {\n      settings: {\n        ids: ['fonts']\n      }\n    }\n  })\n)\nexport default class FontPickerContainer extends Component {\n  static fragments = {\n    settings: {\n      _id: 1,\n      value: 1\n    }\n  };\n\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    onChange: PropTypes.string.isRequired,\n    fonts: PropTypes.object.isRequired\n  };\n\n  static defaultProps = {\n    fonts: {}\n  };\n\n  render () {\n    return (\n      <FontPicker\n        value={this.props.value || {}}\n        onChange={this.props.onChange}\n        fonts={this.props.fonts}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/icon/icon-picker.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nexport default class IconPicker extends Component {\n  static propTypes = {\n    value: PropTypes.number.isRequired,\n    onChange: PropTypes.func.isRequired,\n    openSelector: PropTypes.func.isRequired,\n    closeSelector: PropTypes.func.isRequired\n  };\n\n  render () {\n    return (\n      <div className='icon-picker' onClick={this.props.openSelector}>\n        {this.renderSelected()}\n      </div>\n    );\n  }\n\n  renderSelected () {\n    let result;\n    if (this.props.value && this.props.value.family) {\n      result = (\n        <div className='selected'>\n          <i className={this.props.value.className}>\n            {this.props.value.content}\n          </i>\n        </div>\n      );\n    } else {\n      result = <p>No icon selected</p>;\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/icon/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport IconPicker from './icon-picker';\n\nexport default class IconPickerContainer extends Component {\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    onChange: PropTypes.func.isRequired\n  };\n\n  getInitState () {\n    return {\n      selector: false\n    };\n  }\n\n  openSelector () {\n    this.setState({\n      selector: true\n    });\n  }\n\n  closeSelector () {\n    this.setState({\n      selector: false\n    });\n  }\n\n  render () {\n    return (\n      <IconPicker\n        {...this.props}\n        {...this.state}\n        openSelector={::this.openSelector}\n        closeSelector={::this.closeSelector}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/image/index.js",
    "content": "import * as mediaActions from 'actions/media';\n\nimport bind from 'decorators/bind';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport ImagePicker from './picker';\n\n@dataConnect(\n  null,\n  (dispatch) => bindActionCreators(mediaActions, dispatch),\n  (props) => {\n    const result = {\n      fragments: {},\n      variablesTypes: {\n        mediaItem: {\n          id: 'ID!'\n        }\n      },\n      initialVariables: {\n        mediaItem: {\n          id: props.value\n        }\n      }\n    };\n\n    if (props.value) {\n      result.fragments = ImagePicker.fragments;\n    }\n\n    return result;\n  }\n)\nexport default class ImagePickerContainer extends Component {\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    onChange: PropTypes.func.isRequired,\n    type: PropTypes.string,\n    allowedType: PropTypes.string\n  };\n\n  static defaultProps = {\n    allowedType: 'image'\n  };\n\n  getInitState () {\n    return {\n      mounted: false,\n      calcWidth: 200,\n      selector: false\n    };\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (this.props.value !== nextProps.value && nextProps.value) {\n      this.props.relate.refresh(nextProps);\n    }\n  }\n\n  @bind\n  openSelector () {\n    this.setState({\n      selector: true\n    });\n  }\n\n  @bind\n  closeSelector () {\n    this.setState({\n      selector: false\n    });\n  }\n\n  @bind\n  onMount (width) {\n    this.setState({\n      mounted: true,\n      calcWidth: width\n    });\n  }\n\n  render () {\n    const {mediaItem, allowedType} = this.props;\n\n    return (\n      <ImagePicker\n        {...this.props}\n        {...this.state}\n        openSelector={this.openSelector}\n        closeSelector={this.closeSelector}\n        onMount={this.onMount}\n        mediaItem={mediaItem}\n        allowedType={allowedType}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/image/picker.jsx",
    "content": "import bind from 'decorators/bind';\nimport Component from 'components/component';\nimport MediaItem from 'components/media-item-preview';\nimport MediaSelector from 'components/media-selector';\nimport React, {PropTypes} from 'react';\n\nimport styles from './picker.less';\n\nexport default class ImagePicker extends Component {\n  static fragments = MediaItem.fragments;\n\n  static propTypes = {\n    width: PropTypes.any,\n    height: PropTypes.number,\n    calcWidth: PropTypes.number,\n    onChange: PropTypes.func.isRequired,\n    value: PropTypes.string.isRequired,\n    selector: PropTypes.bool.isRequired,\n    openSelector: PropTypes.func.isRequired,\n    closeSelector: PropTypes.func.isRequired,\n    onMount: PropTypes.func.isRequired,\n    mounted: PropTypes.bool.isRequired,\n    mediaItem: PropTypes.object,\n    allowedType: PropTypes.string.isRequired\n  };\n\n  static defaultProps = {\n    width: '100%',\n    height: 135\n  };\n\n  componentDidMount () {\n    const dom = this.refs.imageHolder;\n    const rect = dom.getBoundingClientRect();\n\n    const width = Math.round(rect.right - rect.left);\n\n    this.props.onMount(width);\n  }\n\n  @bind\n  unselect () {\n    this.props.onChange(null);\n  }\n\n  render () {\n    const {openSelector} = this.props;\n    const style = {\n      width: this.props.width,\n      height: this.props.height\n    };\n\n    return (\n      <div>\n        <div className={styles.picker} style={style} onClick={openSelector}>\n          <div className={styles.selected} ref='imageHolder'>\n            {this.renderSelected()}\n            <div className={styles.changeCover}>Choose Image</div>\n          </div>\n        </div>\n        {this.renderUnselect()}\n        {this.renderMediaSelector()}\n      </div>\n    );\n  }\n\n  renderUnselect () {\n    const {value, width} = this.props;\n    if (value) {\n      return (\n        <div\n          className={styles.unselect}\n          style={{width}}\n          onClick={this.unselect}\n        >\n          Unselect Image\n        </div>\n      );\n    }\n  }\n\n  renderSelected () {\n    if (this.props.mounted && this.props.value && this.props.mediaItem && this.props.mediaItem._id) {\n      return (\n        <MediaItem\n          mediaItem={this.props.mediaItem}\n          width={this.props.calcWidth}\n          height={this.props.height}\n          useThumbnail={false}\n        />\n      );\n    }\n  }\n\n  renderMediaSelector () {\n    const {selector, value, closeSelector, onChange, allowedType} = this.props;\n    if (selector) {\n      return (\n        <MediaSelector\n          selected={value}\n          onClose={closeSelector}\n          onChange={onChange}\n          allowedType={allowedType}\n        />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/image/picker.less",
    "content": "@import '~styles/colors.less';\n\n.picker {\n  display: inline-block;\n}\n\n.selected {\n  background-color: @chromeBordersColor;\n  position: relative;\n  overflow: hidden;\n  cursor: pointer;\n  width: 100%;\n  height: 100%;\n\n  img {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n  }\n}\n\n.changeCover {\n  background-color: rgba(0, 0, 0, 0.6);\n  text-align: center;\n  padding: 50px 20px;\n  position: absolute;\n  top: 0; right: 0; bottom: 0; left: 0;\n  opacity: 0;\n  transition: all 0.3s ease-out;\n  color: @chromeTextColor;\n}\n\n.selected:hover .changeCover {\n  opacity: 1;\n}\n\n.unselect {\n  color: @chromeTextColor;\n  font-size: 12px;\n  text-transform: uppercase;\n  text-align: center;\n  padding: 10px 0;\n  cursor: pointer;\n\n  &:hover {\n    color: @alert;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/input/index.jsx",
    "content": "import bind from 'decorators/bind';\nimport classNames from 'classnames';\nimport cx from 'classnames';\nimport Animate from 'components/animate';\nimport Component from 'components/component';\nimport Spinner from 'components/spinner';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class Input extends Component {\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    onChange: PropTypes.func.isRequired,\n    className: PropTypes.string,\n    placeholder: PropTypes.string,\n    password: PropTypes.bool,\n    state: PropTypes.string,\n    disabled: PropTypes.bool,\n    focused: PropTypes.bool,\n    white: PropTypes.bool\n  };\n\n  componentDidMount () {\n    if (this.props.focused) {\n      this.refs.input.focus();\n    }\n  }\n\n  @bind\n  onChange (event) {\n    this.props.onChange(event.target.value);\n  }\n\n  render () {\n    const {disabled, className, state, password, white} = this.props;\n    return (\n      <div className={classNames(\n          styles.input,\n          white && styles.white,\n          disabled && styles.disabled,\n          className,\n          state && styles.withState\n        )}\n      >\n        <input\n          type={password ? 'password' : 'text'}\n          value={this.props.value}\n          disabled={this.props.disabled}\n          onChange={this.onChange}\n          ref='input'\n          placeholder={this.props.placeholder || ''}\n        />\n        {this.renderState()}\n      </div>\n    );\n  }\n\n  renderState () {\n    const {state} = this.props;\n    if (state) {\n      if (state === 'valid') {\n        return (\n          <Animate transition='fadeIn' key='valid'>\n            <div className={cx(styles.state, styles.valid)}>\n              <i className={cx(styles.stateContent, 'nc-icon-mini ui-1_check')}></i>\n            </div>\n          </Animate>\n        );\n      } else if (state === 'invalid') {\n        return (\n          <Animate transition='fadeIn' key='invalid'>\n            <div className={cx(styles.state, styles.invalid)}>\n              <i className={cx(styles.stateContent, 'nc-icon-mini ui-1_simple-remove')}></i>\n            </div>\n          </Animate>\n        );\n      } else if (state === 'loading') {\n        return (\n          <Animate transition='fadeIn' key='loading'>\n            <div className={styles.state}>\n              <div className={styles.stateContent}>\n                <Spinner />\n              </div>\n            </div>\n          </Animate>\n        );\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/input/index.less",
    "content": "@import '~styles/colors.less';\n\n.input {\n  border-radius: 2px;\n  max-width: 480px;\n  position: relative;\n\n  :global input {\n    border: 0;\n    background: #2c2f34;\n    box-shadow: none;\n    width: 100%;\n    max-width: 480px;\n    display: block;\n    outline: none;\n    border: 1px solid @chromeBordersColor;\n    border-radius: 3px;\n    padding: 0px 12px;\n    font-size: 10px;\n    line-height: 38px;\n    color: @chromeTextColor;\n    transition: all 0.3s ease-out;\n\n    &:focus {\n      border-color: @primary;\n    }\n\n    &.valid {\n      border: 1px solid @success;\n    }\n    &.invalid {\n      border: 1px solid @alert;\n    }\n  }\n}\n\n.block {\n  max-width: none;\n  display: block;\n\n  :global input {\n    max-width: none;\n  }\n}\n\n.big {\n  :global input {\n    font-size: 17px;\n  }\n}\n\n.white {\n  :global input {\n    background: transparent;\n    border-color: @adminInputBorders;\n    color: @adminText;\n\n    &:focus {\n      border-color: @primary;\n    }\n  }\n}\n\n.disabled {\n  opacity: 0.5;\n}\n\n.withState {\n  :global input {\n    padding-right: 34px;\n  }\n}\n\n.state {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  width: 35px;\n\n .stateContent {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    line-height: 21px;\n    height: 21px;\n    transform: translate(-50%, -50%);\n    font-size: 16px;\n  }\n\n  &.valid .stateContent {\n    color: @success;\n  }\n  &.invalid .stateContent {\n    color: @alert;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/menu/index.js",
    "content": "import forEach from 'lodash.foreach';\nimport Combobox from 'components/input-options/combobox';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {dataConnect} from 'relate-js';\n\n@dataConnect(\n  () => ({\n    fragments: {\n      menus: {\n        _id: 1,\n        title: 1\n      }\n    }\n  })\n)\nexport default class MenuPickerContainer extends Component {\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    onChange: PropTypes.string.isRequired,\n    menus: PropTypes.array.isRequired\n  };\n\n  static defaultProps = {\n    menus: []\n  };\n\n  render () {\n    const labels = [];\n    const values = [];\n\n    forEach(this.props.menus, (menu) => {\n      labels.push(menu.title);\n      values.push(menu._id);\n    });\n\n    return (\n      <Combobox\n        value={this.props.value}\n        onChange={this.props.onChange}\n        values={values}\n        labels={labels}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/number/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class NumberInput extends Component {\n  static propTypes = {\n    value: PropTypes.number.isRequired,\n    onChange: PropTypes.func.isRequired,\n    allowed: PropTypes.array,\n    min: PropTypes.number,\n    max: PropTypes.number,\n    inactive: PropTypes.bool,\n    className: PropTypes.string,\n    arrows: PropTypes.bool,\n    white: PropTypes.bool,\n    small: PropTypes.bool\n  };\n\n  static defaultProps = {\n    min: 0,\n    max: false,\n    allowed: [],\n    inactive: false,\n    arrows: true\n  };\n\n  getInitState () {\n    return {\n      focused: false\n    };\n  }\n\n  limitValue (value) {\n    let result = value;\n\n    if (this.props.min !== false) {\n      if (value < this.props.min) {\n        result = this.props.min;\n      }\n    }\n\n    if (this.props.max !== false) {\n      if (value > this.props.max) {\n        result = this.props.max;\n      }\n    }\n\n    return result;\n  }\n\n  getUnitAndValue (str, defaultUnit = this.props.allowed.length > 0 && this.props.allowed[0] || '') {\n    let result;\n\n    if (str === 'auto') {\n      result = {\n        value: 'auto',\n        unit: ''\n      };\n    } else {\n      let value = str !== '' && parseFloat(str, 10);\n      value = (value === false || isNaN(value)) ? this.limitValue(0) : value;\n\n      let unit = defaultUnit;\n      const valueLength = (value.toString()).length;\n\n      if (valueLength < str.length && this.props.allowed.indexOf(str.substr(valueLength)) > -1) {\n        unit = str.substr(valueLength);\n      }\n\n      result = {\n        value,\n        unit\n      };\n    }\n\n    return result;\n  }\n\n  onInput (event) {\n    const string = event.target.value.replace(',', '.').toLowerCase();\n\n    if (string === 'auto' && this.props.allowed.indexOf('auto') !== 0) {\n      this.props.onChange(string);\n    } else {\n      const unitValue = this.getUnitAndValue(string, this.state.unitValue.unit);\n      this.props.onChange(this.limitValue(unitValue.value) + unitValue.unit);\n    }\n\n    this.setState({\n      value: string\n    });\n  }\n\n  up (event) {\n    event.preventDefault();\n    if (this.props.value === 'auto') {\n      this.props.onChange(this.limitValue(1) + this.props.allowed[0]);\n    } else {\n      const unitValue = this.getUnitAndValue(this.props.value);\n      this.props.onChange(this.limitValue(unitValue.value + 1) + unitValue.unit);\n    }\n  }\n\n  down (event) {\n    event.preventDefault();\n    if (this.props.value === 'auto') {\n      this.props.onChange(this.limitValue(-1) + this.props.allowed[0]);\n    } else {\n      const unitValue = this.getUnitAndValue(this.props.value);\n      this.props.onChange(this.limitValue(unitValue.value - 1) + unitValue.unit);\n    }\n  }\n\n  onFocus () {\n    this.setState({\n      focused: true,\n      value: this.props.inactive ? '--' : this.props.value,\n      unitValue: this.getUnitAndValue(this.props.value)\n    });\n  }\n\n  onBlur () {\n    this.setState({\n      focused: false,\n      unitValue: null\n    });\n  }\n\n  render () {\n    const {className, white, small} = this.props;\n    const {focused} = this.state;\n    const value = this.props.inactive ? '--' : this.props.value;\n\n    return (\n      <div className={cx(\n          styles.root,\n          focused && styles.focused,\n          white && styles.white,\n          small && styles.small,\n          className\n        )}\n      >\n        <input\n          className={styles.input}\n          type='text'\n          value={focused ? this.state.value : value}\n          onChange={::this.onInput}\n          ref='input'\n          onBlur={::this.onBlur}\n          onFocus={::this.onFocus}\n        />\n        {this.renderArrows()}\n      </div>\n    );\n  }\n\n  renderArrows () {\n    const {arrows} = this.props;\n    if (arrows) {\n      return (\n        <div className={styles.arrows}>\n          <button className={styles.arrow} onClick={::this.up}>\n            <i className='nc-icon-mini arrows-1_minimal-up'></i>\n          </button>\n          <button className={styles.arrow} onClick={::this.down}>\n            <i className='nc-icon-mini arrows-1_minimal-down'></i>\n          </button>\n        </div>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/number/index.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  width: 100%;\n  max-width: 150px;\n  height: 38px;\n  display: block;\n  position: relative;\n  outline: none;\n  background-color: @chromeBackgroundDarkerColor;\n  border: 1px solid @chromeBordersColor;\n  border-radius: 3px;\n  overflow: hidden;\n  transition: all 0.3s ease-out;\n}\n\n.focused {\n  border: 1px solid @primary;\n}\n\n.small {\n  width: 80px;\n}\n\n.input {\n  display: inline-block;\n  vertical-align: top;\n  border: 0;\n  outline: 0;\n  background: transparent;\n  box-shadow: none;\n  line-height: 36px;\n  padding: 0 12px;\n  padding-right: 40px;\n  width: 100%;\n  font-size: 10px;\n  color: @chromeTextColor;\n}\n\n.arrows {\n  display: inline-block;\n  vertical-align: top;\n  position: absolute;\n  width: 20px;\n  top: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.arrow {\n  display: inline-block;\n  color: @chromeTextSubColor;\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 19px;\n  width: 20px;\n  text-align: center;\n  font-size: 12px;\n\n  :global i {\n    line-height: 18px;\n    font-size: 7px;\n    color: @chromeTextSubColor;\n  }\n\n  &:last-child {\n    top: auto;\n    bottom: 0;\n  }\n\n  &:hover {\n    background-color: @chromeBackgroundActive;\n  }\n}\n\n.white {\n  border-color: @adminInputBorders;\n  background-color: transparent;\n\n  .input {\n    color: @adminText;\n  }\n  .arrow {\n    color: @adminText;\n\n    &:hover {\n      background-color: transparent;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/optional/index.jsx",
    "content": "import Component from 'components/component';\nimport React from 'react';\n\nimport styles from './index.less';\n\nexport default class Optional extends Component {\n  static propTypes = {\n    value: React.PropTypes.bool.isRequired,\n    onChange: React.PropTypes.func.isRequired,\n    label: React.PropTypes.string.isRequired\n  };\n\n  toggle (event) {\n    event.preventDefault();\n    this.props.onChange(!this.props.value);\n  }\n\n  render () {\n    return (\n      <div className={styles.root} onClick={::this.toggle}>\n        <span className={styles.label}>{this.props.label}</span>\n        <span className={styles.box}>\n          {this.props.value && <i className='nc-icon-mini ui-1_check'></i>}\n        </span>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/optional/index.less",
    "content": "@import '~styles/colors.less';\n\n@size: 15px;\n\n.root {\n  position: relative;\n  cursor: pointer;\n  padding: 0 3px;\n  margin-bottom: 8px;\n\n  &:hover {\n    .label {\n      color: @chromeTextColor;\n    }\n    .box {\n      border-color: @primary;\n    }\n  }\n}\n\n.box, .label {\n  vertical-align: top;\n  line-height: 17px;\n  transition: all 0.3s ease-out;\n}\n\n.label {\n  text-transform: uppercase;\n  font-size: 10px;\n  color: @chromeTextColor;\n  line-height: 16px;\n  padding-right: @size + 5px;\n\n  &.white {\n    color: @adminText;\n  }\n}\n\n.box {\n  position: absolute;\n  right: 3px;\n  top: 1px;\n  display: inline-block;\n  width: @size;\n  height: @size;\n  text-align: center;\n  border: 1px solid @chromeTextSubColor;\n  border-radius: 3px;\n\n  :global i {\n    font-size: 9px;\n    color: #ffffff;\n    line-height: 14px;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/page/index.js",
    "content": "import forEach from 'lodash.foreach';\nimport Combobox from 'components/input-options/combobox';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {dataConnect} from 'relate-js';\n\n@dataConnect(\n  () => ({\n    fragments: {\n      pages: {\n        _id: 1,\n        title: 1\n      }\n    }\n  })\n)\nexport default class PagePickerContainer extends Component {\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    onChange: PropTypes.func.isRequired,\n    pages: PropTypes.array.isRequired,\n    fetchData: PropTypes.func.isRequired\n  };\n\n  static defaultProps = {\n    pages: []\n  };\n\n  componentDidMount () {\n    this.props.fetchData({\n      fragments: this.constructor.fragments\n    });\n  }\n\n  render () {\n    const labels = [];\n    const values = [];\n\n    forEach(this.props.pages, (page) => {\n      labels.push(page.title);\n      values.push(page._id);\n    });\n\n    return (\n      <Combobox\n        value={this.props.value}\n        onChange={this.props.onChange}\n        values={values}\n        labels={labels}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/rich-text/index.jsx",
    "content": "import classNames from 'classnames';\nimport Component from 'components/component';\nimport Editor from 'components/medium-editor';\nimport React, {PropTypes} from 'react';\n\nexport default class HtmlArea extends Component {\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    onChange: PropTypes.func.isRequired,\n    className: PropTypes.string\n  };\n\n  render () {\n    return (\n      <div className={classNames('html-area', this.props.className)}>\n        <Editor\n          tag='div'\n          className='html-editor'\n          value={this.props.value}\n          onChange={this.props.onChange}\n          options={{\n            toolbar: {\n              buttons: ['bold', 'italic', 'underline', 'anchor']\n            },\n            placeholder: false,\n            imageDragging: false\n          }}\n        />\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/schema/index.js",
    "content": "import forEach from 'lodash.foreach';\nimport Combobox from 'components/input-options/combobox';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {dataConnect} from 'relate-js';\n\n@dataConnect(\n  () => ({\n    fragments: {\n      schemas: {\n        _id: 1,\n        title: 1\n      }\n    }\n  })\n)\nexport default class SchemaPickerContainer extends Component {\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    onChange: PropTypes.string.isRequired,\n    schemas: PropTypes.array.isRequired\n  };\n\n  render () {\n    const labels = [];\n    const values = [];\n\n    forEach(this.props.schemas, (schema) => {\n      labels.push(schema.title);\n      values.push(schema._id);\n    });\n\n    return (\n      <Combobox\n        value={this.props.value}\n        onChange={this.props.onChange}\n        values={values}\n        labels={labels}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/section/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React from 'react';\n\nimport styles from './index.less';\n\nexport default class Section extends Component {\n  static propTypes = {\n    value: React.PropTypes.bool.isRequired,\n    label: React.PropTypes.string.isRequired,\n    onChange: React.PropTypes.func.isRequired\n  };\n\n  toggle (event) {\n    event.preventDefault();\n    this.props.onChange(!this.props.value);\n  }\n\n  render () {\n    const {value, label} = this.props;\n    return (\n      <div className={styles.root} onClick={::this.toggle}>\n        <i className={cx('nc-icon-mini', value ? 'arrows-1_minimal-down' : 'arrows-1_minimal-right')}></i>\n        <span>{label}</span>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/section/index.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  margin: 0 -13px;\n  cursor: pointer;\n  padding: 0 10px;\n  margin-top: -1px;\n  border-top: 1px solid @chromeBordersColor;\n  border-bottom: 1px solid @chromeBordersColor;\n\n  :global {\n    i, span {\n      display: inline-block;\n      vertical-align: top;\n      line-height: 50px;\n      color: @chromeTextColor;\n    }\n    i {\n      font-size: 10px;\n      padding-right: 10px;\n    }\n    span {\n      font-size: 11px;\n      text-transform: uppercase;\n    }\n  }\n\n  &:hover {\n    background-color: @chromeBackgroundActive;\n\n    :global {\n      i, span {\n        color: @chromeTextColorHighlight;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/shadow-position/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class ShadowPosition extends Component {\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    onChange: PropTypes.func.isRequired\n  };\n\n  init () {\n    this.onOutset = this.onClick.bind(this, 'outset');\n    this.onInset = this.onClick.bind(this, 'inset');\n  }\n\n  onClick (to) {\n    this.props.onChange(to);\n  }\n\n  render () {\n    const {value} = this.props;\n    return (\n      <div className={styles.root}>\n        <button\n          className={cx(styles.outset, value === 'outset' && styles.active)}\n          onClick={this.onOutset}\n        />\n        <button\n          className={cx(styles.inset, value === 'inset' && styles.active)}\n          onClick={this.onInset}\n        />\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/shadow-position/index.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  padding-top: 5px;\n}\n\n.outset, .inset {\n  display: inline-block;\n  width: 24px;\n  height: 24px;\n  background-color: #ffffff;\n  margin-right: 9px;\n  border-radius: 4px;\n}\n\n.outset {\n  -webkit-box-shadow: 0px 0px 2px 1px rgba(0,0,0,0.3);\n  -moz-box-shadow: 0px 0px 2px 1px rgba(0,0,0,0.3);\n  box-shadow: 0px 0px 2px 1px rgba(0,0,0,0.3);\n\n  &.active {\n    -webkit-box-shadow: 0px 0px 3px 1px @primary;\n    -moz-box-shadow: 0px 0px 3px 1px @primary;\n    box-shadow: 0px 0px 3px 1px @primary;\n  }\n}\n\n.inset {\n  -webkit-box-shadow: inset 0px 0px 2px 1px rgba(0,0,0,0.3);\n  -moz-box-shadow: inset 0px 0px 2px 1px rgba(0,0,0,0.3);\n  box-shadow: inset 0px 0px 2px 1px rgba(0,0,0,0.3);\n\n  &.active {\n    -webkit-box-shadow: inset 0px 0px 3px 1px @primary;\n    -moz-box-shadow: inset 0px 0px 3px 1px @primary;\n    box-shadow: inset 0px 0px 3px 1px @primary;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/sorts/edit.jsx",
    "content": "import find from 'lodash.find';\nimport forEach from 'lodash.foreach';\nimport Combobox from 'components/input-options/combobox';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nexport default class Edit extends Component {\n  static propTypes = {\n    schema: PropTypes.object,\n    sort: PropTypes.object.isRequired,\n    new: PropTypes.bool,\n    onPropertyChange: PropTypes.func.isRequired,\n    onOrderChange: PropTypes.func.isRequired,\n    cancelEdit: PropTypes.func.isRequired,\n    submitEdit: PropTypes.func.isRequired,\n    schemaProperties: PropTypes.array.isRequired\n  };\n\n  render () {\n    const {sort, schemaProperties} = this.props;\n    const labels = [];\n    const values = [];\n\n    forEach(schemaProperties, (property) => {\n      labels.push(property.title);\n      values.push(property.id);\n    });\n\n    return (\n      <div className='sort-picker-edit white-options'>\n        <div className='sort-submit-wrapper'>\n          <div className='sort-cancel' onClick={this.props.cancelEdit}>cancel</div>\n          <div className='sort-submit' onClick={this.props.submitEdit}>\n            {this.props.new ? 'Create new sort' : 'Ok'}\n          </div>\n        </div>\n        <Combobox labels={labels} values={values} value={sort.prop} onChange={this.props.onPropertyChange} />\n        {this.renderOptions()}\n      </div>\n    );\n  }\n\n  renderOptions () {\n    let result;\n\n    const {sort, schemaProperties} = this.props;\n    const property = find(schemaProperties, 'id', sort.prop);\n\n    if (property) {\n      let labels = [];\n      switch (property.type) {\n        case 'Date':\n          labels = ['Newest to oldest', 'Oldest to newest'];\n          break;\n        case 'Boolean':\n          labels = ['Trues first', 'Falses first'];\n          break;\n        default:\n          labels = ['Alphabetical order [A-Z]', 'Inverse alphabetical order [Z-A]'];\n      }\n\n      result = (\n        <div className='sort-option' key='operation'>\n          <div className='sort-label'>Order</div>\n          <Combobox\n            labels={labels}\n            values={['ASC', 'DESC']}\n            value={sort.order}\n            onChange={this.props.onOrderChange}\n          />\n        </div>\n      );\n    } else {\n      result = (\n        <div className='sort-error'>\n          Invalid sort\n        </div>\n      );\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/sorts/index.js",
    "content": "import * as elementsActions from 'actions/elements';\n\nimport cloneDeep from 'lodash.clonedeep';\nimport forEach from 'lodash.foreach';\nimport staticProperties from 'helpers/schema-static-properties';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport {buildQueryAndVariables} from 'relax-fragments';\n\nimport Sorts from './sorts';\n\n@connect(\n  (state) => ({\n    elements: state.elements,\n    selectedId: state.pageBuilder.selectedId,\n    selectedElement: state.pageBuilder.selectedElement\n  }),\n  (dispatch) => bindActionCreators(elementsActions, dispatch)\n)\nexport default class SortsContainer extends Component {\n  static fragments = Sorts.fragments;\n\n  static propTypes = {\n    value: PropTypes.array.isRequired,\n    onChange: PropTypes.func.isRequired,\n    elements: PropTypes.object.isRequired,\n    selectedId: PropTypes.string,\n    selectedElement: PropTypes.object\n  };\n\n  static defaultProps = {\n    value: []\n  };\n\n  getInitState () {\n    this.fetchData(this.props);\n    return {\n      newOpened: false\n    };\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (this.getSelectedSchemaId(nextProps) !== this.getSelectedSchemaId(this.props)) {\n      this.fetchData(nextProps);\n    }\n  }\n\n  getSelectedSchemaId (props) {\n    const {selectedElement} = props;\n    return selectedElement && selectedElement.props && selectedElement.props.schemaId;\n  }\n\n  fetchData (props) {\n    const {selectedId} = props;\n    const schemaId = this.getSelectedSchemaId(props);\n    if (schemaId) {\n      props.getElementData(selectedId, buildQueryAndVariables(\n        this.constructor.fragments,\n        {\n          schema: {\n            _id: {\n              value: schemaId,\n              type: 'ID!'\n            }\n          }\n        }\n      ));\n    }\n  }\n\n  openNew () {\n    this.setState({\n      newOpened: true,\n      editingSort: {\n        prop: 'publishedDate',\n        type: 'Date',\n        options: {}\n      }\n    });\n  }\n\n  onPropertyChange (prop) {\n    this.setState({\n      editingSort: Object.assign({}, this.state.editingSort, {\n        prop\n      })\n    });\n  }\n\n  onOrderChange (order) {\n    this.setState({\n      editingSort: Object.assign({}, this.state.editingSort, {\n        order\n      })\n    });\n  }\n\n  cancelEdit () {\n    this.setState({\n      newOpened: false,\n      editOpened: false,\n      editIndex: null\n    });\n  }\n\n  submitEdit () {\n    let newSorts = this.props.value;\n\n    if (this.state.newOpened) {\n      newSorts = [...newSorts, this.state.editingSort];\n    } else if (this.state.editOpened) {\n      newSorts = [...newSorts];\n      newSorts[this.state.editIndex] = this.state.editingSort;\n    }\n\n    this.props.onChange(newSorts);\n    this.setState({\n      newOpened: false,\n      editOpened: false,\n      editIndex: null\n    });\n  }\n\n  selectSort (index) {\n    if (this.state.editOpened && this.state.editIndex === index) {\n      this.setState({\n        editOpened: false,\n        editIndex: null\n      });\n    } else {\n      this.setState({\n        editOpened: true,\n        editIndex: index,\n        editingSort: cloneDeep(this.props.value[index])\n      });\n    }\n  }\n\n  removeSort (index) {\n    const newSorts = [...this.props.value];\n    newSorts.splice(index, 1);\n    this.props.onChange(newSorts);\n  }\n\n  render () {\n    const {selectedId, elements} = this.props;\n    const elementData = elements[selectedId];\n    const schema = elementData && elementData.schema || null;\n\n    const schemaProperties = schema && schema.properties || [];\n    const properties = [...staticProperties];\n\n    forEach(schemaProperties, (customProperty) => {\n      properties.push(Object.assign({}, customProperty, {\n        id: `properties#${customProperty.id}`\n      }));\n    });\n\n    return (\n      <Sorts\n        {...this.props}\n        {...this.state}\n        schema={schema}\n        schemaProperties={properties}\n        openNew={::this.openNew}\n        onPropertyChange={::this.onPropertyChange}\n        onOrderChange={::this.onOrderChange}\n        cancelEdit={::this.cancelEdit}\n        submitEdit={::this.submitEdit}\n        selectSort={::this.selectSort}\n        removeSort={::this.removeSort}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/sorts/sort.jsx",
    "content": "import find from 'lodash.find';\nimport Balloon from 'components/balloon';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport Edit from './edit';\n\nexport default class Sort extends Component {\n  static propTypes = {\n    editing: PropTypes.bool.isRequired,\n    sort: PropTypes.object.isRequired,\n    schemaProperties: PropTypes.array.isRequired,\n    index: PropTypes.number.isRequired,\n    selectSort: PropTypes.func.isRequired,\n    removeSort: PropTypes.func.isRequired,\n    new: PropTypes.bool\n  };\n\n  onClick () {\n    if (!this.props.new) {\n      this.props.selectSort(this.props.index);\n    }\n  }\n\n  onRemove (event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.props.removeSort(this.props.index);\n  }\n\n  render () {\n    return (\n      <div className='sort-item white-options'>\n        <div className='sort' onClick={::this.onClick} ref={(ref) => {\n          this.ref = ref;\n          !this.state.ready && this.setState({ready: true});\n        }}\n        >\n          {this.renderContent()}\n          {\n            !this.props.new &&\n            <div className='sort-remove' onClick={::this.onRemove}>\n              <i className='material-icons'>delete</i>\n            </div>\n          }\n        </div>\n        {this.renderEditing()}\n      </div>\n    );\n  }\n\n  renderContent () {\n    let result;\n    const {sort, schemaProperties} = this.props;\n    const property = find(schemaProperties, 'id', sort.prop);\n\n    if (property) {\n      switch (property.type) {\n        case 'Date':\n          if (sort.order === 'ASC') {\n            result = (\n              <div>\n                <span>{property.title}</span>\n                <span className='highlight'> newest</span>\n                <span> to </span>\n                <span className='highlight'>oldest</span>\n              </div>\n            );\n          } else {\n            result = (\n              <div>\n                <span>{property.title}</span>\n                <span className='highlight'> oldest</span>\n                <span> to </span>\n                <span className='highlight'>newest</span>\n              </div>\n            );\n          }\n          break;\n        case 'Boolean':\n          if (sort.order === 'ASC') {\n            result = (\n              <div>\n                <span>{property.title}</span>\n                <span className='highlight'> first</span>\n              </div>\n            );\n          } else {\n            result = (\n              <div>\n                <span>{property.title}</span>\n                <span className='highlight'> last</span>\n              </div>\n            );\n          }\n          break;\n        default:\n          if (sort.order === 'ASC') {\n            result = (\n              <div>\n                <span>{property.title}</span>\n                <span className='highlight'> alphabetical</span>\n                <span> order </span>\n                <span className='highlight'>[A-Z]</span>\n              </div>\n            );\n          } else {\n            result = (\n              <div>\n                <span>{property.title}</span>\n                <span className='highlight'> inverse alphabetical</span>\n                <span> order </span>\n                <span className='highlight'>[Z-A]</span>\n              </div>\n            );\n          }\n      }\n    }\n\n    return result;\n  }\n\n  renderEditing () {\n    if (this.props.editing && this.state.ready) {\n      return (\n        <Balloon element={this.ref}>\n          <Edit {...this.props} />\n        </Balloon>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/sorts/sorts.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport Sort from './sort';\n\nexport default class Sorts extends Component {\n  static fragments = {\n    schema: {\n      _id: 1,\n      title: 1,\n      properties: 1\n    }\n  };\n\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    openNew: PropTypes.func.isRequired,\n    newOpened: PropTypes.bool.isRequired,\n    schema: PropTypes.object.isRequired,\n    editingSort: PropTypes.object,\n    editOpened: PropTypes.bool,\n    editIndex: PropTypes.number\n  };\n\n  render () {\n    return (\n      <div className='sorts'>\n        {this.props.value.map(this.renderSort, this)}\n        {this.renderNew()}\n        <div className='add-new' onClick={this.props.openNew}>Add new sort condition</div>\n      </div>\n    );\n  }\n\n  renderSort (sort, index) {\n    const editing = this.props.editOpened && this.props.editIndex === index;\n    return (\n      <Sort editing={editing} {...this.props} index={index} sort={editing ? this.props.editingSort : sort} />\n    );\n  }\n\n  renderNew () {\n    if (this.props.newOpened) {\n      return (\n        <Sort editing new {...this.props} sort={this.props.editingSort} />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/spacing/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport NumberInput from 'components/input-options/number';\nimport React from 'react';\n\nimport styles from './index.less';\n\nexport default class SpacingPicker extends Component {\n  static propTypes = {\n    value: React.PropTypes.string.isRequired,\n    onChange: React.PropTypes.func.isRequired,\n    type: React.PropTypes.string.isRequired\n  };\n\n  getInitState () {\n    return {\n      selected: 'center',\n      values: this.parseValue(this.props.value)\n    };\n  }\n\n  componentWillReceiveProps (nextProps) {\n    this.setState({\n      values: this.parseValue(nextProps.value)\n    });\n  }\n\n  onInputChange (value) {\n    if (this.state.selected === 'center') {\n      this.state.values.top = value;\n      this.state.values.right = value;\n      this.state.values.bottom = value;\n      this.state.values.left = value;\n    } else {\n      this.state.values[this.state.selected] = value;\n    }\n    this.props.onChange(this.getValuesString(this.state.values));\n  }\n\n  getValuesString (values) {\n    return `${values.top || '0'}px ${values.right || '0'}px ${values.bottom || '0'}px ${values.left || '0'}px`;\n  }\n\n  parseValue (value) {\n    const values = value.split(' ');\n    const result = {\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n      equal: false\n    };\n\n    if (values.length === 1) {\n      const parsedValue = parseInt(values[0], 10);\n      result.top = parsedValue;\n      result.bottom = parsedValue;\n      result.left = parsedValue;\n      result.right = parsedValue;\n    } else if (values.length === 2) {\n      result.top = parseInt(values[0], 10);\n      result.right = parseInt(values[1], 10);\n      result.bottom = parseInt(values[0], 10);\n      result.left = parseInt(values[1], 10);\n    } else if (values.length === 4) {\n      result.top = parseInt(values[0], 10);\n      result.right = parseInt(values[1], 10);\n      result.bottom = parseInt(values[2], 10);\n      result.left = parseInt(values[3], 10);\n    }\n\n    if (result.top === result.right && result.top === result.bottom && result.top === result.left) {\n      result.equal = true;\n    } else {\n      result.equal = false;\n    }\n\n    return result;\n  }\n\n  changeSelected (selected, event) {\n    event.preventDefault();\n    this.setState({\n      selected\n    });\n  }\n\n  render () {\n    const values = this.state.values;\n    let value = 0;\n    let inactive = false;\n\n    if (this.state.selected !== 'center') {\n      value = values[this.state.selected];\n    } else {\n      inactive = !values.equal;\n      value =\n        values.equal ?\n        values.top :\n        Math.round((values.top + values.right + values.bottom + values.left) / 4);\n    }\n\n    return (\n      <div className={cx(styles.root, styles[this.props.type])}>\n        <div className={styles.toggles}>\n          {this.renderToggleButton('top', 'arrows-1_minimal-up', !values.equal)}\n          {this.renderToggleButton('left', 'arrows-1_minimal-left', !values.equal)}\n          {this.renderToggleButton('center', 'ui-2_link-68', values.equal)}\n          {this.renderToggleButton('right', 'arrows-1_minimal-right', !values.equal)}\n          {this.renderToggleButton('bottom', 'arrows-1_minimal-down', !values.equal)}\n        </div>\n        <div className={styles.inputs}>\n          <div className={styles.subLabel}>Value</div>\n          <NumberInput value={value} onChange={::this.onInputChange} inactive={inactive} />\n        </div>\n      </div>\n    );\n  }\n\n  renderToggleButton (pos, icon, active) {\n    const onClick = this.changeSelected.bind(this, pos);\n    return (\n      <div\n        className={cx(\n          styles.toggle,\n          styles[pos],\n          this.state.selected === pos && styles.selected,\n          active && styles.active\n        )}\n        onClick={onClick}\n      >\n        <i className={cx('nc-icon-mini', icon)}></i>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/spacing/index.less",
    "content": "@import '~styles/colors.less';\n\n@btnsSize: 25px;\n@btnsSpacing: 3px;\n@total: @btnsSize * 3 + @btnsSpacing * 2;\n\n.root {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  margin-top: 10px;\n}\n\n// Parts\n.toggles, .inputs {\n  display: table-cell;\n  vertical-align: middle;\n}\n\n.toggles {\n  position: relative;\n  height: @total;\n  width: @total;\n}\n\n.inputs {\n  padding-left: 25px;\n  padding-bottom: 13px;\n\n  .subLabel {\n    font-size: 9px;\n    color: #616363;\n    text-transform: uppercase;\n    margin-bottom: 5px;\n  }\n}\n\n// Toggle buttons\n.toggle {\n  position: absolute;\n  width: @btnsSize;\n  height: @btnsSize;\n  border: 1px solid @chromeBordersColor;\n  text-align: center;\n  cursor: pointer;\n\n  :global i {\n    color: #cccccc;\n    font-size: 9px;\n    line-height: 23px;\n    position: relative;\n  }\n\n  @center: @total / 2 - @btnsSize / 2;\n\n  &.top {\n    left: @center;\n    top: 0;\n  }\n  &.left {\n    left: 0;\n    top: @center;\n  }\n  &.center {\n    left: @center;\n    top: @center;\n  }\n  &.right {\n    right: 0;\n    top: @center;\n  }\n  &.bottom {\n    left: @center;\n    bottom: 0;\n  }\n\n  &:before {\n    content: \" \";\n    position: absolute;\n    background-color: #cccccc;\n  }\n\n  &.top:before, &.bottom:before {\n    height: 1px;\n    width: 9px;\n    left: @btnsSize / 2 - 6px;\n  }\n\n  &.left:before, &.right:before {\n    height: 9px;\n    width: 1px;\n    top: @btnsSize / 2 - 6px;\n  }\n\n  &:hover {\n    background-color: #3f4249;\n\n    :global i {\n      color: #ffffff;\n    }\n\n    &:before {\n      background-color: #ffffff;\n    }\n  }\n\n  &.selected {\n    border-color: @primary;\n    background-color: #3f4249;\n\n    :global i {\n      color: #ffffff;\n    }\n\n    &:before {\n      background-color: #ffffff;\n    }\n  }\n\n  &.active {\n    :global i {\n      color: @primary;\n    }\n\n    &:before {\n      background-color: @primary;\n    }\n  }\n}\n\n// Type\n.padding {\n  .top {\n    &:before {\n      top: 7px;\n    }\n    :global i {\n      top: 3px;\n    }\n  }\n  .bottom {\n    &:before {\n      bottom: 7px;\n    }\n    :global i {\n      top: -3px;\n    }\n  }\n  .left {\n    &:before {\n      left: 7px;\n    }\n    :global i {\n      left: 3px;\n    }\n  }\n  .right {\n    &:before {\n      right: 7px;\n    }\n    :global i {\n      left: -3px;\n    }\n  }\n}\n\n.margin {\n  .top {\n    &:before {\n      bottom: 7px;\n    }\n    :global i {\n      top: -3px;\n    }\n  }\n  .bottom {\n    &:before {\n      top: 7px;\n    }\n    :global i {\n      top: 3px;\n    }\n  }\n  .left {\n    &:before {\n      right: 7px;\n    }\n    :global i {\n      left: -3px;\n    }\n  }\n  .right {\n    &:before {\n      left: 7px;\n    }\n    :global i {\n      left: 3px;\n    }\n\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/text-shadow/edit.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nexport default class Edit extends Component {\n  static propTypes = {\n    shadow: PropTypes.object.isRequired,\n    changeShadow: PropTypes.func.isRequired,\n    OptionsList: PropTypes.object.isRequired\n  };\n\n  static options = [\n    {\n      type: 'Columns',\n      options: [\n        {\n          label: 'Color',\n          type: 'Color',\n          id: 'color'\n        },\n        {\n          label: 'Blur',\n          type: 'Pixels',\n          id: 'blur'\n        }\n      ]\n    },\n    {\n      type: 'Columns',\n      options: [\n        {\n          label: 'X',\n          type: 'Pixels',\n          id: 'x'\n        },\n        {\n          label: 'Y',\n          type: 'Pixels',\n          id: 'y'\n        }\n      ]\n    }\n  ];\n\n  render () {\n    const {shadow, OptionsList, changeShadow} = this.props;\n\n    return (\n      <div>\n        <OptionsList white tight options={Edit.options} values={shadow} onChange={changeShadow} />\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/text-shadow/index.jsx",
    "content": "import cloneDeep from 'lodash.clonedeep';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\nimport Shadow from './shadow';\n\nexport default class TextShadow extends Component {\n  static propTypes = {\n    value: PropTypes.array.isRequired,\n    onChange: PropTypes.func.isRequired\n  };\n\n  static defaultProps = {\n    value: []\n  };\n\n  getInitState () {\n    return {\n      editingShadow: false\n    };\n  }\n\n  addNewClick () {\n    this.props.onChange([...this.props.value, {\n      color: '#000000',\n      blur: '2px',\n      x: '2px',\n      y: '2px'\n    }]);\n    this.setState({\n      editingShadow: this.props.value.length\n    });\n  }\n\n  changeShadow (key, value) {\n    if (this.state.editingShadow !== false) {\n      const newValue = cloneDeep(this.props.value);\n      newValue[this.state.editingShadow][key] = value;\n      this.props.onChange(newValue);\n    }\n  }\n\n  selectShadow (index) {\n    if (this.state.editingShadow === index) {\n      this.setState({\n        editingShadow: false\n      });\n    } else {\n      this.setState({\n        editingShadow: index\n      });\n    }\n  }\n\n  removeShadow (index) {\n    const newValue = cloneDeep(this.props.value);\n    newValue.splice(index, 1);\n    this.props.onChange(newValue);\n  }\n\n  render () {\n    return (\n      <div>\n        {this.props.value.map(this.renderEntry, this)}\n        <div className={styles.addButton} onClick={::this.addNewClick}>Add new shadow</div>\n      </div>\n    );\n  }\n\n  renderEntry (shadow, index) {\n    return (\n      <Shadow\n        index={index}\n        editing={this.state.editingShadow === index}\n        shadow={shadow}\n        changeShadow={::this.changeShadow}\n        selectShadow={::this.selectShadow}\n        removeShadow={::this.removeShadow}\n        {...this.props}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/text-shadow/index.less",
    "content": "@import '~styles/colors.less';\n\n.addButton {\n  font-size: 10px;\n  color: #dbdbdb;\n  cursor: pointer;\n  line-height: 20px;\n  text-align: center;\n  text-transform: uppercase;\n  margin-top: 15px;\n\n  &:hover {\n    color: @primary;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/text-shadow/shadow.jsx",
    "content": "import Balloon from 'components/balloon';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {getColor} from 'helpers/colors';\n\nimport styles from './shadow.less';\nimport Edit from './edit';\n\nexport default class Shadow extends Component {\n  static propTypes = {\n    shadow: PropTypes.object.isRequired,\n    editing: PropTypes.bool.isRequired,\n    new: PropTypes.bool.isRequired,\n    selectShadow: PropTypes.func.isRequired,\n    removeShadow: PropTypes.func.isRequired,\n    index: PropTypes.number.isRequired\n  };\n\n  onClick () {\n    this.props.selectShadow(this.props.index);\n  }\n\n  onRemove (event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.props.removeShadow(this.props.index);\n  }\n\n  render () {\n    const {shadow} = this.props;\n\n    return (\n      <div className={styles.root}>\n        <div className={styles.content} onClick={::this.onClick} ref={(ref) => {\n          this.ref = ref;\n          !this.state.ready && this.setState({ready: true});\n        }}\n        >\n          <div>{`${getColor(shadow.color).label}, ${shadow.x} ${shadow.y}, ${shadow.blur}`}</div>\n          <div className={styles.removeButton} onClick={::this.onRemove}>\n            <i className='nc-icon-mini ui-1_trash-simple'></i>\n          </div>\n        </div>\n        {this.renderEditing()}\n      </div>\n    );\n  }\n\n  renderEditing () {\n    if (this.props.editing && this.state.ready) {\n      return (\n        <Balloon element={this.ref}>\n          <Edit {...this.props} />\n        </Balloon>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/input-options/text-shadow/shadow.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  position: relative;\n}\n\n.content {\n  position: relative;\n  border: 1px solid @chromeBordersColor;\n  padding: 12px;\n  font-size: 10px;\n  line-height: 14px;\n  color: @chromeTextColor;\n  border-radius: 4px;\n  cursor: pointer;\n  margin-bottom: 8px;\n\n  &:hover {\n    border-color: @primary;\n\n    .removeButton {\n      visibility: visible;\n    }\n  }\n}\n\n.removeButton {\n  position: absolute;\n  right: 1px; top: 1px; bottom: 1px;\n  width: 30px;\n  text-align: center;\n  visibility: hidden;\n  background: -moz-linear-gradient(left, rgba(51,54,59,0) 0%, rgba(51,54,59,1) 23%, rgba(51,54,59,1) 100%);\n  background: -webkit-linear-gradient(left, rgba(51,54,59,0) 0%,rgba(51,54,59,1) 23%,rgba(51,54,59,1) 100%);\n  background: linear-gradient(to right, rgba(51,54,59,0) 0%,rgba(51,54,59,1) 23%,rgba(51,54,59,1) 100%);\n\n  :global i {\n    color: @chromeTextSubColor;\n    line-height: 36px;\n    font-size: 11px;\n  }\n\n  &:hover {\n    :global i {\n      color: #ffffff;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/list-header/index.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class ListHeader extends Component {\n  static propTypes = {\n    onBack: PropTypes.func.isRequired,\n    title: PropTypes.string.isRequired,\n    newIcon: PropTypes.string,\n    onNew: PropTypes.func,\n    children: PropTypes.node\n  };\n\n  render () {\n    const {onBack, title} = this.props;\n\n    return (\n      <div className={styles.header}>\n        <button className={styles.backButton} onClick={onBack}>\n          <i className='nc-icon-mini arrows-1_minimal-left'></i>\n          <span>Back</span>\n        </button>\n        <div className={styles.title}>{title}</div>\n        {this.renderNewButton()}\n        {this.props.children}\n      </div>\n    );\n  }\n\n  renderNewButton () {\n    const {newIcon, onNew} = this.props;\n    if (newIcon && onNew) {\n      return (\n        <button className={styles.newButton} onClick={onNew}>\n          <i className={newIcon}></i>\n        </button>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/list-header/index.less",
    "content": "@import '~styles/colors.less';\n\n.header {\n  position: relative;\n  height: 70px;\n  border-bottom: 1px solid @adminBorders;\n}\n\n.backButton {\n  position: absolute;\n  top: 0;\n  left: 0;\n  padding: 0 7px;\n  :global {\n    i, span {\n      display: inline-block;\n      vertical-align: top;\n      line-height: 70px;\n    }\n    span {\n      text-transform: uppercase;\n      font-size: 12px;\n    }\n    i {\n      font-size: 10px;\n      margin-right: 5px;\n    }\n  }\n}\n\n.newButton {\n  position: absolute;\n  top: 0;\n  right: 0;\n  padding: 0 10px;\n  :global {\n    i {\n      color: @adminText;\n      line-height: 70px;\n      font-size: 22px;\n    }\n  }\n  &:hover :global i {\n    color: @primary;\n  }\n}\n\n.title {\n  padding: 0 60px;\n  text-align: center;\n  line-height: 69px;\n  font-size: 22px;\n  color: @adminTextHighlight;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/list-search-sort/index.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport debounce from 'lodash.debounce';\nimport find from 'lodash.find';\nimport Balloon from 'components/balloon';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {Link} from 'react-router';\nimport {pushState} from 'redux-router';\n\nimport styles from './index.less';\n\nexport default class ListSearchSort extends Component {\n  static propTypes = {\n    sorts: PropTypes.array.isRequired,\n    sort: PropTypes.string.isRequired,\n    search: PropTypes.string,\n    order: PropTypes.string.isRequired,\n    location: PropTypes.object.isRequired\n  };\n\n  static contextTypes = {\n    store: PropTypes.object.isRequired\n  };\n\n  getInitState () {\n    this.searchDebounce = debounce(::this.changeSearch, 300);\n    return {\n      opened: false,\n      focused: false\n    };\n  }\n\n  toggleSorts () {\n    this.setState({\n      opened: !this.state.opened\n    });\n  }\n\n  changeSearch () {\n    const {location} = this.props;\n    const query = Object.assign({}, location.query, {\n      s: this.state.search\n    });\n    this.context.store.dispatch(pushState(null, location.pathname, query));\n  }\n\n  @bind\n  onFocus () {\n    this.setState({\n      focused: true,\n      search: this.props.search\n    });\n  }\n\n  @bind\n  onBlur () {\n    if (this.state.search !== this.props.search) {\n      this.changeSearch();\n    }\n    this.setState({\n      focused: false\n    });\n  }\n\n  @bind\n  updateSearch (event) {\n    this.setState({\n      search: event.target.value\n    });\n    this.searchDebounce();\n  }\n\n  render () {\n    const {focused} = this.state;\n    const {sort, order, sorts} = this.props;\n    const selected = find(sorts, (obj) => obj.sort === sort && obj.order === order);\n\n    return (\n      <div className={styles.root}>\n        <label className={styles.searchLabel}>\n          <i className='nc-icon-mini ui-1_zoom'></i>\n          <input\n            type='text'\n            value={focused ? this.state.search : this.props.search}\n            className={styles.search}\n            placeholder='Search..'\n            onFocus={this.onFocus}\n            onBlur={this.onBlur}\n            onChange={this.updateSearch}\n          />\n        </label>\n        <div className={styles.sort} onClick={::this.toggleSorts} ref='sort'>\n          <span>{selected && selected.label}</span>\n          <i className='nc-icon-mini arrows-1_minimal-down'></i>\n        </div>\n        {this.renderSorts()}\n      </div>\n    );\n  }\n\n  renderSorts () {\n    if (this.state.opened) {\n      const {sorts} = this.props;\n      return (\n        <Balloon\n          element={this.refs.sort}\n          stickOptions={{horizontalPosition: 'center', onClose: ::this.toggleSorts}}\n          white\n          small\n          unpadded\n        >\n          {sorts.map(this.renderSort, this)}\n        </Balloon>\n      );\n    }\n  }\n\n  renderSort (sort, key) {\n    const {location} = this.props;\n    const active = this.props.sort === sort.sort && this.props.order === sort.order;\n    const query = Object.assign({}, location.query, {\n      sort: sort.sort,\n      order: sort.order\n    });\n    return (\n      <Link\n        to={location.pathname}\n        query={query}\n        className={cx(styles.sortOption, active && styles.active)}\n        key={key}\n        onClick={::this.toggleSorts}\n      >\n        {sort.label}\n      </Link>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/list-search-sort/index.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  background-color: #F7F7F7;\n  height: 40px;\n  border-bottom: 1px solid @adminBorders;\n  padding: 0 10px;\n}\n\n.searchLabel {\n  display: inline-block;\n  vertical-align: top;\n\n  :global i {\n    font-size: 16px;\n    color: @adminTextSub;\n    display: inline-block;\n    vertical-align: top;\n    line-height: 39px;\n  }\n}\n\n.search {\n  border: 0;\n  outline: 0;\n  color: @adminTextHighlight;\n  font-size: 12px;\n  font-weight: 300;\n  display: inline-block;\n  vertical-align: top;\n  background-color: transparent;\n  line-height: 40px;\n  padding: 0px 7px;\n\n  &::-webkit-input-placeholder {\n    color: #b4b4b4;\n  }\n  &:-moz-placeholder {\n    color: #b4b4b4;\n  }\n  &::-moz-placeholder {\n    color: #b4b4b4;\n  }\n  &:-ms-input-placeholder {\n    color: #b4b4b4;\n  }\n  &::-ms-input-placeholder {\n    color: #b4b4b4;\n  }\n  &:placeholder-shown {\n    color: #b4b4b4;\n  }\n}\n\n.sort {\n  float: right;\n  display: inline-block;\n  vertical-align: top;\n  cursor: pointer;\n\n  :global {\n    i, span {\n      display: inline-block;\n      vertical-align: top;\n      line-height: 40px;\n      color: #b4b4b4;\n    }\n    i {\n      font-size: 7px;\n      margin-left: 6px;\n    }\n    span {\n      font-size: 12px;\n      font-weight: 300;\n    }\n  }\n}\n\n.sortOption {\n  display: block;\n  width: 100%;\n  color: @adminText;\n  line-height: 30px;\n  font-size: 12px;\n  text-align: left;\n  padding: 0 15px;\n  text-decoration: none;\n\n  &:hover {\n    background-color: @adminBorders;\n  }\n\n  &.active {\n    background-color: @primary;\n    color: #ffffff;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-item-preview/index.jsx",
    "content": "import Component from 'components/component';\nimport Image from 'components/image';\nimport React, {PropTypes} from 'react';\nimport {getMediaType} from 'helpers/mime-types';\n\nimport styles from './index.less';\n\nexport default class MediaItemPreview extends Component {\n  static fragments = {\n    mediaItem: {\n      _id: 1,\n      type: 1,\n      thumbnail: 1,\n      url: 1\n    }\n  };\n\n  static propTypes = {\n    mediaItem: PropTypes.object.isRequired,\n    useThumbnail: PropTypes.bool,\n    width: PropTypes.number,\n    height: PropTypes.number\n  };\n\n  static defaultProps = {\n    useThumbnail: false,\n    width: 100,\n    height: 100,\n    mediaItem: {}\n  };\n\n  render () {\n    const {mediaItem} = this.props;\n    const type = getMediaType(mediaItem.type);\n    let result;\n\n    if (type === 'favicon') {\n      result = this.renderFaviconType();\n    } else if (type === 'image') {\n      result = this.renderImageType();\n    } else if (type === 'video') {\n      result = this.renderVideoType();\n    } else if (type === 'audio') {\n      result = this.renderAudioType();\n    }\n\n    return (\n      <div className={styles.root}>\n        {result}\n      </div>\n    );\n  }\n\n  renderImageType () {\n    const {mediaItem, width, height, useThumbnail} = this.props;\n    let result;\n\n    if (useThumbnail) {\n      result = (\n        <img\n          src={`/${mediaItem.thumbnail}`}\n          width={width}\n          height={height}\n        />\n      );\n    } else {\n      result = (\n        <Image\n          id={mediaItem._id}\n          width={width}\n          height={height}\n          className={styles.cover}\n        />\n      );\n    }\n\n    return result;\n  }\n\n  renderFaviconType () {\n    const {mediaItem} = this.props;\n    return (\n      <img src={`/${mediaItem.url}`} className={styles.limit} />\n    );\n  }\n\n  renderVideoType () {\n    return (\n      <i className='nc-icon-outline media-1_play-69'></i>\n    );\n  }\n\n  renderAudioType () {\n    return (\n      <i className='nc-icon-outline media-1_volume-98'></i>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-item-preview/index.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  width: 100%;\n  height: 100%;\n\n  text-align: center;\n  overflow: hidden;\n  position: relative;\n\n  :global {\n    img, i {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n    }\n    i {\n      font-size: 36px;\n      color: @adminText;\n    }\n  }\n}\n\n.cover {\n  min-width: 100%;\n  min-height: 100%;\n}\n\n.limit {\n  max-width: 100%;\n  max-height: 100%;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/entry.jsx",
    "content": "import bind from 'decorators/bind';\nimport cx from 'classnames';\nimport moment from 'moment';\nimport Component from 'components/component';\nimport MediaItemPreview from 'components/media-item-preview';\nimport React, {PropTypes} from 'react';\nimport {mergeFragments} from 'relate-js';\n\nimport styles from './entry.less';\n\nexport default class MediaEntry extends Component {\n  static fragments = mergeFragments({\n    mediaItem: {\n      _id: 1,\n      name: 1,\n      date: 1\n    }\n  }, MediaItemPreview.fragments);\n\n  static propTypes = {\n    onClick: PropTypes.func.isRequired,\n    mediaItem: PropTypes.object.isRequired,\n    selected: PropTypes.bool.isRequired\n  };\n\n  @bind\n  onClick () {\n    const {onClick, mediaItem} = this.props;\n    onClick(mediaItem._id);\n  }\n\n  render () {\n    const {mediaItem, selected} = this.props;\n    const momentDate = moment(mediaItem.date);\n\n    return (\n      <div className={cx(styles.entry, selected && styles.selected)} onClick={this.onClick}>\n        <div className={styles.preview}>\n          <MediaItemPreview mediaItem={mediaItem} width={250} height={125} />\n        </div>\n        <div className={styles.info}>\n          <div className={styles.title}>{mediaItem.name}</div>\n          <div className={styles.date}>{momentDate.fromNow()}</div>\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/entry.less",
    "content": "@import '~styles/colors.less';\n\n.entry {\n  display: inline-block;\n  vertical-align: top;\n\n  width: 21.25%;\n  margin-right: 5%;\n\n  margin-bottom: 60px;\n  border: 1px solid transparent;\n\n  cursor: pointer;\n}\n\n@media screen and (min-width: 1501px) {\n  .entry {\n    width: 16%;\n    &:nth-child(5n+5) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 1500px) and (min-width: 1101px) {\n  .entry {\n    &:nth-child(4n+4) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 1100px) and (min-width: 851px) {\n  .entry {\n    width: 30%;\n    &:nth-child(3n+3) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 850px) and (min-width: 751px) {\n  .entry {\n    width: 45%;\n    margin-right: 10%;\n    &:nth-child(2n+2) {\n      margin-right: 0;\n    }\n  }\n}\n\n@media screen and (max-width: 750px) {\n  .entry {\n    width: 100%;\n    margin-right: 0%;\n  }\n}\n\n\n.preview {\n  width: 100%;\n  height: 125px;\n  background-color: @adminBorders;\n}\n\n.info {\n  padding: 15px;\n  height: 65px;\n  text-align: center;\n}\n\n.title {\n  color: @adminTextHighlight;\n  font-size: 16px;\n  line-height: 19px;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.date {\n  color: @adminText;\n  font-size: 12px;\n  font-weight: 300;\n  text-transform: uppercase;\n}\n\n.entry:hover {\n  border: 1px solid @adminBorders;\n}\n\n.entry.selected {\n  border: 1px solid @primary;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/filters.jsx",
    "content": "import forEach from 'lodash.foreach';\nimport Combobox from 'components/input-options/combobox';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {getMimeTypes} from 'helpers/mime-types';\n\nimport styles from './filters.less';\n\nexport default class Filters extends Component {\n  static propTypes = {\n    changeSort: PropTypes.func.isRequired,\n    changeOrder: PropTypes.func.isRequired,\n    changeType: PropTypes.func.isRequired,\n    sort: PropTypes.string.isRequired,\n    order: PropTypes.string.isRequired,\n    type: PropTypes.string.isRequired,\n    allowedType: PropTypes.string.isRequired\n  }\n\n  sortChange (key, value) {\n    this.props.changeSort(key, value);\n  }\n\n  render () {\n    const {changeSort, changeOrder, changeType, sort, order, type, allowedType} = this.props;\n\n    const mimeFilterOptions = {\n      labels: ['ALL'],\n      values: ['all']\n    };\n    const mimeTypes = getMimeTypes(allowedType);\n    forEach(mimeTypes, (mimeType) => {\n      const splitted = mimeType.split('/');\n      if (splitted[1]) {\n        mimeFilterOptions.labels.push(splitted[1].toUpperCase());\n        mimeFilterOptions.values.push(mimeType);\n      }\n    });\n\n    return (\n      <div>\n        <div className={styles.option}>\n          <div className={styles.label}>Sort by</div>\n          <Combobox\n            labels={['Date', 'Size', 'Dimensions']}\n            values={['_id', 'filesize', 'dimension']}\n            value={sort}\n            className={styles.mediumCombobox}\n            onChange={changeSort}\n          />\n          <Combobox\n            labels={['Asc', 'Desc']}\n            values={['asc', 'desc']}\n            value={order}\n            className={styles.smallCombobox}\n            onChange={changeOrder}\n          />\n        </div>\n        <div className={styles.option}>\n          <div className={styles.label}>Filter by type</div>\n          <Combobox\n            {...mimeFilterOptions}\n            value={type}\n            onChange={changeType}\n          />\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/filters.less",
    "content": "@import '~styles/colors.less';\n\n.mediumCombobox {\n  display: inline-block;\n  vertical-align: top;\n  width: 142px;\n  margin-right: 10px;\n}\n\n.smallCombobox {\n  display: inline-block;\n  vertical-align: top;\n  width: 88px;\n}\n\n.label {\n  text-transform: uppercase;\n  font-size: 10px;\n  color: @chromeTextColor;\n  line-height: 16px;\n  margin-bottom: 8px;\n  padding: 0 3px;\n}\n\n.option {\n  margin-bottom: 30px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/index.js",
    "content": "import * as mediaActions from 'actions/media';\n\nimport bind from 'decorators/bind';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {getMimeTypes} from 'helpers/mime-types';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport MediaSelector from './media-selector';\n\n@dataConnect(\n  (state) => ({\n    uploads: state.media.uploads\n  }),\n  (dispatch) => bindActionCreators(mediaActions, dispatch),\n  () => ({\n    fragments: MediaSelector.fragments,\n    variablesTypes: {\n      media: {\n        sort: 'String',\n        order: 'String',\n        filters: '[Filter]'\n      }\n    },\n    initialVariables: {\n      media: {\n        sort: '_id',\n        order: 'desc'\n      }\n    },\n    mutations: {\n      addMedia: [\n        {\n          type: 'PREPEND',\n          field: 'media'\n        }\n      ]\n    }\n  })\n)\nexport default class MediaSelectorContainer extends Component {\n  static propTypes = {\n    selected: PropTypes.string,\n    media: PropTypes.array,\n    onClose: PropTypes.func.isRequired,\n    onChange: PropTypes.func.isRequired,\n    allowedType: PropTypes.string.isRequired,\n    uploadMediaFiles: PropTypes.func.isRequired,\n    uploads: PropTypes.array.isRequired\n  };\n\n  static defaultProps = {\n    media: []\n  };\n\n  getInitState () {\n    return {\n      sort: '_id',\n      order: 'desc',\n      type: 'all'\n    };\n  }\n\n  componentWillUpdate (nextProps, nextState) {\n    if (this.state.sort !== nextState.sort ||\n        this.state.order !== nextState.order ||\n        this.state.type !== nextState.type) {\n      const filter = nextState.type;\n      let filters = [];\n      if (filter !== 'all') {\n        let type = getMimeTypes(filter);\n        let op = 'in';\n        if (!type) {\n          op = 'eq';\n          type = filter;\n        }\n        filters = [{\n          property: 'type',\n          op: {\n            [op]: type\n          }\n        }];\n      }\n\n      nextProps.relate.setVariables({\n        media: {\n          sort: nextState.sort,\n          order: nextState.order,\n          filters\n        }\n      });\n    }\n  }\n\n  @bind\n  changeSort (sort) {\n    this.setState({sort});\n  }\n\n  @bind\n  changeOrder (order) {\n    this.setState({order});\n  }\n\n  @bind\n  changeType (type) {\n    this.setState({type});\n  }\n\n  render () {\n    const {media, selected, onClose, onChange, allowedType, uploadMediaFiles, uploads} = this.props;\n\n    return (\n      <MediaSelector\n        {...this.state}\n        allowedType={allowedType}\n        media={media}\n        selected={selected}\n        onClose={onClose}\n        onChange={onChange}\n        changeSort={this.changeSort}\n        changeOrder={this.changeOrder}\n        changeType={this.changeType}\n        uploadMediaFiles={uploadMediaFiles}\n        uploads={uploads}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/list.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './list.less';\nimport Entry from './entry';\nimport MockEntry from './mock-entry';\n\nexport default class MediaSelectorList extends Component {\n  static fragments = {\n    media: Entry.fragments.mediaItem\n  };\n\n  static propTypes = {\n    media: PropTypes.array.isRequired,\n    onChange: PropTypes.func.isRequired,\n    uploads: PropTypes.array.isRequired,\n    selected: PropTypes.string\n  };\n\n  render () {\n    const {uploads} = this.props;\n    const mocks = [];\n    for (let i = uploads.length - 1; i >= 0; i--) {\n      mocks.push(this.renderMockItem(uploads[i]));\n    }\n\n    return (\n      <div className={styles.root}>\n        {mocks}\n        {this.props.media.map(this.renderItem, this)}\n      </div>\n    );\n  }\n\n  renderItem (mediaItem) {\n    const {onChange, selected} = this.props;\n    return (\n      <Entry mediaItem={mediaItem} onClick={onChange} selected={selected === mediaItem._id} key={mediaItem._id} />\n    );\n  }\n\n  renderMockItem (upload, index) {\n    const {status} = upload;\n\n    if (status === 'queue' || status === 'uploading') {\n      return (\n        <MockEntry upload={upload} key={index} />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/list.less",
    "content": ".root {\n  padding: 40px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/media-selector.jsx",
    "content": "import Component from 'components/component';\nimport Modal from 'components/modal';\nimport Scrollable from 'components/scrollable';\nimport Upload from 'components/upload';\nimport React, {PropTypes} from 'react';\n\nimport styles from './media-selector.less';\nimport List from './list';\nimport Sidebar from './sidebar';\n\nexport default class MediasSelector extends Component {\n  static fragments = List.fragments;\n\n  static propTypes = {\n    media: PropTypes.array.isRequired,\n    selected: PropTypes.string,\n    onClose: PropTypes.func.isRequired,\n    onChange: PropTypes.func.isRequired,\n    changeSort: PropTypes.func.isRequired,\n    changeOrder: PropTypes.func.isRequired,\n    changeType: PropTypes.func.isRequired,\n    sort: PropTypes.string.isRequired,\n    order: PropTypes.string.isRequired,\n    type: PropTypes.string.isRequired,\n    allowedType: PropTypes.string.isRequired,\n    uploadMediaFiles: PropTypes.func.isRequired,\n    uploads: PropTypes.array.isRequired\n  };\n\n  render () {\n    const {media, selected, onClose, onChange, uploadMediaFiles, uploads} = this.props;\n    return (\n      <Modal big onClose={onClose}>\n        <Upload clickable={false} infos onFiles={uploadMediaFiles}>\n          {this.renderSidebar()}\n          <Scrollable className={styles.wrapper}>\n            <List\n              media={media}\n              selected={selected}\n              onChange={onChange}\n              uploads={uploads}\n            />\n          </Scrollable>\n        </Upload>\n      </Modal>\n    );\n  }\n\n  renderSidebar () {\n    const {selected, changeSort, changeOrder, changeType, sort, order, type, allowedType} = this.props;\n    return (\n      <div className={styles.sidebar}>\n        <Sidebar\n          selected={selected}\n          changeSort={changeSort}\n          changeOrder={changeOrder}\n          changeType={changeType}\n          sort={sort}\n          order={order}\n          type={type}\n          allowedType={allowedType}\n        />\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/media-selector.less",
    "content": "@import '~styles/colors.less';\n\n.sidebar {\n  position: absolute;\n  top: 0; left: 0; bottom: 0;\n  width: 280px;\n  background-color: @chromeBackgroundColor;\n}\n\n.wrapper {\n  position: absolute;\n  top: 0; left: 280px; bottom: 0; right: 0;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/mock-entry.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport Spinner from 'components/spinner';\nimport React, {PropTypes} from 'react';\n\nimport mockStyles from './mock-entry.less';\nimport styles from './entry.less';\n\nexport default class MediaMockEntry extends Component {\n  static propTypes = {\n    upload: PropTypes.object.isRequired\n  };\n\n  render () {\n    const {upload} = this.props;\n    let result;\n\n    if (upload.status === 'queue') {\n      result = <i className='nc-icon-mini ui-2_hourglass'></i>;\n    } else if (upload.status === 'uploading') {\n      result = <Spinner />;\n    }\n\n    return (\n      <div className={cx(styles.entry, mockStyles.root)}>\n        <div className={cx(styles.preview, mockStyles.preview)}>\n          {result}\n        </div>\n        <div className={styles.info}></div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/mock-entry.less",
    "content": ".root {\n  cursor: default;\n  &:hover {\n    border: 1px solid transparent !important;\n  }\n}\n\n.preview {\n  text-align: center;\n  padding: 50px 0;\n\n  :global i {\n    font-size: 18px;\n    color: #ccc;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/selected/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {dataConnect} from 'relate-js';\n\nimport Selected from './selected';\n\n@dataConnect(\n  (props) => {\n    const result = {\n      fragments: {},\n      variablesTypes: {\n        mediaItem: {\n          id: 'ID!'\n        }\n      },\n      initialVariables: {\n        mediaItem: {\n          id: props.selected\n        }\n      }\n    };\n\n    if (props.selected) {\n      result.fragments = Selected.fragments;\n    }\n\n    return result;\n  }\n)\nexport default class MediaSelectorSelectedContainer extends Component {\n  static propTypes = {\n    selected: PropTypes.string,\n    mediaItem: PropTypes.object\n  };\n\n  componentWillReceiveProps (nextProps) {\n    if (this.props.selected !== nextProps.selected && nextProps.selected) {\n      this.props.relate.refresh(nextProps);\n    }\n  }\n\n  render () {\n    const {mediaItem, selected} = this.props;\n    return (\n      <Selected\n        mediaItem={mediaItem}\n        selected={selected}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/selected/selected.jsx",
    "content": "import moment from 'moment';\nimport Component from 'components/component';\nimport MediaItemPreview from 'components/media-item-preview';\nimport React, {PropTypes} from 'react';\nimport {mergeFragments} from 'relate-js';\n\nimport styles from './selected.less';\n\nexport default class MediaSelectorSelected extends Component {\n  static fragments = mergeFragments({\n    mediaItem: {\n      _id: 1,\n      date: 1,\n      name: 1,\n      size: 1,\n      dimension: {\n        width: 1,\n        height: 1\n      }\n    }\n  }, MediaItemPreview.fragments);\n\n  static propTypes = {\n    selected: PropTypes.string,\n    mediaItem: PropTypes.object\n  };\n\n  render () {\n    const {mediaItem, selected} = this.props;\n    let result;\n    if (selected && mediaItem) {\n      const date = moment(mediaItem.date).format('Do MMMM YYYY');\n\n      result = (\n        <div className={styles.root}>\n          <div className={styles.wrapper}>\n            <div className={styles.imagePart}>\n              <MediaItemPreview mediaItem={mediaItem} width={100} height={100} />\n            </div>\n            <div className={styles.infoPart}>\n              <div className={styles.title}>\n                {mediaItem.name}\n              </div>\n              <div className={styles.underTitle}>\n                {date}\n              </div>\n              {mediaItem.dimension && mediaItem.dimension.width &&\n                <div className={styles.underTitle}>\n                  {`${mediaItem.dimension.width}x${mediaItem.dimension.height}`}\n                </div>\n              }\n              <div className={styles.underTitle}>\n                {mediaItem.size}\n              </div>\n            </div>\n          </div>\n        </div>\n      );\n    } else {\n      result = (\n        <div className={styles.root}>\n          <div className={styles.wrapper}>\n            <div className={styles.imagePart}>\n              <div className={styles.dummyImage}></div>\n            </div>\n            <div className={styles.infoPart}>\n              <div className={styles.underTitle}>\n                Nothing selected\n              </div>\n            </div>\n          </div>\n        </div>\n      );\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/selected/selected.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  position: absolute;\n  padding: 12px;\n  bottom: 52px;\n  left: 0;\n  right: 0;\n  height: 124px;\n  border-top: 1px solid @chromeBordersColor;\n}\n\n.wrapper {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n}\n\n.imagePart {\n  display: table-cell;\n  vertical-align: middle;\n  width: 100px;\n  height: 100px;\n}\n\n.dummyImage {\n  display: inline-block;\n  background-color: @chromeBordersColor;\n  width: 100px;\n  height: 100px;\n}\n\n.infoPart {\n  display: table-cell;\n  vertical-align: middle;\n  padding: 5px 10px;\n  padding-right: 0;\n}\n\n.title {\n  color: @chromeTextColor;\n  font-size: 11px;\n  margin-bottom: 5px;\n  word-break: break-word;\n}\n.underTitle {\n  font-size: 10px;\n  color: @chromeTextSubColor;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/sidebar.jsx",
    "content": "import Button from 'components/button';\nimport Component from 'components/component';\nimport Scrollable from 'components/scrollable';\nimport React, {PropTypes} from 'react';\n\nimport styles from './sidebar.less';\nimport Filters from './filters';\nimport Selected from './selected';\n\nexport default class MediaSelectorSidebar extends Component {\n  static propTypes = {\n    selected: PropTypes.string,\n    changeSort: PropTypes.func.isRequired,\n    changeOrder: PropTypes.func.isRequired,\n    changeType: PropTypes.func.isRequired,\n    sort: PropTypes.string.isRequired,\n    order: PropTypes.string.isRequired,\n    type: PropTypes.string.isRequired,\n    allowedType: PropTypes.string.isRequired\n  };\n\n  render () {\n    const {selected, changeSort, changeOrder, changeType, sort, order, type, allowedType} = this.props;\n    return (\n      <div>\n        <div className={styles.header}>Media Selector</div>\n        <Selected selected={selected} />\n        <Scrollable className={styles.filters}>\n          <div className={styles.wrapper}>\n            <Filters\n              changeSort={changeSort}\n              changeOrder={changeOrder}\n              changeType={changeType}\n              sort={sort}\n              order={order}\n              type={type}\n              allowedType={allowedType}\n            />\n          </div>\n        </Scrollable>\n        <div className={styles.done}>\n          <Button primary full>Done</Button>\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/sidebar.less",
    "content": "@import '~styles/colors.less';\n\n.header {\n  font-size: 16px;\n  padding: 0 10px;\n  line-height: 60px;\n  border-bottom: 1px solid @chromeBordersColor;\n  color: @chromeTextColor;\n  text-align: center;\n}\n\n.done {\n  position: absolute;\n  bottom: 0; left: 0; right: 0;\n  padding: 10px;\n  border-top: 1px solid @chromeBordersColor;\n}\n\n.filters {\n  position: absolute;\n  top: 61px;\n  bottom: 176px;\n  left: 0; right: 0;\n}\n\n.wrapper {\n  padding: 30px 20px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/top-bar.jsx",
    "content": "import Component from 'components/component';\nimport React from 'react';\n\nimport styles from './top-bar.less';\n\nexport default class MediaSelectorTopBar extends Component {\n  render () {\n    return (\n      <div className={styles.root}>\n        topbar\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/media-selector/top-bar.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  height: 61px;\n  border-bottom: 1px solid @adminBorders;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/menu-button/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {Link} from 'react-router';\n\nimport styles from './index.less';\n\nexport default class Menu extends Component {\n  static propTypes = {\n    link: PropTypes.string.isRequired,\n    label: PropTypes.string.isRequired,\n    icon: PropTypes.string.isRequired,\n    active: PropTypes.bool,\n    onActiveClick: PropTypes.func,\n    dark: PropTypes.bool,\n    children: PropTypes.node,\n    query: PropTypes.object\n  };\n\n  static defaultProps = {\n    active: false\n  };\n\n  getInitState () {\n    this.caretToggle = ::this.caretToggle;\n    return {\n      opened: true\n    };\n  }\n\n  caretToggle () {\n    this.setState({\n      opened: !this.state.opened\n    });\n  }\n\n  onClick (event) {\n    if (this.props.active && this.props.onActiveClick) {\n      event.preventDefault();\n      event.stopPropagation();\n      this.props.onActiveClick();\n    }\n  }\n\n  render () {\n    const {link, label, icon, active, dark, query} = this.props;\n    return (\n      <div>\n        <div className={styles.buttonHolder}>\n          <Link\n            to={link}\n            query={query}\n            className={cx(styles.button, active && styles.active, dark && styles.dark)}\n            onClick={::this.onClick}\n          >\n            <i className={icon}></i>\n            <span>{label}</span>\n          </Link>\n          {this.renderCaret()}\n        </div>\n        {this.renderChildren()}\n      </div>\n    );\n  }\n\n  renderChildren () {\n    const {children} = this.props;\n    if (children && this.state.opened) {\n      return (\n        <div>\n          {children}\n        </div>\n      );\n    }\n  }\n\n  renderCaret () {\n    const {children} = this.props;\n    if (children) {\n      const {opened} = this.state;\n      return (\n        <button className={styles.caret} onClick={this.caretToggle}>\n          <i\n            className={cx(\n              'nc-icon-outline',\n              opened ? 'arrows-1_small-triangle-up' : 'arrows-1_small-triangle-down'\n            )}\n          />\n        </button>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/menu-button/index.less",
    "content": "@import '~styles/colors.less';\n\n.button {\n  display: block;\n  height: 60px;\n\n  font-size: 14px;\n  color: @adminText;\n\n  :global {\n    i, span {\n      display: inline-block;\n      vertical-align: top;\n      line-height: 60px;\n    }\n    i {\n      width: 60px;\n      text-align: center;\n      font-size: 22px;\n      color: @primarySub;\n    }\n    span {\n      font-weight: 600;\n    }\n  }\n\n  &:hover {\n    background-color: @primaryBack;\n  }\n}\n\n.dark {\n  :global i {\n    color: @adminText;\n  }\n}\n\n.buttonHolder {\n  position: relative;\n}\n\n.caret {\n  position: absolute;\n  right: 0;\n  top: 0;\n  height: 60px;\n  width: 60px;\n  text-align: center;\n  display: inline-block;\n\n  :global i {\n    color: @adminText;\n    font-size: 22px;\n    line-height: 60px;\n  }\n\n  &:hover {\n    :global i {\n      color: @adminTextHighlight;\n    }\n  }\n}\n\n.active {\n  background-color: @primary;\n\n  :global {\n    i, span {\n      color: #ffffff;\n    }\n  }\n\n  .caret {\n    :global {\n      color: #ffffff;\n    }\n  }\n\n  &:hover {\n    background-color: @primary;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/menu-sub-button/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {Link} from 'react-router';\n\nimport styles from './index.less';\n\nexport default class MenuSubButton extends Component {\n  static propTypes = {\n    link: PropTypes.string.isRequired,\n    label: PropTypes.string.isRequired,\n    active: PropTypes.bool,\n    query: PropTypes.object\n  };\n\n  static defaultProps = {\n    active: false\n  };\n\n  render () {\n    const {link, label, active, query} = this.props;\n    return (\n      <Link\n        to={link}\n        query={query}\n        className={cx(styles.button, active && styles.active)}\n      >\n        {label}\n      </Link>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/menu-sub-button/index.less",
    "content": "@import '~styles/colors.less';\n\n.button {\n  line-height: 30px;\n  padding: 0 60px;\n  padding-right: 20px;\n  background-color: #F8F8F8;\n  color: @adminText;\n  display: block;\n  text-decoration: none;\n  font-size: 12px;\n\n  &:hover {\n    background-color: @primaryBack;\n  }\n}\n\n.active {\n  color: @primary;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/modal/index.jsx",
    "content": "import cx from 'classnames';\nimport Animate from 'components/animate';\nimport Component from 'components/component';\nimport Portal from 'components/portal';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class Modal extends Component {\n  static propTypes = {\n    children: PropTypes.node.isRequired,\n    onClose: PropTypes.func,\n    subTitle: PropTypes.string,\n    title: PropTypes.string,\n    small: PropTypes.bool,\n    big: PropTypes.bool\n  };\n\n  componentDidMount () {\n    const {onClose} = this.props;\n    if (onClose) {\n      this.keyDownBind = ::this.keyDown;\n      document.addEventListener('keydown', this.keyDownBind);\n    }\n  }\n\n  componentWillUnmount () {\n    this.keyDownBind && document.removeEventListener('keydown', this.keyDownBind);\n  }\n\n  keyDown (evt) {\n    const event = evt || window.event;\n\n    // Check if escape key pressed (code: 27)\n    if (event.keyCode === 27) {\n      this.props.onClose();\n    }\n  }\n\n  onClose () {\n    const {onClose} = this.props;\n    onClose && onClose();\n  }\n\n  render () {\n    const {children, small, big} = this.props;\n\n    return (\n      <Portal>\n        <div className={styles.root}>\n          <Animate transition='fadeIn'>\n            <div className={styles.background} onClick={::this.onClose}></div>\n          </Animate>\n          <Animate transition='slideUpIn'>\n            <div className={styles.wrapper}>\n              <div className={cx(styles.content, small && styles.small, big && styles.big)}>\n                {this.renderTitles()}\n                {children}\n              </div>\n            </div>\n          </Animate>\n        </div>\n      </Portal>\n    );\n  }\n\n  renderTitles () {\n    const {title, subTitle} = this.props;\n    if (title || subTitle) {\n      return (\n        <div className={styles.titles}>\n          {subTitle && <div className={styles.subTitle}>{subTitle}</div>}\n          {title && <div className={styles.title}>{title}</div>}\n        </div>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/modal/index.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  position: fixed;\n  top: 0; bottom: 0;\n  left: 0; right: 0;\n  z-index: 10;\n}\n\n.background {\n  position: absolute;\n  background-color: rgba(0, 0, 0, 0.6);\n  top: 0; bottom: 0;\n  left: 0; right: 0;\n}\n\n.wrapper {\n  position: absolute;\n  top: 0; bottom: 0;\n  left: 0; right: 0;\n  pointer-events: none;\n}\n\n.content {\n  pointer-events: all;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  background-color: #ffffff;\n\n  width: 725px;\n  max-width: 90%;\n  border-radius: 4px;\n  overflow: hidden;\n\n  &.small {\n    width: 430px;\n  }\n  &.big {\n    width: 90%;\n    height: 80%;\n  }\n}\n\n.titles {\n  padding: 20px 20px;\n}\n\n.subTitle {\n  font-size: 12px;\n  color: @adminText;\n  text-align: center;\n  text-transform: uppercase;\n  line-height: 18px;\n  margin-bottom: 5px;\n}\n\n.title {\n  font-size: 26px;\n  color: @adminText;\n  text-align: center;\n  line-height: 34px;\n  font-weight: 300;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/modal-delete/index.jsx",
    "content": "import Animate from 'components/animate';\nimport Button from 'components/button';\nimport Component from 'components/component';\nimport Spinner from 'components/spinner';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\nimport Modal from '../modal';\n\nexport default class ModalDelete extends Component {\n  static propTypes = {\n    submit: PropTypes.func.isRequired,\n    cancel: PropTypes.func.isRequired,\n    loading: PropTypes.bool,\n    children: PropTypes.node.isRequired,\n    cancelLabel: PropTypes.string,\n    deleteLabel: PropTypes.string,\n    title: PropTypes.string,\n    subTitle: PropTypes.string\n  };\n\n  static defaultProps = {\n    cancelLabel: 'Cancel',\n    deleteLabel: 'Delete',\n    title: 'Are you sure?',\n    subTitle: 'You won\\'t be able to reverse it'\n  };\n\n  onSubmit (event) {\n    event.preventDefault();\n    this.props.submit();\n  }\n\n  render () {\n    const {cancel, title, subTitle} = this.props;\n    return (\n      <Modal onClose={cancel} title={title} subTitle={subTitle} small>\n        <div className={styles.state}>\n          {this.renderLoading()}\n          {this.renderCreateButton()}\n        </div>\n      </Modal>\n    );\n  }\n\n  renderLoading () {\n    const {loading} = this.props;\n\n    return (\n      <div className={styles.button}>\n        <Animate\n          initial={false}\n          transition={loading ? 'slideRightIn' : 'slideRightOut'}\n          options={{display: loading ? 'inline-block' : 'none'}}\n        >\n          <div className={styles.out}>\n            <Spinner />\n          </div>\n        </Animate>\n      </div>\n    );\n  }\n\n  renderCreateButton () {\n    const {loading, cancelLabel, deleteLabel, cancel, submit} = this.props;\n\n    return (\n      <div className={styles.button}>\n        <Animate\n          initial={false}\n          transition={loading ? 'slideLeftOut' : 'slideLeftIn'}\n          options={{display: loading ? 'none' : 'inline-block'}}\n        >\n          <div>\n            <Button noBackground grey onClick={cancel}>{cancelLabel}</Button>\n            <Button noBackground alert onClick={submit}>{deleteLabel}</Button>\n          </div>\n        </Animate>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/modal-delete/index.less",
    "content": ".button {\n  position: absolute;\n  top: 50%; left: 50%;\n  transform: translate(-50%, -50%);\n}\n\n.state {\n  position: relative;\n  margin-top: 15px;\n  margin-bottom: 30px;\n  height: 30px;\n}\n\n.out {\n  display: none;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/modal-input/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nimport styles from './index.less';\n\nexport default class ModalInput extends Component {\n  static propTypes = {\n    invalid: PropTypes.bool,\n    value: PropTypes.string.isRequired,\n    onChange: PropTypes.func.isRequired,\n    placeholder: PropTypes.string,\n    focus: PropTypes.bool,\n    type: PropTypes.string\n  };\n\n  static defaultProps = {\n    type: 'text'\n  };\n\n  componentDidMount () {\n    if (this.props.focus) {\n      findDOMNode(this).focus();\n    }\n  }\n\n  onChange (event) {\n    this.props.onChange(event.target.value);\n  }\n\n  render () {\n    const {placeholder, value, invalid, type} = this.props;\n    return (\n      <input\n        type={type}\n        className={cx(styles.input, invalid === true && styles.invalid, invalid === false && styles.valid)}\n        value={value}\n        placeholder={placeholder}\n        onChange={::this.onChange}\n      />\n  );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/modal-input/index.less",
    "content": "@import '~styles/colors.less';\n\n.input {\n  display: block;\n  width: 100%;\n  border: 0;\n  outline: 0;\n  padding: 0 3px;\n  border-bottom: 1px solid @adminBordersInputs;\n  color: @adminText;\n  font-size: 16px;\n  line-height: 35px;\n  margin-bottom: 20px;\n\n  &::-webkit-input-placeholder {\n    color: @adminTextSub;\n  }\n  &:-moz-placeholder {\n    color: @adminTextSub;\n  }\n  &::-moz-placeholder {\n    color: @adminTextSub;\n  }\n  &:-ms-input-placeholder {\n    color: @adminTextSub;\n  }\n  &::-ms-input-placeholder {\n    color: @adminTextSub;\n  }\n  &:placeholder-shown {\n    color: @adminTextSub;\n  }\n\n  &:focus {\n    border-color: @primary;\n  }\n}\n\n.invalid {\n  border-color: @alert;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/modal-new/index.jsx",
    "content": "import Animate from 'components/animate';\nimport Button from 'components/button';\nimport Component from 'components/component';\nimport Spinner from 'components/spinner';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class ModalNew extends Component {\n  static propTypes = {\n    submit: PropTypes.func.isRequired,\n    loading: PropTypes.bool,\n    children: PropTypes.node.isRequired,\n    submitLabel: PropTypes.string\n  };\n\n  static defaultProps = {\n    submitLabel: 'Create'\n  };\n\n  onSubmit (event) {\n    event.preventDefault();\n    this.props.submit();\n  }\n\n  render () {\n    return (\n      <div className={styles.root}>\n        <form onSubmit={::this.onSubmit}>\n          {this.props.children}\n          <div className={styles.state}>\n            {this.renderLoading()}\n            {this.renderCreateButton()}\n          </div>\n          <input type='submit' hidden />\n        </form>\n      </div>\n    );\n  }\n\n  renderLoading () {\n    const {loading} = this.props;\n\n    return (\n      <div className={styles.button}>\n        <Animate\n          initial={false}\n          transition={loading ? 'slideRightIn' : 'slideRightOut'}\n          options={{display: loading ? 'inline-block' : 'none'}}\n        >\n          <div className={styles.out}>\n            <Spinner />\n          </div>\n        </Animate>\n      </div>\n    );\n  }\n\n  renderCreateButton () {\n    const {loading, submitLabel} = this.props;\n\n    return (\n      <div className={styles.button}>\n        <Animate\n          initial={false}\n          transition={loading ? 'slideLeftOut' : 'slideLeftIn'}\n          options={{display: loading ? 'none' : 'inline-block'}}\n        >\n          <Button noBackground primary>{submitLabel}</Button>\n        </Animate>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/modal-new/index.less",
    "content": ".root {\n  text-align: center;\n  padding: 45px;\n  padding-bottom: 40px;\n}\n\n.button {\n  position: absolute;\n  top: 50%; left: 50%;\n  transform: translate(-50%, -50%);\n}\n\n.state {\n  position: relative;\n  margin-top: 30px;\n  height: 30px;\n}\n\n.out {\n  display: none;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/options-list/index.jsx",
    "content": "import cx from 'classnames';\nimport merge from 'lodash.merge';\nimport warning from 'warning';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {TypesOptionsMap, TypesOptionsDefaultProps} from 'helpers/input-options-map';\n\nimport styles from './index.less';\n\nexport default class OptionsList extends Component {\n  static propTypes = {\n    options: PropTypes.array.isRequired,\n    values: PropTypes.object.isRequired,\n    onChange: PropTypes.func.isRequired,\n    passToOptions: PropTypes.object,\n    white: PropTypes.bool,\n    tight: PropTypes.bool\n  };\n\n  static defaultProps = {\n    passToOptions: {}\n  };\n\n  onChange (id, value) {\n    this.props.onChange(id, value);\n  }\n\n  render () {\n    return this.renderOptions(this.props.options);\n  }\n\n  renderOptions (options) {\n    return (\n      <div className={styles.group}>\n        {options.map(this.renderOption, this)}\n      </div>\n    );\n  }\n\n  renderColumn (option, index) {\n    return (\n      <div className={styles.column} key={index}>\n        {this.renderOption(option)}\n      </div>\n    );\n  }\n\n  renderOption (option, index) {\n    let result;\n\n    if (option.type === 'Columns') {\n      result = (\n        <div className={styles.columns} key={index}>\n          {option.options.map(this.renderColumn, this)}\n        </div>\n      );\n    } else if (TypesOptionsMap[option.type]) {\n      const Option = TypesOptionsMap[option.type];\n      const value = this.props.values[option.id];\n      const extraProps = merge({}, TypesOptionsDefaultProps[option.type] || {});\n      merge(extraProps, option.props || {});\n\n      let unlockedContent = null;\n      if (option.unlocks && value !== '') {\n        if (option.type === 'Optional') {\n          if (value && option.unlocks.length > 1) {\n            unlockedContent = this.renderOptions(option.unlocks);\n          } else if (value && option.unlocks.length === 1) {\n            unlockedContent = (\n              <div>{this.renderOptions(option.unlocks)}</div>\n            );\n          }\n          extraProps.label = option.label;\n        } else if (option.type === 'Section') {\n          if (value) {\n            unlockedContent = <div className={styles.section}>{this.renderOptions(option.unlocks)}</div>;\n          }\n          extraProps.label = option.label;\n        } else if (option.unlocks.constructor === Array) {\n          unlockedContent = this.renderOptions(option.unlocks);\n        } else if (option.unlocks[value]) {\n          unlockedContent = this.renderOptions(option.unlocks[value]);\n        }\n      }\n\n      const onChange = this.onChange.bind(this, option.id);\n      if (option.type === 'Section') {\n        result = (\n          <div key={option.id}>\n            <Option\n              onChange={onChange}\n              value={value}\n              {...extraProps}\n              OptionsList={OptionsList}\n            />\n            {unlockedContent}\n          </div>\n        );\n      } else {\n        result = (\n          <div className={cx(styles.option, this.props.tight && styles.tight)} key={option.id}>\n            {this.renderLabel(option.type !== 'Optional' && option.label)}\n            <Option\n              white={this.props.white}\n              onChange={onChange}\n              value={value}\n              {...extraProps}\n              OptionsList={OptionsList}\n              {...this.props.passToOptions}\n            />\n            {unlockedContent}\n          </div>\n        );\n      }\n    } else {\n      warning(false, 'Element option type not valid');\n    }\n    return result;\n  }\n\n  renderLabel (label) {\n    if (label) {\n      const {white} = this.props;\n      return (\n        <div className={cx(styles.label, white && styles.white)}>{label}</div>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/options-list/index.less",
    "content": "@import '~styles/colors.less';\n\n.option {\n  margin-bottom: 30px;\n\n  &.tight {\n    margin-bottom: 15px;\n  }\n}\n\n.option>.group {\n  margin-top: 20px;\n  padding-left: 10px;\n}\n\n.label {\n  text-transform: uppercase;\n  font-size: 10px;\n  color: @chromeTextColor;\n  line-height: 16px;\n  margin-bottom: 8px;\n  padding: 0 3px;\n\n  &.white {\n    color: @adminText;\n  }\n\n  :global {\n    i, span {\n      display: inline-block;\n      vertical-align: top;\n      line-height: 16px;\n    }\n    i {\n      margin-right: 7px;\n      font-size: 12px;\n    }\n  }\n}\n\n.columns {\n  display: table;\n  table-layout: fixed;\n  width: 100%;\n\n  &:last-child {\n    .option {\n      margin-bottom: 0;\n    }\n  }\n}\n\n.column {\n  display: table-cell;\n  vertical-align: top;\n\n  &:first-child {\n    padding-right: 10px;\n  }\n\n  &:last-child {\n    padding-left: 10px;\n  }\n}\n\n.section {\n  margin: 20px 0;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/options-menu/index.jsx",
    "content": "import Component from 'components/component';\nimport React from 'react';\n\nexport default class OptionsMenu extends Component {\n  static propTypes = {\n    options: React.PropTypes.array.isRequired,\n    style: React.PropTypes.object\n  };\n\n  render () {\n    return (\n      <div className='options-menu' style={this.props.style}>\n        {this.props.options.map(this.renderOption, this)}\n      </div>\n    );\n  }\n\n  renderOption (option, key) {\n    return (\n      <button onClick={option.action || 'return false;'} key={key}>\n        {option.icon && <i className={option.icon}></i>}\n        {option.label}\n      </button>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/canvas/canvas.jsx",
    "content": "import displays from 'helpers/displays';\nimport forEach from 'lodash.foreach';\nimport getElementProps from 'helpers/get-element-props';\nimport stylesManager from 'helpers/styles-manager';\nimport utils from 'helpers/utils';\nimport Component from 'components/component';\nimport Droppable from 'components/dnd/droppable';\nimport Symbol from 'elements/symbol';\nimport React, {PropTypes} from 'react';\nimport {Component as Jss} from 'relax-jss';\n\nimport classes from './canvas.less';\nimport Empty from './empty';\n\nexport default class Canvas extends Component {\n  static propTypes = {\n    pageBuilderActions: PropTypes.object.isRequired,\n    display: PropTypes.string.isRequired,\n    styles: PropTypes.array.isRequired,\n    symbols: PropTypes.object.isRequired,\n    dragging: PropTypes.bool.isRequired,\n    pageData: PropTypes.object.isRequired,\n    elements: PropTypes.object.isRequired,\n    selectedId: PropTypes.string,\n    editing: PropTypes.bool.isRequired\n  };\n\n  static contextTypes = {\n    store: PropTypes.object.isRequired\n  };\n\n  static childContextTypes = {\n    dropHighlight: PropTypes.string.isRequired\n  };\n\n  getInitState () {\n    this.renderElementBind = ::this.renderElement;\n    this.renderChildrenBind = ::this.renderChildren;\n    return {};\n  }\n\n  getChildContext () {\n    const {dragging} = this.props;\n    return {\n      dropHighlight: dragging ? 'vertical' : 'none'\n    };\n  }\n\n  componentDidMount () {\n    this.refs.canvas.addEventListener('scroll', this.onScroll.bind(this));\n  }\n\n  onScroll () {\n    window.dispatchEvent(new Event('scroll'));\n  }\n\n  render () {\n    const {pageData, display} = this.props;\n    const dropInfo = {\n      id: 'body',\n      type: 'body'\n    };\n    const bodyStyle = {\n      margin: '0 auto',\n      maxWidth: displays[display]\n    };\n\n    // Process schema links if any\n    const elementsLinks = {};\n    const elements = pageData && pageData.body && this.renderChildren(pageData.body.children, {elementsLinks});\n\n    return (\n      <div className={classes.canvas} ref='canvas'>\n        <div className={classes.content} style={bodyStyle} ref='body'>\n          <Droppable\n            type='body'\n            placeholder\n            placeholderRender={::this.renderPlaceholder}\n            dropInfo={dropInfo}\n            accepts='Section'\n            minHeight='100%'\n          >\n            {elements}\n          </Droppable>\n        </div>\n        {this.renderStyles()}\n      </div>\n    );\n  }\n\n  renderPlaceholder () {\n    const {pageBuilderActions} = this.props;\n    return (\n      <Empty pageBuilderActions={pageBuilderActions} />\n    );\n  }\n\n  renderStyles () {\n    const styleTags = [];\n    forEach(stylesManager.stylesMap, (styleMap, key) => {\n      styleTags.push(\n        <Jss stylesheet={styleMap.stylesheet} key={key} />\n      );\n    });\n    return styleTags;\n  }\n\n  renderChildren (children, options) {\n    let result;\n    if (children instanceof Array) {\n      result = children.map(this.renderElement.bind(this, options));\n    } else {\n      result = children;\n    }\n    return result;\n  }\n\n  renderElement (options, elementId, positionInParent) {\n    const {display, editing, pageData, elements, selectedId, styles} = this.props;\n    let element = options.customData && options.customData[elementId] || pageData[elementId];\n\n    const elementProps = getElementProps(element, display);\n\n    if (options.schemaEntry && options.elementsLinks && options.elementsLinks[element.id]) {\n      element = utils.alterSchemaElementProps(\n        options.elementsLinks[element.id],\n        element,\n        options.schemaEntry,\n        elementProps\n      );\n    }\n\n    const styleClassMap = stylesManager.processElement(\n      element,\n      elementProps,\n      elements[element.tag],\n      styles,\n      elements,\n      display\n    );\n\n    if ((!element.hide || !element.hide[display]) && element.display !== false) {\n      const FactoredElement = element.tag === 'Symbol' ? Symbol : elements[element.tag];\n      const selected = selectedId === element.id;\n      let children = element.children && this.renderChildren(element.children, options);\n\n      if (element.tag === 'Symbol') {\n        const symbol = this.props.symbols[element.props.symbolId];\n        children = symbol && symbol.data && this.renderElement({customData: symbol.data}, 'base', 0);\n      }\n\n      return (\n        <FactoredElement\n          {...elementProps}\n          styleClassMap={styleClassMap}\n          key={elementId}\n          relax={{\n            editing,\n            display,\n            selected,\n            element,\n            positionInParent,\n            renderElement: this.renderElementBind,\n            renderChildren: this.renderChildrenBind,\n            insideSymbol: options.customData && true,\n            dispatch: this.context.store.dispatch\n          }}\n        >\n          {children}\n        </FactoredElement>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/canvas/canvas.less",
    "content": ".canvas {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  overflow-y: auto;\n  overflow-x: hidden;\n}\n\n.content {\n  box-shadow: 0 0 8px 4px fade(#000000, 20);\n  position: relative;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/canvas/empty.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './empty.less';\n\nexport default class Empty extends Component {\n  static propTypes = {\n    pageBuilderActions: PropTypes.object.isRequired\n  };\n\n  onClick () {\n    const {pageBuilderActions} = this.props;\n    pageBuilderActions.addElementAt({tag: 'Section'}, {id: 'body', position: 0});\n  }\n\n  render () {\n    return (\n      <div className={styles.root}>\n        <div className={styles.wrapper}>\n          <div className={styles.title}>Let's get you started</div>\n          <div className={styles.subTitle}>Click the blue dot below to add your first section</div>\n          <button className={styles.button} onClick={::this.onClick}>\n            <i className='nc-icon-mini ui-1_simple-add'></i>\n          </button>\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/canvas/empty.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n}\n\n.wrapper {\n  position: absolute;\n  top: 30%;\n  left: 0;\n  right: 0;\n  text-align: center;\n}\n\n.title {\n  font-weight: 300;\n  font-size: 26px;\n  line-height: 36px;\n  color: @adminText;\n}\n\n.subTitle {\n  font-weight: 300;\n  font-size: 16px;\n  line-height: 34px;\n  color: @primary;\n}\n\n.button {\n  display: inline-block;\n  vertical-align: top;\n  width: 40px;\n  height: 40px;\n  border-radius: 50%;\n  background-color: @primary;\n  position: relative;\n  text-align: center;\n  margin-top: 15px;\n  transform: scale(0.5);\n  transition: all 0.2s ease-out;\n\n  :global i {\n    font-size: 14px;\n    color: #ffffff;\n    line-height: 40px;\n    opacity: 0;\n    transition: all 0.2s ease-out;\n  }\n\n  &:hover {\n    transform: scale(1);\n\n    :global i {\n      opacity: 1;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/canvas/index.js",
    "content": "import * as pageBuilderActions from 'actions/page-builder';\n\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {updateColors} from 'helpers/colors';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport Canvas from './canvas.jsx';\n\n@dataConnect(\n  (state) => ({\n    dragging: state.dnd.dragging,\n    display: state.display,\n    symbols: state.symbols,\n    elements: state.pageBuilder.elements,\n    pageData: state.pageBuilder.data,\n    selectedId: state.pageBuilder.selectedId,\n    editing: state.pageBuilder.editing,\n    stylesData: state.styles.data\n  }),\n  (dispatch) => ({\n    pageBuilderActions: bindActionCreators(pageBuilderActions, dispatch)\n  }),\n  () => ({\n    fragments: {\n      colors: {\n        _id: 1,\n        label: 1,\n        value: 1\n      },\n      styles: {\n        _id: 1,\n        title: 1,\n        type: 1,\n        options: 1\n      }\n    }\n  })\n)\nexport default class CanvasContainer extends Component {\n  static propTypes = {\n    pageBuilderActions: PropTypes.object.isRequired,\n    display: PropTypes.string.isRequired,\n    stylesData: PropTypes.array.isRequired,\n    symbols: PropTypes.object.isRequired,\n    dragging: PropTypes.bool.isRequired,\n    pageData: PropTypes.object.isRequired,\n    elements: PropTypes.object.isRequired,\n    selectedId: PropTypes.string,\n    editing: PropTypes.bool.isRequired,\n    colors: PropTypes.array.isRequired\n  };\n\n  getInitState () {\n    updateColors(this.props.colors);\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (this.props.colors !== nextProps.colors) {\n      updateColors(nextProps.colors);\n    }\n  }\n\n  render () {\n    const {\n      dragging,\n      display,\n      symbols,\n      elements,\n      pageData,\n      selectedId,\n      editing,\n      stylesData\n    } = this.props;\n\n    return (\n      <Canvas\n        dragging={dragging}\n        display={display}\n        symbols={symbols}\n        elements={elements}\n        pageData={pageData}\n        selectedId={selectedId}\n        editing={editing}\n        styles={stylesData}\n        pageBuilderActions={this.props.pageBuilderActions}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/elements-menu/autocomplete.jsx",
    "content": "import Component from 'components/component';\nimport React from 'react';\n\nimport styles from './autocomplete.less';\n\nexport default class Autocomplete extends Component {\n  static propTypes = {\n    autoFocus: React.PropTypes.bool,\n    value: React.PropTypes.string.isRequired,\n    onChange: React.PropTypes.func.isRequired,\n    suggestion: React.PropTypes.string\n  };\n\n  static defaultProps = {\n    autoFocus: true\n  };\n\n  componentDidMount () {\n    if (this.props.autoFocus) {\n      this.focus();\n    }\n  }\n\n  onInput () {\n    const str = this.refs.editable.innerText;\n    this.props.onChange(str);\n  }\n\n  focus () {\n    const el = this.refs.editable;\n    el.focus();\n    if (typeof window.getSelection !== 'undefined' && typeof document.createRange !== 'undefined') {\n      const range = document.createRange();\n      range.selectNodeContents(el);\n      range.collapse(false);\n      const sel = window.getSelection();\n      sel.removeAllRanges();\n      sel.addRange(range);\n    } else if (typeof document.body.createTextRange !== 'undefined') {\n      const range = document.body.createTextRange();\n      range.moveToElementText(el);\n      range.collapse(false);\n      range.select();\n    }\n  }\n\n  render () {\n    let before = '';\n    let after = '';\n    if (this.props.suggestion) {\n      const index = this.props.suggestion.toLowerCase().indexOf(this.props.value.toLowerCase());\n      before = index > 0 && this.props.suggestion.slice(0, index);\n      after = this.props.suggestion.slice(index + this.props.value.length);\n    }\n\n    return (\n      <div className={styles.autocomplete}>\n        <span onClick={::this.focus}>{before}</span>\n        <span\n          ref='editable'\n          className={styles.editable}\n          onInput={::this.onInput}\n          contentEditable\n        >\n          {this.props.value}\n        </span>\n        <span onClick={::this.focus}>{after}</span>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/elements-menu/autocomplete.less",
    "content": ".autocomplete {\n  border: 0;\n  background-color: #000000;\n  border-radius: 0;\n  padding: 0 12px;\n  height: 40px;\n\n  :global span {\n    line-height: 40px;\n    color: #999999;\n    font-size: 20px;\n    border: 0;\n    outline: 0;\n  }\n}\n\n.editable {\n  color: #efefef;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/elements-menu/elements-menu.jsx",
    "content": "import cx from 'classnames';\nimport forEach from 'lodash.foreach';\nimport Animate from 'components/animate';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {findDOMNode} from 'react-dom';\n\nimport styles from './elements-menu.less';\nimport List from './list';\nimport Search from './search';\n\nexport default class ElementsMenu extends Component {\n  static fragments = {\n    symbols: {\n      _id: 1,\n      title: 1\n    }\n  };\n\n  static propTypes = {\n    symbols: PropTypes.object.isRequired,\n    pageBuilderActions: PropTypes.object.isRequired,\n    elementsMenuOptions: PropTypes.object.isRequired,\n    elements: PropTypes.object.isRequired,\n    categories: PropTypes.object.isRequired\n  };\n\n  getInitState () {\n    return {\n      top: 0,\n      left: 0,\n      contentTop: 0,\n      side: 'right',\n      angleTriangle: false,\n      searchOpened: false,\n      search: '',\n      suggestions: [],\n      suggestion: false\n    };\n  }\n\n  componentDidMount () {\n    this.onCloseBind = ::this.onClose;\n    this.updatePositionBind = ::this.updatePosition;\n    this.stopPropagationBind = ::this.stopPropagation;\n    this.keyDownBind = ::this.focusSearch;\n\n    findDOMNode(this).addEventListener('click', this.stopPropagationBind);\n    document.addEventListener('keydown', this.keyDownBind);\n    document.addEventListener('click', this.onCloseBind);\n    window.addEventListener('scroll', this.updatePositionBind);\n    window.addEventListener('resize', this.updatePositionBind);\n    this.updatePosition();\n  }\n\n  componentWillUnmount () {\n    findDOMNode(this).removeEventListener('click', this.stopPropagationBind);\n    document.removeEventListener('keydown', this.keyDownBind);\n    document.removeEventListener('click', this.onCloseBind);\n    window.removeEventListener('scroll', this.updatePositionBind);\n    window.removeEventListener('resize', this.updatePositionBind);\n  }\n\n  focusSearch () {\n    if (!this.state.searchOpened) {\n      document.removeEventListener('keydown', this.keyDownBind);\n      this.setState({\n        searchOpened: true\n      });\n    }\n  }\n\n  onSearchChange (search) {\n    if (search) {\n      const {elements, categories} = this.props;\n      const suggestions = [];\n      const searchLowered = search.toLowerCase();\n      let suggestion = false;\n      let suggestionweight = categories.length + 2;\n\n      forEach(elements, (element, name) => {\n        if (this.elementAcceptable(name, element) && name.toLowerCase().indexOf(searchLowered) !== -1) {\n          let weight = categories.length;\n          forEach(categories, (category, ind) => {\n            if (category === (element.settings && element.settings.category)) {\n              weight = ind;\n            }\n          });\n          if (weight < suggestionweight) {\n            suggestion = name;\n            suggestionweight = weight;\n          }\n          suggestions.push(name);\n        }\n      });\n\n      forEach(this.props.symbols, (symbol) => {\n        if (symbol.title.toLowerCase().indexOf(searchLowered) !== -1) {\n          const weight = categories.length + 1;\n          if (weight < suggestionweight) {\n            suggestion = {\n              type: 'symbol',\n              id: symbol._id,\n              title: symbol.title\n            };\n            suggestionweight = weight;\n          }\n          suggestions.push({\n            type: 'symbol',\n            id: symbol._id\n          });\n        }\n      });\n\n      this.setState({\n        searchOpened: true,\n        search,\n        suggestions,\n        suggestion\n      });\n    } else {\n      this.state.searchOpened && document.addEventListener('keydown', this.keyDownBind);\n      this.setState({\n        searchOpened: false,\n        search\n      });\n    }\n  }\n\n  toggleCategory (category) {\n    const {toggleCategory} = this.props.pageBuilderActions;\n    toggleCategory(category);\n  }\n\n  stopPropagation () {\n    this.clickedInside = true;\n  }\n\n  updatePosition (event = null, props = this.props) {\n    const containerRect = props.elementsMenuOptions.container.getBoundingClientRect();\n\n    const top = containerRect.top + containerRect.height / 2 - 105;\n    let left = containerRect.right + 10;\n    let side = 'right';\n    let angleTriangle = false;\n\n    // Constraints\n    let contentTop = 0;\n    const menuWidth = 280;\n    const menuHeight = 400;\n    const windowHeight = window.innerHeight;\n    const windowWidth = window.innerWidth;\n\n    if (top + menuHeight > windowHeight) {\n      contentTop = windowHeight - (top + menuHeight);\n\n      if (contentTop < -360) {\n        contentTop = -360;\n      }\n    }\n\n    if (top < 46) {\n      const dif = 46 - top;\n      contentTop = dif;\n      if (contentTop > 95) {\n        contentTop = 115;\n        angleTriangle = true;\n      }\n    }\n\n    if (left + menuWidth > windowWidth) {\n      side = 'left';\n      left = containerRect.right - 10 - menuWidth - containerRect.width;\n    }\n\n    this.setState({top, left, contentTop, side, angleTriangle});\n  }\n\n  onClose () {\n    if (!this.clickedInside) {\n      this.props.pageBuilderActions.closeElementsMenu();\n    }\n    this.clickedInside = false;\n  }\n\n  addElement (tag) {\n    const {elementsMenuOptions} = this.props;\n    this.props.pageBuilderActions.closeElementsMenu();\n    this.props.pageBuilderActions.addElementAt({tag}, {\n      id: elementsMenuOptions.targetId,\n      position: elementsMenuOptions.targetPosition\n    });\n  }\n\n  addSymbol (symbolId) {\n    const {elementsMenuOptions} = this.props;\n    this.props.pageBuilderActions.closeElementsMenu();\n    this.props.pageBuilderActions.addElementAt({\n      tag: 'Symbol',\n      props: {\n        symbolId\n      }\n    }, {\n      id: elementsMenuOptions.targetId,\n      position: elementsMenuOptions.targetPosition\n    });\n  }\n\n  elementAcceptable (elementTag, element) {\n    const {elementsMenuOptions} = this.props;\n    let is = true;\n\n    if (elementsMenuOptions.accepts) {\n      if (elementsMenuOptions.accepts !== 'any' && elementsMenuOptions.accepts !== elementTag) {\n        is = false;\n      }\n    } else if (elementsMenuOptions.rejects) {\n      if (elementsMenuOptions.rejects === 'any' || elementsMenuOptions.rejects === elementTag) {\n        is = false;\n      }\n    }\n\n    const droppableOn = element.settings.drag && element.settings.drag.droppableOn;\n    if (droppableOn) {\n      if (droppableOn !== 'any' && elementsMenuOptions.targetType !== droppableOn) {\n        is = false;\n      }\n    }\n\n    return is;\n  }\n\n  render () {\n    const style = {\n      top: this.state.top,\n      left: this.state.left\n    };\n    const ballonStyle = {\n      top: this.state.contentTop\n    };\n\n    return (\n      <Animate transition='slideLeftIn'>\n        <div\n          className={cx(styles.root, styles[this.state.side], this.state.angleTriangle && styles.angled)}\n          style={style}\n        >\n          <div className={styles.arrowLeft}></div>\n          <div className={styles.ballon} style={ballonStyle}>\n            {this.renderContent()}\n          </div>\n        </div>\n      </Animate>\n    );\n  }\n\n  renderContent () {\n    let result;\n    if (this.state.searchOpened) {\n      result = (\n        <Search\n          {...this.props}\n          suggestions={this.state.suggestions}\n          suggestion={this.state.suggestion}\n          search={this.state.search}\n          elementAcceptable={::this.elementAcceptable}\n          onSearchChange={::this.onSearchChange}\n          addElement={::this.addElement}\n          addSymbol={::this.addSymbol}\n        />\n      );\n    } else {\n      result = (\n        <List\n          {...this.props}\n          elementAcceptable={::this.elementAcceptable}\n          addElement={::this.addElement}\n          addSymbol={::this.addSymbol}\n          toggleCategory={::this.toggleCategory}\n        />\n      );\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/elements-menu/elements-menu.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  width: 280px;\n  height: 400px;\n  text-align: left;\n  text-decoration: none;\n  z-index: 4;\n  position: fixed;\n}\n\n.angled {\n  .arrowLeft {\n    border-top: 11px solid transparent;\n    border-bottom: 11px solid transparent;\n    border-right: 17px solid @chromeBordersColor;\n    transform: translate(5px, 10px) rotate(45deg);\n  }\n}\n\n.left {\n  .arrowLeft {\n    left: auto;\n    right: -8px;\n    border-left: 8px solid @chromeBordersColor;\n    border-right: 0;\n  }\n}\n\n.arrowLeft {\n  position: absolute;\n  top: 96px;\n  left: -10px;\n  width: 0;\n  height: 0;\n  border-top: 9px solid transparent;\n  border-bottom: 9px solid transparent;\n  border-right: 11px solid #2b2d31;\n  z-index: 1;\n}\n\n.ballon {\n  width: 100%;\n  height: 100%;\n  border: 1px solid @chromeBordersColor;\n  background-color: #2b2d31;\n  border-radius: 3px;\n  overflow: hidden;\n  position: relative;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/elements-menu/index.js",
    "content": "import * as pageBuilderActions from 'actions/page-builder';\n\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport ElementsMenu from './elements-menu';\n\n@dataConnect(\n  (state) => ({\n    symbols: state.symbols,\n    elementsMenuOptions: state.pageBuilder.elementsMenuOptions,\n    elements: state.pageBuilder.elements,\n    categories: state.pageBuilder.categories,\n    categoriesCollapsed: state.pageBuilder.categoriesCollapsed\n  }),\n  (dispatch) => ({\n    pageBuilderActions: bindActionCreators(pageBuilderActions, dispatch)\n  }),\n  () => ({\n    fragments: ElementsMenu.fragments\n  })\n)\nexport default class ElementsMenuContainer extends Component {\n  static propTypes = {\n    symbols: PropTypes.object.isRequired,\n    pageBuilderActions: PropTypes.object.isRequired\n  };\n\n  render () {\n    return <ElementsMenu {...this.props} />;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/elements-menu/list.jsx",
    "content": "import cx from 'classnames';\nimport forEach from 'lodash.foreach';\nimport Component from 'components/component';\nimport Scrollable from 'components/scrollable';\nimport React, {PropTypes} from 'react';\n\nimport styles from './list.less';\n\nexport default class List extends Component {\n  static propTypes = {\n    elementAcceptable: PropTypes.func.isRequired,\n    addElement: PropTypes.func.isRequired,\n    addSymbol: PropTypes.func.isRequired,\n    toggleCategory: PropTypes.func.isRequired,\n    symbols: PropTypes.object.isRequired,\n    categories: PropTypes.object.isRequired,\n    categoriesCollapsed: PropTypes.object.isRequired,\n    elements: PropTypes.object.isRequired\n  };\n\n  toggleCategory (category, event) {\n    event.preventDefault();\n    this.props.toggleCategory(category);\n  }\n\n  addElement (tag, event) {\n    event.preventDefault();\n    this.props.addElement(tag);\n  }\n\n  addSymbol (symbolId) {\n    this.props.addSymbol(symbolId);\n  }\n\n  render () {\n    const {categories} = this.props;\n    return (\n      <div className={styles.root}>\n        <Scrollable>\n          {categories.map(this.renderCategory, this)}\n          {this.renderSymbolsCategory()}\n        </Scrollable>\n      </div>\n    );\n  }\n\n  renderCategory (category) {\n    const {elements, categoriesCollapsed} = this.props;\n    const categoryElements = [];\n\n    forEach(elements, (element, index) => {\n      if (element.settings && element.settings.category) {\n        if (element.settings.category === category &&\n            this.props.elementAcceptable(index, element) &&\n            index !== 'Symbol') {\n          categoryElements.push({\n            label: index,\n            element\n          });\n        }\n      } else if (category === 'other' && this.props.elementAcceptable(index, element) && index !== 'Symbol') {\n        categoryElements.push({\n          label: index,\n          element\n        });\n      }\n    });\n\n    if (categoryElements.length > 0) {\n      const collapsedCategory = categoriesCollapsed[category];\n      const onClick = this.toggleCategory.bind(this, category);\n\n      return (\n        <div className={cx(styles.category, collapsedCategory && styles.collapsed)} key={category}>\n          <div className={styles.categoryInfo} onClick={onClick}>\n            <i className='nc-icon-mini arrows-1_small-triangle-down'></i>\n            <span>{category}</span>\n          </div>\n          <div>\n            {!collapsedCategory && categoryElements.map(this.renderElement, this)}\n          </div>\n        </div>\n      );\n    }\n  }\n\n  renderElement (elementObj) {\n    const element = elementObj.element;\n    const icon = element.settings.icon;\n    const label = elementObj.label;\n    const addElement = this.addElement.bind(this, label);\n\n    return (\n      <div className={styles.elementEntry} onClick={addElement} key={label}>\n        <i className={icon.class}>{icon.content}</i>\n        <span>{label}</span>\n      </div>\n    );\n  }\n\n  renderSymbolsCategory () {\n    if (Object.keys(this.props.symbols).length > 0) {\n      const {categoriesCollapsed} = this.props;\n      const collapsedCategory = categoriesCollapsed.symbols;\n\n      const symbols = [];\n      forEach(this.props.symbols, (symbol) => {\n        symbols.push(this.renderSymbol(symbol));\n      });\n      const onClick = this.toggleCategory.bind(this, 'symbols');\n\n      return (\n        <div className={cx(styles.category, collapsedCategory && styles.collapsed)} key='symbols'>\n          <div className={styles.categoryInfo} onClick={onClick}>\n            <i className='nc-icon-mini arrows-1_small-triangle-down'></i>\n            <span>Symbols</span>\n          </div>\n          <div>\n            {!collapsedCategory && symbols}\n          </div>\n        </div>\n      );\n    }\n  }\n\n  renderSymbol (symbol) {\n    const onClick = this.addSymbol.bind(this, symbol._id);\n    return (\n      <div className={styles.elementEntry} onClick={onClick} key={symbol._id}>\n        <i className='nc-icon-mini objects_puzzle-10'></i>\n        <span>{symbol.title}</span>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/elements-menu/list.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n}\n\n.category {\n  margin-top: -1px;\n}\n\n.collapsed {\n  .categoryInfo :global i {\n    transform: rotate(-90deg);\n  }\n}\n\n.categoryInfo {\n  background-color: @chromeBackgroundColor;\n  color: #efefef;\n  padding-right: 5px;\n  font-size: 10px;\n  text-transform: uppercase;\n  cursor: pointer;\n  line-height: 30px;\n  border-top: 1px solid @chromeBordersColor;\n  border-bottom: 1px solid @chromeBordersColor;\n\n  :global {\n    i, span {\n      vertical-align: top;\n      display: inline-block;\n    }\n    i {\n      color: #efefef;\n      line-height: 30px;\n      font-size: 14px;\n      width: 30px;\n      text-align: center;\n      transition: all 0.3s fade-out;\n    }\n  }\n\n  &:hover {\n    background-color: #3f4249;\n  }\n}\n\n.elementEntry {\n  height: 30px;\n  cursor: pointer;\n  padding-left: 25px;\n\n  :global {\n    i, span {\n      color: #efefef;\n      line-height: 30px;\n      display: inline-block;\n      vertical-align: top;\n    }\n\n    span {\n      font-size: 10px;\n      text-transform: uppercase;\n    }\n\n    i {\n      width: 35px;\n      font-size: 13px;\n      text-align: center;\n    }\n  }\n\n  &:hover, &.active {\n    background-color: #3f4249;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/elements-menu/search.jsx",
    "content": "import forEach from 'lodash.foreach';\nimport key from 'keymaster';\nimport Component from 'components/component';\nimport Scrollable from 'components/scrollable';\nimport React, {PropTypes} from 'react';\n\nimport styles from './search.less';\nimport Autocomplete from './autocomplete';\n\nexport default class Search extends Component {\n  static propTypes = {\n    elementAcceptable: PropTypes.func.isRequired,\n    addElement: PropTypes.func.isRequired,\n    addSymbol: PropTypes.func.isRequired,\n    onSearchChange: PropTypes.func.isRequired,\n    suggestions: PropTypes.array.isRequired,\n    suggestion: PropTypes.string.isRequired,\n    search: PropTypes.string.isRequired,\n    symbols: PropTypes.object.isRequired,\n    categories: PropTypes.object.isRequired,\n    elements: PropTypes.object.isRequired\n  };\n\n  componentDidMount () {\n    key('enter', 'suggestions', this.addElementHotkey.bind(this, 0));\n    for (let i = 1; i < 10; i++) {\n      key(`⌘+${i}, ctrl+${i}`, 'suggestions', this.addElementHotkey.bind(this, i));\n    }\n    key.setScope('suggestions');\n  }\n\n  componentWillUnmount () {\n    key.unbind('enter');\n    for (let i = 1; i < 10; i++) {\n      key.unbind(`⌘+${i}, ctrl+${i}`);\n    }\n    key.setScope('all');\n  }\n\n  addElementHotkey (num, event) {\n    event.preventDefault();\n    event.stopPropagation();\n    const {suggestions} = this.props;\n    const {categories, elements} = this.props;\n\n    let counter = 0;\n    let added = false;\n    forEach(categories, (category) => {\n      forEach(suggestions, (suggestion) => {\n        if (typeof suggestion === 'string') {\n          const element = elements[suggestion];\n          const elementCategory = element.settings && element.settings.category || 'other';\n          if (category === elementCategory) {\n            if (counter === num) {\n              this.props.addElement(suggestion);\n              added = true;\n            } else {\n              counter++;\n            }\n          }\n        }\n        if (added) {\n          return false;\n        }\n      });\n      if (added) {\n        return false;\n      }\n    });\n\n    if (!added) {\n      forEach(suggestions, (suggestion) => {\n        if (typeof suggestion !== 'string') {\n          if (counter === num) {\n            this.props.addSymbol(suggestion.id);\n            added = true;\n          } else {\n            counter++;\n          }\n        }\n        if (added) {\n          return false;\n        }\n      });\n    }\n  }\n\n  addElement (tag, event) {\n    event.preventDefault();\n    this.props.addElement(tag);\n  }\n\n  addSymbol (symbolId) {\n    this.props.addSymbol(symbolId);\n  }\n\n  render () {\n    this.suggestionsCounter = -1;\n\n    return (\n      <div>\n        <Autocomplete\n          value={this.props.search}\n          onChange={this.props.onSearchChange}\n          suggestion={this.props.suggestion.title || this.props.suggestion}\n          focused\n        />\n      <div className={styles.searchList}>\n          <Scrollable>\n            {this.renderContent()}\n          </Scrollable>\n        </div>\n      </div>\n    );\n  }\n\n  renderContent () {\n    let result;\n\n    if (this.props.suggestions.length > 0) {\n      const {categories} = this.props;\n      result = (\n        <div>\n          {categories.map(this.renderCategory, this)}\n          {this.renderSymbols()}\n        </div>\n      );\n    } else {\n      result = <div className={styles.noResults}>No results from your search</div>;\n    }\n\n    return result;\n  }\n\n  renderCategory (category) {\n    const {suggestions, elements} = this.props;\n    const categoryElements = [];\n\n    forEach(suggestions, (elementName) => {\n      if (typeof elementName === 'string') {\n        const element = elements[elementName];\n        if (element.settings && element.settings.category) {\n          if (element.settings.category === category) {\n            categoryElements.push({\n              label: elementName,\n              element\n            });\n          }\n        } else if (category === 'other') {\n          categoryElements.push({\n            label: elementName,\n            element\n          });\n        }\n      }\n    });\n\n    if (categoryElements.length > 0) {\n      return (\n        <div className={styles.suggestionCategory} key={category}>\n          <div className={styles.categoryInfo}>{category}</div>\n          <div>\n            {categoryElements.map(this.renderElement, this)}\n          </div>\n        </div>\n      );\n    }\n  }\n\n  renderElement (elementObj) {\n    const element = elementObj.element;\n    const icon = element.settings.icon;\n    const label = elementObj.label;\n\n    const index = label.toLowerCase().indexOf(this.props.search.toLowerCase());\n    const before = index > 0 && label.slice(0, index);\n    const searched = label.slice(index, index + this.props.search.length);\n    const after = label.slice(index + this.props.search.length);\n\n    this.suggestionsCounter++;\n\n    return (\n      <div className={styles.elementEntry} onClick={this.addElement.bind(this, label)} key={label}>\n        <i className={icon.class}>{icon.content}</i>\n        <span>{before}</span>\n        <span className={styles.searched}>{searched}</span>\n        <span>{after}</span>\n        {this.suggestionsCounter < 10 && <span className={styles.hotkey}>{this.suggestionsCounter === 0 ? 'enter' : ('cmd+' + this.suggestionsCounter)}</span>}\n      </div>\n    );\n  }\n\n  renderSymbols () {\n    const {suggestions} = this.props;\n    const symbolsSuggestions = [];\n\n    forEach(suggestions, (suggestion) => {\n      if (typeof suggestion !== 'string') {\n        symbolsSuggestions.push(this.renderSymbol(suggestion.id));\n      }\n    });\n\n    if (symbolsSuggestions.length > 0) {\n      return (\n        <div className={styles.suggestionCategory} key='symbols'>\n          <div className={styles.categoryInfo}>Symbols</div>\n          <div>\n            {symbolsSuggestions}\n          </div>\n        </div>\n      );\n    }\n  }\n\n  renderSymbol (id) {\n    const symbol = this.props.symbols[id];\n    const label = symbol.title;\n\n    const index = label.toLowerCase().indexOf(this.props.search.toLowerCase());\n    const before = index > 0 && label.slice(0, index);\n    const searched = label.slice(index, index + this.props.search.length);\n    const after = label.slice(index + this.props.search.length);\n\n    this.suggestionsCounter++;\n\n    return (\n      <div className={styles.elementEntry} onClick={this.addSymbol.bind(this, id)} key={id}>\n        <i className='nc-icon-mini objects_puzzle-10'></i>\n        <span>{before}</span>\n        <span className={styles.searched}>{searched}</span>\n        <span>{after}</span>\n        {this.suggestionsCounter < 10 && <span className={styles.hotkey}>{this.suggestionsCounter === 0 ? 'enter' : ('cmd+' + this.suggestionsCounter)}</span>}\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/elements-menu/search.less",
    "content": "@import '~styles/colors.less';\n\n.searchList {\n  position: absolute;\n  top: 40px;\n  bottom: 0;\n  left: 0;\n  right: 0;\n}\n\n.noResults {\n  padding: 30px 15px;\n  text-align: center;\n  font-size: 10px;\n  color: #efefef;\n}\n\n.suggestionCategory {\n  margin-top: 5px;\n}\n\n.categoryInfo {\n  color: #efefef;\n  font-size: 10px;\n  text-transform: uppercase;\n  padding: 12px;\n}\n\n.elementEntry {\n  padding: 0 18px;\n  cursor: pointer;\n\n  .searched {\n    color: @primary;\n    font-weight: 800;\n  }\n  .hotkey {\n    float: right;\n    color: #999999;\n    font-size: 8px;\n    text-transform: uppercase;\n  }\n\n  :global {\n    span, i {\n      display: inline-block;\n      vertical-align: top;\n      color: #efefef;\n      line-height: 30px;\n      font-size: 12px;\n    }\n    i {\n      font-size: 13px;\n      padding-right: 10px;\n    }\n  }\n\n  &:hover, &.active {\n    background-color: #3f4249;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/index.js",
    "content": "import * as pageBuilderActions from 'actions/page-builder';\n\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {bindActionCreators} from 'redux';\nimport {dataConnect} from 'relate-js';\n\nimport PageBuilder from './page-builder.jsx';\n\n@dataConnect(\n  (state) => ({\n    params: state.router.params,\n    elementsMenuOpened: state.pageBuilder.elementsMenuOpened,\n    dragging: state.dnd.dragging\n  }),\n  (dispatch) => ({\n    pageBuilderActions: bindActionCreators(pageBuilderActions, dispatch)\n  }),\n  (props) => ({\n    fragments: {\n      draft: {\n        _id: {\n          _id: 1,\n          _userId: 1\n        },\n        __v: 1,\n        data: 1,\n        actions: 1\n      }\n    },\n    variablesTypes: {\n      draft: {\n        id: 'ID!'\n      }\n    },\n    initialVariables: {\n      draft: {\n        id: props.params.id\n      }\n    }\n  })\n)\nexport default class PageBuilderContainer extends Component {\n  static propTypes = {\n    relate: PropTypes.object.isRequired,\n    params: PropTypes.object.isRequired\n  };\n\n  componentWillReceiveProps (nextProps) {\n    if (this.props.params.id !== nextProps.params.id) {\n      this.props.relate.setVariables({\n        draft: {\n          id: nextProps.params.id\n        }\n      });\n    }\n  }\n\n  render () {\n    return (\n      <PageBuilder {...this.props} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/page-builder.jsx",
    "content": "import cx from 'classnames';\nimport key from 'keymaster';\nimport stylesheet from 'helpers/stylesheet';\nimport Component from 'components/component';\nimport Dragger from 'components/dnd/dragger';\nimport Portal from 'components/portal';\nimport React, {PropTypes} from 'react';\nimport {Component as Jss} from 'relax-jss';\n\nimport styles from './page-builder.less';\nimport Canvas from './canvas';\nimport ElementsMenu from './elements-menu';\n\nexport default class PageBuilder extends Component {\n  static propTypes = {\n    dragging: PropTypes.bool.isRequired,\n    elementsMenuOpened: PropTypes.bool.isRequired,\n    pageBuilderActions: PropTypes.object.isRequired\n  };\n\n  componentDidMount () {\n    const {undoAction, redoAction} = this.props.pageBuilderActions;\n    key('⌘+z, ctrl+z', undoAction);\n    key('⌘+y, ctrl+y', redoAction);\n    // key('delete', );\n  }\n\n  componentWillUnmount () {\n    key.unbind('⌘+z, ctrl+z');\n    key.unbind('⌘+y, ctrl+y');\n  }\n\n  render () {\n    return (\n      <div className={cx(styles.root)}>\n        <Jss stylesheet={stylesheet} />\n        <Canvas />\n        {this.renderElementsMenu()}\n        {this.renderDragger()}\n      </div>\n    );\n  }\n\n  renderElementsMenu () {\n    const {elementsMenuOpened} = this.props;\n    if (elementsMenuOpened) {\n      return (\n        <Portal>\n          <ElementsMenu />\n        </Portal>\n      );\n    }\n  }\n\n  renderDragger () {\n    const {dragging, pageBuilderActions} = this.props;\n    if (dragging) {\n      return (\n        <Dragger onStopDrag={pageBuilderActions.draggedComponent} />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder/page-builder.less",
    "content": ""
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/breadcrumbs/breadcrumbs.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './breadcrumbs.less';\nimport Entry from './entry';\n\nexport default class Breadcrumbs extends Component {\n  static propTypes = {\n    selectElement: PropTypes.func.isRequired,\n    selectedPath: PropTypes.array.isRequired,\n    selectedElement: PropTypes.object,\n    className: PropTypes.string\n  };\n\n  render () {\n    const {selectedPath, selectedElement, className} = this.props;\n    return (\n      <div className={cx(styles.root, className)}>\n        {selectedPath && selectedPath.map(this.renderEntry, this)}\n        <span\n          className={styles.current}\n          key='current'\n        >\n          {(selectedElement && (selectedElement.label || selectedElement.tag)) || 'body'}\n        </span>\n      </div>\n    );\n  }\n\n  renderEntry (entry) {\n    const {selectElement} = this.props;\n    return (\n      <Entry key={entry.id} entry={entry} onClick={selectElement} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/breadcrumbs/breadcrumbs.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  overflow: hidden;\n  white-space: nowrap;\n  direction: ltr;\n  text-align: left;\n\n  &:after {\n    content: '';\n    position: absolute;\n    left: 0; top: 0; bottom: 0;\n    width: 7px;\n    background: linear-gradient(to right, rgba(51,54,59,1) 0%, rgba(51,54,59,0) 100%);\n  }\n}\n\n.current {\n  font-size: 12px;\n  color: @chromeTextSubColor;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/breadcrumbs/entry.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './entry.less';\n\nexport default class Breadcrumbs extends Component {\n  static propTypes = {\n    entry: PropTypes.object.isRequired,\n    onClick: PropTypes.func.isRequired\n  };\n\n  onClick () {\n    const {onClick, entry} = this.props;\n    onClick(entry.id);\n  }\n\n  render () {\n    const {entry} = this.props;\n    return (\n      <span className={styles.root}>\n        <button className={styles.button} onClick={::this.onClick}>\n          {entry.label || entry.tag}\n        </button>\n        <span className={styles.sep}> > </span>\n      </span>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/breadcrumbs/entry.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  font-size: 12px;\n}\n\n.button {\n  position: relative;\n  text-decoration: none;\n  font-size: 12px;\n  color: @chromeTextColor;\n  text-transform: capitalize;\n\n  &:hover {\n    color: @primary;\n  }\n}\n\n.sep {\n  font-size: 12px;\n  color: @chromeTextColor;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/breadcrumbs/index.js",
    "content": "import Component from 'components/component';\nimport React from 'react';\nimport {selectElement} from 'actions/page-builder';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport Breadcrumbs from './breadcrumbs';\n\n@connect(\n  (state) => ({\n    selectedPath: state.pageBuilder.selectedPath,\n    selectedElement: state.pageBuilder.selectedElement\n  }),\n  (dispatch) => bindActionCreators({selectElement}, dispatch)\n)\nexport default class BreadcrumbsContainer extends Component {\n  render () {\n    return (\n      <Breadcrumbs {...this.props} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/index.js",
    "content": "import Component from 'components/component';\nimport React from 'react';\nimport {connect} from 'react-redux';\n\nimport Menu from './menu';\n\n@connect(\n  (state) => ({\n    linkingData: state.pageBuilder.linkingData,\n    linkingFormData: state.pageBuilder.linkingFormData,\n    editing: state.pageBuilder.editing\n  })\n)\nexport default class PageBuilderMenuContainer extends Component {\n  render () {\n    return (\n      <Menu {...this.props} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/menu.jsx",
    "content": "import velocity from 'velocity-animate';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './menu.less';\nimport Breadcrumbs from './breadcrumbs';\nimport Tabs from './tabs';\n\nexport default class PageBuilderMenu extends Component {\n  static propTypes = {\n    editing: PropTypes.bool.isRequired,\n    linkingData: PropTypes.bool.isRequired,\n    linkingFormData: PropTypes.bool.isRequired,\n    previewing: PropTypes.bool.isRequired\n  };\n\n  componentWillReceiveProps (nextProps) {\n    const config = {\n      duration: 800,\n      display: null,\n      easing: 'easeOutExpo'\n    };\n\n    if (nextProps.previewing !== this.props.previewing) {\n      if (nextProps.previewing) {\n        velocity(this.refs.content, {translateX: '290px'}, config);\n      } else {\n        velocity(this.refs.content, {translateX: '0px'}, config);\n      }\n    }\n  }\n\n  render () {\n    return (\n      <div className={styles.root} ref='content'>\n        <div className={styles.content}>\n          {this.renderContent()}\n        </div>\n        <Breadcrumbs className={styles.breadcrumbs} />\n      </div>\n    );\n  }\n\n  renderContent () {\n    const {linkingData, linkingFormData} = this.props;\n    let result;\n\n    if (linkingData) {\n      result = <div>Missing</div>;\n    } else if (linkingFormData) {\n      result = <div>Missing</div>;\n    } else {\n      result = <Tabs />;\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/menu.less",
    "content": "@import '~styles/sizes.less';\n@import '~styles/colors.less';\n\n@breadcrumbsHeight: 30px;\n\n.root {\n  position: absolute;\n  left: 100%;\n  top: 0;\n  bottom: 0;\n  width: @menuWidth;\n  background-color: @chromeBackgroundColor;\n  border-left: 1px solid @chromeBordersColor;\n}\n\n.breadcrumbs {\n  position: absolute;\n  height: @breadcrumbsHeight;\n  line-height: @breadcrumbsHeight;\n  border-top: 1px solid @chromeBordersColor;\n  padding: 0 7px;\n  bottom: 0;\n  left: 0;\n  right: 0;\n}\n\n.content {\n  position: absolute;\n  top: 0px;\n  left: 0;\n  right: 0;\n  bottom: @breadcrumbsHeight;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/index.js",
    "content": "import Component from 'components/component';\nimport React from 'react';\nimport {setMenuTab} from 'actions/page-builder';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport Tabs from './tabs';\n\n@connect(\n  (state) => ({\n    menuTab: state.pageBuilder.menuTab\n  }),\n  (dispatch) => bindActionCreators({setMenuTab}, dispatch)\n)\nexport default class TabsContainer extends Component {\n  render () {\n    return (\n      <Tabs {...this.props} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/layers/entry.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport Draggable from 'components/dnd/draggable';\nimport OptionsMenu from 'components/options-menu';\nimport React, {PropTypes} from 'react';\n\nimport styles from './entry.less';\n\nexport default class Entry extends Component {\n  static propTypes = {\n    pageBuilderActions: PropTypes.object.isRequired,\n    element: PropTypes.object.isRequired,\n    isExpanded: PropTypes.bool.isRequired,\n    hasChildren: PropTypes.bool.isRequired,\n    dragging: PropTypes.bool.isRequired,\n    ElementClass: PropTypes.func.isRequired,\n    selectedId: PropTypes.string,\n    overedId: PropTypes.string\n  };\n\n  getInitState () {\n    return {\n      options: false\n    };\n  }\n\n  onClick () {\n    const {element, pageBuilderActions} = this.props;\n    pageBuilderActions.selectElement(element.id);\n  }\n\n  onMouseOver () {\n    const {dragging, pageBuilderActions, element, hasChildren, isExpanded} = this.props;\n    if (!dragging) {\n      pageBuilderActions.overElement(element.id);\n    } else if (hasChildren && !isExpanded) {\n      this.openInterval = setTimeout(pageBuilderActions.toggleExpandElement.bind(this, element.id), 500);\n    }\n  }\n\n  onMouseOut () {\n    const {dragging, pageBuilderActions, element} = this.props;\n    if (!dragging) {\n      pageBuilderActions.outElement(element.id);\n\n      if (this.state.options) {\n        this.setState({\n          options: false\n        });\n      }\n    } else if (this.openInterval) {\n      clearTimeout(this.openInterval);\n    }\n  }\n\n  openOptions (event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.setState({\n      options: true\n    });\n  }\n\n  duplicate (event) {\n    event.preventDefault();\n    const {pageBuilderActions, element} = this.props;\n    pageBuilderActions.duplicateElement(element.id);\n    this.setState({\n      options: false\n    });\n  }\n\n  remove (event) {\n    event.preventDefault();\n    const {pageBuilderActions, element} = this.props;\n    pageBuilderActions.removeElement(element.id);\n    this.setState({\n      options: false\n    });\n  }\n\n  toggleExpand (event) {\n    event.preventDefault();\n    event.stopPropagation();\n    const {pageBuilderActions, element} = this.props;\n    pageBuilderActions.toggleExpandElement(element.id);\n  }\n\n  render () {\n    const {ElementClass, element} = this.props;\n    let result;\n\n    if (element.subComponent) {\n      result = (\n        <div>\n          {this.renderContent()}\n        </div>\n      );\n    } else {\n      const dragInfo = {\n        type: 'move',\n        id: element.id\n      };\n\n      result = (\n        <div>\n          <Draggable type={element.tag} dragInfo={dragInfo} {...ElementClass.settings.drag}>\n            {this.renderContent()}\n          </Draggable>\n        </div>\n      );\n    }\n    return result;\n  }\n\n  renderOptionsMenu () {\n    if (this.state.options) {\n      return (\n        <OptionsMenu\n          options={[\n            {label: 'Duplicate', action: ::this.duplicate, icon: 'nc-icon-mini files_single-copy-04'},\n            {label: 'Remove', action: ::this.remove, icon: 'nc-icon-mini ui-1_trash'}\n          ]}\n        />\n      );\n    }\n  }\n\n  renderContent () {\n    const {ElementClass, selectedId, overedId, element, hasChildren} = this.props;\n\n    const selected = selectedId === element.id;\n    const overed = overedId === element.id;\n    const subComponent = element.subComponent;\n\n    return (\n      <div\n        className={cx(\n          styles.entry,\n          selected && styles.selected,\n          overed && styles.overed,\n          hasChildren && styles.hasChildren,\n          subComponent && styles.subComponent\n        )}\n        onClick={::this.onClick}\n        onMouseEnter={::this.onMouseOver}\n        onMouseLeave={::this.onMouseOut}\n      >\n        {this.renderCaret()}\n        <div className={cx(styles.part, styles.info)}>\n          <i className={ElementClass.settings.icon.class}>{ElementClass.settings.icon.content}</i>\n          <span>{element.label || element.tag}</span>\n        </div>\n        {this.renderOptions()}\n      </div>\n    );\n  }\n\n  renderCaret () {\n    const {hasChildren, isExpanded} = this.props;\n    if (hasChildren) {\n      return (\n        <span\n          className={cx(styles.part, styles.caret, !isExpanded && styles.collapsed)}\n          onClick={::this.toggleExpand}\n        >\n          <i className='nc-icon-mini arrows-1_small-triangle-down'></i>\n        </span>\n      );\n    }\n  }\n\n  renderOptions () {\n    if (!this.props.element.subComponent) {\n      return (\n        <div className={cx(styles.part, styles.options)} onClick={::this.openOptions}>\n          <i className='nc-icon-mini ui-2_menu-dots'></i>\n          {this.renderOptionsMenu()}\n        </div>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/layers/entry.less",
    "content": "@import '~styles/colors.less';\n\n@height: 30px;\n\n.entry {\n  display: block;\n  text-align: left;\n  text-decoration: none;\n\n  color: @chromeTextColor;\n  font-size: 11px;\n  line-height: @height;\n  padding-right: 25px;\n  margin-top: 1px;\n\n  height: @height;\n\n  &.subComponent {\n    opacity: 0.6;\n  }\n\n  &:not(.hasChildren) {\n    .info {\n      padding-left: @height;\n    }\n  }\n\n  &:before {\n    content: '';\n    position: absolute;\n    left: 0; right: 0;\n    height: @height;\n    border-bottom: 1px solid @chromeBordersColor;\n  }\n\n  &.overed {\n    &:before {\n      background-color: @chromeBackgroundActive;\n    }\n    .options  {\n      visibility: visible;\n    }\n  }\n\n  &.selected {\n    &:before {\n      background-color: @primary;\n    }\n    color: @chromeTextColorHighlight;\n  }\n}\n\n.part {\n  position: relative;\n  vertical-align: top;\n  display: inline-block;\n}\n\n.caret {\n  width: @height;\n  height: @height;\n  text-align: center;\n  cursor: pointer;\n\n  :global i {\n    color: @chromeTextColor;\n    font-size: 13px;\n    line-height: @height;\n    transition: all 0.2s ease-out;\n  }\n\n  &.collapsed {\n    :global i {\n      transform: rotate(-90deg);\n    }\n  }\n}\n\n.info {\n  cursor: default;\n\n  :global {\n    i, span {\n      display: inline-block;\n      vertical-align: top;\n      line-height: @height;\n      color: @chromeTextColor;\n    }\n\n    i {\n      font-size: 13px;\n      padding-right: 10px;\n    }\n\n    span {\n      font-size: 11px;\n    }\n  }\n}\n\n.options {\n  position: absolute;\n  right: 0;\n  height: @height;\n  width: @height;\n  text-align: center;\n  cursor: pointer;\n\n  :global i {\n    line-height: @height;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/layers/index.js",
    "content": "import * as pageBuilderActions from 'actions/page-builder';\n\nimport Component from 'components/component';\nimport React from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport Layers from './layers';\n\n@connect(\n  (state) => ({\n    data: state.pageBuilder.data,\n    selectedElement: state.pageBuilder.selectedElement,\n    elements: state.pageBuilder.elements,\n    expanded: state.pageBuilder.expanded,\n    userExpanded: state.pageBuilder.userExpanded,\n    selectedId: state.pageBuilder.selectedId,\n    overedId: state.pageBuilder.overedId,\n    dragging: state.dnd.dragging\n  }),\n  (dispatch) => ({\n    pageBuilderActions: bindActionCreators(pageBuilderActions, dispatch)\n  })\n)\nexport default class LayersTabContainer extends Component {\n  render () {\n    return (\n      <Layers\n        {...this.props}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/layers/layers.jsx",
    "content": "import Component from 'components/component';\nimport Droppable from 'components/dnd/droppable';\nimport Scrollable from 'components/scrollable';\nimport React, {PropTypes} from 'react';\n\nimport styles from './layers.less';\nimport Entry from './entry';\n\nexport default class Layers extends Component {\n  static propTypes = {\n    pageBuilderActions: PropTypes.object.isRequired,\n    data: PropTypes.object.isRequired,\n    elements: PropTypes.object.isRequired,\n    expanded: PropTypes.object.isRequired,\n    userExpanded: PropTypes.object.isRequired,\n    dragging: PropTypes.bool.isRequired,\n    selectedId: PropTypes.string,\n    overedId: PropTypes.string\n  };\n\n  render () {\n    const {data, pageBuilderActions} = this.props;\n    return (\n      <Scrollable>\n        <div className={styles.filterDisplay}>\n          <button className={styles.trigger} onClick={pageBuilderActions.expandAll}>Expand all</button>\n          <button className={styles.trigger} onClick={pageBuilderActions.collapseAll}>Collapse all</button>\n        </div>\n        <div className={styles.structureList}>\n          {\n            data.body &&\n            data.body.children &&\n            this.renderList(\n              data.body.children,\n              {type: 'body', id: 'body'},\n              {accepts: 'Section'},\n              {tag: 'body'}\n            )\n          }\n        </div>\n      </Scrollable>\n    );\n  }\n\n  renderList (children, dropInfo, dropSettings, parent, droppable = true) {\n    let result;\n    if (!droppable) {\n      result = (\n        <ul className={styles.list}>\n          {children.map(this.renderListEntry, this)}\n        </ul>\n      );\n    } else {\n      result = (\n        <ul className={styles.list}>\n          <Droppable showMarks={false} type={parent.type} dropInfo={dropInfo} {...dropSettings} hitSpace={12}>\n            {children.map(this.renderListEntry, this)}\n          </Droppable>\n        </ul>\n      );\n    }\n    return result;\n  }\n\n  renderListEntry (elementId) {\n    const {\n      elements,\n      data,\n      expanded,\n      userExpanded,\n      dragging,\n      pageBuilderActions,\n      selectedId,\n      overedId\n    } = this.props;\n    const element = data[elementId];\n    const hasChildren = element.children instanceof Array && element.children.length > 0;\n    const ElementClass = elements[element.tag];\n    const dropInfo = {id: element.id};\n    let dropSettings = ElementClass.settings.drop;\n    const isExpanded = hasChildren && (expanded[elementId] || userExpanded[elementId]) && true;\n\n    if (dropSettings !== false) {\n      dropSettings = Object.assign({}, ElementClass.settings.drop, {\n        orientation: 'vertical',\n        customDropArea: false,\n        selectionChildren: false\n      });\n    }\n\n    let underlings;\n\n    if (isExpanded) {\n      underlings = this.renderList(element.children, dropInfo, dropSettings, element, dropSettings);\n    } else if (dragging && !hasChildren && dropSettings !== false) {\n      underlings = (\n        <ul className={styles.list}>\n          <Droppable\n            type={element.tag}\n            dropInfo={dropInfo}\n            showMarks={false}\n            {...dropSettings}\n            minHeight={7}\n          />\n        </ul>\n      );\n    }\n\n    return (\n      <li key={element.id}>\n        <Entry\n          pageBuilderActions={pageBuilderActions}\n          element={element}\n          isExpanded={isExpanded}\n          hasChildren={hasChildren}\n          dragging={dragging}\n          ElementClass={ElementClass}\n          selectedId={selectedId}\n          overedId={overedId}\n        />\n        {underlings}\n      </li>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/layers/layers.less",
    "content": "@import '~styles/colors.less';\n\n.filterDisplay {\n  padding: 0 10px;\n}\n\n.trigger {\n  display: inline-block;\n  vertical-align: top;\n  text-decoration: none;\n  font-size: 10px;\n  color: @chromeTextColor;\n  margin-right: 10px;\n  opacity: 0.7;\n  line-height: 30px;\n\n  &:hover, &.active {\n    opacity: 1;\n  }\n}\n\n.structureList {\n  border-top: 1px solid @chromeBordersColor;\n}\n\n.list {\n  list-style-type: none;\n  padding: 0;\n  margin: 0;\n\n  .list {\n    padding-left: 15px;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/settings/animation.jsx",
    "content": "import Button from 'components/button';\nimport Component from 'components/component';\nimport OptionsList from 'components/options-list';\nimport React, {PropTypes} from 'react';\n\nexport default class AnimationTab extends Component {\n  static propTypes = {\n    pageBuilderActions: PropTypes.object.isRequired,\n    selectedId: PropTypes.string,\n    selectedElement: PropTypes.object\n  };\n\n  static options = [\n    {\n      label: 'Animation',\n      type: 'Optional',\n      id: 'use',\n      unlocks: [\n        {\n          label: 'Effect',\n          type: 'Select',\n          id: 'effect',\n          props: {\n            labels: [\n              'Fade',\n              'Flip X',\n              'Flip Y',\n              'Whirl',\n              'Shrink',\n              'Expand',\n              'Slide up',\n              'Slide down',\n              'Slide left',\n              'Slide right',\n              'Slide big up',\n              'Slide big down',\n              'Slide big left',\n              'Slide big right'\n            ],\n            values: [\n              'transition.fadeIn',\n              'transition.flipXIn',\n              'transition.flipYIn',\n              'transition.whirlIn',\n              'transition.shrinkIn',\n              'transition.expandIn',\n              'transition.slideUpIn',\n              'transition.slideDownIn',\n              'transition.slideLeftIn',\n              'transition.slideRightIn',\n              'transition.slideUpBigIn',\n              'transition.slideDownBigIn',\n              'transition.slideLeftBigIn',\n              'transition.slideRightBigIn'\n            ]\n          }\n        },\n        {\n          type: 'Columns',\n          options: [\n            {\n              label: 'Duration',\n              type: 'Number',\n              id: 'duration',\n              props: {\n                min: 0,\n                max: 20000,\n                label: 'ms'\n              }\n            },\n            {\n              label: 'Delay',\n              type: 'Number',\n              id: 'delay',\n              props: {\n                min: 0,\n                max: 20000,\n                label: 'ms'\n              }\n            }\n          ]\n        }\n\n      ]\n    }\n  ];\n\n  onChange (id, value) {\n    const {selectedId} = this.props;\n    const {changeElementAnimation} = this.props.pageBuilderActions;\n    changeElementAnimation(selectedId, id, value);\n  }\n\n  playAnimations (event) {\n    event.preventDefault();\n    window.dispatchEvent(new Event('animateElements'));\n  }\n\n  render () {\n    return (\n      <div>\n        {this.renderContent()}\n        <Button onClick={::this.playAnimations} full primary>\n          Play animations\n        </Button>\n      </div>\n    );\n  }\n\n  renderContent () {\n    const {selectedElement} = this.props;\n    return (\n      <OptionsList\n        options={AnimationTab.options}\n        onChange={::this.onChange}\n        values={selectedElement.animation || {}}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/settings/index.js",
    "content": "import * as pageBuilderActions from 'actions/page-builder';\n\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport Settings from './settings';\n\n@connect(\n  (state) => ({\n    selectedId: state.pageBuilder.selectedId,\n    selectedElement: state.pageBuilder.selectedElement,\n    elements: state.pageBuilder.elements,\n    display: state.display\n  }),\n  (dispatch) => ({\n    pageBuilderActions: bindActionCreators(pageBuilderActions, dispatch)\n  })\n)\nexport default class SettingsTabContainer extends Component {\n  static propTypes = {\n    pageBuilderActions: PropTypes.object.isRequired,\n    selectedId: PropTypes.string\n  };\n\n  duplicate () {\n    const {selectedId} = this.props;\n    const {duplicateElement} = this.props.pageBuilderActions;\n    duplicateElement(selectedId);\n  }\n\n  remove () {\n    const {removeElement} = this.props.pageBuilderActions;\n    const {selectedId} = this.props;\n    removeElement(selectedId);\n  }\n\n  render () {\n    return (\n      <Settings\n        {...this.props}\n        duplicate={::this.duplicate}\n        remove={::this.remove}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/settings/position.jsx",
    "content": "import getElementPosition from 'helpers/get-element-position';\nimport Component from 'components/component';\nimport OptionsList from 'components/options-list';\nimport React, {PropTypes} from 'react';\n\nconst positioningOptions = [\n  {\n    type: 'Columns',\n    options: [\n      {\n        label: 'Top',\n        type: 'Number',\n        id: 'top',\n        props: {\n          allowed: ['px', '%', 'auto']\n        }\n      },\n      {\n        label: 'Right',\n        type: 'Number',\n        id: 'right',\n        props: {\n          allowed: ['px', '%', 'auto']\n        }\n      }\n    ]\n  },\n  {\n    type: 'Columns',\n    options: [\n      {\n        label: 'Bottom',\n        type: 'Number',\n        id: 'bottom',\n        props: {\n          allowed: ['px', '%', 'auto']\n        }\n      },\n      {\n        label: 'Left',\n        type: 'Number',\n        id: 'left',\n        props: {\n          allowed: ['px', '%', 'auto']\n        }\n      }\n    ]\n  },\n  {\n    label: 'Z-index',\n    type: 'Number',\n    id: 'zIndex'\n  }\n];\n\nexport default class PositionSettings extends Component {\n  static propTypes = {\n    pageBuilderActions: PropTypes.object.isRequired,\n    display: PropTypes.string.isRequired,\n    selectedId: PropTypes.string,\n    selectedElement: PropTypes.object\n  };\n\n  static options = [\n    {\n      label: 'Position',\n      type: 'Select',\n      id: 'position',\n      props: {\n        labels: ['Static', 'Relative', 'Absolute', 'Fixed'],\n        values: ['static', 'relative', 'absolute', 'fixed']\n      },\n      unlocks: {\n        relative: positioningOptions,\n        absolute: positioningOptions,\n        fixed: positioningOptions\n      }\n    }\n  ];\n\n  onChange (id, value) {\n    const {selectedId} = this.props;\n    const {changeElementPosition} = this.props.pageBuilderActions;\n    changeElementPosition(selectedId, id, value);\n  }\n\n  render () {\n    const {selectedElement} = this.props;\n    const values = selectedElement.position && getElementPosition(selectedElement, this.props.display) || {\n      position: 'static'\n    };\n    return (\n      <OptionsList options={PositionSettings.options} onChange={::this.onChange} values={values} />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/settings/props.jsx",
    "content": "import cx from 'classnames';\nimport getElementProps from 'helpers/get-element-props';\nimport optionsStyles from 'components/options-list/index.less';\nimport Component from 'components/component';\nimport Input from 'components/input-options/input';\nimport OptionsList from 'components/options-list';\nimport React, {PropTypes} from 'react';\n\nimport styles from './props.less';\nimport Animation from './animation';\nimport Position from './position';\n\nexport default class EditProps extends Component {\n  static propTypes = {\n    pageBuilderActions: PropTypes.object.isRequired,\n    display: PropTypes.string.isRequired,\n    selectedElement: PropTypes.object,\n    selectedId: PropTypes.string,\n    elements: PropTypes.object.isRequired\n  };\n\n  displayToggleElement (id, display) {\n    const {toggleElementVisibleOn} = this.props.pageBuilderActions;\n    toggleElementVisibleOn(id, display);\n  }\n\n  render () {\n    const {selectedElement, elements} = this.props;\n    const {changeElementLabel} = this.props.pageBuilderActions;\n    const ElementClass = elements[selectedElement.tag];\n\n    return (\n      <div className={styles.root}>\n        <div className={optionsStyles.option}>\n          <div className={optionsStyles.label}>Label</div>\n          <Input\n            value={selectedElement.label || selectedElement.tag}\n            onChange={changeElementLabel.bind(this, selectedElement.id)}\n          />\n        </div>\n        <div className={optionsStyles.option}>\n          <div className={optionsStyles.label}>Visible on</div>\n          <div>\n            <button\n              className={cx(\n                styles.displayButton,\n                selectedElement.hide && selectedElement.hide.desktop && styles.selected\n              )}\n              onClick={this.displayToggleElement.bind(this, selectedElement.id, 'desktop')}\n            >\n              <i className='nc-icon-mini tech_desktop-screen'></i>\n            </button>\n            <button\n              className={cx(\n                styles.displayButton,\n                selectedElement.hide && selectedElement.hide.tablet && styles.selected\n              )}\n              onClick={this.displayToggleElement.bind(this, selectedElement.id, 'tablet')}\n            >\n              <i className='nc-icon-mini tech_tablet-button'></i>\n            </button>\n            <button\n              className={cx(\n                styles.displayButton,\n                selectedElement.hide && selectedElement.hide.mobile && styles.selected\n              )}\n              onClick={this.displayToggleElement.bind(this, selectedElement.id, 'mobile')}\n            >\n              <i className='nc-icon-mini tech_mobile-button'></i>\n            </button>\n          </div>\n        </div>\n        <Position {...this.props} />\n        {this.renderOptions(ElementClass)}\n        <Animation {...this.props} />\n      </div>\n    );\n  }\n\n  renderOptions (ElementClass) {\n    const {changeElementProperty} = this.props.pageBuilderActions;\n    const {selectedId, selectedElement, display} = this.props;\n\n    if (ElementClass.propsSchema) {\n      const values = Object.assign({}, ElementClass.defaultProps, getElementProps(selectedElement, display));\n      return (\n        <OptionsList\n          options={ElementClass.propsSchema}\n          values={values}\n          onChange={changeElementProperty.bind(this, selectedId)}\n        />\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/settings/props.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  padding: 15px;\n  padding-top: 20px;\n}\n\n.displayButton {\n  text-decoration: none;\n  display: inline-block;\n  color: #ffffff;\n  border: 1px solid @chromeBordersColor;\n  border-right-width: 0;\n  background-color: @chromeBackgroundDarkerColor;\n  width: 33.332%;\n  height: 38px;\n  text-align: center;\n\n  :global i {\n    font-size: 10px;\n    line-height: 38px;\n  }\n\n  &:first-child {\n    border-radius: 3px 0 0 3px;\n  }\n\n  &:last-child {\n    border-radius: 0 3px 3px 0;\n    border-right-width: 1px;\n  }\n\n  &:hover {\n    background-color: @chromeBackgroundActive;\n  }\n\n  &.selected {\n    background-color: #7a222d;\n    border-color: #7a222d;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/settings/settings.jsx",
    "content": "import Component from 'components/component';\nimport Scrollable from 'components/scrollable';\nimport React, {PropTypes} from 'react';\n\nimport styles from './settings.less';\nimport Props from './props';\n\nexport default class SettingsTab extends Component {\n  static propTypes = {\n    selectedId: PropTypes.string,\n    selectedElement: PropTypes.object,\n    duplicate: PropTypes.func.isRequired,\n    remove: PropTypes.func.isRequired\n  };\n\n  render () {\n    return (\n      <div>\n        {this.renderActionButtons()}\n        <Scrollable autoshow className={styles.content}>\n          {this.renderContent()}\n        </Scrollable>\n      </div>\n    );\n  }\n\n  renderContent () {\n    const {selectedId} = this.props;\n    let result;\n\n    if (selectedId && selectedId !== 'body') {\n      result = <Props {...this.props} />;\n    } else {\n      result = this.renderNonSelected();\n    }\n\n    return result;\n  }\n\n  renderNonSelected () {\n    return (\n      <div className={styles.info}>\n        <i className='nc-icon-outline media-1_touch'></i>\n        <div className={styles.label}>Relax, you have to select an element first!</div>\n      </div>\n    );\n  }\n\n  renderActionButtons () {\n    const {selectedId, selectedElement, duplicate, remove} = this.props;\n\n    if (selectedId && selectedId !== 'body') {\n      let result;\n\n      if (selectedElement.subComponent) {\n        result = (\n          <div>\n            This is a sub element\n          </div>\n        );\n      } else {\n        result = (\n          <div className={styles.actions}>\n            <button className={styles.action} onClick={duplicate}>\n              <i className='nc-icon-mini files_single-copy-04'></i>\n              <span>Duplicate</span>\n            </button>\n            <button className={styles.action} onClick={remove}>\n              <i className='nc-icon-mini ui-1_trash'></i>\n              <span>Remove</span>\n            </button>\n          </div>\n        );\n      }\n\n      return result;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/settings/settings.less",
    "content": "@import '~styles/colors.less';\n\n.content {\n  position: absolute;\n  top: 30px;\n  bottom: 0px;\n  left: 0;\n  right: 0;\n}\n\n.info {\n  position: absolute;\n  left: 0;\n  right: 0;\n  top: 40%;\n  transform: translateY(-50%);\n  text-align: center;\n  padding: 0 45px;\n\n  :global i {\n    font-size: 35px;\n    color: @chromeTextSubColor;\n    margin-bottom: 15px;\n  }\n}\n\n.label {\n  font-size: 12px;\n  color: @chromeTextSubColor;\n}\n\n.actions {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 30px;\n  border-bottom: 1px solid @chromeBordersColor;\n  margin: 0;\n}\n\n.action {\n  display: inline-block;\n  vertical-align: top;\n  text-align: center;\n  text-decoration: none;\n  width: 50%;\n  margin: 0;\n  border-right: 1px solid @chromeBordersColor;\n\n  :global {\n    i, span {\n      display: inline-block;\n      line-height: 30px;\n      color: @chromeTextColor;\n    }\n    span {\n      font-size: 10px;\n    }\n    i {\n      font-size: 9px;\n      margin-right: 6px;\n    }\n  }\n\n  &:last-child {\n    border-right: 0;\n  }\n\n  &:hover {\n    :global {\n      i, span {\n        color: @primary;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/style/index.js",
    "content": "import Component from 'components/component';\nimport React from 'react';\nimport {connect} from 'react-redux';\n\nimport Style from './style';\n\n@connect(\n  (state) => ({\n    styles: state.styles.data,\n    display: state.display,\n    selectedElement: state.pageBuilder.selectedElement,\n    elements: state.pageBuilder.elements\n  })\n)\nexport default class StyleTabContainer extends Component {\n  render () {\n    return (\n      <Style\n        {...this.props}\n        {...this.state}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/style/style-picker/edit.jsx",
    "content": "import getElementStyleValues from 'helpers/get-element-style-values';\nimport Component from 'components/component';\nimport OptionsList from 'components/options-list';\nimport React from 'react';\n\nimport styles from './edit.less';\n\nexport default class Edit extends Component {\n  static propTypes = {\n    display: React.PropTypes.string.isRequired,\n    styleOptions: React.PropTypes.object.isRequired,\n    selectedStyle: React.PropTypes.object.isRequired,\n    onChange: React.PropTypes.func.isRequired\n  };\n\n  render () {\n    return (\n      <div className={styles.root}>\n        {this.renderOptions()}\n      </div>\n    );\n  }\n\n  renderOptions () {\n    const {styleOptions, selectedStyle, display} = this.props;\n    const values = getElementStyleValues(\n      styleOptions.defaults,\n      selectedStyle.options,\n      selectedStyle.displayOptions,\n      display\n    );\n\n    return (\n      <OptionsList\n        options={styleOptions.options}\n        values={values}\n        onChange={this.props.onChange}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/style/style-picker/edit.less",
    "content": ".root {\n  padding: 20px 14px;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/style/style-picker/entry.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport OptionsMenu from 'components/options-menu';\nimport React, {PropTypes} from 'react';\n\nimport styles from './entry.less';\n\nexport default class Entry extends Component {\n  static propTypes = {\n    entry: PropTypes.object.isRequired,\n    onClick: PropTypes.func.isRequired,\n    styleOptions: PropTypes.object.isRequired,\n    removeStyle: PropTypes.func.isRequired,\n    duplicateStyle: PropTypes.func.isRequired\n  };\n\n  getInitState () {\n    return {\n      options: false\n    };\n  }\n\n  openOptions (event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.setState({\n      options: true\n    });\n  }\n\n  onMouseLeave () {\n    if (this.state.options) {\n      this.setState({\n        options: false\n      });\n    }\n  }\n\n  onClick (event) {\n    event.preventDefault();\n    this.props.onClick(this.props.entry._id);\n  }\n\n  duplicate () {\n    this.props.duplicateStyle(this.props.entry);\n  }\n\n  remove () {\n    this.props.removeStyle(this.props.entry._id);\n  }\n\n  render () {\n    return (\n      <div className={styles.root} onClick={::this.onClick} onMouseLeave={::this.onMouseLeave}>\n        <div className={styles.holder}>\n          <span className={cx(styles.column, styles.title)}>{this.props.entry.title}</span>\n          {this.renderOptionsButton()}\n          {this.renderInfo()}\n        </div>\n      </div>\n    );\n  }\n\n  renderOptionsButton () {\n    if (this.props.entry._id !== 'no_style') {\n      return (\n        <span className={cx(styles.column, styles.optionsButton)} onClick={::this.openOptions}>\n          <i className={cx('nc-icon-mini ui-2_menu-dots', styles.icon)}></i>\n          {this.renderOptionsMenu()}\n        </span>\n      );\n    }\n  }\n\n  renderOptionsMenu () {\n    if (this.state.options) {\n      return (\n        <OptionsMenu\n          options={[\n            {label: 'Duplicate', action: ::this.duplicate, icon: 'nc-icon-mini files_single-copy-04'},\n            {label: 'Remove', action: ::this.remove, icon: 'nc-icon-mini ui-1_trash'}\n          ]}\n        />\n      );\n    }\n  }\n\n  renderInfo () {\n    const {styleOptions, entry} = this.props;\n    if (styleOptions.getIdentifierLabel && entry._id !== 'no_style') {\n      return (\n        <span className={cx(styles.column, styles.info)}>\n          {styleOptions.getIdentifierLabel(Object.assign({}, styleOptions.defaults, entry.options))}\n        </span>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/style/style-picker/entry.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  position: relative;\n  cursor: pointer;\n  padding: 0px 11px;\n  border-bottom: 1px solid @chromeBordersColor;\n\n  &:hover, &.selected {\n    background-color: @chromeBackgroundActive;\n  }\n}\n\n.holder {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n}\n\n.column {\n  display: table-cell;\n  vertical-align: top;\n}\n\n.title {\n  font-size: 10px;\n  text-transform: uppercase;\n  color: @chromeTextColor;\n  line-height: 60px;\n}\n\n.info {\n  font-size: 9px;\n  color: @chromeTextColor;\n  float: right;\n  line-height: 60px;\n}\n\n.optionsButton {\n  float: right;\n  position: relative;\n  margin-top: 10px;\n  margin-left: 10px;\n  text-align: center;\n  width: 25px;\n  cursor: pointer;\n\n  .icon {\n    color: @chromeTextColor;\n    font-size: 12px;\n    line-height: 40px;\n  }\n\n  &:hover .icon {\n    color: @primary;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/style/style-picker/index.js",
    "content": "import * as pageBuilderActions from 'actions/page-builder';\nimport * as stylesActions from 'actions/styles';\n\nimport debounce from 'lodash.debounce';\nimport filter from 'lodash.filter';\nimport find from 'lodash.find';\nimport forEach from 'lodash.foreach';\nimport omit from 'lodash.omit';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport StylePicker from './style-picker';\n\n@connect(\n  (state) => ({\n    styles: state.styles.data,\n    display: state.display,\n    selectedElement: state.pageBuilder.selectedElement,\n    selectedId: state.pageBuilder.selectedId,\n    elements: state.pageBuilder.elements\n  }),\n  (dispatch) => ({\n    pageBuilderActions: bindActionCreators(pageBuilderActions, dispatch),\n    ...bindActionCreators(stylesActions, dispatch)\n  })\n)\nexport default class StylePickerContainer extends Component {\n  static fragments = StylePicker.fragments;\n\n  static propTypes = {\n    style: PropTypes.string.isRequired,\n    value: PropTypes.string.isRequired,\n    styles: PropTypes.array.isRequired,\n    pageBuilderActions: PropTypes.object.isRequired,\n    saveStyle: PropTypes.func.isRequired,\n    duplicateStyle: PropTypes.func.isRequired,\n    updateStyle: PropTypes.func.isRequired,\n    changeStyleProp: PropTypes.func.isRequired,\n    // page builder\n    selectedElement: PropTypes.object.isRequired,\n    selectedId: PropTypes.string.isRequired,\n    elements: PropTypes.object.isRequired\n  };\n\n  getInitState () {\n    const styleOptions = this.getStyleOptions(this.props.style);\n    this.updateStyle = debounce(::this.onUpdateStyle, 3000);\n    return {\n      editing: true,\n      editingTitle: false,\n      titleValue: '',\n      styleOptions\n    };\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (nextProps.style !== this.props.style) {\n      this.setState({\n        styleOptions: this.getStyleOptions(nextProps.style)\n      });\n    }\n  }\n\n  onUpdateStyle (styleId) {\n    if (styleId !== 'no_style') {\n      const selectedStyle = find(this.props.styles, {_id: styleId});\n      if (selectedStyle) {\n        this.props.updateStyle(this.constructor.fragments, selectedStyle);\n      }\n    }\n  }\n\n  async saveStyle () {\n    const selectedStyle = this.props.value || 'no_style';\n    if (selectedStyle === 'no_style') {\n      const {selectedElement} = this.props;\n      const style = {\n        title: this.state.titleValue,\n        type: this.state.styleOptions.type,\n        options: selectedElement.style || {},\n        displayOptions: selectedElement.displayStyle || {}\n      };\n      await this.props.saveStyle(this.constructor.fragments, selectedElement.id, style);\n      this.setState({\n        editingTitle: false,\n        titleValue: ''\n      });\n    }\n  }\n\n  async duplicateStyle (data) {\n    const {selectedElement} = this.props;\n    const style = omit(data, '_id');\n    style.title += ' copy';\n    await this.props.saveStyle(this.constructor.fragments, selectedElement.id, style);\n    this.setState({\n      editing: true\n    });\n  }\n\n  onChangeValue (key, value) {\n    const selectedStyle = this.props.value || 'no_style';\n    if (selectedStyle === 'no_style') {\n      const {selectedId} = this.props;\n      const {changeElementStyle} = this.props.pageBuilderActions;\n      changeElementStyle(selectedId, key, value);\n    } else {\n      this.props.changeStyleProp(selectedStyle, key, value);\n      this.updateStyle(selectedStyle);\n    }\n  }\n\n  onChange (value) {\n    const {selectedId} = this.props;\n    const {changeElementProperty} = this.props.pageBuilderActions;\n    changeElementProperty(selectedId, 'style', value);\n    this.setState({\n      editing: true\n    });\n  }\n\n  toggleEditingTitle () {\n    this.setState({\n      editingTitle: !this.state.editingTitle\n    });\n  }\n\n  changeTitleValue (value) {\n    this.setState({\n      titleValue: value\n    });\n  }\n\n  toggleEditing () {\n    this.setState({\n      editing: !this.state.editing\n    });\n  }\n\n  getStyleOptions (style) {\n    let result = style;\n    if (typeof style === 'string') {\n      forEach(this.props.elements, (element) => {\n        if (element.style && typeof element.style === 'object' && element.style.type === style) {\n          result = element.style;\n        }\n      });\n    }\n    return result;\n  }\n\n  render () {\n    let styles = [];\n    if (this.state.styleOptions && this.state.styleOptions.type) {\n      const {selectedElement} = this.props;\n      styles = filter(this.props.styles, {type: this.state.styleOptions.type});\n      styles.unshift({\n        _id: 'no_style',\n        title: 'No style',\n        options: selectedElement.style || {},\n        displayOptions: selectedElement.displayStyle || {}\n      });\n    }\n    let selectedStyle = find(styles, {_id: this.props.value || 'no_style'});\n    if (!selectedStyle) {\n      selectedStyle = find(styles, {_id: 'no_style'});\n    }\n\n    return (\n      <StylePicker\n        {...this.props}\n        {...this.state}\n        styles={styles}\n        selectedStyle={selectedStyle}\n        styleOptions={this.state.styleOptions}\n        toggleEditing={::this.toggleEditing}\n        toggleEditingTitle={::this.toggleEditingTitle}\n        changeTitleValue={::this.changeTitleValue}\n        saveStyle={::this.saveStyle}\n        onChange={::this.onChange}\n        onChangeValue={::this.onChangeValue}\n        duplicateStyle={::this.duplicateStyle}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/style/style-picker/style-picker.jsx",
    "content": "import cx from 'classnames';\nimport Animate from 'components/animate';\nimport Button from 'components/button';\nimport Component from 'components/component';\nimport Input from 'components/input-options/input';\nimport Scrollable from 'components/scrollable';\nimport React, {PropTypes} from 'react';\n\nimport classes from './style-picker.less';\nimport Edit from './edit';\nimport Entry from './entry';\n\nexport default class StylePicker extends Component {\n  static fragments = {\n    style: {\n      _id: 1,\n      type: 1,\n      title: 1,\n      options: 1,\n      displayOptions: 1\n    }\n  };\n\n  static propTypes = {\n    value: PropTypes.any.isRequired,\n    onChange: PropTypes.func.isRequired,\n    onChangeValue: PropTypes.func.isRequired,\n    styles: PropTypes.array.isRequired,\n    selectedStyle: PropTypes.object.isRequired,\n    editing: PropTypes.bool.isRequired,\n    editingTitle: PropTypes.bool.isRequired,\n    titleValue: PropTypes.string.isRequired,\n    changeTitleValue: PropTypes.func.isRequired,\n    toggleEditing: PropTypes.func.isRequired,\n    toggleEditingTitle: PropTypes.func.isRequired,\n    saveStyle: PropTypes.func.isRequired,\n    styleOptions: PropTypes.object.isRequired,\n    removeStyle: PropTypes.func.isRequired,\n    duplicateStyle: PropTypes.func.isRequired,\n    display: React.PropTypes.string.isRequired\n  };\n\n  onSubmit (event) {\n    event.preventDefault();\n    this.props.saveStyle();\n  }\n\n  render () {\n    const {selectedStyle, toggleEditing, editing} = this.props;\n    return (\n      <div>\n        <div className={classes.selected} onClick={toggleEditing}>\n          <span>{selectedStyle.title}</span>\n          <i className={cx('nc-icon-outline', editing ? 'arrows-1_minimal-up' : 'arrows-1_minimal-down')}></i>\n        </div>\n        <Scrollable\n          className={cx(classes.content, selectedStyle._id === 'no_style' && editing && classes.noStyle)}\n        >\n          {this.renderContent()}\n        </Scrollable>\n        {this.renderSaveStyle()}\n      </div>\n    );\n  }\n\n  renderContent () {\n    let result;\n    if (this.props.editing) {\n      result = (\n        <Animate transition='slideDownIn' duration={300} key='edit'>\n          {this.renderEdit()}\n        </Animate>\n      );\n    } else if (this.props.styles.length > 1) {\n      result = (\n        <Animate transition='slideUpIn' duration={300} key='list'>\n          <div>\n            {this.props.styles.map(this.renderEntry, this)}\n          </div>\n        </Animate>\n      );\n    }\n    return result;\n  }\n\n  renderEntry (entry) {\n    if (entry._id !== this.props.selectedStyle._id) {\n      return (\n        <Entry\n          entry={entry}\n          key={entry._id}\n          styleOptions={this.props.styleOptions}\n          onClick={this.props.onChange}\n          removeStyle={this.props.removeStyle}\n          duplicateStyle={this.props.duplicateStyle}\n        />\n      );\n    }\n  }\n\n  renderEdit () {\n    return (\n      <Edit\n        display={this.props.display}\n        selectedStyle={this.props.selectedStyle}\n        styleOptions={this.props.styleOptions}\n        onChange={this.props.onChangeValue}\n      />\n    );\n  }\n\n  renderSaveStyle () {\n    const {\n      editing,\n      selectedStyle,\n      editingTitle,\n      titleValue,\n      changeTitleValue,\n      saveStyle,\n      toggleEditingTitle\n    } = this.props;\n    if (editing && selectedStyle._id === 'no_style') {\n      let result;\n      if (editingTitle) {\n        result = (\n          <div className={classes.saveStyle}>\n            <Animate transition='slideRightIn' duration={300}>\n              <form onSubmit={::this.onSubmit}>\n                <Input\n                  className={classes.input}\n                  placeholder='Style title'\n                  value={titleValue}\n                  onChange={changeTitleValue}\n                  focused\n                />\n                <div className={classes.submitButton} onClick={saveStyle}>\n                  <i className='nc-icon-outline arrows-1_tail-right'></i>\n                </div>\n                <input type='submit' hidden />\n              </form>\n            </Animate>\n          </div>\n        );\n      } else {\n        result = (\n          <div className={classes.saveStyle}>\n            <Button primary full big onClick={toggleEditingTitle}>\n              Save style\n            </Button>\n          </div>\n        );\n      }\n      return result;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/style/style-picker/style-picker.less",
    "content": "@import '~styles/colors.less';\n\n.selected {\n  position: relative;\n  padding: 0 18px;\n  border-bottom: 1px solid @chromeBordersColor;\n  cursor: pointer;\n\n  :global {\n    span, i {\n      display: inline-block;\n    }\n    span {\n      font-size: 11px;\n      text-transform: uppercase;\n      line-height: 65px;\n      color: @chromeTextColor;\n    }\n    i {\n      font-size: 14px;\n      position: absolute;\n      right: 12px;\n      line-height: 65px;\n      color: @chromeTextSubColor;\n    }\n  }\n\n  &:hover {\n    background-color: @chromeBackgroundActive;\n  }\n}\n\n.content {\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 66px;\n}\n\n.noStyle {\n  bottom: 91px;\n}\n\n.saveStyle {\n  position: absolute;\n  bottom: 0px;\n  height: 60px;\n  left: 0; right: 0;\n  border-top: 1px solid @chromeBordersColor;\n  text-align: center;\n  padding: 10px;\n\n  .input {\n    width: 205px;\n    height: 39px;\n    display: inline-block;\n    vertical-align: top;\n\n    :global input {\n      text-transform: uppercase;\n    }\n  }\n}\n\n.submitButton {\n  display: inline-block;\n  vertical-align: top;\n  width: 50px;\n  text-align: center;\n  cursor: pointer;\n\n  :global i {\n    font-size: 18px;\n    line-height: 39px;\n    color: @chromeTextSubColor;\n    transition: all 0.3s ease-out;\n  }\n\n  &:hover :global i {\n    color: @chromeTextColor;\n    transform: translateX(5px);\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/style/style.jsx",
    "content": "import getElementProps from 'helpers/get-element-props';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './style.less';\nimport StylePicker from './style-picker';\n\nexport default class Style extends Component {\n  static propTypes = {\n    selectedElement: PropTypes.object,\n    elements: PropTypes.object,\n    display: PropTypes.string,\n    styles: PropTypes.array.isRequired\n  };\n\n  render () {\n    const {selectedElement, elements} = this.props;\n    let result;\n\n    if (selectedElement && selectedElement.id !== 'body') {\n      const Element = elements[selectedElement.tag];\n\n      if (Element && Element.style) {\n        result = this.renderStylePicker(Element);\n      } else {\n        result = this.renderNotStylable();\n      }\n    } else {\n      result = this.renderNoneSelected();\n    }\n\n    return result;\n  }\n\n  renderStylePicker (Element) {\n    const {selectedElement, display} = this.props;\n    const elementProps = getElementProps(selectedElement, display);\n\n    return (\n      <StylePicker\n        style={Element.style}\n        value={elementProps && elementProps.style}\n      />\n    );\n  }\n\n  renderNoneSelected () {\n    return (\n      <div className={styles.info}>\n        <i className='nc-icon-outline media-1_touch'></i>\n        <div className={styles.label}>Relax, you have to select an element first!</div>\n      </div>\n    );\n  }\n\n  renderNotStylable () {\n    return (\n      <div className={styles.info}>\n        <i className='nc-icon-outline media-1_edit-color'></i>\n        <div className={styles.label}>Current selected element has no style options.</div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/style/style.less",
    "content": "@import '~styles/colors.less';\n\n.info {\n  position: absolute;\n  left: 0;\n  right: 0;\n  top: 40%;\n  transform: translateY(-50%);\n  text-align: center;\n  padding: 0 45px;\n\n  :global i {\n    font-size: 35px;\n    color: @chromeTextSubColor;\n    margin-bottom: 15px;\n  }\n}\n\n.label {\n  font-size: 12px;\n  color: @chromeTextSubColor;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/tab-button.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './tab-button.less';\n\nexport default class TabButton extends Component {\n  static propTypes = {\n    tab: PropTypes.string.isRequired,\n    onClick: PropTypes.func.isRequired,\n    active: PropTypes.bool.isRequired\n  };\n\n  onClick () {\n    const {onClick, tab} = this.props;\n    onClick(tab);\n  }\n\n  render () {\n    const {tab, active} = this.props;\n    return (\n      <button className={cx(styles.root, active && styles.selected)} onClick={::this.onClick}>\n        {tab}\n      </button>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/tab-button.less",
    "content": "@import '~styles/colors.less';\n\n.root {\n  display: inline-block;\n  vertical-align: top;\n  width: 33.3332%;\n  color: @chromeTextColor;\n  text-align: center;\n  font-size: 12px;\n  line-height: 49px;\n  text-transform: uppercase;\n  border-right: 1px solid @chromeBordersColor;\n\n  &:last-child {\n    border-right: 0;\n  }\n}\n\n.selected {\n  background-color: @chromeBackgroundActive;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/tabs.jsx",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './tabs.less';\nimport Layers from './layers';\nimport Settings from './settings';\nimport Style from './style';\nimport TabButton from './tab-button';\n\nexport default class Tabs extends Component {\n  static propTypes = {\n    menuTab: PropTypes.string.isRequired,\n    setMenuTab: PropTypes.func.isRequired\n  };\n\n  render () {\n    const {menuTab} = this.props;\n    return (\n      <div>\n        <div className={styles.tabs}>\n          <TabButton tab='style' active={menuTab === 'style'} onClick={this.props.setMenuTab} />\n          <TabButton tab='settings' active={menuTab === 'settings'} onClick={this.props.setMenuTab} />\n          <TabButton tab='layers' active={menuTab === 'layers'} onClick={this.props.setMenuTab} />\n        </div>\n        <div className={styles.content}>\n          {this.renderContent()}\n        </div>\n      </div>\n    );\n  }\n\n  renderContent () {\n    const {menuTab} = this.props;\n    let result;\n\n    if (menuTab === 'style') {\n      result = <Style />;\n    } else if (menuTab === 'settings') {\n      result = <Settings />;\n    } else if (menuTab === 'layers') {\n      result = <Layers />;\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/page-builder-menu/tabs/tabs.less",
    "content": "@import '~styles/colors.less';\n\n.tabs {\n  height: 50px;\n  border-bottom: 1px solid @chromeBordersColor;\n}\n\n.content {\n  position: absolute;\n  top: 50px;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/scrollable/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport GeminiScrollbar from 'react-gemini-scrollbar';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class Scrollable extends Component {\n  static propTypes = {\n    children: PropTypes.node,\n    autoshow: PropTypes.bool,\n    className: PropTypes.string\n  };\n\n  static defaultProps = {\n    autoshow: true\n  };\n\n  render () {\n    return (\n      <div className={cx(this.props.className || styles.root, styles.scrollbar)}>\n        <GeminiScrollbar autoshow={this.props.autoshow}>\n          {this.props.children}\n        </GeminiScrollbar>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/scrollable/index.less",
    "content": ".root {\n  position: absolute;\n  top: 0; left: 0; bottom: 0; right: 0;\n}\n\n.scrollbar {\n  :global {\n    /* @helper: used to measure the scrollbar width on a temporal element */\n    .gm-test {\n      width: 100px;\n      height: 100px;\n      position: absolute;\n      top: -9999px;\n      overflow: scroll;\n      -ms-overflow-style: scrollbar;\n    }\n\n    /* disable selection while dragging */\n    .gm-scrollbar-disable-selection {\n      -webkit-touch-callout: none;\n      -webkit-user-select: none;\n      -khtml-user-select: none;\n      -moz-user-select: none;\n      -ms-user-select: none;\n      user-select: none;\n    }\n\n    /* fallback for native floating scrollbars */\n    .gm-prevented {\n      -webkit-overflow-scrolling: touch;\n    }\n    .gm-prevented .gm-scrollbar {\n      display: none;\n    }\n\n\n    /* actual gemini-scrollbar styles */\n    .gm-scrollbar-container {\n      position: relative;\n      overflow: hidden!important;\n      width: 100%;\n      height: 100%;\n    }\n\n    .gm-scrollbar {\n      position: absolute;\n      right: 2px;\n      bottom: 2px;\n      z-index: 1;\n      border-radius: 3px;\n    }\n\n    .gm-scrollbar.-vertical {\n      width: 5px;\n      top: 2px;\n    }\n\n    .gm-scrollbar.-horizontal {\n      height: 6px;\n      left: 2px;\n    }\n\n    .gm-scrollbar .thumb {\n      position: relative;\n      display: block;\n      width: 0;\n      height: 0;\n      cursor: pointer;\n      border-radius: inherit;\n      background-color: rgba(0, 0, 0, 0.1);\n    }\n\n    .gm-scrollbar .thumb:hover,\n    .gm-scrollbar .thumb:active {\n      background-color: rgba(0, 0, 0, 0.4);\n    }\n\n    .gm-scrollbar.-vertical .thumb {\n      width: 100%;\n    }\n\n    .gm-scrollbar.-horizontal .thumb {\n      height: 100%;\n    }\n\n    .gm-scrollbar-container .gm-scroll-view {\n      width: 100%;\n      height: 100%;\n      overflow: scroll;\n      -webkit-overflow-scrolling: touch;\n    }\n\n    /* @option: autoshow */\n    .gm-scrollbar-container.gm-autoshow .gm-scrollbar {\n      opacity: 0;\n      transition: opacity 120ms ease-out;\n    }\n    .gm-scrollbar-container.gm-autoshow:hover .gm-scrollbar,\n    .gm-scrollbar-container.gm-autoshow:focus .gm-scrollbar {\n      opacity: 1;\n      transition: opacity 340ms ease-out;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/spinner/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class Spinner extends Component {\n  static propTypes = {\n    className: PropTypes.string,\n    small: PropTypes.bool\n  };\n\n  render () {\n    const {className, small} = this.props;\n    return (\n      <div className={cx(styles.spinner, small && styles.small, className)}></div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/spinner/index.less",
    "content": "// Bar spinner (check)\n.spinner {\n  display: inline-block;\n  font-size: 10px;\n  position: relative;\n  text-indent: -9999em;\n  border-top: 3px solid #3EB0F2;\n  border-right: 3px solid #DADADA;\n  border-bottom: 3px solid #DADADA;\n  border-left: 3px solid #DADADA;\n  -webkit-transform: translateZ(0);\n  -ms-transform: translateZ(0);\n  transform: translateZ(0);\n  -webkit-animation: sk-bar-spinner-frames 1.1s infinite linear;\n  animation: sk-bar-spinner-frames 1.1s infinite linear;\n}\n.spinner, .spinner:after {\n  border-radius: 50%;\n  width: 20px;\n  height: 20px;\n}\n.small, .small:after {\n  width: 13px;\n  height: 13px;\n}\n\n@-webkit-keyframes sk-bar-spinner-frames {.sk-bar-spinner-frames;}\n@keyframes sk-bar-spinner-frames {.sk-bar-spinner-frames;}\n\n.sk-bar-spinner-frames() {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/stick/index.jsx",
    "content": "import cx from 'classnames';\nimport Animate from 'components/animate';\nimport Component from 'components/component';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class Stick extends Component {\n  static propTypes = {\n    element: PropTypes.node.isRequired,\n    children: PropTypes.node.isRequired,\n    className: PropTypes.string,\n    transition: PropTypes.string,\n    verticalPosition: PropTypes.oneOf(['top', 'center', 'bottom']),\n    horizontalPosition: PropTypes.oneOf(['left', 'center', 'right']),\n    verticalOffset: PropTypes.number,\n    horizontalOffset: PropTypes.number,\n    onClose: PropTypes.func\n  };\n\n  static defaultProps = {\n    transition: 'fadeIn',\n    verticalPosition: 'top',\n    horizontalPosition: 'center',\n    verticalOffset: 0,\n    horizontalOffset: 0\n  };\n\n  getInitState () {\n    return {\n      left: 0,\n      top: 0\n    };\n  }\n\n  componentDidMount () {\n    this.mousewheelevt = (/Firefox/i.test(navigator.userAgent)) ? 'DOMMouseScroll' : 'mousewheel';\n    this.scrollBind = ::this.onScroll;\n    this.resizeBind = ::this.onResize;\n    this.onCloseBind = ::this.onClose;\n    document.body.addEventListener(this.mousewheelevt, this.scrollBind, false);\n    window.addEventListener('resize', this.resizeBind, false);\n    this.props.onClose && document.body.addEventListener('mousedown', this.onCloseBind, false);\n    this.updatePosition();\n  }\n\n  componentWillUnmount () {\n    document.body.removeEventListener(this.mousewheelevt, this.scrollBind);\n    window.removeEventListener('resize', this.resizeBind);\n    this.props.onClose && document.body.removeEventListener('mousedown', this.onCloseBind);\n  }\n\n  onClose (event) {\n    const rect = this.props.element.getBoundingClientRect();\n    const thisRect = this.refs.holder.getBoundingClientRect();\n\n    const outOfElement = (event.pageX < rect.left || event.pageX > rect.left + rect.width) ||\n                         (event.pageY < rect.top || event.pageY > rect.top + rect.height);\n    const outOfThis = (event.pageX < thisRect.left || event.pageX > thisRect.left + thisRect.width) ||\n                      (event.pageY < thisRect.top || event.pageY > thisRect.top + thisRect.height);\n\n    if (outOfElement && outOfThis) {\n      this.props.onClose();\n    }\n  }\n\n  onScroll () {\n    this.updatePosition();\n    this.updateTimeout = setTimeout(::this.updatePosition, 0);\n  }\n\n  onResize () {\n    this.updatePosition();\n    this.updateTimeout = setTimeout(::this.updatePosition, 10);\n  }\n\n  updatePosition () {\n    this.setState(this.getPosition());\n  }\n\n  getPosition () {\n    const position = {\n      left: 0,\n      top: 0,\n      horizontal: this.props.horizontalPosition,\n      vertical: this.props.verticalPosition\n    };\n    const rect = this.props.element.getBoundingClientRect();\n    const thisRect = this.refs.holder.getBoundingClientRect();\n    const windowHeight = window.innerHeight;\n    const windowWidth = window.innerWidth;\n\n    switch (this.props.horizontalPosition) {\n      case 'left':\n        position.left = rect.left;\n        break;\n      case 'center':\n        position.left = rect.left + rect.width / 2 - thisRect.width / 2;\n        break;\n      case 'right':\n        position.left = rect.left + rect.width - thisRect.width;\n        break;\n      default:\n        position.left = 0;\n    }\n    position.left += this.props.horizontalOffset;\n\n    switch (this.props.verticalPosition) {\n      case 'top':\n        position.top = rect.top - thisRect.height;\n        break;\n      case 'center':\n        position.top = rect.top + rect.height / 2 - thisRect.height / 2;\n        break;\n      case 'bottom':\n        position.top = rect.top + rect.height;\n        break;\n      default:\n        position.top = 0;\n    }\n    position.top += this.props.verticalOffset;\n\n    // Overflows\n    if (position.top + thisRect.height > windowHeight) {\n      position.top = rect.top - thisRect.height - this.props.verticalOffset;\n      position.vertical = 'top';\n    }\n    if (position.left + thisRect.width > windowWidth) {\n      position.left = rect.left + rect.width - thisRect.width - this.props.horizontalOffset;\n      position.horizontal = 'right';\n    }\n\n    return position;\n  }\n\n  render () {\n    const {transition, className} = this.props;\n    // const {vertical, horizontal} = this.state;\n    const style = {\n      left: this.state.left,\n      top: this.state.top\n    };\n\n    return (\n      <Animate transition={transition} duration={300}>\n        <div className={cx(styles.stick, className)} style={style} ref='holder'>\n          {this.props.children}\n        </div>\n      </Animate>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/stick/index.less",
    "content": ".stick {\n  position: absolute;\n  top: 0; left: 0;\n  display: inline-block;\n  z-index: 11;\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/upload/index.jsx",
    "content": "import cx from 'classnames';\nimport Component from 'components/component';\nimport ReactDropzone from 'react-dropzone';\nimport React, {PropTypes} from 'react';\n\nimport styles from './index.less';\n\nexport default class Upload extends Component {\n  static propTypes = {\n    accept: PropTypes.string,\n    clickable: PropTypes.bool,\n    children: PropTypes.node,\n    onFiles: PropTypes.func.isRequired,\n    className: PropTypes.string,\n    activeClassName: PropTypes.string,\n    rejectClassName: PropTypes.string,\n    showInfos: PropTypes.bool\n  };\n\n  static defaultProps = {\n    accept: 'image/*,video/*,audio/*',\n    clickable: true,\n    droppable: true,\n    showInfos: true\n  };\n\n  onDrop (files) {\n    this.props.onFiles(files);\n    // files.forEach((file) => {\n    //   const reader = new FileReader();\n    //   reader.onload = (event) => {\n    //     this.props.onFile({\n    //       file: event.target.result,\n    //       filename: file.name\n    //     }, file);\n    //   };\n    //   reader.readAsDataURL(file);\n    // });\n  }\n\n  render () {\n    const {className, activeClassName, rejectClassName} = this.props;\n\n    return (\n      <ReactDropzone\n        className={cx(className || 'dropzone')}\n        activeClassName={cx(activeClassName || styles.active)}\n        rejectClassName={cx(rejectClassName || styles.reject)}\n        onDropAccepted={::this.onDrop}\n        disableClick={!this.props.clickable}\n        accept={this.props.accept}\n      >\n        {this.renderInfos()}\n        {this.props.children}\n      </ReactDropzone>\n    );\n  }\n\n  renderInfos () {\n    if (this.props.showInfos) {\n      return (\n        <div>\n          <div className={styles.canDrop}>Release your file(s) to upload</div>\n          <div className={styles.cannotDrop}>You're dragging invalid files</div>\n        </div>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/components/upload/index.less",
    "content": "@import '~styles/colors.less';\n\n.canDrop, .cannotDrop {\n  visibility: hidden;\n  position: absolute;\n  top: 10px;\n  left: 50%;\n  transform: translateX(-50%);\n  border-radius: 3px;\n  pointer-events: none;\n  border: 1px solid @primary;\n  background-color: rgba(17, 164, 255, 0.75);\n  color: #ffffff;\n  font-size: 12px;\n  line-height: 28px;\n  text-align: center;\n  width: 280px;\n  z-index: 1;\n}\n.cannotDrop {\n  border-color: #F55151;\n  background-color: rgba(255, 17, 17, 0.75);\n}\n\n.active {\n  .canDrop {\n    visibility: visible;\n  }\n  &:after {\n    content: ' ';\n    position: absolute;\n    top: 0; right: 0; bottom: 0; left: 0;\n    border: 5px solid @primary;\n  }\n}\n\n.reject {\n  .cannotDrop {\n    visibility: visible;\n  }\n  &:after {\n    content: ' ';\n    position: absolute;\n    top: 0; right: 0; bottom: 0; left: 0;\n    border: 5px solid #F55151;\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/admin/shared/helpers/input-options-map.js",
    "content": "import BorderPicker from 'components/input-options/border';\nimport BorderStyle from 'components/input-options/border-style';\nimport BoxShadow from 'components/input-options/box-shadow';\nimport Button from 'components/input-options/button';\nimport Checkbox from 'components/input-options/checkbox';\nimport ColorPicker from 'components/input-options/color';\nimport ColumnsManager from 'components/input-options/columns';\nimport Combobox from 'components/input-options/combobox';\nimport CornersPicker from 'components/input-options/corners';\nimport Filters from 'components/input-options/filters';\nimport FontPicker from 'components/input-options/font';\nimport HtmlArea from 'components/input-options/rich-text';\nimport IconPicker from 'components/input-options/icon';\nimport ImagePicker from 'components/input-options/image';\nimport Input from 'components/input-options/input';\nimport MenuPicker from 'components/input-options/menu';\nimport NumberInput from 'components/input-options/number';\nimport Optional from 'components/input-options/optional';\nimport PagePicker from 'components/input-options/page';\nimport SchemaPicker from 'components/input-options/schema';\nimport Section from 'components/input-options/section';\nimport ShadowPosition from 'components/input-options/shadow-position';\nimport Sorts from 'components/input-options/sorts';\nimport SpacingPicker from 'components/input-options/spacing';\nimport TextShadow from 'components/input-options/text-shadow';\n\nexport const TypesOptionsMap = {\n  Color: ColorPicker,\n  String: Input,\n  Image: ImagePicker,\n  Audio: ImagePicker,\n  Select: Combobox,\n  SchemaPicker,\n  MenuPicker,\n  PagePicker,\n  Number: NumberInput,\n  Pixels: NumberInput,\n  Percentage: NumberInput,\n  Padding: SpacingPicker,\n  Margin: SpacingPicker,\n  Boolean: Checkbox,\n  Font: FontPicker,\n  Button,\n  Icon: IconPicker,\n  Corners: CornersPicker,\n  ManageColumns: ColumnsManager,\n  Border: BorderPicker,\n  LineStyle: BorderStyle,\n  Optional,\n  Section,\n  Html: HtmlArea,\n  Filters,\n  Sorts,\n  TextShadow,\n  BoxShadow,\n  ShadowPosition,\n  Date: NumberInput\n};\n\nexport const TypesOptionsDefaultProps = {\n  Pixels: {\n    allowed: ['px']\n  },\n  Percentage: {\n    min: 0,\n    max: 100,\n    allowed: ['%']\n  },\n  Padding: {\n    type: 'padding'\n  },\n  Margin: {\n    type: 'margin'\n  },\n  Audio: {\n    width: 50,\n    height: 50,\n    type: 'audio'\n  }\n};\n"
  },
  {
    "path": "lib/shared/screens/auth/components/logo/index.jsx",
    "content": "import React from 'react';\nimport Component from 'components/component';\n\nimport styles from './index.less';\n\nexport default class Logo extends Component {\n  render () {\n    return (\n      <div className={styles.logo}>\n        <img src='/images/admin/logo_big.png' width='150' />\n        <div className={styles.version}>beta</div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/auth/components/logo/index.less",
    "content": "@import '~styles/colors.less';\n\n.logo {\n  text-align: center;\n  position: relative;\n  display: inline-block;\n  margin-bottom: 30px;\n}\n\n.version {\n  position: absolute;\n  background-color: @primary;\n  right: -10px;\n  top: 0;\n  display: inline-block;\n  font-size: 9px;\n  color: #ffffff;\n  border-radius: 4px;\n  padding: 1px 4px;\n}\n"
  },
  {
    "path": "lib/shared/screens/auth/index.css",
    "content": ".content {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  max-width: 100%;\n  width: 400px;\n  text-align: center;\n  font-family: 'Open Sans';\n}\n"
  },
  {
    "path": "lib/shared/screens/auth/index.jsx",
    "content": "import 'styles/normalize.less';\nimport 'styles/nucleo/index.less';\n\nimport React, {PropTypes} from 'react';\nimport Component from 'components/component';\n\nimport styles from './index.css';\nimport Logo from './components/logo';\n\nexport default class Auth extends Component {\n  static propTypes = {\n    children: PropTypes.node.isRequired\n  };\n\n  render () {\n    return (\n      <div className={styles.content}>\n        <Logo />\n        {this.props.children}\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/auth/screens/init/components/init.jsx",
    "content": "import authStyles from 'styles/auth.less';\nimport Button from 'components/button';\nimport React, {PropTypes} from 'react';\nimport Component from 'components/component';\n\nexport default class Init extends Component {\n  static propTypes = {\n    onChange: PropTypes.func.isRequired,\n    onSubmit: PropTypes.func.isRequired,\n    user: PropTypes.object,\n    error: PropTypes.string\n  };\n\n  onChange (id, event) {\n    this.props.onChange(id, event.target.value);\n  }\n\n  render () {\n    const {username, password, name, email} = this.props.user;\n\n    return (\n      <div>\n        <div className={authStyles.title}>Welcome to Relax!</div>\n        <div className={authStyles.subTitle}>Register the first user to start building your website in a breeze.</div>\n        <form className={authStyles.form} onSubmit={this.props.onSubmit}>\n          <label>\n            <i className='nc-icon-outline users_single-03'></i>\n            <input type='text' name='username' placeholder='Username' value={username} onChange={this.onChange.bind(this, 'username')} />\n          </label>\n          <label>\n            <i className='nc-icon-outline ui-1_lock'></i>\n            <input type='password' name='password' placeholder='Password' value={password} onChange={this.onChange.bind(this, 'password')} />\n          </label>\n          <label>\n            <i className='nc-icon-outline users_circle-08'></i>\n            <input type='text' name='name' placeholder='Name' value={name} onChange={this.onChange.bind(this, 'name')} />\n          </label>\n          <label>\n            <i className='nc-icon-outline ui-1_email-85'></i>\n            <input type='text' name='email' placeholder='Email' value={email} onChange={this.onChange.bind(this, 'email')} />\n          </label>\n          <Button primary full big onClick={this.props.onSubmit} style={{marginTop: 40}}>Let's get started</Button>\n          {<div className='error'>{this.props.error && this.props.error || ' '}</div>}\n          <input type='submit' hidden />\n        </form>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/auth/screens/init/index.js",
    "content": "import Component from 'components/component';\nimport React, {PropTypes} from 'react';\nimport {addUser} from 'actions/users';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport AdminInit from './components/init';\n\n@connect(\n  () => ({}),\n  (dispatch) => bindActionCreators({addUser}, dispatch)\n)\nexport default class Init extends Component {\n  static propTypes = {\n    addUser: PropTypes.func.isRequired\n  };\n\n  getInitState () {\n    return {\n      user: {\n        username: '',\n        name: '',\n        password: '',\n        email: ''\n      }\n    };\n  }\n\n  onChange (id, value) {\n    this.state.user[id] = value;\n    this.setState({\n      user: this.state.user\n    });\n  }\n\n  onSubmit (event) {\n    event.preventDefault();\n\n    this.props\n      .addUser({\n        users: {\n          _id: 1\n        }\n      }, {\n        ...this.state.user\n      })\n      .then(() => {\n        window.location = '/admin/login';\n      })\n      .done();\n  }\n\n  render () {\n    return (\n      <AdminInit\n        {...this.props}\n        {...this.state}\n        onChange={::this.onChange}\n        onSubmit={::this.onSubmit}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/auth/screens/login/components/login.jsx",
    "content": "import authStyles from 'styles/auth.less';\nimport Button from 'components/button';\nimport React, {PropTypes} from 'react';\nimport Component from 'components/component';\n\nexport default class Login extends Component {\n  static propTypes = {\n    onSubmit: PropTypes.func.isRequired,\n    fieldChange: PropTypes.func.isRequired,\n    username: PropTypes.string.isRequired,\n    password: PropTypes.string.isRequired,\n    error: PropTypes.string\n  };\n\n  onChange (id, event) {\n    this.props.fieldChange(id, event.target.value);\n  }\n\n  render () {\n    return (\n      <div>\n        <div className={authStyles.title}>Welcome back!</div>\n        <div className={authStyles.subTitle}>Login with your account below to get started</div>\n        <form className={authStyles.form} onSubmit={this.props.onSubmit}>\n          <label>\n            <i className='nc-icon-outline users_single-03'></i>\n            <input type='text' name='username' placeholder='Username' value={this.props.username} onChange={this.onChange.bind(this, 'username')} />\n          </label>\n          <label>\n            <i className='nc-icon-outline ui-1_lock'></i>\n            <input type='password' name='password' placeholder='Password' value={this.props.password} onChange={this.onChange.bind(this, 'password')} />\n          </label>\n          <Button primary full big onClick={this.props.onSubmit} style={{marginTop: 40}}>Let's get started</Button>\n          {<div className={authStyles.error}>{this.props.error && this.props.error || ' '}</div>}\n          <input type='submit' hidden />\n        </form>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/auth/screens/login/index.js",
    "content": "import request from 'superagent';\nimport React, {PropTypes} from 'react';\nimport Component from 'components/component';\n\nimport Login from './components/login';\n\nexport default class LoginContainer extends Component {\n  static propTypes = {\n    history: PropTypes.object.isRequired\n  };\n\n  getInitState () {\n    return {\n      username: '',\n      password: ''\n    };\n  }\n\n  onSubmit (event) {\n    event.preventDefault();\n    const {username, password} = this.state;\n\n    request\n      .post('/admin/login')\n      .set('Content-Type', 'application/json')\n      .set('Accept', 'application/json')\n      .send({username, password})\n      .end((error, res) => {\n        if (error) {\n          this.setState({\n            error: res.body.message\n          });\n        } else {\n          window.location.href = '/admin';\n        }\n      });\n  }\n\n  fieldChange (id, value) {\n    this.setState({\n      [id]: value\n    });\n  }\n\n  render () {\n    return (\n      <Login\n        ref='login'\n        {...this.props}\n        {...this.state}\n        onSubmit={::this.onSubmit}\n        fieldChange={::this.fieldChange}\n      />\n    );\n  }\n}\n"
  },
  {
    "path": "lib/shared/screens/auth/shared/styles/auth.less",
    "content": "@import '~styles/colors.less';\n\n.title {\n  font-size: 34px;\n  line-height: 44px;\n  font-weight: 400;\n  margin: 0;\n  color: #454545;\n}\n\n.subTitle {\n  font-size: 14px;\n  line-height: 20px;\n  font-weight: 300;\n  margin: 0;\n  color: #454545;\n}\n\n.form {\n  margin-top: 40px;\n  text-align: left;\n  width: 334px;\n  max-width: 100%;\n  display: inline-block;\n\n  :global {\n    label {\n      display: block;\n      margin-bottom: 21px;\n      border-bottom: 1px solid #e1e1e1;\n      padding: 0px 7px;\n\n      input {\n        font-size: 13px;\n        border: 0;\n        outline: 0;\n        font-weight: 300;\n        color: #454545;\n        width: 280px;\n\n        &::-webkit-input-placeholder {\n          color: #9b9b9b;\n        }\n        &:-moz-placeholder {\n          color: #9b9b9b;\n        }\n        &::-moz-placeholder {\n          color: #9b9b9b;\n        }\n        &:-ms-input-placeholder {\n          color: #9b9b9b;\n        }\n        &::-ms-input-placeholder {\n          color: #9b9b9b;\n        }\n        &:placeholder-shown {\n          color: #9b9b9b;\n        }\n        &:focus {\n          border-color: @primary;\n        }\n      }\n      i, input {\n        display: inline-block;\n        vertical-align: top;\n        line-height: 35px;\n        color: #9b9b9b;\n      }\n      i {\n        width: 20px;\n        text-align: center;\n        font-size: 16px;\n        margin-right: 18px;\n      }\n    }\n  }\n}\n\n.error {\n  font-size: 11px;\n  color: @alert;\n  margin-top: 10px;\n  text-align: center;\n}\n"
  },
  {
    "path": "lib/shared/styles/colors.less",
    "content": "@primary: #12A5FF;\n@primaryLight: lighten(@primary, 20%);\n@primaryDarker: darken(@primary, 20%);\n@primarySub: #73CAFF;\n@primaryBack: #DFF3FF;\n\n@alert: #ff0000;\n@success: #17B923;\n@draft: #F7CF00;\n\n@chromeBackgroundColor: #33363b;\n@chromeBackgroundDarkerColor: #2c2f34;\n@chromeBackgroundActive: #3f4249;\n@chromeBordersColor: #494949;\n@chromeTextColor: #efefef;\n@chromeTextSubColor: #999999;\n@chromeTextColorHighlight: #ffffff;\n\n@dropSuccess: #7ED321;\n@dropSuccessBack: fade(#7ED321, 10%);\n\n@adminBorders: #efefef;\n@adminInputBorders: #cccccc;\n@adminText: #999999;\n@adminTextSub: #dbdbdb;\n@adminTextHighlight: #3a3a3a;\n@adminBordersInputs: #E1E1E1;\n"
  },
  {
    "path": "lib/shared/styles/element.less",
    "content": ".editingWrapper {\n  position: relative;\n\n  .editingCover {\n    position: absolute;\n    top: 0; left: 0; right: 0; bottom: 0;\n    background-color: rgba(255, 255, 255, 0);\n    transition: all 0.2s ease-out;\n  }\n\n  &:hover .editingCover {\n    background-color: rgba(255, 255, 255, 0.2);\n  }\n}\n\n.dummy {\n  background-color: #efefef;\n  height: 200px;\n  text-align: center;\n  max-height: 100%;\n\n  :global i {\n    font-size: 25px;\n    color: #333333;\n    top: 50%;\n    position: relative;\n    transform: translateY(-50%);\n  }\n}\n"
  },
  {
    "path": "lib/shared/styles/normalize.less",
    "content": "/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS text size adjust after orientation change, without disabling\n *    user zoom.\n */\n\nhtml {\n  font-family: sans-serif; /* 1 */\n  -ms-text-size-adjust: 100%; /* 2 */\n  -webkit-text-size-adjust: 100%; /* 2 */\n}\n\nform {\n  margin: 0;\n}\n\n// Reset button tag style\nbutton {\n  outline: 0;\n  background: transparent;\n  border: 0;\n  padding: 0;\n}\n\niframe {\n  border: 0;\n}\n\n/**\n * Remove default margin.\n */\n\nbody {\n  margin: 0;\n}\n\n* {\n  box-sizing: border-box;\n}\n\n/* HTML5 display definitions\n   ========================================================================== */\n\n/**\n * Correct `block` display not defined for any HTML5 element in IE 8/9.\n * Correct `block` display not defined for `details` or `summary` in IE 10/11\n * and Firefox.\n * Correct `block` display not defined for `main` in IE 11.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; /* 1 */\n  vertical-align: baseline; /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9/10.\n * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n */\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n/* Links\n   ========================================================================== */\n\n/**\n * Remove the gray background color from active links in IE 10.\n */\n\na {\n  background-color: transparent;\n}\n\n/**\n * Improve readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n  outline: 0;\n}\n\n/* Text-level semantics\n   ========================================================================== */\n\n/**\n * Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n */\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n */\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n/**\n * Address styling not present in Safari and Chrome.\n */\n\ndfn {\n  font-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari, and Chrome.\n */\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\n\nsmall {\n  font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n/* Embedded content\n   ========================================================================== */\n\n/**\n * Remove border when inside `a` element in IE 8/9/10.\n */\n\nimg {\n  border: 0;\n}\n\n/**\n * Correct overflow not hidden in IE 9/10/11.\n */\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n/* Grouping content\n   ========================================================================== */\n\n/**\n * Address margin not present in IE 8/9 and Safari.\n */\n\nfigure {\n  margin: 1em 40px;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\n\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\n\npre {\n  overflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n/* Forms\n   ========================================================================== */\n\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n\n/**\n * 1. Correct color not being inherited.\n *    Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; /* 1 */\n  font: inherit; /* 2 */\n  margin: 0; /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10/11.\n */\n\nbutton {\n  overflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n * Correct `select` style inheritance in Firefox.\n */\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n *    and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n *    `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; /* 2 */\n  cursor: pointer; /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\ninput {\n  line-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; /* 1 */\n  padding: 0; /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n *    (include `-moz` to future-proof).\n */\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; /* 1 */\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box; /* 2 */\n  box-sizing: content-box;\n}\n\n/**\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the search input has\n * padding (and `textfield` appearance).\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9/10/11.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n  border: 0; /* 1 */\n  padding: 0; /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9/10/11.\n */\n\ntextarea {\n  overflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\n\noptgroup {\n  font-weight: bold;\n}\n\n/* Tables\n   ========================================================================== */\n\n/**\n * Remove most spacing between table cells.\n */\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n\nbody{\n  overflow-x: hidden;\n}\n\n/*\n* Remove text-shadow in selection highlight:\n* https://twitter.com/miketaylr/status/12228805301\n*\n* These selection rule sets have to be separate.\n* Customize the background color to match your design.\n*/\n\n::-moz-selection {\n  background: #b3d4fc;\n  text-shadow: none;\n}\n\n::selection {\n  background: #b3d4fc;\n  text-shadow: none;\n}\n\n/*\n* A better looking default horizontal rule\n*/\n\nhr {\n  display: block;\n  height: 1px;\n  border: 0;\n  border-top: 1px solid #ccc;\n  margin: 1em 0;\n  padding: 0;\n}\n\n/*\n* Remove the gap between audio, canvas, iframes,\n* images, videos and the bottom of their containers:\n* https://github.com/h5bp/html5-boilerplate/issues/440\n*/\n\naudio,\ncanvas,\niframe,\nimg,\nsvg,\nvideo {\n  vertical-align: middle;\n}\n\n/*\n* Remove default fieldset styles.\n*/\n\nfieldset {\n  border: 0;\n  margin: 0;\n  padding: 0;\n}\n\n/*\n* Allow only vertical resizing of textareas.\n*/\n\ntextarea {\n  resize: vertical;\n}\n"
  },
  {
    "path": "lib/shared/styles/nucleo/index.less",
    "content": "@import './outline/less/nucleo-outline.less';\n@import './mini/less/nucleo-mini.less';\n"
  },
  {
    "path": "lib/shared/styles/nucleo/mini/less/icons.less",
    "content": "/*------------------------\n\tfont icons\n-------------------------*/\n\n.nc-icon-mini.envir_bulb-saver:before {\n    content: \"\\ee5c\";\n}\n.nc-icon-mini.envir_bulb:before {\n    content: \"\\ee5d\";\n}\n.nc-icon-mini.envir_car:before {\n    content: \"\\ee5e\";\n}\n.nc-icon-mini.envir_fuel-electric:before {\n    content: \"\\ee5f\";\n}\n.nc-icon-mini.envir_fuel:before {\n    content: \"\\ee60\";\n}\n.nc-icon-mini.envir_home:before {\n    content: \"\\ee61\";\n}\n.nc-icon-mini.envir_level:before {\n    content: \"\\ee62\";\n}\n.nc-icon-mini.envir_panel:before {\n    content: \"\\ee63\";\n}\n.nc-icon-mini.envir_radiation:before {\n    content: \"\\ee64\";\n}\n.nc-icon-mini.envir_recycling:before {\n    content: \"\\ee65\";\n}\n.nc-icon-mini.envir_save-planet:before {\n    content: \"\\ee66\";\n}\n.nc-icon-mini.envir_waste-danger:before {\n    content: \"\\ee67\";\n}\n.nc-icon-mini.envir_waste-recycling:before {\n    content: \"\\ee68\";\n}\n.nc-icon-mini.envir_waste:before {\n    content: \"\\ee69\";\n}\n.nc-icon-mini.envir_water-hand:before {\n    content: \"\\ee6a\";\n}\n.nc-icon-mini.envir_water-sink:before {\n    content: \"\\ee6b\";\n}\n.nc-icon-mini.envir_water:before {\n    content: \"\\ee6c\";\n}\n.nc-icon-mini.envir_wind:before {\n    content: \"\\ee6d\";\n}\n.nc-icon-mini.arrows-1_back-78:before {\n    content: \"\\e900\";\n}\n.nc-icon-mini.arrows-1_back-80:before {\n    content: \"\\e901\";\n}\n.nc-icon-mini.arrows-1_bold-down:before {\n    content: \"\\e902\";\n}\n.nc-icon-mini.arrows-1_bold-left:before {\n    content: \"\\e903\";\n}\n.nc-icon-mini.arrows-1_bold-right:before {\n    content: \"\\e904\";\n}\n.nc-icon-mini.arrows-1_bold-up:before {\n    content: \"\\e905\";\n}\n.nc-icon-mini.arrows-1_circle-down-12:before {\n    content: \"\\e906\";\n}\n.nc-icon-mini.arrows-1_circle-down-40:before {\n    content: \"\\e907\";\n}\n.nc-icon-mini.arrows-1_circle-left-10:before {\n    content: \"\\e908\";\n}\n.nc-icon-mini.arrows-1_circle-left-38:before {\n    content: \"\\e909\";\n}\n.nc-icon-mini.arrows-1_circle-right-09:before {\n    content: \"\\e90a\";\n}\n.nc-icon-mini.arrows-1_circle-right-37:before {\n    content: \"\\e90b\";\n}\n.nc-icon-mini.arrows-1_circle-up-11:before {\n    content: \"\\e90c\";\n}\n.nc-icon-mini.arrows-1_circle-up-39:before {\n    content: \"\\e90d\";\n}\n.nc-icon-mini.arrows-1_cloud-download-95:before {\n    content: \"\\e90e\";\n}\n.nc-icon-mini.arrows-1_cloud-upload-96:before {\n    content: \"\\e90f\";\n}\n.nc-icon-mini.arrows-1_curved-next:before {\n    content: \"\\e910\";\n}\n.nc-icon-mini.arrows-1_curved-previous:before {\n    content: \"\\e911\";\n}\n.nc-icon-mini.arrows-1_direction-53:before {\n    content: \"\\e912\";\n}\n.nc-icon-mini.arrows-1_direction-56:before {\n    content: \"\\e913\";\n}\n.nc-icon-mini.arrows-1_double-left:before {\n    content: \"\\e914\";\n}\n.nc-icon-mini.arrows-1_double-right:before {\n    content: \"\\e915\";\n}\n.nc-icon-mini.arrows-1_download:before {\n    content: \"\\e916\";\n}\n.nc-icon-mini.arrows-1_enlarge-diagonal-43:before {\n    content: \"\\e917\";\n}\n.nc-icon-mini.arrows-1_enlarge-diagonal-44:before {\n    content: \"\\e918\";\n}\n.nc-icon-mini.arrows-1_enlarge-horizontal:before {\n    content: \"\\e919\";\n}\n.nc-icon-mini.arrows-1_enlarge-vertical:before {\n    content: \"\\e91a\";\n}\n.nc-icon-mini.arrows-1_fullscreen-70:before {\n    content: \"\\e91b\";\n}\n.nc-icon-mini.arrows-1_fullscreen-71:before {\n    content: \"\\e91c\";\n}\n.nc-icon-mini.arrows-1_fullscreen-76:before {\n    content: \"\\e91d\";\n}\n.nc-icon-mini.arrows-1_fullscreen-77:before {\n    content: \"\\e91e\";\n}\n.nc-icon-mini.arrows-1_fullscreen-double-74:before {\n    content: \"\\e91f\";\n}\n.nc-icon-mini.arrows-1_fullscreen-double-75:before {\n    content: \"\\e920\";\n}\n.nc-icon-mini.arrows-1_fullscreen-split-72:before {\n    content: \"\\e921\";\n}\n.nc-icon-mini.arrows-1_fullscreen-split-73:before {\n    content: \"\\e922\";\n}\n.nc-icon-mini.arrows-1_log-in:before {\n    content: \"\\e923\";\n}\n.nc-icon-mini.arrows-1_log-out:before {\n    content: \"\\e924\";\n}\n.nc-icon-mini.arrows-1_loop-82:before {\n    content: \"\\e925\";\n}\n.nc-icon-mini.arrows-1_minimal-down:before {\n    content: \"\\e926\";\n}\n.nc-icon-mini.arrows-1_minimal-left:before {\n    content: \"\\e927\";\n}\n.nc-icon-mini.arrows-1_minimal-right:before {\n    content: \"\\e928\";\n}\n.nc-icon-mini.arrows-1_minimal-up:before {\n    content: \"\\e929\";\n}\n.nc-icon-mini.arrows-1_redo-79:before {\n    content: \"\\e92a\";\n}\n.nc-icon-mini.arrows-1_redo-81:before {\n    content: \"\\e92b\";\n}\n.nc-icon-mini.arrows-1_refresh-68:before {\n    content: \"\\e92c\";\n}\n.nc-icon-mini.arrows-1_refresh-69:before {\n    content: \"\\e92d\";\n}\n.nc-icon-mini.arrows-1_round-down:before {\n    content: \"\\e92e\";\n}\n.nc-icon-mini.arrows-1_round-left:before {\n    content: \"\\e92f\";\n}\n.nc-icon-mini.arrows-1_round-right:before {\n    content: \"\\e930\";\n}\n.nc-icon-mini.arrows-1_round-up:before {\n    content: \"\\e931\";\n}\n.nc-icon-mini.arrows-1_share-66:before {\n    content: \"\\e932\";\n}\n.nc-icon-mini.arrows-1_share-91:before {\n    content: \"\\e933\";\n}\n.nc-icon-mini.arrows-1_share-92:before {\n    content: \"\\e934\";\n}\n.nc-icon-mini.arrows-1_shuffle-97:before {\n    content: \"\\e935\";\n}\n.nc-icon-mini.arrows-1_shuffle-98:before {\n    content: \"\\e936\";\n}\n.nc-icon-mini.arrows-1_simple-down:before {\n    content: \"\\e937\";\n}\n.nc-icon-mini.arrows-1_simple-left:before {\n    content: \"\\e938\";\n}\n.nc-icon-mini.arrows-1_simple-right:before {\n    content: \"\\e939\";\n}\n.nc-icon-mini.arrows-1_simple-up:before {\n    content: \"\\e93a\";\n}\n.nc-icon-mini.arrows-1_small-triangle-down:before {\n    content: \"\\e93b\";\n}\n.nc-icon-mini.arrows-1_small-triangle-left:before {\n    content: \"\\e93c\";\n}\n.nc-icon-mini.arrows-1_small-triangle-right:before {\n    content: \"\\e93d\";\n}\n.nc-icon-mini.arrows-1_small-triangle-up:before {\n    content: \"\\e93e\";\n}\n.nc-icon-mini.arrows-1_square-down:before {\n    content: \"\\e93f\";\n}\n.nc-icon-mini.arrows-1_square-left:before {\n    content: \"\\e940\";\n}\n.nc-icon-mini.arrows-1_square-right:before {\n    content: \"\\e941\";\n}\n.nc-icon-mini.arrows-1_square-up:before {\n    content: \"\\e942\";\n}\n.nc-icon-mini.arrows-1_strong-down:before {\n    content: \"\\e943\";\n}\n.nc-icon-mini.arrows-1_strong-left:before {\n    content: \"\\e944\";\n}\n.nc-icon-mini.arrows-1_strong-right:before {\n    content: \"\\e945\";\n}\n.nc-icon-mini.arrows-1_strong-up:before {\n    content: \"\\e946\";\n}\n.nc-icon-mini.arrows-1_tail-down:before {\n    content: \"\\e947\";\n}\n.nc-icon-mini.arrows-1_tail-left:before {\n    content: \"\\e948\";\n}\n.nc-icon-mini.arrows-1_tail-right:before {\n    content: \"\\e949\";\n}\n.nc-icon-mini.arrows-1_tail-triangle-down:before {\n    content: \"\\e94a\";\n}\n.nc-icon-mini.arrows-1_tail-triangle-left:before {\n    content: \"\\e94b\";\n}\n.nc-icon-mini.arrows-1_tail-triangle-right:before {\n    content: \"\\e94c\";\n}\n.nc-icon-mini.arrows-1_tail-triangle-up:before {\n    content: \"\\e94d\";\n}\n.nc-icon-mini.arrows-1_tail-up:before {\n    content: \"\\e94e\";\n}\n.nc-icon-mini.arrows-1_trend-down:before {\n    content: \"\\e94f\";\n}\n.nc-icon-mini.arrows-1_trend-up:before {\n    content: \"\\e950\";\n}\n.nc-icon-mini.arrows-1_triangle-down-20:before {\n    content: \"\\e951\";\n}\n.nc-icon-mini.arrows-1_triangle-down-65:before {\n    content: \"\\e952\";\n}\n.nc-icon-mini.arrows-1_triangle-left-18:before {\n    content: \"\\e953\";\n}\n.nc-icon-mini.arrows-1_triangle-left-63:before {\n    content: \"\\e954\";\n}\n.nc-icon-mini.arrows-1_triangle-right-17:before {\n    content: \"\\e955\";\n}\n.nc-icon-mini.arrows-1_triangle-right-62:before {\n    content: \"\\e956\";\n}\n.nc-icon-mini.arrows-1_triangle-up-19:before {\n    content: \"\\e957\";\n}\n.nc-icon-mini.arrows-1_triangle-up-64:before {\n    content: \"\\e958\";\n}\n.nc-icon-mini.arrows-1_zoom-88:before {\n    content: \"\\e959\";\n}\n.nc-icon-mini.arrows-2_block-down:before {\n    content: \"\\e95a\";\n}\n.nc-icon-mini.arrows-2_block-left:before {\n    content: \"\\e95b\";\n}\n.nc-icon-mini.arrows-2_block-right:before {\n    content: \"\\e95c\";\n}\n.nc-icon-mini.arrows-2_block-up:before {\n    content: \"\\e95d\";\n}\n.nc-icon-mini.arrows-2_conversion:before {\n    content: \"\\e95e\";\n}\n.nc-icon-mini.arrows-2_corner-down-round:before {\n    content: \"\\e95f\";\n}\n.nc-icon-mini.arrows-2_corner-down:before {\n    content: \"\\e960\";\n}\n.nc-icon-mini.arrows-2_corner-left-down:before {\n    content: \"\\e961\";\n}\n.nc-icon-mini.arrows-2_corner-left-round:before {\n    content: \"\\e962\";\n}\n.nc-icon-mini.arrows-2_corner-left:before {\n    content: \"\\e963\";\n}\n.nc-icon-mini.arrows-2_corner-right-down:before {\n    content: \"\\e964\";\n}\n.nc-icon-mini.arrows-2_corner-right-round:before {\n    content: \"\\e965\";\n}\n.nc-icon-mini.arrows-2_corner-right:before {\n    content: \"\\e966\";\n}\n.nc-icon-mini.arrows-2_corner-up-left:before {\n    content: \"\\e967\";\n}\n.nc-icon-mini.arrows-2_corner-up-right:before {\n    content: \"\\e968\";\n}\n.nc-icon-mini.arrows-2_corner-up-round:before {\n    content: \"\\e969\";\n}\n.nc-icon-mini.arrows-2_corner-up:before {\n    content: \"\\e96a\";\n}\n.nc-icon-mini.arrows-2_cross-down:before {\n    content: \"\\e96b\";\n}\n.nc-icon-mini.arrows-2_cross-left:before {\n    content: \"\\e96c\";\n}\n.nc-icon-mini.arrows-2_cross-right:before {\n    content: \"\\e96d\";\n}\n.nc-icon-mini.arrows-2_cross-up:before {\n    content: \"\\e96e\";\n}\n.nc-icon-mini.arrows-2_delete-49:before {\n    content: \"\\e96f\";\n}\n.nc-icon-mini.arrows-2_delete-50:before {\n    content: \"\\e970\";\n}\n.nc-icon-mini.arrows-2_direction:before {\n    content: \"\\e971\";\n}\n.nc-icon-mini.arrows-2_dots-download:before {\n    content: \"\\e972\";\n}\n.nc-icon-mini.arrows-2_dots-upload:before {\n    content: \"\\e973\";\n}\n.nc-icon-mini.arrows-2_eject:before {\n    content: \"\\e974\";\n}\n.nc-icon-mini.arrows-2_enlarge-circle:before {\n    content: \"\\e975\";\n}\n.nc-icon-mini.arrows-2_file-download-87:before {\n    content: \"\\e976\";\n}\n.nc-icon-mini.arrows-2_file-upload-86:before {\n    content: \"\\e977\";\n}\n.nc-icon-mini.arrows-2_hit-down:before {\n    content: \"\\e978\";\n}\n.nc-icon-mini.arrows-2_hit-left:before {\n    content: \"\\e979\";\n}\n.nc-icon-mini.arrows-2_hit-right:before {\n    content: \"\\e97a\";\n}\n.nc-icon-mini.arrows-2_hit-up:before {\n    content: \"\\e97b\";\n}\n.nc-icon-mini.arrows-2_log-out:before {\n    content: \"\\e97c\";\n}\n.nc-icon-mini.arrows-2_move-down-right:before {\n    content: \"\\e97d\";\n}\n.nc-icon-mini.arrows-2_move-down:before {\n    content: \"\\e97e\";\n}\n.nc-icon-mini.arrows-2_move-left:before {\n    content: \"\\e97f\";\n}\n.nc-icon-mini.arrows-2_move-right:before {\n    content: \"\\e980\";\n}\n.nc-icon-mini.arrows-2_move-up-left:before {\n    content: \"\\e981\";\n}\n.nc-icon-mini.arrows-2_move-up:before {\n    content: \"\\e982\";\n}\n.nc-icon-mini.arrows-2_push-next:before {\n    content: \"\\e983\";\n}\n.nc-icon-mini.arrows-2_push-previous:before {\n    content: \"\\e984\";\n}\n.nc-icon-mini.arrows-2_replay:before {\n    content: \"\\e985\";\n}\n.nc-icon-mini.arrows-2_round-left-down:before {\n    content: \"\\e986\";\n}\n.nc-icon-mini.arrows-2_round-right-down:before {\n    content: \"\\e987\";\n}\n.nc-icon-mini.arrows-2_round-up-left:before {\n    content: \"\\e988\";\n}\n.nc-icon-mini.arrows-2_round-up-right:before {\n    content: \"\\e989\";\n}\n.nc-icon-mini.arrows-2_select-83:before {\n    content: \"\\e98a\";\n}\n.nc-icon-mini.arrows-2_select-84:before {\n    content: \"\\e98b\";\n}\n.nc-icon-mini.arrows-2_skew-down:before {\n    content: \"\\e98c\";\n}\n.nc-icon-mini.arrows-2_skew-left:before {\n    content: \"\\e98d\";\n}\n.nc-icon-mini.arrows-2_skew-right:before {\n    content: \"\\e98e\";\n}\n.nc-icon-mini.arrows-2_skew-up:before {\n    content: \"\\e98f\";\n}\n.nc-icon-mini.arrows-2_small-left:before {\n    content: \"\\e990\";\n}\n.nc-icon-mini.arrows-2_small-right:before {\n    content: \"\\e991\";\n}\n.nc-icon-mini.arrows-2_square-download:before {\n    content: \"\\e992\";\n}\n.nc-icon-mini.arrows-2_square-upload:before {\n    content: \"\\e993\";\n}\n.nc-icon-mini.arrows-2_triangle-down:before {\n    content: \"\\e994\";\n}\n.nc-icon-mini.arrows-2_triangle-left:before {\n    content: \"\\e995\";\n}\n.nc-icon-mini.arrows-2_triangle-right:before {\n    content: \"\\e996\";\n}\n.nc-icon-mini.arrows-2_triangle-up:before {\n    content: \"\\e997\";\n}\n.nc-icon-mini.arrows-2_zoom:before {\n    content: \"\\e998\";\n}\n.nc-icon-mini.arrows-3_circle-simple-down:before {\n    content: \"\\e999\";\n}\n.nc-icon-mini.arrows-3_circle-simple-left:before {\n    content: \"\\e99a\";\n}\n.nc-icon-mini.arrows-3_circle-simple-right:before {\n    content: \"\\e99b\";\n}\n.nc-icon-mini.arrows-3_circle-simple-up:before {\n    content: \"\\e99c\";\n}\n.nc-icon-mini.arrows-3_small-down:before {\n    content: \"\\e99d\";\n}\n.nc-icon-mini.arrows-3_small-up:before {\n    content: \"\\e99e\";\n}\n.nc-icon-mini.arrows-3_square-corner-down-left:before {\n    content: \"\\e99f\";\n}\n.nc-icon-mini.arrows-3_square-corner-down-right:before {\n    content: \"\\e9a0\";\n}\n.nc-icon-mini.arrows-3_square-corner-up-left:before {\n    content: \"\\e9a1\";\n}\n.nc-icon-mini.arrows-3_square-corner-up-right:before {\n    content: \"\\e9a2\";\n}\n.nc-icon-mini.arrows-3_square-down-06:before {\n    content: \"\\e9a3\";\n}\n.nc-icon-mini.arrows-3_square-left-04:before {\n    content: \"\\e9a4\";\n}\n.nc-icon-mini.arrows-3_square-right-03:before {\n    content: \"\\e9a5\";\n}\n.nc-icon-mini.arrows-3_square-simple-down:before {\n    content: \"\\e9a6\";\n}\n.nc-icon-mini.arrows-3_square-simple-left:before {\n    content: \"\\e9a7\";\n}\n.nc-icon-mini.arrows-3_square-simple-right:before {\n    content: \"\\e9a8\";\n}\n.nc-icon-mini.arrows-3_square-simple-up:before {\n    content: \"\\e9a9\";\n}\n.nc-icon-mini.arrows-3_square-up-05:before {\n    content: \"\\e9aa\";\n}\n.nc-icon-mini.arrows-e_archive-e-download:before {\n    content: \"\\e9ab\";\n}\n.nc-icon-mini.arrows-e_archive-e-upload:before {\n    content: \"\\e9ac\";\n}\n.nc-icon-mini.arrows-e_circle-e-down-04:before {\n    content: \"\\e9ad\";\n}\n.nc-icon-mini.arrows-e_circle-e-down-12:before {\n    content: \"\\e9ae\";\n}\n.nc-icon-mini.arrows-e_circle-e-left-02:before {\n    content: \"\\e9af\";\n}\n.nc-icon-mini.arrows-e_circle-e-left-10:before {\n    content: \"\\e9b0\";\n}\n.nc-icon-mini.arrows-e_circle-e-right-01:before {\n    content: \"\\e9b1\";\n}\n.nc-icon-mini.arrows-e_circle-e-right-09:before {\n    content: \"\\e9b2\";\n}\n.nc-icon-mini.arrows-e_circle-e-up-03:before {\n    content: \"\\e9b3\";\n}\n.nc-icon-mini.arrows-e_circle-e-up-11:before {\n    content: \"\\e9b4\";\n}\n.nc-icon-mini.arrows-e_enlarge-21:before {\n    content: \"\\e9b5\";\n}\n.nc-icon-mini.arrows-e_enlarge-22:before {\n    content: \"\\e9b6\";\n}\n.nc-icon-mini.arrows-e_expand:before {\n    content: \"\\e9b7\";\n}\n.nc-icon-mini.arrows-e_move-bottom-right:before {\n    content: \"\\e9b8\";\n}\n.nc-icon-mini.arrows-e_move-top-left:before {\n    content: \"\\e9b9\";\n}\n.nc-icon-mini.arrows-e_refresh-19:before {\n    content: \"\\e9ba\";\n}\n.nc-icon-mini.arrows-e_refresh-20:before {\n    content: \"\\e9bb\";\n}\n.nc-icon-mini.arrows-e_resize-h:before {\n    content: \"\\e9bc\";\n}\n.nc-icon-mini.arrows-e_resize-v:before {\n    content: \"\\e9bd\";\n}\n.nc-icon-mini.arrows-e_share-26:before {\n    content: \"\\e9be\";\n}\n.nc-icon-mini.arrows-e_share-27:before {\n    content: \"\\e9bf\";\n}\n.nc-icon-mini.arrows-e_square-e-down:before {\n    content: \"\\e9c0\";\n}\n.nc-icon-mini.arrows-e_square-e-left:before {\n    content: \"\\e9c1\";\n}\n.nc-icon-mini.arrows-e_square-e-right:before {\n    content: \"\\e9c2\";\n}\n.nc-icon-mini.arrows-e_square-e-up:before {\n    content: \"\\e9c3\";\n}\n.nc-icon-mini.arrows-e_zoom-circle:before {\n    content: \"\\e9c4\";\n}\n.nc-icon-mini.arrows-e_zoom-e:before {\n    content: \"\\e9c5\";\n}\n.nc-icon-mini.arrows-e_zoom-square:before {\n    content: \"\\e9c6\";\n}\n.nc-icon-mini.arrows-e_zoom-triangles:before {\n    content: \"\\e9c7\";\n}\n.nc-icon-mini.weather_celsius:before {\n    content: \"\\e9c8\";\n}\n.nc-icon-mini.weather_cloud-drop:before {\n    content: \"\\e9c9\";\n}\n.nc-icon-mini.weather_cloud-fog-31:before {\n    content: \"\\e9ca\";\n}\n.nc-icon-mini.weather_cloud-fog-32:before {\n    content: \"\\e9cb\";\n}\n.nc-icon-mini.weather_cloud-hail:before {\n    content: \"\\e9cc\";\n}\n.nc-icon-mini.weather_cloud-light:before {\n    content: \"\\e9cd\";\n}\n.nc-icon-mini.weather_cloud-moon:before {\n    content: \"\\e9ce\";\n}\n.nc-icon-mini.weather_cloud-rain:before {\n    content: \"\\e9cf\";\n}\n.nc-icon-mini.weather_cloud-snow-34:before {\n    content: \"\\e9d0\";\n}\n.nc-icon-mini.weather_cloud-snow-42:before {\n    content: \"\\e9d1\";\n}\n.nc-icon-mini.weather_cloud-sun-17:before {\n    content: \"\\e9d2\";\n}\n.nc-icon-mini.weather_compass:before {\n    content: \"\\e9d3\";\n}\n.nc-icon-mini.weather_drop-15:before {\n    content: \"\\e9d4\";\n}\n.nc-icon-mini.weather_drops:before {\n    content: \"\\e9d5\";\n}\n.nc-icon-mini.weather_eclipse:before {\n    content: \"\\e9d6\";\n}\n.nc-icon-mini.weather_fahrenheit:before {\n    content: \"\\e9d7\";\n}\n.nc-icon-mini.weather_fog:before {\n    content: \"\\e9d8\";\n}\n.nc-icon-mini.weather_forecast:before {\n    content: \"\\e9d9\";\n}\n.nc-icon-mini.weather_hurricane-44:before {\n    content: \"\\e9da\";\n}\n.nc-icon-mini.weather_hurricane-45:before {\n    content: \"\\e9db\";\n}\n.nc-icon-mini.weather_moon-cloud-drop:before {\n    content: \"\\e9dc\";\n}\n.nc-icon-mini.weather_moon-cloud-fog:before {\n    content: \"\\e9dd\";\n}\n.nc-icon-mini.weather_moon-cloud-hail:before {\n    content: \"\\e9de\";\n}\n.nc-icon-mini.weather_moon-cloud-light:before {\n    content: \"\\e9df\";\n}\n.nc-icon-mini.weather_moon-cloud-rain:before {\n    content: \"\\e9e0\";\n}\n.nc-icon-mini.weather_moon-cloud-snow-61:before {\n    content: \"\\e9e1\";\n}\n.nc-icon-mini.weather_moon-cloud-snow-62:before {\n    content: \"\\e9e2\";\n}\n.nc-icon-mini.weather_moon-fog:before {\n    content: \"\\e9e3\";\n}\n.nc-icon-mini.weather_moon-full:before {\n    content: \"\\e9e4\";\n}\n.nc-icon-mini.weather_moon-stars:before {\n    content: \"\\e9e5\";\n}\n.nc-icon-mini.weather_moon:before {\n    content: \"\\e9e6\";\n}\n.nc-icon-mini.weather_rain-hail:before {\n    content: \"\\e9e7\";\n}\n.nc-icon-mini.weather_rain:before {\n    content: \"\\e9e8\";\n}\n.nc-icon-mini.weather_rainbow:before {\n    content: \"\\e9e9\";\n}\n.nc-icon-mini.weather_snow:before {\n    content: \"\\e9ea\";\n}\n.nc-icon-mini.weather_sun-cloud-drop:before {\n    content: \"\\e9eb\";\n}\n.nc-icon-mini.weather_sun-cloud-fog:before {\n    content: \"\\e9ec\";\n}\n.nc-icon-mini.weather_sun-cloud-hail:before {\n    content: \"\\e9ed\";\n}\n.nc-icon-mini.weather_sun-cloud-light:before {\n    content: \"\\e9ee\";\n}\n.nc-icon-mini.weather_sun-cloud-rain:before {\n    content: \"\\e9ef\";\n}\n.nc-icon-mini.weather_sun-cloud-snow-54:before {\n    content: \"\\e9f0\";\n}\n.nc-icon-mini.weather_sun-cloud-snow-55:before {\n    content: \"\\e9f1\";\n}\n.nc-icon-mini.weather_sun-cloud:before {\n    content: \"\\e9f2\";\n}\n.nc-icon-mini.weather_sun-fog-30:before {\n    content: \"\\e9f3\";\n}\n.nc-icon-mini.weather_sun-fog-43:before {\n    content: \"\\e9f4\";\n}\n.nc-icon-mini.weather_wind:before {\n    content: \"\\e9f5\";\n}\n.nc-icon-mini.weather-e_cloud-01:before {\n    content: \"\\e9f6\";\n}\n.nc-icon-mini.weather-e_cloud-02:before {\n    content: \"\\e9f7\";\n}\n.nc-icon-mini.users_add-27:before {\n    content: \"\\e9f8\";\n}\n.nc-icon-mini.users_add-29:before {\n    content: \"\\e9f9\";\n}\n.nc-icon-mini.users_badge-13:before {\n    content: \"\\e9fa\";\n}\n.nc-icon-mini.users_badge-14:before {\n    content: \"\\e9fb\";\n}\n.nc-icon-mini.users_badge-15:before {\n    content: \"\\e9fc\";\n}\n.nc-icon-mini.users_circle-08:before {\n    content: \"\\e9fd\";\n}\n.nc-icon-mini.users_circle-09:before {\n    content: \"\\e9fe\";\n}\n.nc-icon-mini.users_circle-10:before {\n    content: \"\\e9ff\";\n}\n.nc-icon-mini.users_delete-28:before {\n    content: \"\\ea00\";\n}\n.nc-icon-mini.users_delete-30:before {\n    content: \"\\ea01\";\n}\n.nc-icon-mini.users_man-20:before {\n    content: \"\\ea02\";\n}\n.nc-icon-mini.users_multiple-11:before {\n    content: \"\\ea03\";\n}\n.nc-icon-mini.users_multiple-19:before {\n    content: \"\\ea04\";\n}\n.nc-icon-mini.users_single-01:before {\n    content: \"\\ea05\";\n}\n.nc-icon-mini.users_single-02:before {\n    content: \"\\ea06\";\n}\n.nc-icon-mini.users_single-03:before {\n    content: \"\\ea07\";\n}\n.nc-icon-mini.users_single-04:before {\n    content: \"\\ea08\";\n}\n.nc-icon-mini.users_single-05:before {\n    content: \"\\ea09\";\n}\n.nc-icon-mini.users_single-body:before {\n    content: \"\\ea0a\";\n}\n.nc-icon-mini.users_square-31:before {\n    content: \"\\ea0b\";\n}\n.nc-icon-mini.users_square-32:before {\n    content: \"\\ea0c\";\n}\n.nc-icon-mini.users_square-33:before {\n    content: \"\\ea0d\";\n}\n.nc-icon-mini.users_woman-21:before {\n    content: \"\\ea0e\";\n}\n.nc-icon-mini.ui-1_analytics-88:before {\n    content: \"\\ea0f\";\n}\n.nc-icon-mini.ui-1_analytics-89:before {\n    content: \"\\ea10\";\n}\n.nc-icon-mini.ui-1_attach-86:before {\n    content: \"\\ea11\";\n}\n.nc-icon-mini.ui-1_attach-87:before {\n    content: \"\\ea12\";\n}\n.nc-icon-mini.ui-1_bell-53:before {\n    content: \"\\ea13\";\n}\n.nc-icon-mini.ui-1_bell-54:before {\n    content: \"\\ea14\";\n}\n.nc-icon-mini.ui-1_bell-55:before {\n    content: \"\\ea15\";\n}\n.nc-icon-mini.ui-1_bold-add:before {\n    content: \"\\ea16\";\n}\n.nc-icon-mini.ui-1_bold-delete:before {\n    content: \"\\ea17\";\n}\n.nc-icon-mini.ui-1_bold-remove:before {\n    content: \"\\ea18\";\n}\n.nc-icon-mini.ui-1_bookmark-add:before {\n    content: \"\\ea19\";\n}\n.nc-icon-mini.ui-1_bookmark-remove:before {\n    content: \"\\ea1a\";\n}\n.nc-icon-mini.ui-1_calendar-57:before {\n    content: \"\\ea1b\";\n}\n.nc-icon-mini.ui-1_calendar-60:before {\n    content: \"\\ea1c\";\n}\n.nc-icon-mini.ui-1_check-bold:before {\n    content: \"\\ea1d\";\n}\n.nc-icon-mini.ui-1_check-circle-07:before {\n    content: \"\\ea1e\";\n}\n.nc-icon-mini.ui-1_check-circle-08:before {\n    content: \"\\ea1f\";\n}\n.nc-icon-mini.ui-1_check-curve:before {\n    content: \"\\ea20\";\n}\n.nc-icon-mini.ui-1_check-simple:before {\n    content: \"\\ea21\";\n}\n.nc-icon-mini.ui-1_check-small:before {\n    content: \"\\ea22\";\n}\n.nc-icon-mini.ui-1_check-square-09:before {\n    content: \"\\ea23\";\n}\n.nc-icon-mini.ui-1_check-square-11:before {\n    content: \"\\ea24\";\n}\n.nc-icon-mini.ui-1_check:before {\n    content: \"\\ea25\";\n}\n.nc-icon-mini.ui-1_circle-add:before {\n    content: \"\\ea26\";\n}\n.nc-icon-mini.ui-1_circle-bold-add:before {\n    content: \"\\ea27\";\n}\n.nc-icon-mini.ui-1_circle-bold-remove:before {\n    content: \"\\ea28\";\n}\n.nc-icon-mini.ui-1_circle-delete:before {\n    content: \"\\ea29\";\n}\n.nc-icon-mini.ui-1_circle-remove:before {\n    content: \"\\ea2a\";\n}\n.nc-icon-mini.ui-1_dashboard-29:before {\n    content: \"\\ea2b\";\n}\n.nc-icon-mini.ui-1_dashboard-30:before {\n    content: \"\\ea2c\";\n}\n.nc-icon-mini.ui-1_dashboard-half:before {\n    content: \"\\ea2d\";\n}\n.nc-icon-mini.ui-1_dashboard-level:before {\n    content: \"\\ea2e\";\n}\n.nc-icon-mini.ui-1_database:before {\n    content: \"\\ea2f\";\n}\n.nc-icon-mini.ui-1_drop:before {\n    content: \"\\ea30\";\n}\n.nc-icon-mini.ui-1_edit-71:before {\n    content: \"\\ea31\";\n}\n.nc-icon-mini.ui-1_edit-72:before {\n    content: \"\\ea32\";\n}\n.nc-icon-mini.ui-1_edit-73:before {\n    content: \"\\ea33\";\n}\n.nc-icon-mini.ui-1_edit-74:before {\n    content: \"\\ea34\";\n}\n.nc-icon-mini.ui-1_edit-75:before {\n    content: \"\\ea35\";\n}\n.nc-icon-mini.ui-1_edit-76:before {\n    content: \"\\ea36\";\n}\n.nc-icon-mini.ui-1_edit-77:before {\n    content: \"\\ea37\";\n}\n.nc-icon-mini.ui-1_edit-78:before {\n    content: \"\\ea38\";\n}\n.nc-icon-mini.ui-1_email-83:before {\n    content: \"\\ea39\";\n}\n.nc-icon-mini.ui-1_email-84:before {\n    content: \"\\ea3a\";\n}\n.nc-icon-mini.ui-1_eye-17:before {\n    content: \"\\ea3b\";\n}\n.nc-icon-mini.ui-1_eye-19:before {\n    content: \"\\ea3c\";\n}\n.nc-icon-mini.ui-1_eye-ban-18:before {\n    content: \"\\ea3d\";\n}\n.nc-icon-mini.ui-1_eye-ban-20:before {\n    content: \"\\ea3e\";\n}\n.nc-icon-mini.ui-1_flame:before {\n    content: \"\\ea3f\";\n}\n.nc-icon-mini.ui-1_home-51:before {\n    content: \"\\ea40\";\n}\n.nc-icon-mini.ui-1_home-52:before {\n    content: \"\\ea41\";\n}\n.nc-icon-mini.ui-1_home-minimal:before {\n    content: \"\\ea42\";\n}\n.nc-icon-mini.ui-1_home-simple:before {\n    content: \"\\ea43\";\n}\n.nc-icon-mini.ui-1_leaf-80:before {\n    content: \"\\ea44\";\n}\n.nc-icon-mini.ui-1_leaf-81:before {\n    content: \"\\ea45\";\n}\n.nc-icon-mini.ui-1_leaf-edit:before {\n    content: \"\\ea46\";\n}\n.nc-icon-mini.ui-1_lock-circle-open:before {\n    content: \"\\ea47\";\n}\n.nc-icon-mini.ui-1_lock-circle:before {\n    content: \"\\ea48\";\n}\n.nc-icon-mini.ui-1_lock-open:before {\n    content: \"\\ea49\";\n}\n.nc-icon-mini.ui-1_lock:before {\n    content: \"\\ea4a\";\n}\n.nc-icon-mini.ui-1_notification-69:before {\n    content: \"\\ea4b\";\n}\n.nc-icon-mini.ui-1_pencil:before {\n    content: \"\\ea4c\";\n}\n.nc-icon-mini.ui-1_preferences-circle-rotate:before {\n    content: \"\\ea4d\";\n}\n.nc-icon-mini.ui-1_preferences-circle:before {\n    content: \"\\ea4e\";\n}\n.nc-icon-mini.ui-1_preferences-container-circle-rotate:before {\n    content: \"\\ea4f\";\n}\n.nc-icon-mini.ui-1_preferences-container-circle:before {\n    content: \"\\ea50\";\n}\n.nc-icon-mini.ui-1_preferences-container-rotate:before {\n    content: \"\\ea51\";\n}\n.nc-icon-mini.ui-1_preferences-container:before {\n    content: \"\\ea52\";\n}\n.nc-icon-mini.ui-1_preferences-rotate:before {\n    content: \"\\ea53\";\n}\n.nc-icon-mini.ui-1_preferences:before {\n    content: \"\\ea54\";\n}\n.nc-icon-mini.ui-1_send:before {\n    content: \"\\ea55\";\n}\n.nc-icon-mini.ui-1_settings-gear-63:before {\n    content: \"\\ea56\";\n}\n.nc-icon-mini.ui-1_settings-gear-64:before {\n    content: \"\\ea57\";\n}\n.nc-icon-mini.ui-1_settings-gear-65:before {\n    content: \"\\ea58\";\n}\n.nc-icon-mini.ui-1_settings-tool-66:before {\n    content: \"\\ea59\";\n}\n.nc-icon-mini.ui-1_simple-add:before {\n    content: \"\\ea5a\";\n}\n.nc-icon-mini.ui-1_simple-delete:before {\n    content: \"\\ea5b\";\n}\n.nc-icon-mini.ui-1_simple-remove:before {\n    content: \"\\ea5c\";\n}\n.nc-icon-mini.ui-1_trash-simple:before {\n    content: \"\\ea5d\";\n}\n.nc-icon-mini.ui-1_trash:before {\n    content: \"\\ea5e\";\n}\n.nc-icon-mini.ui-1_ui-03:before {\n    content: \"\\ea5f\";\n}\n.nc-icon-mini.ui-1_ui-04:before {\n    content: \"\\ea60\";\n}\n.nc-icon-mini.ui-1_zoom-bold-in:before {\n    content: \"\\ea61\";\n}\n.nc-icon-mini.ui-1_zoom-bold-out:before {\n    content: \"\\ea62\";\n}\n.nc-icon-mini.ui-1_zoom-bold:before {\n    content: \"\\ea63\";\n}\n.nc-icon-mini.ui-1_zoom-in:before {\n    content: \"\\ea64\";\n}\n.nc-icon-mini.ui-1_zoom-out:before {\n    content: \"\\ea65\";\n}\n.nc-icon-mini.ui-1_zoom:before {\n    content: \"\\ea66\";\n}\n.nc-icon-mini.ui-2_alert:before {\n    content: \"\\ea67\";\n}\n.nc-icon-mini.ui-2_alert-:before {\n    content: \"\\ea68\";\n}\n.nc-icon-mini.ui-2_alert-circle:before {\n    content: \"\\ea69\";\n}\n.nc-icon-mini.ui-2_alert-circle-:before {\n    content: \"\\ea6a\";\n}\n.nc-icon-mini.ui-2_alert-circle-i:before {\n    content: \"\\ea6b\";\n}\n.nc-icon-mini.ui-2_alert-i:before {\n    content: \"\\ea6c\";\n}\n.nc-icon-mini.ui-2_alert-square:before {\n    content: \"\\ea6d\";\n}\n.nc-icon-mini.ui-2_alert-square-:before {\n    content: \"\\ea6e\";\n}\n.nc-icon-mini.ui-2_alert-square-i:before {\n    content: \"\\ea6f\";\n}\n.nc-icon-mini.ui-2_archive:before {\n    content: \"\\ea70\";\n}\n.nc-icon-mini.ui-2_ban:before {\n    content: \"\\ea71\";\n}\n.nc-icon-mini.ui-2_battery-81:before {\n    content: \"\\ea72\";\n}\n.nc-icon-mini.ui-2_battery-83:before {\n    content: \"\\ea73\";\n}\n.nc-icon-mini.ui-2_battery-half:before {\n    content: \"\\ea74\";\n}\n.nc-icon-mini.ui-2_battery-low:before {\n    content: \"\\ea75\";\n}\n.nc-icon-mini.ui-2_bluetooth:before {\n    content: \"\\ea76\";\n}\n.nc-icon-mini.ui-2_book:before {\n    content: \"\\ea77\";\n}\n.nc-icon-mini.ui-2_chart-bar-52:before {\n    content: \"\\ea78\";\n}\n.nc-icon-mini.ui-2_chart-bar-53:before {\n    content: \"\\ea79\";\n}\n.nc-icon-mini.ui-2_chat-content:before {\n    content: \"\\ea7a\";\n}\n.nc-icon-mini.ui-2_chat-round-content:before {\n    content: \"\\ea7b\";\n}\n.nc-icon-mini.ui-2_chat-round:before {\n    content: \"\\ea7c\";\n}\n.nc-icon-mini.ui-2_chat:before {\n    content: \"\\ea7d\";\n}\n.nc-icon-mini.ui-2_circle-bold-delete:before {\n    content: \"\\ea7e\";\n}\n.nc-icon-mini.ui-2_cloud-25:before {\n    content: \"\\ea7f\";\n}\n.nc-icon-mini.ui-2_cloud-26:before {\n    content: \"\\ea80\";\n}\n.nc-icon-mini.ui-2_disk:before {\n    content: \"\\ea81\";\n}\n.nc-icon-mini.ui-2_enlarge-57:before {\n    content: \"\\ea82\";\n}\n.nc-icon-mini.ui-2_enlarge-58:before {\n    content: \"\\ea83\";\n}\n.nc-icon-mini.ui-2_favourite-28:before {\n    content: \"\\ea84\";\n}\n.nc-icon-mini.ui-2_favourite-31:before {\n    content: \"\\ea85\";\n}\n.nc-icon-mini.ui-2_filter:before {\n    content: \"\\ea86\";\n}\n.nc-icon-mini.ui-2_fullsize:before {\n    content: \"\\ea87\";\n}\n.nc-icon-mini.ui-2_grid-45:before {\n    content: \"\\ea88\";\n}\n.nc-icon-mini.ui-2_grid-46:before {\n    content: \"\\ea89\";\n}\n.nc-icon-mini.ui-2_grid-48:before {\n    content: \"\\ea8a\";\n}\n.nc-icon-mini.ui-2_grid-50:before {\n    content: \"\\ea8b\";\n}\n.nc-icon-mini.ui-2_grid-square:before {\n    content: \"\\ea8c\";\n}\n.nc-icon-mini.ui-2_hourglass:before {\n    content: \"\\ea8d\";\n}\n.nc-icon-mini.ui-2_lab:before {\n    content: \"\\ea8e\";\n}\n.nc-icon-mini.ui-2_layers:before {\n    content: \"\\ea8f\";\n}\n.nc-icon-mini.ui-2_like:before {\n    content: \"\\ea90\";\n}\n.nc-icon-mini.ui-2_link-66:before {\n    content: \"\\ea91\";\n}\n.nc-icon-mini.ui-2_link-68:before {\n    content: \"\\ea92\";\n}\n.nc-icon-mini.ui-2_link-69:before {\n    content: \"\\ea93\";\n}\n.nc-icon-mini.ui-2_link-72:before {\n    content: \"\\ea94\";\n}\n.nc-icon-mini.ui-2_link-broken-70:before {\n    content: \"\\ea95\";\n}\n.nc-icon-mini.ui-2_link-broken-73:before {\n    content: \"\\ea96\";\n}\n.nc-icon-mini.ui-2_menu-34:before {\n    content: \"\\ea97\";\n}\n.nc-icon-mini.ui-2_menu-35:before {\n    content: \"\\ea98\";\n}\n.nc-icon-mini.ui-2_menu-bold:before {\n    content: \"\\ea99\";\n}\n.nc-icon-mini.ui-2_menu-dots:before {\n    content: \"\\ea9a\";\n}\n.nc-icon-mini.ui-2_menu-square:before {\n    content: \"\\ea9b\";\n}\n.nc-icon-mini.ui-2_node:before {\n    content: \"\\ea9c\";\n}\n.nc-icon-mini.ui-2_paragraph:before {\n    content: \"\\ea9d\";\n}\n.nc-icon-mini.ui-2_phone:before {\n    content: \"\\ea9e\";\n}\n.nc-icon-mini.ui-2_share-bold:before {\n    content: \"\\ea9f\";\n}\n.nc-icon-mini.ui-2_share:before {\n    content: \"\\eaa0\";\n}\n.nc-icon-mini.ui-2_small-add:before {\n    content: \"\\eaa1\";\n}\n.nc-icon-mini.ui-2_small-delete:before {\n    content: \"\\eaa2\";\n}\n.nc-icon-mini.ui-2_small-remove:before {\n    content: \"\\eaa3\";\n}\n.nc-icon-mini.ui-2_square-add-08:before {\n    content: \"\\eaa4\";\n}\n.nc-icon-mini.ui-2_square-add-11:before {\n    content: \"\\eaa5\";\n}\n.nc-icon-mini.ui-2_square-delete-10:before {\n    content: \"\\eaa6\";\n}\n.nc-icon-mini.ui-2_square-delete-13:before {\n    content: \"\\eaa7\";\n}\n.nc-icon-mini.ui-2_square-remove-09:before {\n    content: \"\\eaa8\";\n}\n.nc-icon-mini.ui-2_square-remove-12:before {\n    content: \"\\eaa9\";\n}\n.nc-icon-mini.ui-2_target:before {\n    content: \"\\eaaa\";\n}\n.nc-icon-mini.ui-2_tile-55:before {\n    content: \"\\eaab\";\n}\n.nc-icon-mini.ui-2_tile-56:before {\n    content: \"\\eaac\";\n}\n.nc-icon-mini.ui-2_time-alarm:before {\n    content: \"\\eaad\";\n}\n.nc-icon-mini.ui-2_time-clock:before {\n    content: \"\\eaae\";\n}\n.nc-icon-mini.ui-2_time-countdown:before {\n    content: \"\\eaaf\";\n}\n.nc-icon-mini.ui-2_time:before {\n    content: \"\\eab0\";\n}\n.nc-icon-mini.ui-2_webpage:before {\n    content: \"\\eab1\";\n}\n.nc-icon-mini.ui-e_round-e-alert:before {\n    content: \"\\eab2\";\n}\n.nc-icon-mini.ui-e_round-e-help:before {\n    content: \"\\eab3\";\n}\n.nc-icon-mini.ui-e_round-e-info:before {\n    content: \"\\eab4\";\n}\n.nc-icon-mini.ui-e_square-e-alert:before {\n    content: \"\\eab5\";\n}\n.nc-icon-mini.ui-e_square-e-help:before {\n    content: \"\\eab6\";\n}\n.nc-icon-mini.ui-e_square-e-info:before {\n    content: \"\\eab7\";\n}\n.nc-icon-mini.ui-e_star-half:before {\n    content: \"\\eab8\";\n}\n.nc-icon-mini.travel_backpack:before {\n    content: \"\\eab9\";\n}\n.nc-icon-mini.travel_bag:before {\n    content: \"\\eaba\";\n}\n.nc-icon-mini.travel_camping:before {\n    content: \"\\eabb\";\n}\n.nc-icon-mini.travel_drink:before {\n    content: \"\\eabc\";\n}\n.nc-icon-mini.travel_explore:before {\n    content: \"\\eabd\";\n}\n.nc-icon-mini.travel_fire:before {\n    content: \"\\eabe\";\n}\n.nc-icon-mini.travel_hotel-bell:before {\n    content: \"\\eabf\";\n}\n.nc-icon-mini.travel_hotel-symbol:before {\n    content: \"\\eac0\";\n}\n.nc-icon-mini.travel_hotel:before {\n    content: \"\\eac1\";\n}\n.nc-icon-mini.travel_igloo:before {\n    content: \"\\eac2\";\n}\n.nc-icon-mini.travel_jellyfish:before {\n    content: \"\\eac3\";\n}\n.nc-icon-mini.travel_lamp:before {\n    content: \"\\eac4\";\n}\n.nc-icon-mini.travel_luggage:before {\n    content: \"\\eac5\";\n}\n.nc-icon-mini.travel_octopus:before {\n    content: \"\\eac6\";\n}\n.nc-icon-mini.travel_passport:before {\n    content: \"\\eac7\";\n}\n.nc-icon-mini.travel_pickaxe:before {\n    content: \"\\eac8\";\n}\n.nc-icon-mini.travel_pool:before {\n    content: \"\\eac9\";\n}\n.nc-icon-mini.travel_rackets:before {\n    content: \"\\eaca\";\n}\n.nc-icon-mini.travel_road-sign-left:before {\n    content: \"\\eacb\";\n}\n.nc-icon-mini.travel_road-sign-right:before {\n    content: \"\\eacc\";\n}\n.nc-icon-mini.travel_rowing:before {\n    content: \"\\eacd\";\n}\n.nc-icon-mini.travel_sea-mask:before {\n    content: \"\\eace\";\n}\n.nc-icon-mini.travel_shark:before {\n    content: \"\\eacf\";\n}\n.nc-icon-mini.travel_spa:before {\n    content: \"\\ead0\";\n}\n.nc-icon-mini.travel_sunglasses:before {\n    content: \"\\ead1\";\n}\n.nc-icon-mini.travel_surf:before {\n    content: \"\\ead2\";\n}\n.nc-icon-mini.travel_swimwear:before {\n    content: \"\\ead3\";\n}\n.nc-icon-mini.travel_swiss-knife:before {\n    content: \"\\ead4\";\n}\n.nc-icon-mini.travel_trolley:before {\n    content: \"\\ead5\";\n}\n.nc-icon-mini.travel_world:before {\n    content: \"\\ead6\";\n}\n.nc-icon-mini.transportation_air-baloon:before {\n    content: \"\\ead7\";\n}\n.nc-icon-mini.transportation_bike:before {\n    content: \"\\ead8\";\n}\n.nc-icon-mini.transportation_boat-small-02:before {\n    content: \"\\ead9\";\n}\n.nc-icon-mini.transportation_boat-small-03:before {\n    content: \"\\eada\";\n}\n.nc-icon-mini.transportation_boat:before {\n    content: \"\\eadb\";\n}\n.nc-icon-mini.transportation_bus-front-10:before {\n    content: \"\\eadc\";\n}\n.nc-icon-mini.transportation_bus-front-12:before {\n    content: \"\\eadd\";\n}\n.nc-icon-mini.transportation_car-front:before {\n    content: \"\\eade\";\n}\n.nc-icon-mini.transportation_car-taxi:before {\n    content: \"\\eadf\";\n}\n.nc-icon-mini.transportation_car:before {\n    content: \"\\eae0\";\n}\n.nc-icon-mini.transportation_helicopter:before {\n    content: \"\\eae1\";\n}\n.nc-icon-mini.transportation_helmet:before {\n    content: \"\\eae2\";\n}\n.nc-icon-mini.transportation_light-traffic:before {\n    content: \"\\eae3\";\n}\n.nc-icon-mini.transportation_moto:before {\n    content: \"\\eae4\";\n}\n.nc-icon-mini.transportation_plane-17:before {\n    content: \"\\eae5\";\n}\n.nc-icon-mini.transportation_plane-18:before {\n    content: \"\\eae6\";\n}\n.nc-icon-mini.transportation_road:before {\n    content: \"\\eae7\";\n}\n.nc-icon-mini.transportation_skateboard:before {\n    content: \"\\eae8\";\n}\n.nc-icon-mini.transportation_tractor:before {\n    content: \"\\eae9\";\n}\n.nc-icon-mini.transportation_train:before {\n    content: \"\\eaea\";\n}\n.nc-icon-mini.transportation_tram:before {\n    content: \"\\eaeb\";\n}\n.nc-icon-mini.transportation_truck-front:before {\n    content: \"\\eaec\";\n}\n.nc-icon-mini.transportation_vespa-front:before {\n    content: \"\\eaed\";\n}\n.nc-icon-mini.gestures_2x-drag-down:before {\n    content: \"\\eaee\";\n}\n.nc-icon-mini.gestures_2x-drag-up:before {\n    content: \"\\eaef\";\n}\n.nc-icon-mini.gestures_active-38:before {\n    content: \"\\eaf0\";\n}\n.nc-icon-mini.gestures_active-40:before {\n    content: \"\\eaf1\";\n}\n.nc-icon-mini.gestures_camera:before {\n    content: \"\\eaf2\";\n}\n.nc-icon-mini.gestures_double-tap:before {\n    content: \"\\eaf3\";\n}\n.nc-icon-mini.gestures_drag-21:before {\n    content: \"\\eaf4\";\n}\n.nc-icon-mini.gestures_drag-31:before {\n    content: \"\\eaf5\";\n}\n.nc-icon-mini.gestures_drag-down:before {\n    content: \"\\eaf6\";\n}\n.nc-icon-mini.gestures_drag-left:before {\n    content: \"\\eaf7\";\n}\n.nc-icon-mini.gestures_drag-right:before {\n    content: \"\\eaf8\";\n}\n.nc-icon-mini.gestures_drag-up:before {\n    content: \"\\eaf9\";\n}\n.nc-icon-mini.gestures_grab:before {\n    content: \"\\eafa\";\n}\n.nc-icon-mini.gestures_pin:before {\n    content: \"\\eafb\";\n}\n.nc-icon-mini.gestures_pinch:before {\n    content: \"\\eafc\";\n}\n.nc-icon-mini.gestures_rotate-22:before {\n    content: \"\\eafd\";\n}\n.nc-icon-mini.gestures_scan:before {\n    content: \"\\eafe\";\n}\n.nc-icon-mini.gestures_stretch:before {\n    content: \"\\eaff\";\n}\n.nc-icon-mini.gestures_swipe-bottom:before {\n    content: \"\\eb00\";\n}\n.nc-icon-mini.gestures_swipe-left:before {\n    content: \"\\eb01\";\n}\n.nc-icon-mini.gestures_swipe-right:before {\n    content: \"\\eb02\";\n}\n.nc-icon-mini.gestures_swipe-up:before {\n    content: \"\\eb03\";\n}\n.nc-icon-mini.gestures_tap-01:before {\n    content: \"\\eb04\";\n}\n.nc-icon-mini.gestures_tap-02:before {\n    content: \"\\eb05\";\n}\n.nc-icon-mini.text_align-center:before {\n    content: \"\\eb06\";\n}\n.nc-icon-mini.text_align-justify:before {\n    content: \"\\eb07\";\n}\n.nc-icon-mini.text_align-left:before {\n    content: \"\\eb08\";\n}\n.nc-icon-mini.text_align-right:before {\n    content: \"\\eb09\";\n}\n.nc-icon-mini.text_background:before {\n    content: \"\\eb0a\";\n}\n.nc-icon-mini.text_bold:before {\n    content: \"\\eb0b\";\n}\n.nc-icon-mini.text_capitalize:before {\n    content: \"\\eb0c\";\n}\n.nc-icon-mini.text_caps-small:before {\n    content: \"\\eb0d\";\n}\n.nc-icon-mini.text_color:before {\n    content: \"\\eb0e\";\n}\n.nc-icon-mini.text_edit:before {\n    content: \"\\eb0f\";\n}\n.nc-icon-mini.text_italic:before {\n    content: \"\\eb10\";\n}\n.nc-icon-mini.text_line-height:before {\n    content: \"\\eb11\";\n}\n.nc-icon-mini.text_list-bullet:before {\n    content: \"\\eb12\";\n}\n.nc-icon-mini.text_list-numbers:before {\n    content: \"\\eb13\";\n}\n.nc-icon-mini.text_margin-left:before {\n    content: \"\\eb14\";\n}\n.nc-icon-mini.text_margin-right:before {\n    content: \"\\eb15\";\n}\n.nc-icon-mini.text_quote:before {\n    content: \"\\eb16\";\n}\n.nc-icon-mini.text_scale-horizontal:before {\n    content: \"\\eb17\";\n}\n.nc-icon-mini.text_scale-vertical:before {\n    content: \"\\eb18\";\n}\n.nc-icon-mini.text_size:before {\n    content: \"\\eb19\";\n}\n.nc-icon-mini.text_strikethrough:before {\n    content: \"\\eb1a\";\n}\n.nc-icon-mini.text_subscript:before {\n    content: \"\\eb1b\";\n}\n.nc-icon-mini.text_superscript:before {\n    content: \"\\eb1c\";\n}\n.nc-icon-mini.text_tracking:before {\n    content: \"\\eb1d\";\n}\n.nc-icon-mini.text_underline:before {\n    content: \"\\eb1e\";\n}\n.nc-icon-mini.tech_cable-49:before {\n    content: \"\\eb1f\";\n}\n.nc-icon-mini.tech_cd-reader:before {\n    content: \"\\eb20\";\n}\n.nc-icon-mini.tech_computer-monitor:before {\n    content: \"\\eb21\";\n}\n.nc-icon-mini.tech_computer-old:before {\n    content: \"\\eb22\";\n}\n.nc-icon-mini.tech_computer:before {\n    content: \"\\eb23\";\n}\n.nc-icon-mini.tech_controller-modern:before {\n    content: \"\\eb24\";\n}\n.nc-icon-mini.tech_controller:before {\n    content: \"\\eb25\";\n}\n.nc-icon-mini.tech_desktop-screen:before {\n    content: \"\\eb26\";\n}\n.nc-icon-mini.tech_desktop:before {\n    content: \"\\eb27\";\n}\n.nc-icon-mini.tech_disk-reader:before {\n    content: \"\\eb28\";\n}\n.nc-icon-mini.tech_disk:before {\n    content: \"\\eb29\";\n}\n.nc-icon-mini.tech_headphones:before {\n    content: \"\\eb2a\";\n}\n.nc-icon-mini.tech_keyboard-wifi:before {\n    content: \"\\eb2b\";\n}\n.nc-icon-mini.tech_keyboard:before {\n    content: \"\\eb2c\";\n}\n.nc-icon-mini.tech_laptop-camera:before {\n    content: \"\\eb2d\";\n}\n.nc-icon-mini.tech_laptop-front:before {\n    content: \"\\eb2e\";\n}\n.nc-icon-mini.tech_laptop:before {\n    content: \"\\eb2f\";\n}\n.nc-icon-mini.tech_mobile-button:before {\n    content: \"\\eb30\";\n}\n.nc-icon-mini.tech_mobile-camera:before {\n    content: \"\\eb31\";\n}\n.nc-icon-mini.tech_mobile-recharger-08:before {\n    content: \"\\eb32\";\n}\n.nc-icon-mini.tech_mobile-recharger-09:before {\n    content: \"\\eb33\";\n}\n.nc-icon-mini.tech_mobile-toolbar:before {\n    content: \"\\eb34\";\n}\n.nc-icon-mini.tech_mobile:before {\n    content: \"\\eb35\";\n}\n.nc-icon-mini.tech_music:before {\n    content: \"\\eb36\";\n}\n.nc-icon-mini.tech_navigation:before {\n    content: \"\\eb37\";\n}\n.nc-icon-mini.tech_player-19:before {\n    content: \"\\eb38\";\n}\n.nc-icon-mini.tech_player-48:before {\n    content: \"\\eb39\";\n}\n.nc-icon-mini.tech_print-round:before {\n    content: \"\\eb3a\";\n}\n.nc-icon-mini.tech_print:before {\n    content: \"\\eb3b\";\n}\n.nc-icon-mini.tech_ram:before {\n    content: \"\\eb3c\";\n}\n.nc-icon-mini.tech_remote:before {\n    content: \"\\eb3d\";\n}\n.nc-icon-mini.tech_signal:before {\n    content: \"\\eb3e\";\n}\n.nc-icon-mini.tech_socket:before {\n    content: \"\\eb3f\";\n}\n.nc-icon-mini.tech_sync:before {\n    content: \"\\eb40\";\n}\n.nc-icon-mini.tech_tablet-button:before {\n    content: \"\\eb41\";\n}\n.nc-icon-mini.tech_tablet-reader-31:before {\n    content: \"\\eb42\";\n}\n.nc-icon-mini.tech_tablet-reader-42:before {\n    content: \"\\eb43\";\n}\n.nc-icon-mini.tech_tablet-toolbar:before {\n    content: \"\\eb44\";\n}\n.nc-icon-mini.tech_tablet:before {\n    content: \"\\eb45\";\n}\n.nc-icon-mini.tech_tv-old:before {\n    content: \"\\eb46\";\n}\n.nc-icon-mini.tech_tv:before {\n    content: \"\\eb47\";\n}\n.nc-icon-mini.tech_watch-circle:before {\n    content: \"\\eb48\";\n}\n.nc-icon-mini.tech_watch-time:before {\n    content: \"\\eb49\";\n}\n.nc-icon-mini.tech_watch:before {\n    content: \"\\eb4a\";\n}\n.nc-icon-mini.tech_webcam-38:before {\n    content: \"\\eb4b\";\n}\n.nc-icon-mini.tech_webcam-39:before {\n    content: \"\\eb4c\";\n}\n.nc-icon-mini.tech_wifi-router:before {\n    content: \"\\eb4d\";\n}\n.nc-icon-mini.tech_wifi:before {\n    content: \"\\eb4e\";\n}\n.nc-icon-mini.sport_badminton:before {\n    content: \"\\eb4f\";\n}\n.nc-icon-mini.sport_baseball-ball:before {\n    content: \"\\eb50\";\n}\n.nc-icon-mini.sport_baseball-bat:before {\n    content: \"\\eb51\";\n}\n.nc-icon-mini.sport_basketball-12:before {\n    content: \"\\eb52\";\n}\n.nc-icon-mini.sport_boxing:before {\n    content: \"\\eb53\";\n}\n.nc-icon-mini.sport_cardio:before {\n    content: \"\\eb54\";\n}\n.nc-icon-mini.sport_cricket:before {\n    content: \"\\eb55\";\n}\n.nc-icon-mini.sport_crown:before {\n    content: \"\\eb56\";\n}\n.nc-icon-mini.sport_dart:before {\n    content: \"\\eb57\";\n}\n.nc-icon-mini.sport_dumbbells:before {\n    content: \"\\eb58\";\n}\n.nc-icon-mini.sport_fencing:before {\n    content: \"\\eb59\";\n}\n.nc-icon-mini.sport_fishing:before {\n    content: \"\\eb5a\";\n}\n.nc-icon-mini.sport_flag-finish:before {\n    content: \"\\eb5b\";\n}\n.nc-icon-mini.sport_football-headguard:before {\n    content: \"\\eb5c\";\n}\n.nc-icon-mini.sport_golf:before {\n    content: \"\\eb5d\";\n}\n.nc-icon-mini.sport_helmet:before {\n    content: \"\\eb5e\";\n}\n.nc-icon-mini.sport_hockey:before {\n    content: \"\\eb5f\";\n}\n.nc-icon-mini.sport_kettlebell:before {\n    content: \"\\eb60\";\n}\n.nc-icon-mini.sport_ping-pong:before {\n    content: \"\\eb61\";\n}\n.nc-icon-mini.sport_podium:before {\n    content: \"\\eb62\";\n}\n.nc-icon-mini.sport_rope:before {\n    content: \"\\eb63\";\n}\n.nc-icon-mini.sport_rugby:before {\n    content: \"\\eb64\";\n}\n.nc-icon-mini.sport_shaker:before {\n    content: \"\\eb65\";\n}\n.nc-icon-mini.sport_skateboard:before {\n    content: \"\\eb66\";\n}\n.nc-icon-mini.sport_snowboard:before {\n    content: \"\\eb67\";\n}\n.nc-icon-mini.sport_soccer-field:before {\n    content: \"\\eb68\";\n}\n.nc-icon-mini.sport_steering-wheel:before {\n    content: \"\\eb69\";\n}\n.nc-icon-mini.sport_supplement:before {\n    content: \"\\eb6a\";\n}\n.nc-icon-mini.sport_surf:before {\n    content: \"\\eb6b\";\n}\n.nc-icon-mini.sport_tactic:before {\n    content: \"\\eb6c\";\n}\n.nc-icon-mini.sport_tennis-ball:before {\n    content: \"\\eb6d\";\n}\n.nc-icon-mini.sport_tennis:before {\n    content: \"\\eb6e\";\n}\n.nc-icon-mini.sport_trophy:before {\n    content: \"\\eb6f\";\n}\n.nc-icon-mini.sport_user-run:before {\n    content: \"\\eb70\";\n}\n.nc-icon-mini.sport_volleyball:before {\n    content: \"\\eb71\";\n}\n.nc-icon-mini.sport_whistle:before {\n    content: \"\\eb72\";\n}\n.nc-icon-mini.social_logo-500px:before {\n    content: \"\\eb73\";\n}\n.nc-icon-mini.social_logo-angellist:before {\n    content: \"\\eb74\";\n}\n.nc-icon-mini.social_logo-behance:before {\n    content: \"\\eb75\";\n}\n.nc-icon-mini.social_logo-blogger:before {\n    content: \"\\eb76\";\n}\n.nc-icon-mini.social_logo-buffer:before {\n    content: \"\\eb77\";\n}\n.nc-icon-mini.social_logo-buysellads:before {\n    content: \"\\eb78\";\n}\n.nc-icon-mini.social_logo-codepen:before {\n    content: \"\\eb79\";\n}\n.nc-icon-mini.social_logo-creative-market:before {\n    content: \"\\eb7a\";\n}\n.nc-icon-mini.social_logo-crunchbase:before {\n    content: \"\\eb7b\";\n}\n.nc-icon-mini.social_logo-deviantart:before {\n    content: \"\\eb7c\";\n}\n.nc-icon-mini.social_logo-dribbble:before {\n    content: \"\\eb7d\";\n}\n.nc-icon-mini.social_logo-dropbox:before {\n    content: \"\\eb7e\";\n}\n.nc-icon-mini.social_logo-envato:before {\n    content: \"\\eb7f\";\n}\n.nc-icon-mini.social_logo-evernote:before {\n    content: \"\\eb80\";\n}\n.nc-icon-mini.social_logo-facebook:before {\n    content: \"\\eb81\";\n}\n.nc-icon-mini.social_logo-fb-simple:before {\n    content: \"\\eb82\";\n}\n.nc-icon-mini.social_logo-feedly:before {\n    content: \"\\eb83\";\n}\n.nc-icon-mini.social_logo-flickr:before {\n    content: \"\\eb84\";\n}\n.nc-icon-mini.social_logo-github:before {\n    content: \"\\eb85\";\n}\n.nc-icon-mini.social_logo-google-plus:before {\n    content: \"\\eb86\";\n}\n.nc-icon-mini.social_logo-instagram:before {\n    content: \"\\eb87\";\n}\n.nc-icon-mini.social_logo-lastfm:before {\n    content: \"\\eb88\";\n}\n.nc-icon-mini.social_logo-linkedin:before {\n    content: \"\\eb89\";\n}\n.nc-icon-mini.social_logo-meetup:before {\n    content: \"\\eb8a\";\n}\n.nc-icon-mini.social_logo-myspace:before {\n    content: \"\\eb8b\";\n}\n.nc-icon-mini.social_logo-paypal:before {\n    content: \"\\eb8c\";\n}\n.nc-icon-mini.social_logo-pinterest:before {\n    content: \"\\eb8d\";\n}\n.nc-icon-mini.social_logo-product-hunt:before {\n    content: \"\\eb8e\";\n}\n.nc-icon-mini.social_logo-reddit:before {\n    content: \"\\eb8f\";\n}\n.nc-icon-mini.social_logo-rss:before {\n    content: \"\\eb90\";\n}\n.nc-icon-mini.social_logo-shopify:before {\n    content: \"\\eb91\";\n}\n.nc-icon-mini.social_logo-skype:before {\n    content: \"\\eb92\";\n}\n.nc-icon-mini.social_logo-slack:before {\n    content: \"\\eb93\";\n}\n.nc-icon-mini.social_logo-soundcloud:before {\n    content: \"\\eb94\";\n}\n.nc-icon-mini.social_logo-spotify:before {\n    content: \"\\eb95\";\n}\n.nc-icon-mini.social_logo-trello:before {\n    content: \"\\eb96\";\n}\n.nc-icon-mini.social_logo-tumblr:before {\n    content: \"\\eb97\";\n}\n.nc-icon-mini.social_logo-twitter:before {\n    content: \"\\eb98\";\n}\n.nc-icon-mini.social_logo-vimeo:before {\n    content: \"\\eb99\";\n}\n.nc-icon-mini.social_logo-vine:before {\n    content: \"\\eb9a\";\n}\n.nc-icon-mini.social_logo-whatsapp:before {\n    content: \"\\eb9b\";\n}\n.nc-icon-mini.social_logo-wordpress:before {\n    content: \"\\eb9c\";\n}\n.nc-icon-mini.social_logo-yelp:before {\n    content: \"\\eb9d\";\n}\n.nc-icon-mini.social_logo-youtube:before {\n    content: \"\\eb9e\";\n}\n.nc-icon-mini.shopping_award:before {\n    content: \"\\eb9f\";\n}\n.nc-icon-mini.shopping_bag-09:before {\n    content: \"\\eba0\";\n}\n.nc-icon-mini.shopping_bag-16:before {\n    content: \"\\eba1\";\n}\n.nc-icon-mini.shopping_bag-17:before {\n    content: \"\\eba2\";\n}\n.nc-icon-mini.shopping_bag-20:before {\n    content: \"\\eba3\";\n}\n.nc-icon-mini.shopping_bag-add-18:before {\n    content: \"\\eba4\";\n}\n.nc-icon-mini.shopping_bag-add-21:before {\n    content: \"\\eba5\";\n}\n.nc-icon-mini.shopping_bag-remove-19:before {\n    content: \"\\eba6\";\n}\n.nc-icon-mini.shopping_bag-remove-22:before {\n    content: \"\\eba7\";\n}\n.nc-icon-mini.shopping_barcode:before {\n    content: \"\\eba8\";\n}\n.nc-icon-mini.shopping_bardcode-qr:before {\n    content: \"\\eba9\";\n}\n.nc-icon-mini.shopping_basket-simple-add:before {\n    content: \"\\ebaa\";\n}\n.nc-icon-mini.shopping_basket-simple-remove:before {\n    content: \"\\ebab\";\n}\n.nc-icon-mini.shopping_basket-simple:before {\n    content: \"\\ebac\";\n}\n.nc-icon-mini.shopping_basket:before {\n    content: \"\\ebad\";\n}\n.nc-icon-mini.shopping_bitcoin:before {\n    content: \"\\ebae\";\n}\n.nc-icon-mini.shopping_box-ribbon:before {\n    content: \"\\ebaf\";\n}\n.nc-icon-mini.shopping_box:before {\n    content: \"\\ebb0\";\n}\n.nc-icon-mini.shopping_cart-modern-in:before {\n    content: \"\\ebb1\";\n}\n.nc-icon-mini.shopping_cart-modern:before {\n    content: \"\\ebb2\";\n}\n.nc-icon-mini.shopping_cart-simple-add:before {\n    content: \"\\ebb3\";\n}\n.nc-icon-mini.shopping_cart-simple-in:before {\n    content: \"\\ebb4\";\n}\n.nc-icon-mini.shopping_cart-simple-remove:before {\n    content: \"\\ebb5\";\n}\n.nc-icon-mini.shopping_cart-simple:before {\n    content: \"\\ebb6\";\n}\n.nc-icon-mini.shopping_cart:before {\n    content: \"\\ebb7\";\n}\n.nc-icon-mini.shopping_cash-register:before {\n    content: \"\\ebb8\";\n}\n.nc-icon-mini.shopping_chart:before {\n    content: \"\\ebb9\";\n}\n.nc-icon-mini.shopping_credit-card-in:before {\n    content: \"\\ebba\";\n}\n.nc-icon-mini.shopping_credit-card:before {\n    content: \"\\ebbb\";\n}\n.nc-icon-mini.shopping_delivery-fast:before {\n    content: \"\\ebbc\";\n}\n.nc-icon-mini.shopping_discount:before {\n    content: \"\\ebbd\";\n}\n.nc-icon-mini.shopping_gift:before {\n    content: \"\\ebbe\";\n}\n.nc-icon-mini.shopping_list:before {\n    content: \"\\ebbf\";\n}\n.nc-icon-mini.shopping_newsletter:before {\n    content: \"\\ebc0\";\n}\n.nc-icon-mini.shopping_receipt-list-42:before {\n    content: \"\\ebc1\";\n}\n.nc-icon-mini.shopping_receipt-list-43:before {\n    content: \"\\ebc2\";\n}\n.nc-icon-mini.shopping_receipt:before {\n    content: \"\\ebc3\";\n}\n.nc-icon-mini.shopping_shop:before {\n    content: \"\\ebc4\";\n}\n.nc-icon-mini.shopping_stock:before {\n    content: \"\\ebc5\";\n}\n.nc-icon-mini.shopping_tag-content:before {\n    content: \"\\ebc6\";\n}\n.nc-icon-mini.shopping_tag-cut:before {\n    content: \"\\ebc7\";\n}\n.nc-icon-mini.shopping_tag:before {\n    content: \"\\ebc8\";\n}\n.nc-icon-mini.shopping_wallet:before {\n    content: \"\\ebc9\";\n}\n.nc-icon-mini.education_agenda-bookmark:before {\n    content: \"\\ebca\";\n}\n.nc-icon-mini.education_atom:before {\n    content: \"\\ebcb\";\n}\n.nc-icon-mini.education_award-55:before {\n    content: \"\\ebcc\";\n}\n.nc-icon-mini.education_backpack-57:before {\n    content: \"\\ebcd\";\n}\n.nc-icon-mini.education_backpack-58:before {\n    content: \"\\ebce\";\n}\n.nc-icon-mini.education_ball-basket:before {\n    content: \"\\ebcf\";\n}\n.nc-icon-mini.education_ball-soccer:before {\n    content: \"\\ebd0\";\n}\n.nc-icon-mini.education_board-51:before {\n    content: \"\\ebd1\";\n}\n.nc-icon-mini.education_book-39:before {\n    content: \"\\ebd2\";\n}\n.nc-icon-mini.education_book-bookmark:before {\n    content: \"\\ebd3\";\n}\n.nc-icon-mini.education_book-open:before {\n    content: \"\\ebd4\";\n}\n.nc-icon-mini.education_books-46:before {\n    content: \"\\ebd5\";\n}\n.nc-icon-mini.education_flask:before {\n    content: \"\\ebd6\";\n}\n.nc-icon-mini.education_glasses:before {\n    content: \"\\ebd7\";\n}\n.nc-icon-mini.education_hat:before {\n    content: \"\\ebd8\";\n}\n.nc-icon-mini.education_language:before {\n    content: \"\\ebd9\";\n}\n.nc-icon-mini.education_molecule:before {\n    content: \"\\ebda\";\n}\n.nc-icon-mini.education_notepad:before {\n    content: \"\\ebdb\";\n}\n.nc-icon-mini.education_paper-diploma:before {\n    content: \"\\ebdc\";\n}\n.nc-icon-mini.education_paper:before {\n    content: \"\\ebdd\";\n}\n.nc-icon-mini.education_pencil-47:before {\n    content: \"\\ebde\";\n}\n.nc-icon-mini.education_school:before {\n    content: \"\\ebdf\";\n}\n.nc-icon-mini.objects_alien-29:before {\n    content: \"\\ebe0\";\n}\n.nc-icon-mini.objects_alien-33:before {\n    content: \"\\ebe1\";\n}\n.nc-icon-mini.objects_anchor:before {\n    content: \"\\ebe2\";\n}\n.nc-icon-mini.objects_astronaut:before {\n    content: \"\\ebe3\";\n}\n.nc-icon-mini.objects_axe:before {\n    content: \"\\ebe4\";\n}\n.nc-icon-mini.objects_baby-bottle:before {\n    content: \"\\ebe5\";\n}\n.nc-icon-mini.objects_baby:before {\n    content: \"\\ebe6\";\n}\n.nc-icon-mini.objects_baloon:before {\n    content: \"\\ebe7\";\n}\n.nc-icon-mini.objects_battery:before {\n    content: \"\\ebe8\";\n}\n.nc-icon-mini.objects_bear:before {\n    content: \"\\ebe9\";\n}\n.nc-icon-mini.objects_billiard:before {\n    content: \"\\ebea\";\n}\n.nc-icon-mini.objects_binocular:before {\n    content: \"\\ebeb\";\n}\n.nc-icon-mini.objects_bow:before {\n    content: \"\\ebec\";\n}\n.nc-icon-mini.objects_bowling:before {\n    content: \"\\ebed\";\n}\n.nc-icon-mini.objects_broom:before {\n    content: \"\\ebee\";\n}\n.nc-icon-mini.objects_cone:before {\n    content: \"\\ebef\";\n}\n.nc-icon-mini.objects_controller:before {\n    content: \"\\ebf0\";\n}\n.nc-icon-mini.objects_diamond:before {\n    content: \"\\ebf1\";\n}\n.nc-icon-mini.objects_dice:before {\n    content: \"\\ebf2\";\n}\n.nc-icon-mini.objects_globe:before {\n    content: \"\\ebf3\";\n}\n.nc-icon-mini.objects_hut:before {\n    content: \"\\ebf4\";\n}\n.nc-icon-mini.objects_key-25:before {\n    content: \"\\ebf5\";\n}\n.nc-icon-mini.objects_key-26:before {\n    content: \"\\ebf6\";\n}\n.nc-icon-mini.objects_lamp:before {\n    content: \"\\ebf7\";\n}\n.nc-icon-mini.objects_leaf-36:before {\n    content: \"\\ebf8\";\n}\n.nc-icon-mini.objects_light:before {\n    content: \"\\ebf9\";\n}\n.nc-icon-mini.objects_planet:before {\n    content: \"\\ebfa\";\n}\n.nc-icon-mini.objects_puzzle-09:before {\n    content: \"\\ebfb\";\n}\n.nc-icon-mini.objects_puzzle-10:before {\n    content: \"\\ebfc\";\n}\n.nc-icon-mini.objects_shovel:before {\n    content: \"\\ebfd\";\n}\n.nc-icon-mini.objects_skull:before {\n    content: \"\\ebfe\";\n}\n.nc-icon-mini.objects_spaceship:before {\n    content: \"\\ebff\";\n}\n.nc-icon-mini.objects_support-16:before {\n    content: \"\\ec00\";\n}\n.nc-icon-mini.objects_support-17:before {\n    content: \"\\ec01\";\n}\n.nc-icon-mini.objects_umbrella-13:before {\n    content: \"\\ec02\";\n}\n.nc-icon-mini.objects_umbrella-14:before {\n    content: \"\\ec03\";\n}\n.nc-icon-mini.objects_wool-ball:before {\n    content: \"\\ec04\";\n}\n.nc-icon-mini.media-1_3d:before {\n    content: \"\\ec05\";\n}\n.nc-icon-mini.media-1_album:before {\n    content: \"\\ec06\";\n}\n.nc-icon-mini.media-1_audio-91:before {\n    content: \"\\ec07\";\n}\n.nc-icon-mini.media-1_audio-92:before {\n    content: \"\\ec08\";\n}\n.nc-icon-mini.media-1_balance:before {\n    content: \"\\ec09\";\n}\n.nc-icon-mini.media-1_brightness-46:before {\n    content: \"\\ec0a\";\n}\n.nc-icon-mini.media-1_brightness-47:before {\n    content: \"\\ec0b\";\n}\n.nc-icon-mini.media-1_button-eject:before {\n    content: \"\\ec0c\";\n}\n.nc-icon-mini.media-1_button-next:before {\n    content: \"\\ec0d\";\n}\n.nc-icon-mini.media-1_button-pause:before {\n    content: \"\\ec0e\";\n}\n.nc-icon-mini.media-1_button-play:before {\n    content: \"\\ec0f\";\n}\n.nc-icon-mini.media-1_button-power:before {\n    content: \"\\ec10\";\n}\n.nc-icon-mini.media-1_button-previous:before {\n    content: \"\\ec11\";\n}\n.nc-icon-mini.media-1_button-record:before {\n    content: \"\\ec12\";\n}\n.nc-icon-mini.media-1_button-rewind:before {\n    content: \"\\ec13\";\n}\n.nc-icon-mini.media-1_button-skip:before {\n    content: \"\\ec14\";\n}\n.nc-icon-mini.media-1_button-stop:before {\n    content: \"\\ec15\";\n}\n.nc-icon-mini.media-1_camera-18:before {\n    content: \"\\ec16\";\n}\n.nc-icon-mini.media-1_camera-19:before {\n    content: \"\\ec17\";\n}\n.nc-icon-mini.media-1_camera-20:before {\n    content: \"\\ec18\";\n}\n.nc-icon-mini.media-1_camera-ban-37:before {\n    content: \"\\ec19\";\n}\n.nc-icon-mini.media-1_camera-compact:before {\n    content: \"\\ec1a\";\n}\n.nc-icon-mini.media-1_camera-square-57:before {\n    content: \"\\ec1b\";\n}\n.nc-icon-mini.media-1_camera-time:before {\n    content: \"\\ec1c\";\n}\n.nc-icon-mini.media-1_countdown-34:before {\n    content: \"\\ec1d\";\n}\n.nc-icon-mini.media-1_edit-color:before {\n    content: \"\\ec1e\";\n}\n.nc-icon-mini.media-1_edit-contrast-42:before {\n    content: \"\\ec1f\";\n}\n.nc-icon-mini.media-1_edit-contrast-43:before {\n    content: \"\\ec20\";\n}\n.nc-icon-mini.media-1_edit-saturation:before {\n    content: \"\\ec21\";\n}\n.nc-icon-mini.media-1_flash-21:before {\n    content: \"\\ec22\";\n}\n.nc-icon-mini.media-1_flash-24:before {\n    content: \"\\ec23\";\n}\n.nc-icon-mini.media-1_flash-29:before {\n    content: \"\\ec24\";\n}\n.nc-icon-mini.media-1_focus-32:before {\n    content: \"\\ec25\";\n}\n.nc-icon-mini.media-1_focus-38:before {\n    content: \"\\ec26\";\n}\n.nc-icon-mini.media-1_focus-40:before {\n    content: \"\\ec27\";\n}\n.nc-icon-mini.media-1_focus-circle:before {\n    content: \"\\ec28\";\n}\n.nc-icon-mini.media-1_frame-12:before {\n    content: \"\\ec29\";\n}\n.nc-icon-mini.media-1_frame-41:before {\n    content: \"\\ec2a\";\n}\n.nc-icon-mini.media-1_grid:before {\n    content: \"\\ec2b\";\n}\n.nc-icon-mini.media-1_image-01:before {\n    content: \"\\ec2c\";\n}\n.nc-icon-mini.media-1_image-02:before {\n    content: \"\\ec2d\";\n}\n.nc-icon-mini.media-1_image-05:before {\n    content: \"\\ec2e\";\n}\n.nc-icon-mini.media-1_layers:before {\n    content: \"\\ec2f\";\n}\n.nc-icon-mini.media-1_lens-31:before {\n    content: \"\\ec30\";\n}\n.nc-icon-mini.media-1_lens-56:before {\n    content: \"\\ec31\";\n}\n.nc-icon-mini.media-1_macro:before {\n    content: \"\\ec32\";\n}\n.nc-icon-mini.media-1_movie-61:before {\n    content: \"\\ec33\";\n}\n.nc-icon-mini.media-1_movie-62:before {\n    content: \"\\ec34\";\n}\n.nc-icon-mini.media-1_night:before {\n    content: \"\\ec35\";\n}\n.nc-icon-mini.media-1_picture:before {\n    content: \"\\ec36\";\n}\n.nc-icon-mini.media-1_play-68:before {\n    content: \"\\ec37\";\n}\n.nc-icon-mini.media-1_play-69:before {\n    content: \"\\ec38\";\n}\n.nc-icon-mini.media-1_player:before {\n    content: \"\\ec39\";\n}\n.nc-icon-mini.media-1_polaroid-add:before {\n    content: \"\\ec3a\";\n}\n.nc-icon-mini.media-1_polaroid-delete:before {\n    content: \"\\ec3b\";\n}\n.nc-icon-mini.media-1_polaroid-multiple:before {\n    content: \"\\ec3c\";\n}\n.nc-icon-mini.media-1_polaroid:before {\n    content: \"\\ec3d\";\n}\n.nc-icon-mini.media-1_roll:before {\n    content: \"\\ec3e\";\n}\n.nc-icon-mini.media-1_sd:before {\n    content: \"\\ec3f\";\n}\n.nc-icon-mini.media-1_ticket-75:before {\n    content: \"\\ec40\";\n}\n.nc-icon-mini.media-1_ticket-76:before {\n    content: \"\\ec41\";\n}\n.nc-icon-mini.media-1_touch:before {\n    content: \"\\ec42\";\n}\n.nc-icon-mini.media-1_tripod:before {\n    content: \"\\ec43\";\n}\n.nc-icon-mini.media-1_video-64:before {\n    content: \"\\ec44\";\n}\n.nc-icon-mini.media-1_video-65:before {\n    content: \"\\ec45\";\n}\n.nc-icon-mini.media-1_video-66:before {\n    content: \"\\ec46\";\n}\n.nc-icon-mini.media-1_video-67:before {\n    content: \"\\ec47\";\n}\n.nc-icon-mini.media-1_videocamera-71:before {\n    content: \"\\ec48\";\n}\n.nc-icon-mini.media-1_videocamera-72:before {\n    content: \"\\ec49\";\n}\n.nc-icon-mini.media-1_volume-93:before {\n    content: \"\\ec4a\";\n}\n.nc-icon-mini.media-1_volume-97:before {\n    content: \"\\ec4b\";\n}\n.nc-icon-mini.media-1_volume-down:before {\n    content: \"\\ec4c\";\n}\n.nc-icon-mini.media-1_volume-up:before {\n    content: \"\\ec4d\";\n}\n.nc-icon-mini.media-2_headphones-mic:before {\n    content: \"\\ec4e\";\n}\n.nc-icon-mini.media-2_headphones:before {\n    content: \"\\ec4f\";\n}\n.nc-icon-mini.media-2_knob:before {\n    content: \"\\ec50\";\n}\n.nc-icon-mini.media-2_mic:before {\n    content: \"\\ec51\";\n}\n.nc-icon-mini.media-2_music-album:before {\n    content: \"\\ec52\";\n}\n.nc-icon-mini.media-2_note-03:before {\n    content: \"\\ec53\";\n}\n.nc-icon-mini.media-2_note-04:before {\n    content: \"\\ec54\";\n}\n.nc-icon-mini.media-2_radio:before {\n    content: \"\\ec55\";\n}\n.nc-icon-mini.media-2_sound-wave:before {\n    content: \"\\ec56\";\n}\n.nc-icon-mini.media-2_speaker-01:before {\n    content: \"\\ec57\";\n}\n.nc-icon-mini.media-2_speaker-05:before {\n    content: \"\\ec58\";\n}\n.nc-icon-mini.media-2_tape:before {\n    content: \"\\ec59\";\n}\n.nc-icon-mini.location_appointment:before {\n    content: \"\\ec5a\";\n}\n.nc-icon-mini.location_bookmark-add:before {\n    content: \"\\ec5b\";\n}\n.nc-icon-mini.location_bookmark-remove:before {\n    content: \"\\ec5c\";\n}\n.nc-icon-mini.location_bookmark:before {\n    content: \"\\ec5d\";\n}\n.nc-icon-mini.location_compass-04:before {\n    content: \"\\ec5e\";\n}\n.nc-icon-mini.location_compass-05:before {\n    content: \"\\ec5f\";\n}\n.nc-icon-mini.location_compass-06:before {\n    content: \"\\ec60\";\n}\n.nc-icon-mini.location_crosshair:before {\n    content: \"\\ec61\";\n}\n.nc-icon-mini.location_explore:before {\n    content: \"\\ec62\";\n}\n.nc-icon-mini.location_flag-diagonal-33:before {\n    content: \"\\ec63\";\n}\n.nc-icon-mini.location_flag-diagonal-34:before {\n    content: \"\\ec64\";\n}\n.nc-icon-mini.location_flag-points-31:before {\n    content: \"\\ec65\";\n}\n.nc-icon-mini.location_flag-points-32:before {\n    content: \"\\ec66\";\n}\n.nc-icon-mini.location_flag-simple:before {\n    content: \"\\ec67\";\n}\n.nc-icon-mini.location_flag-triangle:before {\n    content: \"\\ec68\";\n}\n.nc-icon-mini.location_flag:before {\n    content: \"\\ec69\";\n}\n.nc-icon-mini.location_gps:before {\n    content: \"\\ec6a\";\n}\n.nc-icon-mini.location_map:before {\n    content: \"\\ec6b\";\n}\n.nc-icon-mini.location_marker:before {\n    content: \"\\ec6c\";\n}\n.nc-icon-mini.location_pin-add:before {\n    content: \"\\ec6d\";\n}\n.nc-icon-mini.location_pin-copy:before {\n    content: \"\\ec6e\";\n}\n.nc-icon-mini.location_pin-remove:before {\n    content: \"\\ec6f\";\n}\n.nc-icon-mini.location_pin:before {\n    content: \"\\ec70\";\n}\n.nc-icon-mini.location_pins:before {\n    content: \"\\ec71\";\n}\n.nc-icon-mini.location_position-marker:before {\n    content: \"\\ec72\";\n}\n.nc-icon-mini.location_radar:before {\n    content: \"\\ec73\";\n}\n.nc-icon-mini.location_treasure-map-40:before {\n    content: \"\\ec74\";\n}\n.nc-icon-mini.location_world:before {\n    content: \"\\ec75\";\n}\n.nc-icon-mini.location-e_bookmark-add:before {\n    content: \"\\ec76\";\n}\n.nc-icon-mini.location-e_bookmark-remove:before {\n    content: \"\\ec77\";\n}\n.nc-icon-mini.location-e_flag-06:before {\n    content: \"\\ec78\";\n}\n.nc-icon-mini.location-e_flag-07:before {\n    content: \"\\ec79\";\n}\n.nc-icon-mini.location-e_gps:before {\n    content: \"\\ec7a\";\n}\n.nc-icon-mini.location-e_pin-add:before {\n    content: \"\\ec7b\";\n}\n.nc-icon-mini.location-e_pin-remove:before {\n    content: \"\\ec7c\";\n}\n.nc-icon-mini.location-e_pin:before {\n    content: \"\\ec7d\";\n}\n.nc-icon-mini.holidays_bat:before {\n    content: \"\\ec7e\";\n}\n.nc-icon-mini.holidays_bones:before {\n    content: \"\\ec7f\";\n}\n.nc-icon-mini.holidays_boot:before {\n    content: \"\\ec80\";\n}\n.nc-icon-mini.holidays_candy:before {\n    content: \"\\ec81\";\n}\n.nc-icon-mini.holidays_cat:before {\n    content: \"\\ec82\";\n}\n.nc-icon-mini.holidays_cauldron:before {\n    content: \"\\ec83\";\n}\n.nc-icon-mini.holidays_chimney:before {\n    content: \"\\ec84\";\n}\n.nc-icon-mini.holidays_cockade:before {\n    content: \"\\ec85\";\n}\n.nc-icon-mini.holidays_coffin:before {\n    content: \"\\ec86\";\n}\n.nc-icon-mini.holidays_deer:before {\n    content: \"\\ec87\";\n}\n.nc-icon-mini.holidays_egg-38:before {\n    content: \"\\ec88\";\n}\n.nc-icon-mini.holidays_egg-39:before {\n    content: \"\\ec89\";\n}\n.nc-icon-mini.holidays_ghost:before {\n    content: \"\\ec8a\";\n}\n.nc-icon-mini.holidays_gift:before {\n    content: \"\\ec8b\";\n}\n.nc-icon-mini.holidays_glove:before {\n    content: \"\\ec8c\";\n}\n.nc-icon-mini.holidays_grave:before {\n    content: \"\\ec8d\";\n}\n.nc-icon-mini.holidays_light:before {\n    content: \"\\ec8e\";\n}\n.nc-icon-mini.holidays_message:before {\n    content: \"\\ec8f\";\n}\n.nc-icon-mini.holidays_owl:before {\n    content: \"\\ec90\";\n}\n.nc-icon-mini.holidays_pumpkin:before {\n    content: \"\\ec91\";\n}\n.nc-icon-mini.holidays_rabbit:before {\n    content: \"\\ec92\";\n}\n.nc-icon-mini.holidays_santa-hat:before {\n    content: \"\\ec93\";\n}\n.nc-icon-mini.holidays_sickle:before {\n    content: \"\\ec94\";\n}\n.nc-icon-mini.holidays_snow-ball:before {\n    content: \"\\ec95\";\n}\n.nc-icon-mini.holidays_snowman:before {\n    content: \"\\ec96\";\n}\n.nc-icon-mini.holidays_soak:before {\n    content: \"\\ec97\";\n}\n.nc-icon-mini.holidays_spider:before {\n    content: \"\\ec98\";\n}\n.nc-icon-mini.holidays_tree-ball:before {\n    content: \"\\ec99\";\n}\n.nc-icon-mini.holidays_tree:before {\n    content: \"\\ec9a\";\n}\n.nc-icon-mini.holidays_vampire:before {\n    content: \"\\ec9b\";\n}\n.nc-icon-mini.holidays_witch-hat:before {\n    content: \"\\ec9c\";\n}\n.nc-icon-mini.holidays_wolf:before {\n    content: \"\\ec9d\";\n}\n.nc-icon-mini.holidays_zombie:before {\n    content: \"\\ec9e\";\n}\n.nc-icon-mini.health_apple:before {\n    content: \"\\ec9f\";\n}\n.nc-icon-mini.health_bag-49:before {\n    content: \"\\eca0\";\n}\n.nc-icon-mini.health_bag-50:before {\n    content: \"\\eca1\";\n}\n.nc-icon-mini.health_brain:before {\n    content: \"\\eca2\";\n}\n.nc-icon-mini.health_dna-27:before {\n    content: \"\\eca3\";\n}\n.nc-icon-mini.health_dna-38:before {\n    content: \"\\eca4\";\n}\n.nc-icon-mini.health_flask:before {\n    content: \"\\eca5\";\n}\n.nc-icon-mini.health_heartbeat-16:before {\n    content: \"\\eca6\";\n}\n.nc-icon-mini.health_height:before {\n    content: \"\\eca7\";\n}\n.nc-icon-mini.health_hospital-32:before {\n    content: \"\\eca8\";\n}\n.nc-icon-mini.health_hospital-33:before {\n    content: \"\\eca9\";\n}\n.nc-icon-mini.health_hospital-34:before {\n    content: \"\\ecaa\";\n}\n.nc-icon-mini.health_humidity-26:before {\n    content: \"\\ecab\";\n}\n.nc-icon-mini.health_humidity-52:before {\n    content: \"\\ecac\";\n}\n.nc-icon-mini.health_molecule-39:before {\n    content: \"\\ecad\";\n}\n.nc-icon-mini.health_notebook:before {\n    content: \"\\ecae\";\n}\n.nc-icon-mini.health_patch-46:before {\n    content: \"\\ecaf\";\n}\n.nc-icon-mini.health_pill-42:before {\n    content: \"\\ecb0\";\n}\n.nc-icon-mini.health_pill-43:before {\n    content: \"\\ecb1\";\n}\n.nc-icon-mini.health_pill-container-44:before {\n    content: \"\\ecb2\";\n}\n.nc-icon-mini.health_pill-container-47:before {\n    content: \"\\ecb3\";\n}\n.nc-icon-mini.health_pulse-chart:before {\n    content: \"\\ecb4\";\n}\n.nc-icon-mini.health_pulse-sleep:before {\n    content: \"\\ecb5\";\n}\n.nc-icon-mini.health_pulse:before {\n    content: \"\\ecb6\";\n}\n.nc-icon-mini.health_steps:before {\n    content: \"\\ecb7\";\n}\n.nc-icon-mini.health_syringe:before {\n    content: \"\\ecb8\";\n}\n.nc-icon-mini.health_temperature-23:before {\n    content: \"\\ecb9\";\n}\n.nc-icon-mini.health_temperature-24:before {\n    content: \"\\ecba\";\n}\n.nc-icon-mini.health_tooth:before {\n    content: \"\\ecbb\";\n}\n.nc-icon-mini.health_weed:before {\n    content: \"\\ecbc\";\n}\n.nc-icon-mini.health_weight:before {\n    content: \"\\ecbd\";\n}\n.nc-icon-mini.health_wheelchair:before {\n    content: \"\\ecbe\";\n}\n.nc-icon-mini.health_woman:before {\n    content: \"\\ecbf\";\n}\n.nc-icon-mini.furniture_air-conditioner:before {\n    content: \"\\ecc0\";\n}\n.nc-icon-mini.furniture_armchair:before {\n    content: \"\\ecc1\";\n}\n.nc-icon-mini.furniture_bed-09:before {\n    content: \"\\ecc2\";\n}\n.nc-icon-mini.furniture_bed-23:before {\n    content: \"\\ecc3\";\n}\n.nc-icon-mini.furniture_cabinet:before {\n    content: \"\\ecc4\";\n}\n.nc-icon-mini.furniture_cactus:before {\n    content: \"\\ecc5\";\n}\n.nc-icon-mini.furniture_chair:before {\n    content: \"\\ecc6\";\n}\n.nc-icon-mini.furniture_coat-hanger:before {\n    content: \"\\ecc7\";\n}\n.nc-icon-mini.furniture_coffee:before {\n    content: \"\\ecc8\";\n}\n.nc-icon-mini.furniture_cradle:before {\n    content: \"\\ecc9\";\n}\n.nc-icon-mini.furniture_curtain:before {\n    content: \"\\ecca\";\n}\n.nc-icon-mini.furniture_desk:before {\n    content: \"\\eccb\";\n}\n.nc-icon-mini.furniture_door:before {\n    content: \"\\eccc\";\n}\n.nc-icon-mini.furniture_drawer:before {\n    content: \"\\eccd\";\n}\n.nc-icon-mini.furniture_fridge:before {\n    content: \"\\ecce\";\n}\n.nc-icon-mini.furniture_hanger:before {\n    content: \"\\eccf\";\n}\n.nc-icon-mini.furniture_iron:before {\n    content: \"\\ecd0\";\n}\n.nc-icon-mini.furniture_lamp-floor:before {\n    content: \"\\ecd1\";\n}\n.nc-icon-mini.furniture_lamp:before {\n    content: \"\\ecd2\";\n}\n.nc-icon-mini.furniture_library:before {\n    content: \"\\ecd3\";\n}\n.nc-icon-mini.furniture_light:before {\n    content: \"\\ecd4\";\n}\n.nc-icon-mini.furniture_mixer:before {\n    content: \"\\ecd5\";\n}\n.nc-icon-mini.furniture_oven:before {\n    content: \"\\ecd6\";\n}\n.nc-icon-mini.furniture_shower:before {\n    content: \"\\ecd7\";\n}\n.nc-icon-mini.furniture_sink-wash:before {\n    content: \"\\ecd8\";\n}\n.nc-icon-mini.furniture_sink:before {\n    content: \"\\ecd9\";\n}\n.nc-icon-mini.furniture_storage-hanger:before {\n    content: \"\\ecda\";\n}\n.nc-icon-mini.furniture_storage:before {\n    content: \"\\ecdb\";\n}\n.nc-icon-mini.furniture_toilet-paper:before {\n    content: \"\\ecdc\";\n}\n.nc-icon-mini.furniture_toilet:before {\n    content: \"\\ecdd\";\n}\n.nc-icon-mini.furniture_tv:before {\n    content: \"\\ecde\";\n}\n.nc-icon-mini.furniture_wardrobe:before {\n    content: \"\\ecdf\";\n}\n.nc-icon-mini.furniture_wash:before {\n    content: \"\\ece0\";\n}\n.nc-icon-mini.food_baby:before {\n    content: \"\\ece1\";\n}\n.nc-icon-mini.food_bacon:before {\n    content: \"\\ece2\";\n}\n.nc-icon-mini.food_banana:before {\n    content: \"\\ece3\";\n}\n.nc-icon-mini.food_barbecue-tools:before {\n    content: \"\\ece4\";\n}\n.nc-icon-mini.food_beer-95:before {\n    content: \"\\ece5\";\n}\n.nc-icon-mini.food_beer-96:before {\n    content: \"\\ece6\";\n}\n.nc-icon-mini.food_beverage:before {\n    content: \"\\ece7\";\n}\n.nc-icon-mini.food_bottle-wine:before {\n    content: \"\\ece8\";\n}\n.nc-icon-mini.food_bottle:before {\n    content: \"\\ece9\";\n}\n.nc-icon-mini.food_bowl:before {\n    content: \"\\ecea\";\n}\n.nc-icon-mini.food_bread:before {\n    content: \"\\eceb\";\n}\n.nc-icon-mini.food_broccoli:before {\n    content: \"\\ecec\";\n}\n.nc-icon-mini.food_cake-13:before {\n    content: \"\\eced\";\n}\n.nc-icon-mini.food_cake-slice:before {\n    content: \"\\ecee\";\n}\n.nc-icon-mini.food_candle:before {\n    content: \"\\ecef\";\n}\n.nc-icon-mini.food_candy:before {\n    content: \"\\ecf0\";\n}\n.nc-icon-mini.food_carrot:before {\n    content: \"\\ecf1\";\n}\n.nc-icon-mini.food_champagne:before {\n    content: \"\\ecf2\";\n}\n.nc-icon-mini.food_cheese-24:before {\n    content: \"\\ecf3\";\n}\n.nc-icon-mini.food_cheese-87:before {\n    content: \"\\ecf4\";\n}\n.nc-icon-mini.food_cheeseburger:before {\n    content: \"\\ecf5\";\n}\n.nc-icon-mini.food_chef-hat:before {\n    content: \"\\ecf6\";\n}\n.nc-icon-mini.food_cherry:before {\n    content: \"\\ecf7\";\n}\n.nc-icon-mini.food_chicken:before {\n    content: \"\\ecf8\";\n}\n.nc-icon-mini.food_chili:before {\n    content: \"\\ecf9\";\n}\n.nc-icon-mini.food_chinese:before {\n    content: \"\\ecfa\";\n}\n.nc-icon-mini.food_chips:before {\n    content: \"\\ecfb\";\n}\n.nc-icon-mini.food_chocolate:before {\n    content: \"\\ecfc\";\n}\n.nc-icon-mini.food_cocktail:before {\n    content: \"\\ecfd\";\n}\n.nc-icon-mini.food_coffe-long:before {\n    content: \"\\ecfe\";\n}\n.nc-icon-mini.food_coffee-long:before {\n    content: \"\\ecff\";\n}\n.nc-icon-mini.food_coffee:before {\n    content: \"\\ed00\";\n}\n.nc-icon-mini.food_cookies:before {\n    content: \"\\ed01\";\n}\n.nc-icon-mini.food_course:before {\n    content: \"\\ed02\";\n}\n.nc-icon-mini.food_crab:before {\n    content: \"\\ed03\";\n}\n.nc-icon-mini.food_croissant:before {\n    content: \"\\ed04\";\n}\n.nc-icon-mini.food_cutlery-75:before {\n    content: \"\\ed05\";\n}\n.nc-icon-mini.food_cutlery-76:before {\n    content: \"\\ed06\";\n}\n.nc-icon-mini.food_cutlery-77:before {\n    content: \"\\ed07\";\n}\n.nc-icon-mini.food_donut:before {\n    content: \"\\ed08\";\n}\n.nc-icon-mini.food_drink:before {\n    content: \"\\ed09\";\n}\n.nc-icon-mini.food_egg:before {\n    content: \"\\ed0a\";\n}\n.nc-icon-mini.food_energy-drink:before {\n    content: \"\\ed0b\";\n}\n.nc-icon-mini.food_fish:before {\n    content: \"\\ed0c\";\n}\n.nc-icon-mini.food_glass:before {\n    content: \"\\ed0d\";\n}\n.nc-icon-mini.food_grape:before {\n    content: \"\\ed0e\";\n}\n.nc-icon-mini.food_hob:before {\n    content: \"\\ed0f\";\n}\n.nc-icon-mini.food_hot-dog:before {\n    content: \"\\ed10\";\n}\n.nc-icon-mini.food_ice-cream-22:before {\n    content: \"\\ed11\";\n}\n.nc-icon-mini.food_ice-cream-72:before {\n    content: \"\\ed12\";\n}\n.nc-icon-mini.food_kettle:before {\n    content: \"\\ed13\";\n}\n.nc-icon-mini.food_knife:before {\n    content: \"\\ed14\";\n}\n.nc-icon-mini.food_lighter:before {\n    content: \"\\ed15\";\n}\n.nc-icon-mini.food_matches:before {\n    content: \"\\ed16\";\n}\n.nc-icon-mini.food_measuring-cup:before {\n    content: \"\\ed17\";\n}\n.nc-icon-mini.food_microwave:before {\n    content: \"\\ed18\";\n}\n.nc-icon-mini.food_milk:before {\n    content: \"\\ed19\";\n}\n.nc-icon-mini.food_moka:before {\n    content: \"\\ed1a\";\n}\n.nc-icon-mini.food_muffin:before {\n    content: \"\\ed1b\";\n}\n.nc-icon-mini.food_mug:before {\n    content: \"\\ed1c\";\n}\n.nc-icon-mini.food_pan:before {\n    content: \"\\ed1d\";\n}\n.nc-icon-mini.food_pizza-slice:before {\n    content: \"\\ed1e\";\n}\n.nc-icon-mini.food_plate:before {\n    content: \"\\ed1f\";\n}\n.nc-icon-mini.food_pot:before {\n    content: \"\\ed20\";\n}\n.nc-icon-mini.food_recipe-book-46:before {\n    content: \"\\ed21\";\n}\n.nc-icon-mini.food_recipe-book-47:before {\n    content: \"\\ed22\";\n}\n.nc-icon-mini.food_rolling-pin:before {\n    content: \"\\ed23\";\n}\n.nc-icon-mini.food_sausage:before {\n    content: \"\\ed24\";\n}\n.nc-icon-mini.food_scale:before {\n    content: \"\\ed25\";\n}\n.nc-icon-mini.food_steak:before {\n    content: \"\\ed26\";\n}\n.nc-icon-mini.food_strawberry:before {\n    content: \"\\ed27\";\n}\n.nc-icon-mini.food_sushi:before {\n    content: \"\\ed28\";\n}\n.nc-icon-mini.food_tacos:before {\n    content: \"\\ed29\";\n}\n.nc-icon-mini.food_tea:before {\n    content: \"\\ed2a\";\n}\n.nc-icon-mini.food_watermelon:before {\n    content: \"\\ed2b\";\n}\n.nc-icon-mini.food_whisk:before {\n    content: \"\\ed2c\";\n}\n.nc-icon-mini.files_add:before {\n    content: \"\\ed2d\";\n}\n.nc-icon-mini.files_archive-3d-content:before {\n    content: \"\\ed2e\";\n}\n.nc-icon-mini.files_archive-check:before {\n    content: \"\\ed2f\";\n}\n.nc-icon-mini.files_archive-content:before {\n    content: \"\\ed30\";\n}\n.nc-icon-mini.files_archive-paper:before {\n    content: \"\\ed31\";\n}\n.nc-icon-mini.files_archive:before {\n    content: \"\\ed32\";\n}\n.nc-icon-mini.files_book-07:before {\n    content: \"\\ed33\";\n}\n.nc-icon-mini.files_box:before {\n    content: \"\\ed34\";\n}\n.nc-icon-mini.files_copy:before {\n    content: \"\\ed35\";\n}\n.nc-icon-mini.files_drawer:before {\n    content: \"\\ed36\";\n}\n.nc-icon-mini.files_folder-13:before {\n    content: \"\\ed37\";\n}\n.nc-icon-mini.files_folder-14:before {\n    content: \"\\ed38\";\n}\n.nc-icon-mini.files_folder-15:before {\n    content: \"\\ed39\";\n}\n.nc-icon-mini.files_folder-16:before {\n    content: \"\\ed3a\";\n}\n.nc-icon-mini.files_folder-17:before {\n    content: \"\\ed3b\";\n}\n.nc-icon-mini.files_folder-18:before {\n    content: \"\\ed3c\";\n}\n.nc-icon-mini.files_folder-add:before {\n    content: \"\\ed3d\";\n}\n.nc-icon-mini.files_folder-remove:before {\n    content: \"\\ed3e\";\n}\n.nc-icon-mini.files_notebook:before {\n    content: \"\\ed3f\";\n}\n.nc-icon-mini.files_paper:before {\n    content: \"\\ed40\";\n}\n.nc-icon-mini.files_remove:before {\n    content: \"\\ed41\";\n}\n.nc-icon-mini.files_single-content-02:before {\n    content: \"\\ed42\";\n}\n.nc-icon-mini.files_single-content-03:before {\n    content: \"\\ed43\";\n}\n.nc-icon-mini.files_single-copies:before {\n    content: \"\\ed44\";\n}\n.nc-icon-mini.files_single-copy-04:before {\n    content: \"\\ed45\";\n}\n.nc-icon-mini.files_single-copy-06:before {\n    content: \"\\ed46\";\n}\n.nc-icon-mini.files_single-folded-content:before {\n    content: \"\\ed47\";\n}\n.nc-icon-mini.files_single-folded:before {\n    content: \"\\ed48\";\n}\n.nc-icon-mini.files_single-paragraph:before {\n    content: \"\\ed49\";\n}\n.nc-icon-mini.files_single:before {\n    content: \"\\ed4a\";\n}\n.nc-icon-mini.files-e_add:before {\n    content: \"\\ed4b\";\n}\n.nc-icon-mini.files-e_book:before {\n    content: \"\\ed4c\";\n}\n.nc-icon-mini.files-e_folder-02:before {\n    content: \"\\ed4d\";\n}\n.nc-icon-mini.files-e_folder-03:before {\n    content: \"\\ed4e\";\n}\n.nc-icon-mini.files-e_folder-add:before {\n    content: \"\\ed4f\";\n}\n.nc-icon-mini.files-e_folder-remove:before {\n    content: \"\\ed50\";\n}\n.nc-icon-mini.files-e_remove:before {\n    content: \"\\ed51\";\n}\n.nc-icon-mini.emoticons_angry-10:before {\n    content: \"\\ed52\";\n}\n.nc-icon-mini.emoticons_angry-44:before {\n    content: \"\\ed53\";\n}\n.nc-icon-mini.emoticons_big-eyes:before {\n    content: \"\\ed54\";\n}\n.nc-icon-mini.emoticons_big-smile:before {\n    content: \"\\ed55\";\n}\n.nc-icon-mini.emoticons_bigmouth:before {\n    content: \"\\ed56\";\n}\n.nc-icon-mini.emoticons_bomb:before {\n    content: \"\\ed57\";\n}\n.nc-icon-mini.emoticons_cake:before {\n    content: \"\\ed58\";\n}\n.nc-icon-mini.emoticons_cry-15:before {\n    content: \"\\ed59\";\n}\n.nc-icon-mini.emoticons_cute:before {\n    content: \"\\ed5a\";\n}\n.nc-icon-mini.emoticons_devil:before {\n    content: \"\\ed5b\";\n}\n.nc-icon-mini.emoticons_fist:before {\n    content: \"\\ed5c\";\n}\n.nc-icon-mini.emoticons_ghost:before {\n    content: \"\\ed5d\";\n}\n.nc-icon-mini.emoticons_happy-sun:before {\n    content: \"\\ed5e\";\n}\n.nc-icon-mini.emoticons_kiss:before {\n    content: \"\\ed5f\";\n}\n.nc-icon-mini.emoticons_laugh-35:before {\n    content: \"\\ed60\";\n}\n.nc-icon-mini.emoticons_like-no:before {\n    content: \"\\ed61\";\n}\n.nc-icon-mini.emoticons_like:before {\n    content: \"\\ed62\";\n}\n.nc-icon-mini.emoticons_manga-62:before {\n    content: \"\\ed63\";\n}\n.nc-icon-mini.emoticons_manga-63:before {\n    content: \"\\ed64\";\n}\n.nc-icon-mini.emoticons_monster:before {\n    content: \"\\ed65\";\n}\n.nc-icon-mini.emoticons_nerd-22:before {\n    content: \"\\ed66\";\n}\n.nc-icon-mini.emoticons_poop:before {\n    content: \"\\ed67\";\n}\n.nc-icon-mini.emoticons_puzzled:before {\n    content: \"\\ed68\";\n}\n.nc-icon-mini.emoticons_quite-happy:before {\n    content: \"\\ed69\";\n}\n.nc-icon-mini.emoticons_robot:before {\n    content: \"\\ed6a\";\n}\n.nc-icon-mini.emoticons_sad:before {\n    content: \"\\ed6b\";\n}\n.nc-icon-mini.emoticons_satisfied:before {\n    content: \"\\ed6c\";\n}\n.nc-icon-mini.emoticons_shark:before {\n    content: \"\\ed6d\";\n}\n.nc-icon-mini.emoticons_shy:before {\n    content: \"\\ed6e\";\n}\n.nc-icon-mini.emoticons_skull:before {\n    content: \"\\ed6f\";\n}\n.nc-icon-mini.emoticons_smile:before {\n    content: \"\\ed70\";\n}\n.nc-icon-mini.emoticons_speechless:before {\n    content: \"\\ed71\";\n}\n.nc-icon-mini.emoticons_sunglasses-48:before {\n    content: \"\\ed72\";\n}\n.nc-icon-mini.emoticons_sunglasses-49:before {\n    content: \"\\ed73\";\n}\n.nc-icon-mini.emoticons_surprise:before {\n    content: \"\\ed74\";\n}\n.nc-icon-mini.emoticons_virus:before {\n    content: \"\\ed75\";\n}\n.nc-icon-mini.emoticons_what:before {\n    content: \"\\ed76\";\n}\n.nc-icon-mini.emoticons-e_angry-e-08:before {\n    content: \"\\ed77\";\n}\n.nc-icon-mini.emoticons-e_angry-e-17:before {\n    content: \"\\ed78\";\n}\n.nc-icon-mini.emoticons-e_ghost-e:before {\n    content: \"\\ed79\";\n}\n.nc-icon-mini.emoticons-e_kiss-e:before {\n    content: \"\\ed7a\";\n}\n.nc-icon-mini.emoticons-e_laugh-e:before {\n    content: \"\\ed7b\";\n}\n.nc-icon-mini.emoticons-e_monster-e:before {\n    content: \"\\ed7c\";\n}\n.nc-icon-mini.emoticons-e_puzzled-e:before {\n    content: \"\\ed7d\";\n}\n.nc-icon-mini.emoticons-e_quite-happy-e:before {\n    content: \"\\ed7e\";\n}\n.nc-icon-mini.emoticons-e_robot-e:before {\n    content: \"\\ed7f\";\n}\n.nc-icon-mini.emoticons-e_sad-e:before {\n    content: \"\\ed80\";\n}\n.nc-icon-mini.emoticons-e_satisfied-e:before {\n    content: \"\\ed81\";\n}\n.nc-icon-mini.emoticons-e_shark-e:before {\n    content: \"\\ed82\";\n}\n.nc-icon-mini.emoticons-e_shy-e:before {\n    content: \"\\ed83\";\n}\n.nc-icon-mini.emoticons-e_smile-e:before {\n    content: \"\\ed84\";\n}\n.nc-icon-mini.emoticons-e_speechless-e:before {\n    content: \"\\ed85\";\n}\n.nc-icon-mini.emoticons-e_surprise-e:before {\n    content: \"\\ed86\";\n}\n.nc-icon-mini.emoticons-e_what-e:before {\n    content: \"\\ed87\";\n}\n.nc-icon-mini.design_album:before {\n    content: \"\\ed88\";\n}\n.nc-icon-mini.design_align-bottom:before {\n    content: \"\\ed89\";\n}\n.nc-icon-mini.design_align-center-horizontal:before {\n    content: \"\\ed8a\";\n}\n.nc-icon-mini.design_align-center-vertical:before {\n    content: \"\\ed8b\";\n}\n.nc-icon-mini.design_align-left:before {\n    content: \"\\ed8c\";\n}\n.nc-icon-mini.design_align-right:before {\n    content: \"\\ed8d\";\n}\n.nc-icon-mini.design_align-top:before {\n    content: \"\\ed8e\";\n}\n.nc-icon-mini.design_app:before {\n    content: \"\\ed8f\";\n}\n.nc-icon-mini.design_artboard:before {\n    content: \"\\ed90\";\n}\n.nc-icon-mini.design_blend:before {\n    content: \"\\ed91\";\n}\n.nc-icon-mini.design_book-bookmark:before {\n    content: \"\\ed92\";\n}\n.nc-icon-mini.design_book-open:before {\n    content: \"\\ed93\";\n}\n.nc-icon-mini.design_brush:before {\n    content: \"\\ed94\";\n}\n.nc-icon-mini.design_bug:before {\n    content: \"\\ed95\";\n}\n.nc-icon-mini.design_bullet-list-67:before {\n    content: \"\\ed96\";\n}\n.nc-icon-mini.design_bullet-list-68:before {\n    content: \"\\ed97\";\n}\n.nc-icon-mini.design_bullet-list-69:before {\n    content: \"\\ed98\";\n}\n.nc-icon-mini.design_bullet-list-70:before {\n    content: \"\\ed99\";\n}\n.nc-icon-mini.design_clone:before {\n    content: \"\\ed9a\";\n}\n.nc-icon-mini.design_code:before {\n    content: \"\\ed9b\";\n}\n.nc-icon-mini.design_collection:before {\n    content: \"\\ed9c\";\n}\n.nc-icon-mini.design_command:before {\n    content: \"\\ed9d\";\n}\n.nc-icon-mini.design_compass:before {\n    content: \"\\ed9e\";\n}\n.nc-icon-mini.design_contrast:before {\n    content: \"\\ed9f\";\n}\n.nc-icon-mini.design_copy:before {\n    content: \"\\eda0\";\n}\n.nc-icon-mini.design_crop:before {\n    content: \"\\eda1\";\n}\n.nc-icon-mini.design_cursor-48:before {\n    content: \"\\eda2\";\n}\n.nc-icon-mini.design_cursor-49:before {\n    content: \"\\eda3\";\n}\n.nc-icon-mini.design_design:before {\n    content: \"\\eda4\";\n}\n.nc-icon-mini.design_distribute-horizontal:before {\n    content: \"\\eda5\";\n}\n.nc-icon-mini.design_distribute-vertical:before {\n    content: \"\\eda6\";\n}\n.nc-icon-mini.design_eraser-32:before {\n    content: \"\\eda7\";\n}\n.nc-icon-mini.design_eraser-33:before {\n    content: \"\\eda8\";\n}\n.nc-icon-mini.design_eraser-46:before {\n    content: \"\\eda9\";\n}\n.nc-icon-mini.design_flip-horizontal:before {\n    content: \"\\edaa\";\n}\n.nc-icon-mini.design_flip-vertical:before {\n    content: \"\\edab\";\n}\n.nc-icon-mini.design_image:before {\n    content: \"\\edac\";\n}\n.nc-icon-mini.design_magnet:before {\n    content: \"\\edad\";\n}\n.nc-icon-mini.design_marker:before {\n    content: \"\\edae\";\n}\n.nc-icon-mini.design_measure-02:before {\n    content: \"\\edaf\";\n}\n.nc-icon-mini.design_measure-17:before {\n    content: \"\\edb0\";\n}\n.nc-icon-mini.design_measure-big:before {\n    content: \"\\edb1\";\n}\n.nc-icon-mini.design_mouse-08:before {\n    content: \"\\edb2\";\n}\n.nc-icon-mini.design_mouse-09:before {\n    content: \"\\edb3\";\n}\n.nc-icon-mini.design_mouse-10:before {\n    content: \"\\edb4\";\n}\n.nc-icon-mini.design_note-code:before {\n    content: \"\\edb5\";\n}\n.nc-icon-mini.design_paint-16:before {\n    content: \"\\edb6\";\n}\n.nc-icon-mini.design_paint-37:before {\n    content: \"\\edb7\";\n}\n.nc-icon-mini.design_paint-38:before {\n    content: \"\\edb8\";\n}\n.nc-icon-mini.design_paint-bucket-39:before {\n    content: \"\\edb9\";\n}\n.nc-icon-mini.design_paint-bucket-40:before {\n    content: \"\\edba\";\n}\n.nc-icon-mini.design_palette:before {\n    content: \"\\edbb\";\n}\n.nc-icon-mini.design_pantone:before {\n    content: \"\\edbc\";\n}\n.nc-icon-mini.design_patch-19:before {\n    content: \"\\edbd\";\n}\n.nc-icon-mini.design_patch-34:before {\n    content: \"\\edbe\";\n}\n.nc-icon-mini.design_path-exclude:before {\n    content: \"\\edbf\";\n}\n.nc-icon-mini.design_path-intersect:before {\n    content: \"\\edc0\";\n}\n.nc-icon-mini.design_path-minus:before {\n    content: \"\\edc1\";\n}\n.nc-icon-mini.design_path-unite:before {\n    content: \"\\edc2\";\n}\n.nc-icon-mini.design_pen-01:before {\n    content: \"\\edc3\";\n}\n.nc-icon-mini.design_pen-23:before {\n    content: \"\\edc4\";\n}\n.nc-icon-mini.design_pen-tool:before {\n    content: \"\\edc5\";\n}\n.nc-icon-mini.design_phone:before {\n    content: \"\\edc6\";\n}\n.nc-icon-mini.design_scissors:before {\n    content: \"\\edc7\";\n}\n.nc-icon-mini.design_shape-adjust:before {\n    content: \"\\edc8\";\n}\n.nc-icon-mini.design_shape-circle:before {\n    content: \"\\edc9\";\n}\n.nc-icon-mini.design_shape-polygon:before {\n    content: \"\\edca\";\n}\n.nc-icon-mini.design_shape-square:before {\n    content: \"\\edcb\";\n}\n.nc-icon-mini.design_shape-triangle:before {\n    content: \"\\edcc\";\n}\n.nc-icon-mini.design_shapes:before {\n    content: \"\\edcd\";\n}\n.nc-icon-mini.design_sharpener:before {\n    content: \"\\edce\";\n}\n.nc-icon-mini.design_slice:before {\n    content: \"\\edcf\";\n}\n.nc-icon-mini.design_spray:before {\n    content: \"\\edd0\";\n}\n.nc-icon-mini.design_stamp:before {\n    content: \"\\edd1\";\n}\n.nc-icon-mini.design_tablet:before {\n    content: \"\\edd2\";\n}\n.nc-icon-mini.design_text:before {\n    content: \"\\edd3\";\n}\n.nc-icon-mini.design_todo:before {\n    content: \"\\edd4\";\n}\n.nc-icon-mini.design_usb:before {\n    content: \"\\edd5\";\n}\n.nc-icon-mini.design_vector:before {\n    content: \"\\edd6\";\n}\n.nc-icon-mini.design_wand:before {\n    content: \"\\edd7\";\n}\n.nc-icon-mini.design_webpage:before {\n    content: \"\\edd8\";\n}\n.nc-icon-mini.design_window-code:before {\n    content: \"\\edd9\";\n}\n.nc-icon-mini.design_window-paragraph:before {\n    content: \"\\edda\";\n}\n.nc-icon-mini.design_window-responsive:before {\n    content: \"\\eddb\";\n}\n.nc-icon-mini.clothes_baby:before {\n    content: \"\\eddc\";\n}\n.nc-icon-mini.clothes_backpack:before {\n    content: \"\\eddd\";\n}\n.nc-icon-mini.clothes_bag-21:before {\n    content: \"\\edde\";\n}\n.nc-icon-mini.clothes_bag-22:before {\n    content: \"\\eddf\";\n}\n.nc-icon-mini.clothes_belt:before {\n    content: \"\\ede0\";\n}\n.nc-icon-mini.clothes_boot-woman:before {\n    content: \"\\ede1\";\n}\n.nc-icon-mini.clothes_boot:before {\n    content: \"\\ede2\";\n}\n.nc-icon-mini.clothes_bra:before {\n    content: \"\\ede3\";\n}\n.nc-icon-mini.clothes_button:before {\n    content: \"\\ede4\";\n}\n.nc-icon-mini.clothes_cap:before {\n    content: \"\\ede5\";\n}\n.nc-icon-mini.clothes_corset:before {\n    content: \"\\ede6\";\n}\n.nc-icon-mini.clothes_dress-woman:before {\n    content: \"\\ede7\";\n}\n.nc-icon-mini.clothes_flip:before {\n    content: \"\\ede8\";\n}\n.nc-icon-mini.clothes_glasses:before {\n    content: \"\\ede9\";\n}\n.nc-icon-mini.clothes_hat-top:before {\n    content: \"\\edea\";\n}\n.nc-icon-mini.clothes_hat:before {\n    content: \"\\edeb\";\n}\n.nc-icon-mini.clothes_iron:before {\n    content: \"\\edec\";\n}\n.nc-icon-mini.clothes_jeans-41:before {\n    content: \"\\eded\";\n}\n.nc-icon-mini.clothes_jeans-pocket:before {\n    content: \"\\edee\";\n}\n.nc-icon-mini.clothes_kitchen:before {\n    content: \"\\edef\";\n}\n.nc-icon-mini.clothes_long-sleeve:before {\n    content: \"\\edf0\";\n}\n.nc-icon-mini.clothes_makeup:before {\n    content: \"\\edf1\";\n}\n.nc-icon-mini.clothes_ring:before {\n    content: \"\\edf2\";\n}\n.nc-icon-mini.clothes_scarf:before {\n    content: \"\\edf3\";\n}\n.nc-icon-mini.clothes_shirt-buttons:before {\n    content: \"\\edf4\";\n}\n.nc-icon-mini.clothes_shirt-neck:before {\n    content: \"\\edf5\";\n}\n.nc-icon-mini.clothes_shirt:before {\n    content: \"\\edf6\";\n}\n.nc-icon-mini.clothes_shoe-man:before {\n    content: \"\\edf7\";\n}\n.nc-icon-mini.clothes_shoe-sport:before {\n    content: \"\\edf8\";\n}\n.nc-icon-mini.clothes_shoe-woman:before {\n    content: \"\\edf9\";\n}\n.nc-icon-mini.clothes_skirt:before {\n    content: \"\\edfa\";\n}\n.nc-icon-mini.clothes_slacks-12:before {\n    content: \"\\edfb\";\n}\n.nc-icon-mini.clothes_sock:before {\n    content: \"\\edfc\";\n}\n.nc-icon-mini.clothes_tie-bow:before {\n    content: \"\\edfd\";\n}\n.nc-icon-mini.clothes_tshirt-53:before {\n    content: \"\\edfe\";\n}\n.nc-icon-mini.clothes_tshirt-54:before {\n    content: \"\\edff\";\n}\n.nc-icon-mini.clothes_underwear-man:before {\n    content: \"\\ee00\";\n}\n.nc-icon-mini.clothes_underwear:before {\n    content: \"\\ee01\";\n}\n.nc-icon-mini.clothes_vest:before {\n    content: \"\\ee02\";\n}\n.nc-icon-mini.clothes_wash:before {\n    content: \"\\ee03\";\n}\n.nc-icon-mini.business_agenda:before {\n    content: \"\\ee04\";\n}\n.nc-icon-mini.business_atm:before {\n    content: \"\\ee05\";\n}\n.nc-icon-mini.business_award-48:before {\n    content: \"\\ee06\";\n}\n.nc-icon-mini.business_award-49:before {\n    content: \"\\ee07\";\n}\n.nc-icon-mini.business_award-74:before {\n    content: \"\\ee08\";\n}\n.nc-icon-mini.business_badge:before {\n    content: \"\\ee09\";\n}\n.nc-icon-mini.business_bank:before {\n    content: \"\\ee0a\";\n}\n.nc-icon-mini.business_board-27:before {\n    content: \"\\ee0b\";\n}\n.nc-icon-mini.business_board-28:before {\n    content: \"\\ee0c\";\n}\n.nc-icon-mini.business_books:before {\n    content: \"\\ee0d\";\n}\n.nc-icon-mini.business_briefcase-24:before {\n    content: \"\\ee0e\";\n}\n.nc-icon-mini.business_briefcase-25:before {\n    content: \"\\ee0f\";\n}\n.nc-icon-mini.business_briefcase-26:before {\n    content: \"\\ee10\";\n}\n.nc-icon-mini.business_building:before {\n    content: \"\\ee11\";\n}\n.nc-icon-mini.business_bulb-61:before {\n    content: \"\\ee12\";\n}\n.nc-icon-mini.business_bulb-62:before {\n    content: \"\\ee13\";\n}\n.nc-icon-mini.business_bulb-63:before {\n    content: \"\\ee14\";\n}\n.nc-icon-mini.business_businessman-03:before {\n    content: \"\\ee15\";\n}\n.nc-icon-mini.business_businessman-04:before {\n    content: \"\\ee16\";\n}\n.nc-icon-mini.business_calculator:before {\n    content: \"\\ee17\";\n}\n.nc-icon-mini.business_chair:before {\n    content: \"\\ee18\";\n}\n.nc-icon-mini.business_chart-bar-32:before {\n    content: \"\\ee19\";\n}\n.nc-icon-mini.business_chart-growth:before {\n    content: \"\\ee1a\";\n}\n.nc-icon-mini.business_chart-pie-35:before {\n    content: \"\\ee1b\";\n}\n.nc-icon-mini.business_chart-pie-36:before {\n    content: \"\\ee1c\";\n}\n.nc-icon-mini.business_chart:before {\n    content: \"\\ee1d\";\n}\n.nc-icon-mini.business_cheque:before {\n    content: \"\\ee1e\";\n}\n.nc-icon-mini.business_coins:before {\n    content: \"\\ee1f\";\n}\n.nc-icon-mini.business_connect:before {\n    content: \"\\ee20\";\n}\n.nc-icon-mini.business_contacts:before {\n    content: \"\\ee21\";\n}\n.nc-icon-mini.business_currency-dollar:before {\n    content: \"\\ee22\";\n}\n.nc-icon-mini.business_currency-euro:before {\n    content: \"\\ee23\";\n}\n.nc-icon-mini.business_currency-pound:before {\n    content: \"\\ee24\";\n}\n.nc-icon-mini.business_currency-yen:before {\n    content: \"\\ee25\";\n}\n.nc-icon-mini.business_factory:before {\n    content: \"\\ee26\";\n}\n.nc-icon-mini.business_globe:before {\n    content: \"\\ee27\";\n}\n.nc-icon-mini.business_goal-64:before {\n    content: \"\\ee28\";\n}\n.nc-icon-mini.business_goal-65:before {\n    content: \"\\ee29\";\n}\n.nc-icon-mini.business_hammer:before {\n    content: \"\\ee2a\";\n}\n.nc-icon-mini.business_handout:before {\n    content: \"\\ee2b\";\n}\n.nc-icon-mini.business_hat:before {\n    content: \"\\ee2c\";\n}\n.nc-icon-mini.business_hierarchy-53:before {\n    content: \"\\ee2d\";\n}\n.nc-icon-mini.business_math:before {\n    content: \"\\ee2e\";\n}\n.nc-icon-mini.business_money-11:before {\n    content: \"\\ee2f\";\n}\n.nc-icon-mini.business_money-12:before {\n    content: \"\\ee30\";\n}\n.nc-icon-mini.business_money-13:before {\n    content: \"\\ee31\";\n}\n.nc-icon-mini.business_money-bag:before {\n    content: \"\\ee32\";\n}\n.nc-icon-mini.business_net:before {\n    content: \"\\ee33\";\n}\n.nc-icon-mini.business_notes:before {\n    content: \"\\ee34\";\n}\n.nc-icon-mini.business_percentage-39:before {\n    content: \"\\ee35\";\n}\n.nc-icon-mini.business_pin:before {\n    content: \"\\ee36\";\n}\n.nc-icon-mini.business_plug:before {\n    content: \"\\ee37\";\n}\n.nc-icon-mini.business_progress:before {\n    content: \"\\ee38\";\n}\n.nc-icon-mini.business_safe:before {\n    content: \"\\ee39\";\n}\n.nc-icon-mini.business_sign:before {\n    content: \"\\ee3a\";\n}\n.nc-icon-mini.business_signature:before {\n    content: \"\\ee3b\";\n}\n.nc-icon-mini.business_stock:before {\n    content: \"\\ee3c\";\n}\n.nc-icon-mini.business_strategy:before {\n    content: \"\\ee3d\";\n}\n.nc-icon-mini.business_tie-01:before {\n    content: \"\\ee3e\";\n}\n.nc-icon-mini.business_tie-02:before {\n    content: \"\\ee3f\";\n}\n.nc-icon-mini.business_wallet-43:before {\n    content: \"\\ee40\";\n}\n.nc-icon-mini.business_wallet-44:before {\n    content: \"\\ee41\";\n}\n.nc-icon-mini.nature_bee:before {\n    content: \"\\ee42\";\n}\n.nc-icon-mini.nature_butterfly:before {\n    content: \"\\ee43\";\n}\n.nc-icon-mini.nature_chicken:before {\n    content: \"\\ee44\";\n}\n.nc-icon-mini.nature_clover:before {\n    content: \"\\ee45\";\n}\n.nc-icon-mini.nature_collar:before {\n    content: \"\\ee46\";\n}\n.nc-icon-mini.nature_cow:before {\n    content: \"\\ee47\";\n}\n.nc-icon-mini.nature_dog-house:before {\n    content: \"\\ee48\";\n}\n.nc-icon-mini.nature_dog:before {\n    content: \"\\ee49\";\n}\n.nc-icon-mini.nature_flower-05:before {\n    content: \"\\ee4a\";\n}\n.nc-icon-mini.nature_flower-06:before {\n    content: \"\\ee4b\";\n}\n.nc-icon-mini.nature_flower-07:before {\n    content: \"\\ee4c\";\n}\n.nc-icon-mini.nature_food-dog:before {\n    content: \"\\ee4d\";\n}\n.nc-icon-mini.nature_food:before {\n    content: \"\\ee4e\";\n}\n.nc-icon-mini.nature_mountain:before {\n    content: \"\\ee4f\";\n}\n.nc-icon-mini.nature_mushroom:before {\n    content: \"\\ee50\";\n}\n.nc-icon-mini.nature_panda:before {\n    content: \"\\ee51\";\n}\n.nc-icon-mini.nature_paw:before {\n    content: \"\\ee52\";\n}\n.nc-icon-mini.nature_pig:before {\n    content: \"\\ee53\";\n}\n.nc-icon-mini.nature_plant-ground:before {\n    content: \"\\ee54\";\n}\n.nc-icon-mini.nature_plant-vase:before {\n    content: \"\\ee55\";\n}\n.nc-icon-mini.nature_rat:before {\n    content: \"\\ee56\";\n}\n.nc-icon-mini.nature_tree-01:before {\n    content: \"\\ee57\";\n}\n.nc-icon-mini.nature_tree-02:before {\n    content: \"\\ee58\";\n}\n.nc-icon-mini.nature_tree-03:before {\n    content: \"\\ee59\";\n}\n.nc-icon-mini.nature_turtle:before {\n    content: \"\\ee5a\";\n}\n.nc-icon-mini.nature_wood:before {\n    content: \"\\ee5b\";\n}"
  },
  {
    "path": "lib/shared/styles/nucleo/mini/less/mixins.less",
    "content": ".nc-rotate(@degrees, @rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);\n  -webkit-transform: rotate(@degrees);\n  -moz-transform: rotate(@degrees);\n  -ms-transform: rotate(@degrees);\n  -o-transform: rotate(@degrees);\n  transform: rotate(@degrees); \n}\n\n.nc-flip(@horiz, @vert, @rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);\n  -webkit-transform: scale(@horiz, @vert);\n  -moz-transform: scale(@horiz, @vert);\n  -ms-transform: scale(@horiz, @vert);\n  -o-transform: scale(@horiz, @vert);\n  transform: scale(@horiz, @vert);\n}\n"
  },
  {
    "path": "lib/shared/styles/nucleo/mini/less/nucleo-mini.less",
    "content": "/* --------------------------------\n\nNucleo Mini Web Font - nucleoapp.com/\nLicense - nucleoapp.com/license/\nCreated using IcoMoon - icomoon.io\n\n-------------------------------- */\n@import \"./variables.less\";\n\n@font-face {\n  font-family: 'Nucleo Mini';\n  src: url('/fonts/nucleo-mini.eot');\n  src: url('/fonts/nucleo-mini.eot') format('embedded-opentype'),\n    url('/fonts/nucleo-mini.woff2') format('woff2'),\n    url('/fonts/nucleo-mini.woff') format('woff'),\n    url('/fonts/nucleo-mini.ttf') format('truetype'),\n    url('/fonts/nucleo-mini.svg') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n\n:global {\n  /*------------------------\n  \tbase class definition\n  -------------------------*/\n  .nc-icon-mini {\n    display: inline-block;\n    font: normal normal normal @nc-font-size-base/1 'Nucleo Mini';\n    font-size: inherit;\n    speak: none;\n    text-transform: none;\n    /* Better Font Rendering */\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n  }\n\n\n  @import \"./icons.less\";\n}\n"
  },
  {
    "path": "lib/shared/styles/nucleo/mini/less/variables.less",
    "content": "@nc-font-path:        \"/fonts\";\n@nc-font-size-base:   14px;\n@nc-css-prefix:       nc-icon;\n@nc-background-color:     #eee;\n@nc-li-width:         (30em / 14);\n@nc-padding-width:    (1em/3);\n"
  },
  {
    "path": "lib/shared/styles/nucleo/outline/less/icons.less",
    "content": "/*------------------------\n\tfont icons\n-------------------------*/\n\n.nc-icon-outline.envir_bulb-saver:before {\n    content: \"\\ecc4\";\n}\n.nc-icon-outline.envir_bulb:before {\n    content: \"\\ecc5\";\n}\n.nc-icon-outline.envir_car:before {\n    content: \"\\ecc6\";\n}\n.nc-icon-outline.envir_fuel-electric:before {\n    content: \"\\ecc7\";\n}\n.nc-icon-outline.envir_fuel:before {\n    content: \"\\ecc8\";\n}\n.nc-icon-outline.envir_home:before {\n    content: \"\\ecc9\";\n}\n.nc-icon-outline.envir_level:before {\n    content: \"\\ecca\";\n}\n.nc-icon-outline.envir_panel:before {\n    content: \"\\eccb\";\n}\n.nc-icon-outline.envir_radiation:before {\n    content: \"\\eccc\";\n}\n.nc-icon-outline.envir_recycling:before {\n    content: \"\\eccd\";\n}\n.nc-icon-outline.envir_save-planet:before {\n    content: \"\\ecce\";\n}\n.nc-icon-outline.envir_waste-danger:before {\n    content: \"\\eccf\";\n}\n.nc-icon-outline.envir_waste-recycling:before {\n    content: \"\\ecd0\";\n}\n.nc-icon-outline.envir_waste:before {\n    content: \"\\ecd1\";\n}\n.nc-icon-outline.envir_water-hand:before {\n    content: \"\\ecd2\";\n}\n.nc-icon-outline.envir_water-sink:before {\n    content: \"\\ecd3\";\n}\n.nc-icon-outline.envir_water:before {\n    content: \"\\ecd4\";\n}\n.nc-icon-outline.envir_wind:before {\n    content: \"\\ecd5\";\n}\n.nc-icon-outline.text_align-center:before {\n    content: \"\\ecaa\";\n}\n.nc-icon-outline.text_align-justify:before {\n    content: \"\\ecab\";\n}\n.nc-icon-outline.text_align-left:before {\n    content: \"\\ecac\";\n}\n.nc-icon-outline.text_align-right:before {\n    content: \"\\ecad\";\n}\n.nc-icon-outline.text_background:before {\n    content: \"\\ecae\";\n}\n.nc-icon-outline.text_bold:before {\n    content: \"\\ecaf\";\n}\n.nc-icon-outline.text_capitalize:before {\n    content: \"\\ecb0\";\n}\n.nc-icon-outline.text_caps-all:before {\n    content: \"\\ecb1\";\n}\n.nc-icon-outline.text_caps-small:before {\n    content: \"\\ecb2\";\n}\n.nc-icon-outline.text_color:before {\n    content: \"\\ecb3\";\n}\n.nc-icon-outline.text_edit:before {\n    content: \"\\ecb4\";\n}\n.nc-icon-outline.text_italic:before {\n    content: \"\\ecb5\";\n}\n.nc-icon-outline.text_line-height:before {\n    content: \"\\ecb6\";\n}\n.nc-icon-outline.text_list-bullet:before {\n    content: \"\\ecb7\";\n}\n.nc-icon-outline.text_list-numbers:before {\n    content: \"\\ecb8\";\n}\n.nc-icon-outline.text_margin-left:before {\n    content: \"\\ecb9\";\n}\n.nc-icon-outline.text_margin-right:before {\n    content: \"\\ecba\";\n}\n.nc-icon-outline.text_quote:before {\n    content: \"\\ecbb\";\n}\n.nc-icon-outline.text_scale-horizontal:before {\n    content: \"\\ecbc\";\n}\n.nc-icon-outline.text_scale-vertical:before {\n    content: \"\\ecbd\";\n}\n.nc-icon-outline.text_size:before {\n    content: \"\\ecbe\";\n}\n.nc-icon-outline.text_strikethrough:before {\n    content: \"\\ecbf\";\n}\n.nc-icon-outline.text_subscript:before {\n    content: \"\\ecc0\";\n}\n.nc-icon-outline.text_superscript:before {\n    content: \"\\ecc1\";\n}\n.nc-icon-outline.text_tracking:before {\n    content: \"\\ecc2\";\n}\n.nc-icon-outline.text_underline:before {\n    content: \"\\ecc3\";\n}\n.nc-icon-outline.gestures_2x-drag-down:before {\n    content: \"\\ec09\";\n}\n.nc-icon-outline.gestures_2x-drag-up:before {\n    content: \"\\ec0a\";\n}\n.nc-icon-outline.gestures_2x-swipe-down:before {\n    content: \"\\ec0b\";\n}\n.nc-icon-outline.gestures_2x-swipe-left:before {\n    content: \"\\ec0c\";\n}\n.nc-icon-outline.gestures_2x-swipe-right:before {\n    content: \"\\ec0d\";\n}\n.nc-icon-outline.gestures_2x-swipe-up:before {\n    content: \"\\ec0e\";\n}\n.nc-icon-outline.gestures_2x-tap:before {\n    content: \"\\ec0f\";\n}\n.nc-icon-outline.gestures_3x-swipe-left:before {\n    content: \"\\ec10\";\n}\n.nc-icon-outline.gestures_3x-swipe-right:before {\n    content: \"\\ec11\";\n}\n.nc-icon-outline.gestures_3x-swipe-up:before {\n    content: \"\\ec12\";\n}\n.nc-icon-outline.gestures_3x-tap:before {\n    content: \"\\ec13\";\n}\n.nc-icon-outline.gestures_4x-swipe-left:before {\n    content: \"\\ec14\";\n}\n.nc-icon-outline.gestures_4x-swipe-right:before {\n    content: \"\\ec15\";\n}\n.nc-icon-outline.gestures_4x-swipe-up:before {\n    content: \"\\ec16\";\n}\n.nc-icon-outline.gestures_active-38:before {\n    content: \"\\ec17\";\n}\n.nc-icon-outline.gestures_active-40:before {\n    content: \"\\ec18\";\n}\n.nc-icon-outline.gestures_camera:before {\n    content: \"\\ec19\";\n}\n.nc-icon-outline.gestures_double-tap:before {\n    content: \"\\ec1a\";\n}\n.nc-icon-outline.gestures_drag-21:before {\n    content: \"\\ec1b\";\n}\n.nc-icon-outline.gestures_drag-31:before {\n    content: \"\\ec1c\";\n}\n.nc-icon-outline.gestures_drag-down:before {\n    content: \"\\ec1d\";\n}\n.nc-icon-outline.gestures_drag-left:before {\n    content: \"\\ec1e\";\n}\n.nc-icon-outline.gestures_drag-right:before {\n    content: \"\\ec1f\";\n}\n.nc-icon-outline.gestures_drag-up:before {\n    content: \"\\ec20\";\n}\n.nc-icon-outline.gestures_flick-down:before {\n    content: \"\\ec21\";\n}\n.nc-icon-outline.gestures_flick-left:before {\n    content: \"\\ec22\";\n}\n.nc-icon-outline.gestures_flick-right:before {\n    content: \"\\ec23\";\n}\n.nc-icon-outline.gestures_flick-up:before {\n    content: \"\\ec24\";\n}\n.nc-icon-outline.gestures_grab:before {\n    content: \"\\ec25\";\n}\n.nc-icon-outline.gestures_hold:before {\n    content: \"\\ec26\";\n}\n.nc-icon-outline.gestures_pin:before {\n    content: \"\\ec27\";\n}\n.nc-icon-outline.gestures_pinch:before {\n    content: \"\\ec28\";\n}\n.nc-icon-outline.gestures_rotate-22:before {\n    content: \"\\ec29\";\n}\n.nc-icon-outline.gestures_rotate-23:before {\n    content: \"\\ec2a\";\n}\n.nc-icon-outline.gestures_scan:before {\n    content: \"\\ec2b\";\n}\n.nc-icon-outline.gestures_scroll-horitontal:before {\n    content: \"\\ec2c\";\n}\n.nc-icon-outline.gestures_scroll-vertical:before {\n    content: \"\\ec2d\";\n}\n.nc-icon-outline.gestures_stretch:before {\n    content: \"\\ec2e\";\n}\n.nc-icon-outline.gestures_swipe-bottom:before {\n    content: \"\\ec2f\";\n}\n.nc-icon-outline.gestures_swipe-left:before {\n    content: \"\\ec30\";\n}\n.nc-icon-outline.gestures_swipe-right:before {\n    content: \"\\ec31\";\n}\n.nc-icon-outline.gestures_swipe-up:before {\n    content: \"\\ec32\";\n}\n.nc-icon-outline.gestures_tap-01:before {\n    content: \"\\ec33\";\n}\n.nc-icon-outline.gestures_tap-02:before {\n    content: \"\\ec34\";\n}\n.nc-icon-outline.sport_badminton:before {\n    content: \"\\ec35\";\n}\n.nc-icon-outline.sport_baseball-ball:before {\n    content: \"\\ec36\";\n}\n.nc-icon-outline.sport_baseball-bat:before {\n    content: \"\\ec37\";\n}\n.nc-icon-outline.sport_baseball:before {\n    content: \"\\ec38\";\n}\n.nc-icon-outline.sport_basketball-12:before {\n    content: \"\\ec39\";\n}\n.nc-icon-outline.sport_basketball-13:before {\n    content: \"\\ec3a\";\n}\n.nc-icon-outline.sport_boxing:before {\n    content: \"\\ec3b\";\n}\n.nc-icon-outline.sport_cardio:before {\n    content: \"\\ec3c\";\n}\n.nc-icon-outline.sport_cricket:before {\n    content: \"\\ec3d\";\n}\n.nc-icon-outline.sport_crown:before {\n    content: \"\\ec3e\";\n}\n.nc-icon-outline.sport_dart:before {\n    content: \"\\ec3f\";\n}\n.nc-icon-outline.sport_dumbbells:before {\n    content: \"\\ec40\";\n}\n.nc-icon-outline.sport_energy-drink:before {\n    content: \"\\ec41\";\n}\n.nc-icon-outline.sport_energy-supplement:before {\n    content: \"\\ec42\";\n}\n.nc-icon-outline.sport_fencing:before {\n    content: \"\\ec43\";\n}\n.nc-icon-outline.sport_fishing:before {\n    content: \"\\ec44\";\n}\n.nc-icon-outline.sport_flag-finish:before {\n    content: \"\\ec45\";\n}\n.nc-icon-outline.sport_football-headguard:before {\n    content: \"\\ec46\";\n}\n.nc-icon-outline.sport_golf:before {\n    content: \"\\ec47\";\n}\n.nc-icon-outline.sport_helmet:before {\n    content: \"\\ec48\";\n}\n.nc-icon-outline.sport_hockey:before {\n    content: \"\\ec49\";\n}\n.nc-icon-outline.sport_kettlebell:before {\n    content: \"\\ec4a\";\n}\n.nc-icon-outline.sport_ping-pong:before {\n    content: \"\\ec4b\";\n}\n.nc-icon-outline.sport_podium-trophy:before {\n    content: \"\\ec4c\";\n}\n.nc-icon-outline.sport_podium:before {\n    content: \"\\ec4d\";\n}\n.nc-icon-outline.sport_rope:before {\n    content: \"\\ec4e\";\n}\n.nc-icon-outline.sport_rugby:before {\n    content: \"\\ec4f\";\n}\n.nc-icon-outline.sport_shaker:before {\n    content: \"\\ec50\";\n}\n.nc-icon-outline.sport_shoe-run:before {\n    content: \"\\ec51\";\n}\n.nc-icon-outline.sport_skateboard:before {\n    content: \"\\ec52\";\n}\n.nc-icon-outline.sport_snowboard:before {\n    content: \"\\ec53\";\n}\n.nc-icon-outline.sport_soccer-field:before {\n    content: \"\\ec54\";\n}\n.nc-icon-outline.sport_steering-wheel:before {\n    content: \"\\ec55\";\n}\n.nc-icon-outline.sport_supplement:before {\n    content: \"\\ec56\";\n}\n.nc-icon-outline.sport_surf:before {\n    content: \"\\ec57\";\n}\n.nc-icon-outline.sport_tactic:before {\n    content: \"\\ec58\";\n}\n.nc-icon-outline.sport_tennis-ball:before {\n    content: \"\\ec59\";\n}\n.nc-icon-outline.sport_tennis:before {\n    content: \"\\ec5a\";\n}\n.nc-icon-outline.sport_trophy:before {\n    content: \"\\ec5b\";\n}\n.nc-icon-outline.sport_user-balance:before {\n    content: \"\\ec5c\";\n}\n.nc-icon-outline.sport_user-climb:before {\n    content: \"\\ec5d\";\n}\n.nc-icon-outline.sport_user-meditation:before {\n    content: \"\\ec5e\";\n}\n.nc-icon-outline.sport_user-run:before {\n    content: \"\\ec5f\";\n}\n.nc-icon-outline.sport_user-snowboard:before {\n    content: \"\\ec60\";\n}\n.nc-icon-outline.sport_user-swim:before {\n    content: \"\\ec61\";\n}\n.nc-icon-outline.sport_volleyball:before {\n    content: \"\\ec62\";\n}\n.nc-icon-outline.sport_whistle:before {\n    content: \"\\ec63\";\n}\n.nc-icon-outline.holidays_bat:before {\n    content: \"\\ec64\";\n}\n.nc-icon-outline.holidays_biscuit:before {\n    content: \"\\ec65\";\n}\n.nc-icon-outline.holidays_bones:before {\n    content: \"\\ec66\";\n}\n.nc-icon-outline.holidays_boot:before {\n    content: \"\\ec67\";\n}\n.nc-icon-outline.holidays_candy:before {\n    content: \"\\ec68\";\n}\n.nc-icon-outline.holidays_cat:before {\n    content: \"\\ec69\";\n}\n.nc-icon-outline.holidays_cauldron:before {\n    content: \"\\ec6a\";\n}\n.nc-icon-outline.holidays_chimney:before {\n    content: \"\\ec6b\";\n}\n.nc-icon-outline.holidays_cockade:before {\n    content: \"\\ec6c\";\n}\n.nc-icon-outline.holidays_coffin:before {\n    content: \"\\ec6d\";\n}\n.nc-icon-outline.holidays_dead-hand:before {\n    content: \"\\ec6e\";\n}\n.nc-icon-outline.holidays_decoration:before {\n    content: \"\\ec6f\";\n}\n.nc-icon-outline.holidays_deer:before {\n    content: \"\\ec70\";\n}\n.nc-icon-outline.holidays_egg-38:before {\n    content: \"\\ec71\";\n}\n.nc-icon-outline.holidays_egg-39:before {\n    content: \"\\ec72\";\n}\n.nc-icon-outline.holidays_frankenstein:before {\n    content: \"\\ec73\";\n}\n.nc-icon-outline.holidays_ghost:before {\n    content: \"\\ec74\";\n}\n.nc-icon-outline.holidays_gift-exchange:before {\n    content: \"\\ec75\";\n}\n.nc-icon-outline.holidays_gift:before {\n    content: \"\\ec76\";\n}\n.nc-icon-outline.holidays_glove:before {\n    content: \"\\ec77\";\n}\n.nc-icon-outline.holidays_grave:before {\n    content: \"\\ec78\";\n}\n.nc-icon-outline.holidays_light:before {\n    content: \"\\ec79\";\n}\n.nc-icon-outline.holidays_message:before {\n    content: \"\\ec7a\";\n}\n.nc-icon-outline.holidays_mistletoe:before {\n    content: \"\\ec7b\";\n}\n.nc-icon-outline.holidays_owl:before {\n    content: \"\\ec7c\";\n}\n.nc-icon-outline.holidays_pumpkin:before {\n    content: \"\\ec7d\";\n}\n.nc-icon-outline.holidays_rabbit:before {\n    content: \"\\ec7e\";\n}\n.nc-icon-outline.holidays_santa-hat:before {\n    content: \"\\ec7f\";\n}\n.nc-icon-outline.holidays_sickle:before {\n    content: \"\\ec80\";\n}\n.nc-icon-outline.holidays_snow-ball:before {\n    content: \"\\ec81\";\n}\n.nc-icon-outline.holidays_snowman-head:before {\n    content: \"\\ec82\";\n}\n.nc-icon-outline.holidays_snowman:before {\n    content: \"\\ec83\";\n}\n.nc-icon-outline.holidays_soak:before {\n    content: \"\\ec84\";\n}\n.nc-icon-outline.holidays_spider:before {\n    content: \"\\ec85\";\n}\n.nc-icon-outline.holidays_tree-ball:before {\n    content: \"\\ec86\";\n}\n.nc-icon-outline.holidays_tree:before {\n    content: \"\\ec87\";\n}\n.nc-icon-outline.holidays_vampire:before {\n    content: \"\\ec88\";\n}\n.nc-icon-outline.holidays_witch-hat:before {\n    content: \"\\ec89\";\n}\n.nc-icon-outline.holidays_wolf:before {\n    content: \"\\ec8a\";\n}\n.nc-icon-outline.holidays_zombie:before {\n    content: \"\\ec8b\";\n}\n.nc-icon-outline.nature_bear:before {\n    content: \"\\ec8c\";\n}\n.nc-icon-outline.nature_bee:before {\n    content: \"\\ec8d\";\n}\n.nc-icon-outline.nature_butterfly:before {\n    content: \"\\ec8e\";\n}\n.nc-icon-outline.nature_chicken:before {\n    content: \"\\ec8f\";\n}\n.nc-icon-outline.nature_clover:before {\n    content: \"\\ec90\";\n}\n.nc-icon-outline.nature_collar:before {\n    content: \"\\ec91\";\n}\n.nc-icon-outline.nature_cow:before {\n    content: \"\\ec92\";\n}\n.nc-icon-outline.nature_dog-house:before {\n    content: \"\\ec93\";\n}\n.nc-icon-outline.nature_dog:before {\n    content: \"\\ec94\";\n}\n.nc-icon-outline.nature_flower-05:before {\n    content: \"\\ec95\";\n}\n.nc-icon-outline.nature_flower-06:before {\n    content: \"\\ec96\";\n}\n.nc-icon-outline.nature_flower-07:before {\n    content: \"\\ec97\";\n}\n.nc-icon-outline.nature_food-dog:before {\n    content: \"\\ec98\";\n}\n.nc-icon-outline.nature_food:before {\n    content: \"\\ec99\";\n}\n.nc-icon-outline.nature_forest:before {\n    content: \"\\ec9a\";\n}\n.nc-icon-outline.nature_mountain:before {\n    content: \"\\ec9b\";\n}\n.nc-icon-outline.nature_mushroom:before {\n    content: \"\\ec9c\";\n}\n.nc-icon-outline.nature_panda:before {\n    content: \"\\ec9d\";\n}\n.nc-icon-outline.nature_paw:before {\n    content: \"\\ec9e\";\n}\n.nc-icon-outline.nature_pig:before {\n    content: \"\\ec9f\";\n}\n.nc-icon-outline.nature_plant-ground:before {\n    content: \"\\eca0\";\n}\n.nc-icon-outline.nature_plant-vase:before {\n    content: \"\\eca1\";\n}\n.nc-icon-outline.nature_rat:before {\n    content: \"\\eca2\";\n}\n.nc-icon-outline.nature_sheep:before {\n    content: \"\\eca3\";\n}\n.nc-icon-outline.nature_snake:before {\n    content: \"\\eca4\";\n}\n.nc-icon-outline.nature_tree-01:before {\n    content: \"\\eca5\";\n}\n.nc-icon-outline.nature_tree-02:before {\n    content: \"\\eca6\";\n}\n.nc-icon-outline.nature_tree-03:before {\n    content: \"\\eca7\";\n}\n.nc-icon-outline.nature_turtle:before {\n    content: \"\\eca8\";\n}\n.nc-icon-outline.nature_wood:before {\n    content: \"\\eca9\";\n}\n.nc-icon-outline.travel_axe:before {\n    content: \"\\eb28\";\n}\n.nc-icon-outline.travel_backpack:before {\n    content: \"\\eb29\";\n}\n.nc-icon-outline.travel_bag:before {\n    content: \"\\eb2a\";\n}\n.nc-icon-outline.travel_barbecue:before {\n    content: \"\\eb2b\";\n}\n.nc-icon-outline.travel_beach-umbrella:before {\n    content: \"\\eb2c\";\n}\n.nc-icon-outline.travel_berlin:before {\n    content: \"\\eb2d\";\n}\n.nc-icon-outline.travel_binocular:before {\n    content: \"\\eb2e\";\n}\n.nc-icon-outline.travel_camper:before {\n    content: \"\\eb2f\";\n}\n.nc-icon-outline.travel_camping:before {\n    content: \"\\eb30\";\n}\n.nc-icon-outline.travel_castle:before {\n    content: \"\\eb31\";\n}\n.nc-icon-outline.travel_china:before {\n    content: \"\\eb32\";\n}\n.nc-icon-outline.travel_church:before {\n    content: \"\\eb33\";\n}\n.nc-icon-outline.travel_drink:before {\n    content: \"\\eb34\";\n}\n.nc-icon-outline.travel_explore:before {\n    content: \"\\eb35\";\n}\n.nc-icon-outline.travel_fire:before {\n    content: \"\\eb36\";\n}\n.nc-icon-outline.travel_hotel-bell:before {\n    content: \"\\eb37\";\n}\n.nc-icon-outline.travel_hotel-symbol:before {\n    content: \"\\eb38\";\n}\n.nc-icon-outline.travel_hotel:before {\n    content: \"\\eb39\";\n}\n.nc-icon-outline.travel_hut:before {\n    content: \"\\eb3a\";\n}\n.nc-icon-outline.travel_igloo:before {\n    content: \"\\eb3b\";\n}\n.nc-icon-outline.travel_info:before {\n    content: \"\\eb3c\";\n}\n.nc-icon-outline.travel_istanbul:before {\n    content: \"\\eb3d\";\n}\n.nc-icon-outline.travel_jellyfish:before {\n    content: \"\\eb3e\";\n}\n.nc-icon-outline.travel_lamp:before {\n    content: \"\\eb3f\";\n}\n.nc-icon-outline.travel_lighthouse:before {\n    content: \"\\eb40\";\n}\n.nc-icon-outline.travel_london:before {\n    content: \"\\eb41\";\n}\n.nc-icon-outline.travel_luggage:before {\n    content: \"\\eb42\";\n}\n.nc-icon-outline.travel_mosque:before {\n    content: \"\\eb43\";\n}\n.nc-icon-outline.travel_ny:before {\n    content: \"\\eb44\";\n}\n.nc-icon-outline.travel_octopus:before {\n    content: \"\\eb45\";\n}\n.nc-icon-outline.travel_paris-tower:before {\n    content: \"\\eb46\";\n}\n.nc-icon-outline.travel_passport:before {\n    content: \"\\eb47\";\n}\n.nc-icon-outline.travel_pickaxe:before {\n    content: \"\\eb48\";\n}\n.nc-icon-outline.travel_pool:before {\n    content: \"\\eb49\";\n}\n.nc-icon-outline.travel_pyramid:before {\n    content: \"\\eb4a\";\n}\n.nc-icon-outline.travel_rackets:before {\n    content: \"\\eb4b\";\n}\n.nc-icon-outline.travel_rio:before {\n    content: \"\\eb4c\";\n}\n.nc-icon-outline.travel_road-sign-left:before {\n    content: \"\\eb4d\";\n}\n.nc-icon-outline.travel_road-sign-right:before {\n    content: \"\\eb4e\";\n}\n.nc-icon-outline.travel_rome:before {\n    content: \"\\eb4f\";\n}\n.nc-icon-outline.travel_rowing:before {\n    content: \"\\eb50\";\n}\n.nc-icon-outline.travel_sea-mask:before {\n    content: \"\\eb51\";\n}\n.nc-icon-outline.travel_sf-bridge:before {\n    content: \"\\eb52\";\n}\n.nc-icon-outline.travel_shark:before {\n    content: \"\\eb53\";\n}\n.nc-icon-outline.travel_spa:before {\n    content: \"\\eb54\";\n}\n.nc-icon-outline.travel_sunglasses:before {\n    content: \"\\eb55\";\n}\n.nc-icon-outline.travel_surf:before {\n    content: \"\\eb56\";\n}\n.nc-icon-outline.travel_swimsuit:before {\n    content: \"\\eb57\";\n}\n.nc-icon-outline.travel_swimwear:before {\n    content: \"\\eb58\";\n}\n.nc-icon-outline.travel_swiss-knife:before {\n    content: \"\\eb59\";\n}\n.nc-icon-outline.travel_temple-02:before {\n    content: \"\\eb5a\";\n}\n.nc-icon-outline.travel_temple-25:before {\n    content: \"\\eb5b\";\n}\n.nc-icon-outline.travel_trolley:before {\n    content: \"\\eb5c\";\n}\n.nc-icon-outline.travel_white-house:before {\n    content: \"\\eb5d\";\n}\n.nc-icon-outline.travel_world:before {\n    content: \"\\eb5e\";\n}\n.nc-icon-outline.travel_worldmap:before {\n    content: \"\\eb5f\";\n}\n.nc-icon-outline.food_alcohol:before {\n    content: \"\\eb60\";\n}\n.nc-icon-outline.food_apple:before {\n    content: \"\\eb61\";\n}\n.nc-icon-outline.food_baby:before {\n    content: \"\\eb62\";\n}\n.nc-icon-outline.food_bacon:before {\n    content: \"\\eb63\";\n}\n.nc-icon-outline.food_baguette:before {\n    content: \"\\eb64\";\n}\n.nc-icon-outline.food_banana:before {\n    content: \"\\eb65\";\n}\n.nc-icon-outline.food_barbecue-02:before {\n    content: \"\\eb66\";\n}\n.nc-icon-outline.food_barbecue-15:before {\n    content: \"\\eb67\";\n}\n.nc-icon-outline.food_barbecue-tools:before {\n    content: \"\\eb68\";\n}\n.nc-icon-outline.food_beer-95:before {\n    content: \"\\eb69\";\n}\n.nc-icon-outline.food_beer-96:before {\n    content: \"\\eb6a\";\n}\n.nc-icon-outline.food_beverage:before {\n    content: \"\\eb6b\";\n}\n.nc-icon-outline.food_bottle-wine:before {\n    content: \"\\eb6c\";\n}\n.nc-icon-outline.food_bottle:before {\n    content: \"\\eb6d\";\n}\n.nc-icon-outline.food_bowl:before {\n    content: \"\\eb6e\";\n}\n.nc-icon-outline.food_bread:before {\n    content: \"\\eb6f\";\n}\n.nc-icon-outline.food_broccoli:before {\n    content: \"\\eb70\";\n}\n.nc-icon-outline.food_cake-13:before {\n    content: \"\\eb71\";\n}\n.nc-icon-outline.food_cake-100:before {\n    content: \"\\eb72\";\n}\n.nc-icon-outline.food_cake-slice:before {\n    content: \"\\eb73\";\n}\n.nc-icon-outline.food_candle:before {\n    content: \"\\eb74\";\n}\n.nc-icon-outline.food_candy:before {\n    content: \"\\eb75\";\n}\n.nc-icon-outline.food_carrot:before {\n    content: \"\\eb76\";\n}\n.nc-icon-outline.food_champagne:before {\n    content: \"\\eb77\";\n}\n.nc-icon-outline.food_cheese-24:before {\n    content: \"\\eb78\";\n}\n.nc-icon-outline.food_cheese-87:before {\n    content: \"\\eb79\";\n}\n.nc-icon-outline.food_cheeseburger:before {\n    content: \"\\eb7a\";\n}\n.nc-icon-outline.food_chef-hat:before {\n    content: \"\\eb7b\";\n}\n.nc-icon-outline.food_cherry:before {\n    content: \"\\eb7c\";\n}\n.nc-icon-outline.food_chicken:before {\n    content: \"\\eb7d\";\n}\n.nc-icon-outline.food_chili:before {\n    content: \"\\eb7e\";\n}\n.nc-icon-outline.food_chinese:before {\n    content: \"\\eb7f\";\n}\n.nc-icon-outline.food_chips:before {\n    content: \"\\eb80\";\n}\n.nc-icon-outline.food_chocolate:before {\n    content: \"\\eb81\";\n}\n.nc-icon-outline.food_cocktail:before {\n    content: \"\\eb82\";\n}\n.nc-icon-outline.food_coffe-long:before {\n    content: \"\\eb83\";\n}\n.nc-icon-outline.food_coffee-long:before {\n    content: \"\\eb84\";\n}\n.nc-icon-outline.food_coffee:before {\n    content: \"\\eb85\";\n}\n.nc-icon-outline.food_cookies:before {\n    content: \"\\eb86\";\n}\n.nc-icon-outline.food_course:before {\n    content: \"\\eb87\";\n}\n.nc-icon-outline.food_crab:before {\n    content: \"\\eb88\";\n}\n.nc-icon-outline.food_croissant:before {\n    content: \"\\eb89\";\n}\n.nc-icon-outline.food_cutlery-75:before {\n    content: \"\\eb8a\";\n}\n.nc-icon-outline.food_cutlery-76:before {\n    content: \"\\eb8b\";\n}\n.nc-icon-outline.food_cutlery-77:before {\n    content: \"\\eb8c\";\n}\n.nc-icon-outline.food_dishwasher:before {\n    content: \"\\eb8d\";\n}\n.nc-icon-outline.food_donut:before {\n    content: \"\\eb8e\";\n}\n.nc-icon-outline.food_drink:before {\n    content: \"\\eb8f\";\n}\n.nc-icon-outline.food_egg:before {\n    content: \"\\eb90\";\n}\n.nc-icon-outline.food_energy-drink:before {\n    content: \"\\eb91\";\n}\n.nc-icon-outline.food_fish:before {\n    content: \"\\eb92\";\n}\n.nc-icon-outline.food_fishbone:before {\n    content: \"\\eb93\";\n}\n.nc-icon-outline.food_fridge:before {\n    content: \"\\eb94\";\n}\n.nc-icon-outline.food_glass:before {\n    content: \"\\eb95\";\n}\n.nc-icon-outline.food_grape:before {\n    content: \"\\eb96\";\n}\n.nc-icon-outline.food_hob:before {\n    content: \"\\eb97\";\n}\n.nc-icon-outline.food_hot-dog:before {\n    content: \"\\eb98\";\n}\n.nc-icon-outline.food_ice-cream-22:before {\n    content: \"\\eb99\";\n}\n.nc-icon-outline.food_ice-cream-72:before {\n    content: \"\\eb9a\";\n}\n.nc-icon-outline.food_jam:before {\n    content: \"\\eb9b\";\n}\n.nc-icon-outline.food_kettle:before {\n    content: \"\\eb9c\";\n}\n.nc-icon-outline.food_kitchen-fan:before {\n    content: \"\\eb9d\";\n}\n.nc-icon-outline.food_knife:before {\n    content: \"\\eb9e\";\n}\n.nc-icon-outline.food_lemon-slice:before {\n    content: \"\\eb9f\";\n}\n.nc-icon-outline.food_lighter:before {\n    content: \"\\eba0\";\n}\n.nc-icon-outline.food_lobster:before {\n    content: \"\\eba1\";\n}\n.nc-icon-outline.food_matches:before {\n    content: \"\\eba2\";\n}\n.nc-icon-outline.food_measuring-cup:before {\n    content: \"\\eba3\";\n}\n.nc-icon-outline.food_meat-spit:before {\n    content: \"\\eba4\";\n}\n.nc-icon-outline.food_microwave:before {\n    content: \"\\eba5\";\n}\n.nc-icon-outline.food_milk:before {\n    content: \"\\eba6\";\n}\n.nc-icon-outline.food_moka:before {\n    content: \"\\eba7\";\n}\n.nc-icon-outline.food_muffin:before {\n    content: \"\\eba8\";\n}\n.nc-icon-outline.food_mug:before {\n    content: \"\\eba9\";\n}\n.nc-icon-outline.food_oven:before {\n    content: \"\\ebaa\";\n}\n.nc-icon-outline.food_pan:before {\n    content: \"\\ebab\";\n}\n.nc-icon-outline.food_pizza-slice:before {\n    content: \"\\ebac\";\n}\n.nc-icon-outline.food_pizza:before {\n    content: \"\\ebad\";\n}\n.nc-icon-outline.food_plate:before {\n    content: \"\\ebae\";\n}\n.nc-icon-outline.food_pot:before {\n    content: \"\\ebaf\";\n}\n.nc-icon-outline.food_prosciutto:before {\n    content: \"\\ebb0\";\n}\n.nc-icon-outline.food_recipe-book-46:before {\n    content: \"\\ebb1\";\n}\n.nc-icon-outline.food_recipe-book-47:before {\n    content: \"\\ebb2\";\n}\n.nc-icon-outline.food_rolling-pin:before {\n    content: \"\\ebb3\";\n}\n.nc-icon-outline.food_salt:before {\n    content: \"\\ebb4\";\n}\n.nc-icon-outline.food_sausage:before {\n    content: \"\\ebb5\";\n}\n.nc-icon-outline.food_scale:before {\n    content: \"\\ebb6\";\n}\n.nc-icon-outline.food_scotch:before {\n    content: \"\\ebb7\";\n}\n.nc-icon-outline.food_shrimp:before {\n    content: \"\\ebb8\";\n}\n.nc-icon-outline.food_steak:before {\n    content: \"\\ebb9\";\n}\n.nc-icon-outline.food_store:before {\n    content: \"\\ebba\";\n}\n.nc-icon-outline.food_strawberry:before {\n    content: \"\\ebbb\";\n}\n.nc-icon-outline.food_sushi:before {\n    content: \"\\ebbc\";\n}\n.nc-icon-outline.food_tacos:before {\n    content: \"\\ebbd\";\n}\n.nc-icon-outline.food_tea:before {\n    content: \"\\ebbe\";\n}\n.nc-icon-outline.food_temperature:before {\n    content: \"\\ebbf\";\n}\n.nc-icon-outline.food_vest-07:before {\n    content: \"\\ebc0\";\n}\n.nc-icon-outline.food_vest-31:before {\n    content: \"\\ebc1\";\n}\n.nc-icon-outline.food_watermelon:before {\n    content: \"\\ebc2\";\n}\n.nc-icon-outline.food_whisk:before {\n    content: \"\\ebc3\";\n}\n.nc-icon-outline.emoticons_alien:before {\n    content: \"\\ebc4\";\n}\n.nc-icon-outline.emoticons_angry-10:before {\n    content: \"\\ebc5\";\n}\n.nc-icon-outline.emoticons_angry-44:before {\n    content: \"\\ebc6\";\n}\n.nc-icon-outline.emoticons_big-eyes:before {\n    content: \"\\ebc7\";\n}\n.nc-icon-outline.emoticons_big-smile:before {\n    content: \"\\ebc8\";\n}\n.nc-icon-outline.emoticons_bigmouth:before {\n    content: \"\\ebc9\";\n}\n.nc-icon-outline.emoticons_bleah:before {\n    content: \"\\ebca\";\n}\n.nc-icon-outline.emoticons_blind:before {\n    content: \"\\ebcb\";\n}\n.nc-icon-outline.emoticons_bomb:before {\n    content: \"\\ebcc\";\n}\n.nc-icon-outline.emoticons_bored:before {\n    content: \"\\ebcd\";\n}\n.nc-icon-outline.emoticons_cake:before {\n    content: \"\\ebce\";\n}\n.nc-icon-outline.emoticons_cry-15:before {\n    content: \"\\ebcf\";\n}\n.nc-icon-outline.emoticons_cry-57:before {\n    content: \"\\ebd0\";\n}\n.nc-icon-outline.emoticons_cute:before {\n    content: \"\\ebd1\";\n}\n.nc-icon-outline.emoticons_devil:before {\n    content: \"\\ebd2\";\n}\n.nc-icon-outline.emoticons_disgusted:before {\n    content: \"\\ebd3\";\n}\n.nc-icon-outline.emoticons_fist:before {\n    content: \"\\ebd4\";\n}\n.nc-icon-outline.emoticons_ghost:before {\n    content: \"\\ebd5\";\n}\n.nc-icon-outline.emoticons_hannibal:before {\n    content: \"\\ebd6\";\n}\n.nc-icon-outline.emoticons_happy-sun:before {\n    content: \"\\ebd7\";\n}\n.nc-icon-outline.emoticons_kid:before {\n    content: \"\\ebd8\";\n}\n.nc-icon-outline.emoticons_kiss:before {\n    content: \"\\ebd9\";\n}\n.nc-icon-outline.emoticons_laugh-17:before {\n    content: \"\\ebda\";\n}\n.nc-icon-outline.emoticons_laugh-35:before {\n    content: \"\\ebdb\";\n}\n.nc-icon-outline.emoticons_like-no:before {\n    content: \"\\ebdc\";\n}\n.nc-icon-outline.emoticons_like:before {\n    content: \"\\ebdd\";\n}\n.nc-icon-outline.emoticons_mad-12:before {\n    content: \"\\ebde\";\n}\n.nc-icon-outline.emoticons_mad-58:before {\n    content: \"\\ebdf\";\n}\n.nc-icon-outline.emoticons_malicious:before {\n    content: \"\\ebe0\";\n}\n.nc-icon-outline.emoticons_manga-62:before {\n    content: \"\\ebe1\";\n}\n.nc-icon-outline.emoticons_manga-63:before {\n    content: \"\\ebe2\";\n}\n.nc-icon-outline.emoticons_monster:before {\n    content: \"\\ebe3\";\n}\n.nc-icon-outline.emoticons_nerd-22:before {\n    content: \"\\ebe4\";\n}\n.nc-icon-outline.emoticons_nerd-23:before {\n    content: \"\\ebe5\";\n}\n.nc-icon-outline.emoticons_ninja:before {\n    content: \"\\ebe6\";\n}\n.nc-icon-outline.emoticons_no-words:before {\n    content: \"\\ebe7\";\n}\n.nc-icon-outline.emoticons_parrot:before {\n    content: \"\\ebe8\";\n}\n.nc-icon-outline.emoticons_penguin:before {\n    content: \"\\ebe9\";\n}\n.nc-icon-outline.emoticons_pirate:before {\n    content: \"\\ebea\";\n}\n.nc-icon-outline.emoticons_poop:before {\n    content: \"\\ebeb\";\n}\n.nc-icon-outline.emoticons_puzzled:before {\n    content: \"\\ebec\";\n}\n.nc-icon-outline.emoticons_quite-happy:before {\n    content: \"\\ebed\";\n}\n.nc-icon-outline.emoticons_robot:before {\n    content: \"\\ebee\";\n}\n.nc-icon-outline.emoticons_rock:before {\n    content: \"\\ebef\";\n}\n.nc-icon-outline.emoticons_sad:before {\n    content: \"\\ebf0\";\n}\n.nc-icon-outline.emoticons_satisfied:before {\n    content: \"\\ebf1\";\n}\n.nc-icon-outline.emoticons_shark:before {\n    content: \"\\ebf2\";\n}\n.nc-icon-outline.emoticons_shy:before {\n    content: \"\\ebf3\";\n}\n.nc-icon-outline.emoticons_sick:before {\n    content: \"\\ebf4\";\n}\n.nc-icon-outline.emoticons_silly:before {\n    content: \"\\ebf5\";\n}\n.nc-icon-outline.emoticons_skull:before {\n    content: \"\\ebf6\";\n}\n.nc-icon-outline.emoticons_sleep:before {\n    content: \"\\ebf7\";\n}\n.nc-icon-outline.emoticons_sloth:before {\n    content: \"\\ebf8\";\n}\n.nc-icon-outline.emoticons_smart:before {\n    content: \"\\ebf9\";\n}\n.nc-icon-outline.emoticons_smile:before {\n    content: \"\\ebfa\";\n}\n.nc-icon-outline.emoticons_soldier:before {\n    content: \"\\ebfb\";\n}\n.nc-icon-outline.emoticons_speechless:before {\n    content: \"\\ebfc\";\n}\n.nc-icon-outline.emoticons_spiteful:before {\n    content: \"\\ebfd\";\n}\n.nc-icon-outline.emoticons_sunglasses-48:before {\n    content: \"\\ebfe\";\n}\n.nc-icon-outline.emoticons_sunglasses-49:before {\n    content: \"\\ebff\";\n}\n.nc-icon-outline.emoticons_surprise:before {\n    content: \"\\ec00\";\n}\n.nc-icon-outline.emoticons_upset-13:before {\n    content: \"\\ec01\";\n}\n.nc-icon-outline.emoticons_upset-14:before {\n    content: \"\\ec02\";\n}\n.nc-icon-outline.emoticons_virus:before {\n    content: \"\\ec03\";\n}\n.nc-icon-outline.emoticons_what:before {\n    content: \"\\ec04\";\n}\n.nc-icon-outline.emoticons_whiskers:before {\n    content: \"\\ec05\";\n}\n.nc-icon-outline.emoticons_wink-06:before {\n    content: \"\\ec06\";\n}\n.nc-icon-outline.emoticons_wink-11:before {\n    content: \"\\ec07\";\n}\n.nc-icon-outline.emoticons_wink-69:before {\n    content: \"\\ec08\";\n}\n.nc-icon-outline.weather_celsius:before {\n    content: \"\\e600\";\n}\n.nc-icon-outline.weather_cloud-13:before {\n    content: \"\\e601\";\n}\n.nc-icon-outline.weather_cloud-14:before {\n    content: \"\\e602\";\n}\n.nc-icon-outline.weather_cloud-drop:before {\n    content: \"\\e603\";\n}\n.nc-icon-outline.weather_cloud-fog-31:before {\n    content: \"\\e604\";\n}\n.nc-icon-outline.weather_cloud-fog-32:before {\n    content: \"\\e605\";\n}\n.nc-icon-outline.weather_cloud-hail:before {\n    content: \"\\e606\";\n}\n.nc-icon-outline.weather_cloud-light:before {\n    content: \"\\e607\";\n}\n.nc-icon-outline.weather_cloud-moon:before {\n    content: \"\\e608\";\n}\n.nc-icon-outline.weather_cloud-rain:before {\n    content: \"\\e609\";\n}\n.nc-icon-outline.weather_cloud-rainbow:before {\n    content: \"\\e60a\";\n}\n.nc-icon-outline.weather_cloud-snow-34:before {\n    content: \"\\e60b\";\n}\n.nc-icon-outline.weather_cloud-snow-42:before {\n    content: \"\\e60c\";\n}\n.nc-icon-outline.weather_cloud-sun-17:before {\n    content: \"\\e60d\";\n}\n.nc-icon-outline.weather_cloud-sun-19:before {\n    content: \"\\e60e\";\n}\n.nc-icon-outline.weather_compass:before {\n    content: \"\\e60f\";\n}\n.nc-icon-outline.weather_drop-12:before {\n    content: \"\\e610\";\n}\n.nc-icon-outline.weather_drop-15:before {\n    content: \"\\e611\";\n}\n.nc-icon-outline.weather_drops:before {\n    content: \"\\e612\";\n}\n.nc-icon-outline.weather_eclipse:before {\n    content: \"\\e613\";\n}\n.nc-icon-outline.weather_fahrenheit:before {\n    content: \"\\e614\";\n}\n.nc-icon-outline.weather_fog:before {\n    content: \"\\e615\";\n}\n.nc-icon-outline.weather_forecast:before {\n    content: \"\\e616\";\n}\n.nc-icon-outline.weather_hurricane-44:before {\n    content: \"\\e617\";\n}\n.nc-icon-outline.weather_hurricane-45:before {\n    content: \"\\e618\";\n}\n.nc-icon-outline.weather_moon-cloud-drop:before {\n    content: \"\\e619\";\n}\n.nc-icon-outline.weather_moon-cloud-fog:before {\n    content: \"\\e61a\";\n}\n.nc-icon-outline.weather_moon-cloud-hail:before {\n    content: \"\\e61b\";\n}\n.nc-icon-outline.weather_moon-cloud-light:before {\n    content: \"\\e61c\";\n}\n.nc-icon-outline.weather_moon-cloud-rain:before {\n    content: \"\\e61d\";\n}\n.nc-icon-outline.weather_moon-cloud-snow-61:before {\n    content: \"\\e61e\";\n}\n.nc-icon-outline.weather_moon-cloud-snow-62:before {\n    content: \"\\e61f\";\n}\n.nc-icon-outline.weather_moon-fog:before {\n    content: \"\\e620\";\n}\n.nc-icon-outline.weather_moon-full:before {\n    content: \"\\e621\";\n}\n.nc-icon-outline.weather_moon-stars:before {\n    content: \"\\e622\";\n}\n.nc-icon-outline.weather_moon:before {\n    content: \"\\e623\";\n}\n.nc-icon-outline.weather_rain-hail:before {\n    content: \"\\e624\";\n}\n.nc-icon-outline.weather_rain:before {\n    content: \"\\e625\";\n}\n.nc-icon-outline.weather_rainbow:before {\n    content: \"\\e626\";\n}\n.nc-icon-outline.weather_snow:before {\n    content: \"\\e627\";\n}\n.nc-icon-outline.weather_sun-cloud-drop:before {\n    content: \"\\e628\";\n}\n.nc-icon-outline.weather_sun-cloud-fog:before {\n    content: \"\\e629\";\n}\n.nc-icon-outline.weather_sun-cloud-hail:before {\n    content: \"\\e62a\";\n}\n.nc-icon-outline.weather_sun-cloud-light:before {\n    content: \"\\e62b\";\n}\n.nc-icon-outline.weather_sun-cloud-rain:before {\n    content: \"\\e62c\";\n}\n.nc-icon-outline.weather_sun-cloud-snow-54:before {\n    content: \"\\e62d\";\n}\n.nc-icon-outline.weather_sun-cloud-snow-55:before {\n    content: \"\\e62e\";\n}\n.nc-icon-outline.weather_sun-cloud:before {\n    content: \"\\e62f\";\n}\n.nc-icon-outline.weather_sun-fog-29:before {\n    content: \"\\e630\";\n}\n.nc-icon-outline.weather_sun-fog-30:before {\n    content: \"\\e631\";\n}\n.nc-icon-outline.weather_sun-fog-43:before {\n    content: \"\\e632\";\n}\n.nc-icon-outline.weather_sun:before {\n    content: \"\\e633\";\n}\n.nc-icon-outline.weather_wind:before {\n    content: \"\\e634\";\n}\n.nc-icon-outline.users_add-27:before {\n    content: \"\\e635\";\n}\n.nc-icon-outline.users_add-29:before {\n    content: \"\\e636\";\n}\n.nc-icon-outline.users_badge-13:before {\n    content: \"\\e637\";\n}\n.nc-icon-outline.users_badge-14:before {\n    content: \"\\e638\";\n}\n.nc-icon-outline.users_badge-15:before {\n    content: \"\\e639\";\n}\n.nc-icon-outline.users_circle-08:before {\n    content: \"\\e63a\";\n}\n.nc-icon-outline.users_circle-09:before {\n    content: \"\\e63b\";\n}\n.nc-icon-outline.users_circle-10:before {\n    content: \"\\e63c\";\n}\n.nc-icon-outline.users_contacts:before {\n    content: \"\\e63d\";\n}\n.nc-icon-outline.users_delete-28:before {\n    content: \"\\e63e\";\n}\n.nc-icon-outline.users_delete-30:before {\n    content: \"\\e63f\";\n}\n.nc-icon-outline.users_man-20:before {\n    content: \"\\e640\";\n}\n.nc-icon-outline.users_man-23:before {\n    content: \"\\e641\";\n}\n.nc-icon-outline.users_man-glasses:before {\n    content: \"\\e642\";\n}\n.nc-icon-outline.users_mobile-contact:before {\n    content: \"\\e643\";\n}\n.nc-icon-outline.users_multiple-11:before {\n    content: \"\\e644\";\n}\n.nc-icon-outline.users_multiple-19:before {\n    content: \"\\e645\";\n}\n.nc-icon-outline.users_network:before {\n    content: \"\\e646\";\n}\n.nc-icon-outline.users_parent:before {\n    content: \"\\e647\";\n}\n.nc-icon-outline.users_single-01:before {\n    content: \"\\e648\";\n}\n.nc-icon-outline.users_single-02:before {\n    content: \"\\e649\";\n}\n.nc-icon-outline.users_single-03:before {\n    content: \"\\e64a\";\n}\n.nc-icon-outline.users_single-04:before {\n    content: \"\\e64b\";\n}\n.nc-icon-outline.users_single-05:before {\n    content: \"\\e64c\";\n}\n.nc-icon-outline.users_single-body:before {\n    content: \"\\e64d\";\n}\n.nc-icon-outline.users_single-position:before {\n    content: \"\\e64e\";\n}\n.nc-icon-outline.users_square-31:before {\n    content: \"\\e64f\";\n}\n.nc-icon-outline.users_square-32:before {\n    content: \"\\e650\";\n}\n.nc-icon-outline.users_square-33:before {\n    content: \"\\e651\";\n}\n.nc-icon-outline.users_woman-21:before {\n    content: \"\\e652\";\n}\n.nc-icon-outline.users_woman-24:before {\n    content: \"\\e653\";\n}\n.nc-icon-outline.users_woman-25:before {\n    content: \"\\e654\";\n}\n.nc-icon-outline.users_woman-34:before {\n    content: \"\\e655\";\n}\n.nc-icon-outline.users_woman-35:before {\n    content: \"\\e656\";\n}\n.nc-icon-outline.users_woman-man:before {\n    content: \"\\e657\";\n}\n.nc-icon-outline.ui-1_analytics-88:before {\n    content: \"\\e658\";\n}\n.nc-icon-outline.ui-1_analytics-89:before {\n    content: \"\\e659\";\n}\n.nc-icon-outline.ui-1_attach-86:before {\n    content: \"\\e65a\";\n}\n.nc-icon-outline.ui-1_attach-87:before {\n    content: \"\\e65b\";\n}\n.nc-icon-outline.ui-1_bell-53:before {\n    content: \"\\e65c\";\n}\n.nc-icon-outline.ui-1_bell-54:before {\n    content: \"\\e65d\";\n}\n.nc-icon-outline.ui-1_bell-55:before {\n    content: \"\\e65e\";\n}\n.nc-icon-outline.ui-1_bold-add:before {\n    content: \"\\e65f\";\n}\n.nc-icon-outline.ui-1_bold-delete:before {\n    content: \"\\e660\";\n}\n.nc-icon-outline.ui-1_bold-remove:before {\n    content: \"\\e661\";\n}\n.nc-icon-outline.ui-1_bookmark-add:before {\n    content: \"\\e662\";\n}\n.nc-icon-outline.ui-1_bookmark-remove:before {\n    content: \"\\e663\";\n}\n.nc-icon-outline.ui-1_calendar-57:before {\n    content: \"\\e664\";\n}\n.nc-icon-outline.ui-1_calendar-60:before {\n    content: \"\\e665\";\n}\n.nc-icon-outline.ui-1_calendar-check-59:before {\n    content: \"\\e666\";\n}\n.nc-icon-outline.ui-1_calendar-check-62:before {\n    content: \"\\e667\";\n}\n.nc-icon-outline.ui-1_calendar-grid-58:before {\n    content: \"\\e668\";\n}\n.nc-icon-outline.ui-1_calendar-grid-61:before {\n    content: \"\\e669\";\n}\n.nc-icon-outline.ui-1_check-bold:before {\n    content: \"\\e66a\";\n}\n.nc-icon-outline.ui-1_check-circle-07:before {\n    content: \"\\e66b\";\n}\n.nc-icon-outline.ui-1_check-circle-08:before {\n    content: \"\\e66c\";\n}\n.nc-icon-outline.ui-1_check-curve:before {\n    content: \"\\e66d\";\n}\n.nc-icon-outline.ui-1_check-simple:before {\n    content: \"\\e66e\";\n}\n.nc-icon-outline.ui-1_check-small:before {\n    content: \"\\e66f\";\n}\n.nc-icon-outline.ui-1_check-square-09:before {\n    content: \"\\e670\";\n}\n.nc-icon-outline.ui-1_check-square-11:before {\n    content: \"\\e671\";\n}\n.nc-icon-outline.ui-1_check:before {\n    content: \"\\e672\";\n}\n.nc-icon-outline.ui-1_circle-add:before {\n    content: \"\\e673\";\n}\n.nc-icon-outline.ui-1_circle-bold-add:before {\n    content: \"\\e674\";\n}\n.nc-icon-outline.ui-1_circle-bold-remove:before {\n    content: \"\\e675\";\n}\n.nc-icon-outline.ui-1_circle-delete:before {\n    content: \"\\e676\";\n}\n.nc-icon-outline.ui-1_circle-remove:before {\n    content: \"\\e677\";\n}\n.nc-icon-outline.ui-1_dashboard-29:before {\n    content: \"\\e678\";\n}\n.nc-icon-outline.ui-1_dashboard-30:before {\n    content: \"\\e679\";\n}\n.nc-icon-outline.ui-1_dashboard-half:before {\n    content: \"\\e67a\";\n}\n.nc-icon-outline.ui-1_dashboard-level:before {\n    content: \"\\e67b\";\n}\n.nc-icon-outline.ui-1_database:before {\n    content: \"\\e67c\";\n}\n.nc-icon-outline.ui-1_drop:before {\n    content: \"\\e67d\";\n}\n.nc-icon-outline.ui-1_edit-71:before {\n    content: \"\\e67e\";\n}\n.nc-icon-outline.ui-1_edit-72:before {\n    content: \"\\e67f\";\n}\n.nc-icon-outline.ui-1_edit-73:before {\n    content: \"\\e680\";\n}\n.nc-icon-outline.ui-1_edit-74:before {\n    content: \"\\e681\";\n}\n.nc-icon-outline.ui-1_edit-75:before {\n    content: \"\\e682\";\n}\n.nc-icon-outline.ui-1_edit-76:before {\n    content: \"\\e683\";\n}\n.nc-icon-outline.ui-1_edit-77:before {\n    content: \"\\e684\";\n}\n.nc-icon-outline.ui-1_edit-78:before {\n    content: \"\\e685\";\n}\n.nc-icon-outline.ui-1_email-83:before {\n    content: \"\\e686\";\n}\n.nc-icon-outline.ui-1_email-84:before {\n    content: \"\\e687\";\n}\n.nc-icon-outline.ui-1_email-85:before {\n    content: \"\\e688\";\n}\n.nc-icon-outline.ui-1_eye-17:before {\n    content: \"\\e689\";\n}\n.nc-icon-outline.ui-1_eye-19:before {\n    content: \"\\e68a\";\n}\n.nc-icon-outline.ui-1_eye-ban-18:before {\n    content: \"\\e68b\";\n}\n.nc-icon-outline.ui-1_eye-ban-20:before {\n    content: \"\\e68c\";\n}\n.nc-icon-outline.ui-1_flame:before {\n    content: \"\\e68d\";\n}\n.nc-icon-outline.ui-1_home-51:before {\n    content: \"\\e68e\";\n}\n.nc-icon-outline.ui-1_home-52:before {\n    content: \"\\e68f\";\n}\n.nc-icon-outline.ui-1_home-minimal:before {\n    content: \"\\e690\";\n}\n.nc-icon-outline.ui-1_home-simple:before {\n    content: \"\\e691\";\n}\n.nc-icon-outline.ui-1_leaf-80:before {\n    content: \"\\e692\";\n}\n.nc-icon-outline.ui-1_leaf-81:before {\n    content: \"\\e693\";\n}\n.nc-icon-outline.ui-1_leaf-edit:before {\n    content: \"\\e694\";\n}\n.nc-icon-outline.ui-1_lock-circle-open:before {\n    content: \"\\e695\";\n}\n.nc-icon-outline.ui-1_lock-circle:before {\n    content: \"\\e696\";\n}\n.nc-icon-outline.ui-1_lock-open:before {\n    content: \"\\e697\";\n}\n.nc-icon-outline.ui-1_lock:before {\n    content: \"\\e698\";\n}\n.nc-icon-outline.ui-1_notification-69:before {\n    content: \"\\e699\";\n}\n.nc-icon-outline.ui-1_notification-70:before {\n    content: \"\\e69a\";\n}\n.nc-icon-outline.ui-1_pencil:before {\n    content: \"\\e69b\";\n}\n.nc-icon-outline.ui-1_preferences-circle-rotate:before {\n    content: \"\\e69c\";\n}\n.nc-icon-outline.ui-1_preferences-circle:before {\n    content: \"\\e69d\";\n}\n.nc-icon-outline.ui-1_preferences-container-circle-rotate:before {\n    content: \"\\e69e\";\n}\n.nc-icon-outline.ui-1_preferences-container-circle:before {\n    content: \"\\e69f\";\n}\n.nc-icon-outline.ui-1_preferences-container-rotate:before {\n    content: \"\\e6a0\";\n}\n.nc-icon-outline.ui-1_preferences-container:before {\n    content: \"\\e6a1\";\n}\n.nc-icon-outline.ui-1_preferences-rotate:before {\n    content: \"\\e6a2\";\n}\n.nc-icon-outline.ui-1_preferences:before {\n    content: \"\\e6a3\";\n}\n.nc-icon-outline.ui-1_send:before {\n    content: \"\\e6a4\";\n}\n.nc-icon-outline.ui-1_settings-gear-63:before {\n    content: \"\\e6a5\";\n}\n.nc-icon-outline.ui-1_settings-gear-64:before {\n    content: \"\\e6a6\";\n}\n.nc-icon-outline.ui-1_settings-gear-65:before {\n    content: \"\\e6a7\";\n}\n.nc-icon-outline.ui-1_settings-tool-66:before {\n    content: \"\\e6a8\";\n}\n.nc-icon-outline.ui-1_settings-tool-67:before {\n    content: \"\\e6a9\";\n}\n.nc-icon-outline.ui-1_settings:before {\n    content: \"\\e6aa\";\n}\n.nc-icon-outline.ui-1_simple-add:before {\n    content: \"\\e6ab\";\n}\n.nc-icon-outline.ui-1_simple-delete:before {\n    content: \"\\e6ac\";\n}\n.nc-icon-outline.ui-1_simple-remove:before {\n    content: \"\\e6ad\";\n}\n.nc-icon-outline.ui-1_trash-round:before {\n    content: \"\\e6ae\";\n}\n.nc-icon-outline.ui-1_trash-simple:before {\n    content: \"\\e6af\";\n}\n.nc-icon-outline.ui-1_trash:before {\n    content: \"\\e6b0\";\n}\n.nc-icon-outline.ui-1_ui-03:before {\n    content: \"\\e6b1\";\n}\n.nc-icon-outline.ui-1_ui-04:before {\n    content: \"\\e6b2\";\n}\n.nc-icon-outline.ui-1_zoom-bold-in:before {\n    content: \"\\e6b3\";\n}\n.nc-icon-outline.ui-1_zoom-bold-out:before {\n    content: \"\\e6b4\";\n}\n.nc-icon-outline.ui-1_zoom-bold:before {\n    content: \"\\e6b5\";\n}\n.nc-icon-outline.ui-1_zoom-in:before {\n    content: \"\\e6b6\";\n}\n.nc-icon-outline.ui-1_zoom-out:before {\n    content: \"\\e6b7\";\n}\n.nc-icon-outline.ui-1_zoom-split-in:before {\n    content: \"\\e6b8\";\n}\n.nc-icon-outline.ui-1_zoom-split-out:before {\n    content: \"\\e6b9\";\n}\n.nc-icon-outline.ui-1_zoom-split:before {\n    content: \"\\e6ba\";\n}\n.nc-icon-outline.ui-1_zoom:before {\n    content: \"\\e6bb\";\n}\n.nc-icon-outline.ui-2_alert:before {\n    content: \"\\e6bc\";\n}\n.nc-icon-outline.ui-2_alert-:before {\n    content: \"\\e6bd\";\n}\n.nc-icon-outline.ui-2_alert-circle:before {\n    content: \"\\e6be\";\n}\n.nc-icon-outline.ui-2_alert-circle-:before {\n    content: \"\\e6bf\";\n}\n.nc-icon-outline.ui-2_alert-circle-i:before {\n    content: \"\\e6c0\";\n}\n.nc-icon-outline.ui-2_alert-i:before {\n    content: \"\\e6c1\";\n}\n.nc-icon-outline.ui-2_alert-square:before {\n    content: \"\\e6c2\";\n}\n.nc-icon-outline.ui-2_alert-square-:before {\n    content: \"\\e6c3\";\n}\n.nc-icon-outline.ui-2_alert-square-i:before {\n    content: \"\\e6c4\";\n}\n.nc-icon-outline.ui-2_archive:before {\n    content: \"\\e6c5\";\n}\n.nc-icon-outline.ui-2_ban-bold:before {\n    content: \"\\e6c6\";\n}\n.nc-icon-outline.ui-2_ban:before {\n    content: \"\\e6c7\";\n}\n.nc-icon-outline.ui-2_battery-81:before {\n    content: \"\\e6c8\";\n}\n.nc-icon-outline.ui-2_battery-83:before {\n    content: \"\\e6c9\";\n}\n.nc-icon-outline.ui-2_battery-half:before {\n    content: \"\\e6ca\";\n}\n.nc-icon-outline.ui-2_battery-low:before {\n    content: \"\\e6cb\";\n}\n.nc-icon-outline.ui-2_bluetooth:before {\n    content: \"\\e6cc\";\n}\n.nc-icon-outline.ui-2_book:before {\n    content: \"\\e6cd\";\n}\n.nc-icon-outline.ui-2_chart-bar-52:before {\n    content: \"\\e6ce\";\n}\n.nc-icon-outline.ui-2_chart-bar-53:before {\n    content: \"\\e6cf\";\n}\n.nc-icon-outline.ui-2_chat-content:before {\n    content: \"\\e6d0\";\n}\n.nc-icon-outline.ui-2_chat-round-content:before {\n    content: \"\\e6d1\";\n}\n.nc-icon-outline.ui-2_chat-round:before {\n    content: \"\\e6d2\";\n}\n.nc-icon-outline.ui-2_chat:before {\n    content: \"\\e6d3\";\n}\n.nc-icon-outline.ui-2_circle-bold-delete:before {\n    content: \"\\e6d4\";\n}\n.nc-icon-outline.ui-2_cloud-25:before {\n    content: \"\\e6d5\";\n}\n.nc-icon-outline.ui-2_cloud-26:before {\n    content: \"\\e6d6\";\n}\n.nc-icon-outline.ui-2_disk:before {\n    content: \"\\e6d7\";\n}\n.nc-icon-outline.ui-2_enlarge-57:before {\n    content: \"\\e6d8\";\n}\n.nc-icon-outline.ui-2_enlarge-58:before {\n    content: \"\\e6d9\";\n}\n.nc-icon-outline.ui-2_enlarge-59:before {\n    content: \"\\e6da\";\n}\n.nc-icon-outline.ui-2_fat-add:before {\n    content: \"\\e6db\";\n}\n.nc-icon-outline.ui-2_fat-delete:before {\n    content: \"\\e6dc\";\n}\n.nc-icon-outline.ui-2_fat-remove:before {\n    content: \"\\e6dd\";\n}\n.nc-icon-outline.ui-2_favourite-28:before {\n    content: \"\\e6de\";\n}\n.nc-icon-outline.ui-2_favourite-31:before {\n    content: \"\\e6df\";\n}\n.nc-icon-outline.ui-2_favourite-add-29:before {\n    content: \"\\e6e0\";\n}\n.nc-icon-outline.ui-2_favourite-add-32:before {\n    content: \"\\e6e1\";\n}\n.nc-icon-outline.ui-2_favourite-remove-30:before {\n    content: \"\\e6e2\";\n}\n.nc-icon-outline.ui-2_favourite-remove-33:before {\n    content: \"\\e6e3\";\n}\n.nc-icon-outline.ui-2_filter:before {\n    content: \"\\e6e4\";\n}\n.nc-icon-outline.ui-2_fullsize:before {\n    content: \"\\e6e5\";\n}\n.nc-icon-outline.ui-2_grid-45:before {\n    content: \"\\e6e6\";\n}\n.nc-icon-outline.ui-2_grid-46:before {\n    content: \"\\e6e7\";\n}\n.nc-icon-outline.ui-2_grid-48:before {\n    content: \"\\e6e8\";\n}\n.nc-icon-outline.ui-2_grid-49:before {\n    content: \"\\e6e9\";\n}\n.nc-icon-outline.ui-2_grid-50:before {\n    content: \"\\e6ea\";\n}\n.nc-icon-outline.ui-2_grid-square:before {\n    content: \"\\e6eb\";\n}\n.nc-icon-outline.ui-2_hourglass:before {\n    content: \"\\e6ec\";\n}\n.nc-icon-outline.ui-2_lab:before {\n    content: \"\\e6ed\";\n}\n.nc-icon-outline.ui-2_layers:before {\n    content: \"\\e6ee\";\n}\n.nc-icon-outline.ui-2_like:before {\n    content: \"\\e6ef\";\n}\n.nc-icon-outline.ui-2_link-66:before {\n    content: \"\\e6f0\";\n}\n.nc-icon-outline.ui-2_link-67:before {\n    content: \"\\e6f1\";\n}\n.nc-icon-outline.ui-2_link-68:before {\n    content: \"\\e6f2\";\n}\n.nc-icon-outline.ui-2_link-69:before {\n    content: \"\\e6f3\";\n}\n.nc-icon-outline.ui-2_link-71:before {\n    content: \"\\e6f4\";\n}\n.nc-icon-outline.ui-2_link-72:before {\n    content: \"\\e6f5\";\n}\n.nc-icon-outline.ui-2_link-broken-70:before {\n    content: \"\\e6f6\";\n}\n.nc-icon-outline.ui-2_link-broken-73:before {\n    content: \"\\e6f7\";\n}\n.nc-icon-outline.ui-2_menu-34:before {\n    content: \"\\e6f8\";\n}\n.nc-icon-outline.ui-2_menu-35:before {\n    content: \"\\e6f9\";\n}\n.nc-icon-outline.ui-2_menu-bold:before {\n    content: \"\\e6fa\";\n}\n.nc-icon-outline.ui-2_menu-dots:before {\n    content: \"\\e6fb\";\n}\n.nc-icon-outline.ui-2_menu-square:before {\n    content: \"\\e6fc\";\n}\n.nc-icon-outline.ui-2_node:before {\n    content: \"\\e6fd\";\n}\n.nc-icon-outline.ui-2_paragraph:before {\n    content: \"\\e6fe\";\n}\n.nc-icon-outline.ui-2_phone:before {\n    content: \"\\e6ff\";\n}\n.nc-icon-outline.ui-2_settings-90:before {\n    content: \"\\e700\";\n}\n.nc-icon-outline.ui-2_settings-91:before {\n    content: \"\\e701\";\n}\n.nc-icon-outline.ui-2_share-bold:before {\n    content: \"\\e702\";\n}\n.nc-icon-outline.ui-2_share:before {\n    content: \"\\e703\";\n}\n.nc-icon-outline.ui-2_small-add:before {\n    content: \"\\e704\";\n}\n.nc-icon-outline.ui-2_small-delete:before {\n    content: \"\\e705\";\n}\n.nc-icon-outline.ui-2_small-remove:before {\n    content: \"\\e706\";\n}\n.nc-icon-outline.ui-2_square-add-08:before {\n    content: \"\\e707\";\n}\n.nc-icon-outline.ui-2_square-add-11:before {\n    content: \"\\e708\";\n}\n.nc-icon-outline.ui-2_square-delete-10:before {\n    content: \"\\e709\";\n}\n.nc-icon-outline.ui-2_square-delete-13:before {\n    content: \"\\e70a\";\n}\n.nc-icon-outline.ui-2_square-remove-09:before {\n    content: \"\\e70b\";\n}\n.nc-icon-outline.ui-2_square-remove-12:before {\n    content: \"\\e70c\";\n}\n.nc-icon-outline.ui-2_target:before {\n    content: \"\\e70d\";\n}\n.nc-icon-outline.ui-2_tile-55:before {\n    content: \"\\e70e\";\n}\n.nc-icon-outline.ui-2_tile-56:before {\n    content: \"\\e70f\";\n}\n.nc-icon-outline.ui-2_time-alarm:before {\n    content: \"\\e710\";\n}\n.nc-icon-outline.ui-2_time-clock:before {\n    content: \"\\e711\";\n}\n.nc-icon-outline.ui-2_time-countdown:before {\n    content: \"\\e712\";\n}\n.nc-icon-outline.ui-2_time:before {\n    content: \"\\e713\";\n}\n.nc-icon-outline.ui-2_webpage:before {\n    content: \"\\e714\";\n}\n.nc-icon-outline.ui-2_window-add:before {\n    content: \"\\e715\";\n}\n.nc-icon-outline.ui-2_window-delete:before {\n    content: \"\\e716\";\n}\n.nc-icon-outline.transportation_air-baloon:before {\n    content: \"\\e717\";\n}\n.nc-icon-outline.transportation_bike-sport:before {\n    content: \"\\e718\";\n}\n.nc-icon-outline.transportation_bike:before {\n    content: \"\\e719\";\n}\n.nc-icon-outline.transportation_boat-front:before {\n    content: \"\\e71a\";\n}\n.nc-icon-outline.transportation_boat-small-02:before {\n    content: \"\\e71b\";\n}\n.nc-icon-outline.transportation_boat-small-03:before {\n    content: \"\\e71c\";\n}\n.nc-icon-outline.transportation_boat:before {\n    content: \"\\e71d\";\n}\n.nc-icon-outline.transportation_bus-front-10:before {\n    content: \"\\e71e\";\n}\n.nc-icon-outline.transportation_bus-front-12:before {\n    content: \"\\e71f\";\n}\n.nc-icon-outline.transportation_bus:before {\n    content: \"\\e720\";\n}\n.nc-icon-outline.transportation_car-front:before {\n    content: \"\\e721\";\n}\n.nc-icon-outline.transportation_car-simple:before {\n    content: \"\\e722\";\n}\n.nc-icon-outline.transportation_car-sport:before {\n    content: \"\\e723\";\n}\n.nc-icon-outline.transportation_car-taxi:before {\n    content: \"\\e724\";\n}\n.nc-icon-outline.transportation_car:before {\n    content: \"\\e725\";\n}\n.nc-icon-outline.transportation_helicopter:before {\n    content: \"\\e726\";\n}\n.nc-icon-outline.transportation_helmet:before {\n    content: \"\\e727\";\n}\n.nc-icon-outline.transportation_light-traffic:before {\n    content: \"\\e728\";\n}\n.nc-icon-outline.transportation_moto:before {\n    content: \"\\e729\";\n}\n.nc-icon-outline.transportation_plane-17:before {\n    content: \"\\e72a\";\n}\n.nc-icon-outline.transportation_plane-18:before {\n    content: \"\\e72b\";\n}\n.nc-icon-outline.transportation_road:before {\n    content: \"\\e72c\";\n}\n.nc-icon-outline.transportation_skateboard:before {\n    content: \"\\e72d\";\n}\n.nc-icon-outline.transportation_tractor:before {\n    content: \"\\e72e\";\n}\n.nc-icon-outline.transportation_train-speed:before {\n    content: \"\\e72f\";\n}\n.nc-icon-outline.transportation_train:before {\n    content: \"\\e730\";\n}\n.nc-icon-outline.transportation_tram:before {\n    content: \"\\e731\";\n}\n.nc-icon-outline.transportation_truck-front:before {\n    content: \"\\e732\";\n}\n.nc-icon-outline.transportation_vespa-front:before {\n    content: \"\\e733\";\n}\n.nc-icon-outline.transportation_vespa:before {\n    content: \"\\e734\";\n}\n.nc-icon-outline.tech_cable-49:before {\n    content: \"\\e735\";\n}\n.nc-icon-outline.tech_cable-50:before {\n    content: \"\\e736\";\n}\n.nc-icon-outline.tech_cd-reader:before {\n    content: \"\\e737\";\n}\n.nc-icon-outline.tech_computer-monitor:before {\n    content: \"\\e738\";\n}\n.nc-icon-outline.tech_computer-old:before {\n    content: \"\\e739\";\n}\n.nc-icon-outline.tech_computer:before {\n    content: \"\\e73a\";\n}\n.nc-icon-outline.tech_controller-modern:before {\n    content: \"\\e73b\";\n}\n.nc-icon-outline.tech_controller:before {\n    content: \"\\e73c\";\n}\n.nc-icon-outline.tech_desktop-screen:before {\n    content: \"\\e73d\";\n}\n.nc-icon-outline.tech_desktop:before {\n    content: \"\\e73e\";\n}\n.nc-icon-outline.tech_disk-reader:before {\n    content: \"\\e73f\";\n}\n.nc-icon-outline.tech_disk:before {\n    content: \"\\e740\";\n}\n.nc-icon-outline.tech_gopro:before {\n    content: \"\\e741\";\n}\n.nc-icon-outline.tech_headphones:before {\n    content: \"\\e742\";\n}\n.nc-icon-outline.tech_keyboard-mouse:before {\n    content: \"\\e743\";\n}\n.nc-icon-outline.tech_keyboard-wifi:before {\n    content: \"\\e744\";\n}\n.nc-icon-outline.tech_keyboard:before {\n    content: \"\\e745\";\n}\n.nc-icon-outline.tech_laptop-camera:before {\n    content: \"\\e746\";\n}\n.nc-icon-outline.tech_laptop-front:before {\n    content: \"\\e747\";\n}\n.nc-icon-outline.tech_laptop:before {\n    content: \"\\e748\";\n}\n.nc-icon-outline.tech_mobile-button:before {\n    content: \"\\e749\";\n}\n.nc-icon-outline.tech_mobile-camera:before {\n    content: \"\\e74a\";\n}\n.nc-icon-outline.tech_mobile-recharger-08:before {\n    content: \"\\e74b\";\n}\n.nc-icon-outline.tech_mobile-recharger-09:before {\n    content: \"\\e74c\";\n}\n.nc-icon-outline.tech_mobile-toolbar:before {\n    content: \"\\e74d\";\n}\n.nc-icon-outline.tech_mobile:before {\n    content: \"\\e74e\";\n}\n.nc-icon-outline.tech_music:before {\n    content: \"\\e74f\";\n}\n.nc-icon-outline.tech_navigation:before {\n    content: \"\\e750\";\n}\n.nc-icon-outline.tech_player-19:before {\n    content: \"\\e751\";\n}\n.nc-icon-outline.tech_player-48:before {\n    content: \"\\e752\";\n}\n.nc-icon-outline.tech_print-fold:before {\n    content: \"\\e753\";\n}\n.nc-icon-outline.tech_print-round-fold:before {\n    content: \"\\e754\";\n}\n.nc-icon-outline.tech_print-round:before {\n    content: \"\\e755\";\n}\n.nc-icon-outline.tech_print:before {\n    content: \"\\e756\";\n}\n.nc-icon-outline.tech_ram:before {\n    content: \"\\e757\";\n}\n.nc-icon-outline.tech_remote:before {\n    content: \"\\e758\";\n}\n.nc-icon-outline.tech_signal:before {\n    content: \"\\e759\";\n}\n.nc-icon-outline.tech_socket:before {\n    content: \"\\e75a\";\n}\n.nc-icon-outline.tech_sync:before {\n    content: \"\\e75b\";\n}\n.nc-icon-outline.tech_tablet-button:before {\n    content: \"\\e75c\";\n}\n.nc-icon-outline.tech_tablet-reader-31:before {\n    content: \"\\e75d\";\n}\n.nc-icon-outline.tech_tablet-reader-42:before {\n    content: \"\\e75e\";\n}\n.nc-icon-outline.tech_tablet-toolbar:before {\n    content: \"\\e75f\";\n}\n.nc-icon-outline.tech_tablet:before {\n    content: \"\\e760\";\n}\n.nc-icon-outline.tech_tv-old:before {\n    content: \"\\e761\";\n}\n.nc-icon-outline.tech_tv:before {\n    content: \"\\e762\";\n}\n.nc-icon-outline.tech_watch-circle:before {\n    content: \"\\e763\";\n}\n.nc-icon-outline.tech_watch-time:before {\n    content: \"\\e764\";\n}\n.nc-icon-outline.tech_watch:before {\n    content: \"\\e765\";\n}\n.nc-icon-outline.tech_webcam-38:before {\n    content: \"\\e766\";\n}\n.nc-icon-outline.tech_webcam-39:before {\n    content: \"\\e767\";\n}\n.nc-icon-outline.tech_wifi-router:before {\n    content: \"\\e768\";\n}\n.nc-icon-outline.tech_wifi:before {\n    content: \"\\e769\";\n}\n.nc-icon-outline.shopping_award:before {\n    content: \"\\e76a\";\n}\n.nc-icon-outline.shopping_bag-09:before {\n    content: \"\\e76b\";\n}\n.nc-icon-outline.shopping_bag-16:before {\n    content: \"\\e76c\";\n}\n.nc-icon-outline.shopping_bag-17:before {\n    content: \"\\e76d\";\n}\n.nc-icon-outline.shopping_bag-20:before {\n    content: \"\\e76e\";\n}\n.nc-icon-outline.shopping_bag-add-18:before {\n    content: \"\\e76f\";\n}\n.nc-icon-outline.shopping_bag-add-21:before {\n    content: \"\\e770\";\n}\n.nc-icon-outline.shopping_bag-edit:before {\n    content: \"\\e771\";\n}\n.nc-icon-outline.shopping_bag-remove-19:before {\n    content: \"\\e772\";\n}\n.nc-icon-outline.shopping_bag-remove-22:before {\n    content: \"\\e773\";\n}\n.nc-icon-outline.shopping_barcode-scan:before {\n    content: \"\\e774\";\n}\n.nc-icon-outline.shopping_barcode:before {\n    content: \"\\e775\";\n}\n.nc-icon-outline.shopping_bardcode-qr:before {\n    content: \"\\e776\";\n}\n.nc-icon-outline.shopping_basket-add:before {\n    content: \"\\e777\";\n}\n.nc-icon-outline.shopping_basket-edit:before {\n    content: \"\\e778\";\n}\n.nc-icon-outline.shopping_basket-remove:before {\n    content: \"\\e779\";\n}\n.nc-icon-outline.shopping_basket-simple-add:before {\n    content: \"\\e77a\";\n}\n.nc-icon-outline.shopping_basket-simple-remove:before {\n    content: \"\\e77b\";\n}\n.nc-icon-outline.shopping_basket-simple:before {\n    content: \"\\e77c\";\n}\n.nc-icon-outline.shopping_basket:before {\n    content: \"\\e77d\";\n}\n.nc-icon-outline.shopping_bitcoin:before {\n    content: \"\\e77e\";\n}\n.nc-icon-outline.shopping_board:before {\n    content: \"\\e77f\";\n}\n.nc-icon-outline.shopping_box-3d-50:before {\n    content: \"\\e780\";\n}\n.nc-icon-outline.shopping_box-3d-67:before {\n    content: \"\\e781\";\n}\n.nc-icon-outline.shopping_box-ribbon:before {\n    content: \"\\e782\";\n}\n.nc-icon-outline.shopping_box:before {\n    content: \"\\e783\";\n}\n.nc-icon-outline.shopping_cart-add:before {\n    content: \"\\e784\";\n}\n.nc-icon-outline.shopping_cart-modern-add:before {\n    content: \"\\e785\";\n}\n.nc-icon-outline.shopping_cart-modern-in:before {\n    content: \"\\e786\";\n}\n.nc-icon-outline.shopping_cart-modern-remove:before {\n    content: \"\\e787\";\n}\n.nc-icon-outline.shopping_cart-modern:before {\n    content: \"\\e788\";\n}\n.nc-icon-outline.shopping_cart-remove:before {\n    content: \"\\e789\";\n}\n.nc-icon-outline.shopping_cart-simple-add:before {\n    content: \"\\e78a\";\n}\n.nc-icon-outline.shopping_cart-simple-in:before {\n    content: \"\\e78b\";\n}\n.nc-icon-outline.shopping_cart-simple-remove:before {\n    content: \"\\e78c\";\n}\n.nc-icon-outline.shopping_cart-simple:before {\n    content: \"\\e78d\";\n}\n.nc-icon-outline.shopping_cart:before {\n    content: \"\\e78e\";\n}\n.nc-icon-outline.shopping_cash-register:before {\n    content: \"\\e78f\";\n}\n.nc-icon-outline.shopping_chart:before {\n    content: \"\\e790\";\n}\n.nc-icon-outline.shopping_credit-card-in:before {\n    content: \"\\e791\";\n}\n.nc-icon-outline.shopping_credit-card:before {\n    content: \"\\e792\";\n}\n.nc-icon-outline.shopping_credit-locked:before {\n    content: \"\\e793\";\n}\n.nc-icon-outline.shopping_delivery-fast:before {\n    content: \"\\e794\";\n}\n.nc-icon-outline.shopping_delivery-time:before {\n    content: \"\\e795\";\n}\n.nc-icon-outline.shopping_delivery-track:before {\n    content: \"\\e796\";\n}\n.nc-icon-outline.shopping_delivery:before {\n    content: \"\\e797\";\n}\n.nc-icon-outline.shopping_discount:before {\n    content: \"\\e798\";\n}\n.nc-icon-outline.shopping_gift:before {\n    content: \"\\e799\";\n}\n.nc-icon-outline.shopping_hand-card:before {\n    content: \"\\e79a\";\n}\n.nc-icon-outline.shopping_list:before {\n    content: \"\\e79b\";\n}\n.nc-icon-outline.shopping_mobile-card:before {\n    content: \"\\e79c\";\n}\n.nc-icon-outline.shopping_mobile-cart:before {\n    content: \"\\e79d\";\n}\n.nc-icon-outline.shopping_mobile-touch:before {\n    content: \"\\e79e\";\n}\n.nc-icon-outline.shopping_newsletter:before {\n    content: \"\\e79f\";\n}\n.nc-icon-outline.shopping_pos:before {\n    content: \"\\e7a0\";\n}\n.nc-icon-outline.shopping_receipt-list-42:before {\n    content: \"\\e7a1\";\n}\n.nc-icon-outline.shopping_receipt-list-43:before {\n    content: \"\\e7a2\";\n}\n.nc-icon-outline.shopping_receipt:before {\n    content: \"\\e7a3\";\n}\n.nc-icon-outline.shopping_shop-location:before {\n    content: \"\\e7a4\";\n}\n.nc-icon-outline.shopping_shop:before {\n    content: \"\\e7a5\";\n}\n.nc-icon-outline.shopping_stock:before {\n    content: \"\\e7a6\";\n}\n.nc-icon-outline.shopping_tag-content:before {\n    content: \"\\e7a7\";\n}\n.nc-icon-outline.shopping_tag-cut:before {\n    content: \"\\e7a8\";\n}\n.nc-icon-outline.shopping_tag-line:before {\n    content: \"\\e7a9\";\n}\n.nc-icon-outline.shopping_tag-sale:before {\n    content: \"\\e7aa\";\n}\n.nc-icon-outline.shopping_tag:before {\n    content: \"\\e7ab\";\n}\n.nc-icon-outline.shopping_wallet:before {\n    content: \"\\e7ac\";\n}\n.nc-icon-outline.education_abc:before {\n    content: \"\\e7ad\";\n}\n.nc-icon-outline.education_agenda-bookmark:before {\n    content: \"\\e7ae\";\n}\n.nc-icon-outline.education_atom:before {\n    content: \"\\e7af\";\n}\n.nc-icon-outline.education_award-55:before {\n    content: \"\\e7b0\";\n}\n.nc-icon-outline.education_backpack-57:before {\n    content: \"\\e7b1\";\n}\n.nc-icon-outline.education_backpack-58:before {\n    content: \"\\e7b2\";\n}\n.nc-icon-outline.education_ball-basket:before {\n    content: \"\\e7b3\";\n}\n.nc-icon-outline.education_ball-soccer:before {\n    content: \"\\e7b4\";\n}\n.nc-icon-outline.education_board-51:before {\n    content: \"\\e7b5\";\n}\n.nc-icon-outline.education_book-39:before {\n    content: \"\\e7b6\";\n}\n.nc-icon-outline.education_book-bookmark:before {\n    content: \"\\e7b7\";\n}\n.nc-icon-outline.education_book-open:before {\n    content: \"\\e7b8\";\n}\n.nc-icon-outline.education_books-46:before {\n    content: \"\\e7b9\";\n}\n.nc-icon-outline.education_chalkboard:before {\n    content: \"\\e7ba\";\n}\n.nc-icon-outline.education_flask:before {\n    content: \"\\e7bb\";\n}\n.nc-icon-outline.education_glasses:before {\n    content: \"\\e7bc\";\n}\n.nc-icon-outline.education_grammar-check:before {\n    content: \"\\e7bd\";\n}\n.nc-icon-outline.education_hat:before {\n    content: \"\\e7be\";\n}\n.nc-icon-outline.education_language:before {\n    content: \"\\e7bf\";\n}\n.nc-icon-outline.education_microscope:before {\n    content: \"\\e7c0\";\n}\n.nc-icon-outline.education_molecule:before {\n    content: \"\\e7c1\";\n}\n.nc-icon-outline.education_notepad:before {\n    content: \"\\e7c2\";\n}\n.nc-icon-outline.education_paper-diploma:before {\n    content: \"\\e7c3\";\n}\n.nc-icon-outline.education_paper:before {\n    content: \"\\e7c4\";\n}\n.nc-icon-outline.education_pencil-47:before {\n    content: \"\\e7c5\";\n}\n.nc-icon-outline.education_school:before {\n    content: \"\\e7c6\";\n}\n.nc-icon-outline.objects_alien-29:before {\n    content: \"\\e7c7\";\n}\n.nc-icon-outline.objects_alien-33:before {\n    content: \"\\e7c8\";\n}\n.nc-icon-outline.objects_anchor:before {\n    content: \"\\e7c9\";\n}\n.nc-icon-outline.objects_astronaut:before {\n    content: \"\\e7ca\";\n}\n.nc-icon-outline.objects_axe:before {\n    content: \"\\e7cb\";\n}\n.nc-icon-outline.objects_baby-bottle:before {\n    content: \"\\e7cc\";\n}\n.nc-icon-outline.objects_baby:before {\n    content: \"\\e7cd\";\n}\n.nc-icon-outline.objects_baloon:before {\n    content: \"\\e7ce\";\n}\n.nc-icon-outline.objects_battery:before {\n    content: \"\\e7cf\";\n}\n.nc-icon-outline.objects_bear:before {\n    content: \"\\e7d0\";\n}\n.nc-icon-outline.objects_billiard:before {\n    content: \"\\e7d1\";\n}\n.nc-icon-outline.objects_binocular:before {\n    content: \"\\e7d2\";\n}\n.nc-icon-outline.objects_bow:before {\n    content: \"\\e7d3\";\n}\n.nc-icon-outline.objects_bowling:before {\n    content: \"\\e7d4\";\n}\n.nc-icon-outline.objects_broom:before {\n    content: \"\\e7d5\";\n}\n.nc-icon-outline.objects_cone:before {\n    content: \"\\e7d6\";\n}\n.nc-icon-outline.objects_controller:before {\n    content: \"\\e7d7\";\n}\n.nc-icon-outline.objects_diamond:before {\n    content: \"\\e7d8\";\n}\n.nc-icon-outline.objects_dice:before {\n    content: \"\\e7d9\";\n}\n.nc-icon-outline.objects_globe:before {\n    content: \"\\e7da\";\n}\n.nc-icon-outline.objects_hut:before {\n    content: \"\\e7db\";\n}\n.nc-icon-outline.objects_key-25:before {\n    content: \"\\e7dc\";\n}\n.nc-icon-outline.objects_key-26:before {\n    content: \"\\e7dd\";\n}\n.nc-icon-outline.objects_lamp:before {\n    content: \"\\e7de\";\n}\n.nc-icon-outline.objects_leaf-36:before {\n    content: \"\\e7df\";\n}\n.nc-icon-outline.objects_leaf-38:before {\n    content: \"\\e7e0\";\n}\n.nc-icon-outline.objects_light:before {\n    content: \"\\e7e1\";\n}\n.nc-icon-outline.objects_pipe:before {\n    content: \"\\e7e2\";\n}\n.nc-icon-outline.objects_planet:before {\n    content: \"\\e7e3\";\n}\n.nc-icon-outline.objects_puzzle-09:before {\n    content: \"\\e7e4\";\n}\n.nc-icon-outline.objects_puzzle-10:before {\n    content: \"\\e7e5\";\n}\n.nc-icon-outline.objects_shovel:before {\n    content: \"\\e7e6\";\n}\n.nc-icon-outline.objects_skull:before {\n    content: \"\\e7e7\";\n}\n.nc-icon-outline.objects_spaceship:before {\n    content: \"\\e7e8\";\n}\n.nc-icon-outline.objects_spray:before {\n    content: \"\\e7e9\";\n}\n.nc-icon-outline.objects_support-16:before {\n    content: \"\\e7ea\";\n}\n.nc-icon-outline.objects_support-17:before {\n    content: \"\\e7eb\";\n}\n.nc-icon-outline.objects_umbrella-13:before {\n    content: \"\\e7ec\";\n}\n.nc-icon-outline.objects_umbrella-14:before {\n    content: \"\\e7ed\";\n}\n.nc-icon-outline.objects_wool-ball:before {\n    content: \"\\e7ee\";\n}\n.nc-icon-outline.media-1_3d:before {\n    content: \"\\e7ef\";\n}\n.nc-icon-outline.media-1_action-73:before {\n    content: \"\\e7f0\";\n}\n.nc-icon-outline.media-1_action-74:before {\n    content: \"\\e7f1\";\n}\n.nc-icon-outline.media-1_album:before {\n    content: \"\\e7f2\";\n}\n.nc-icon-outline.media-1_audio-91:before {\n    content: \"\\e7f3\";\n}\n.nc-icon-outline.media-1_audio-92:before {\n    content: \"\\e7f4\";\n}\n.nc-icon-outline.media-1_balance:before {\n    content: \"\\e7f5\";\n}\n.nc-icon-outline.media-1_brightness-46:before {\n    content: \"\\e7f6\";\n}\n.nc-icon-outline.media-1_brightness-47:before {\n    content: \"\\e7f7\";\n}\n.nc-icon-outline.media-1_button-circle-pause:before {\n    content: \"\\e7f8\";\n}\n.nc-icon-outline.media-1_button-circle-play:before {\n    content: \"\\e7f9\";\n}\n.nc-icon-outline.media-1_button-circle-stop:before {\n    content: \"\\e7fa\";\n}\n.nc-icon-outline.media-1_button-eject:before {\n    content: \"\\e7fb\";\n}\n.nc-icon-outline.media-1_button-next:before {\n    content: \"\\e7fc\";\n}\n.nc-icon-outline.media-1_button-pause:before {\n    content: \"\\e7fd\";\n}\n.nc-icon-outline.media-1_button-play:before {\n    content: \"\\e7fe\";\n}\n.nc-icon-outline.media-1_button-power:before {\n    content: \"\\e7ff\";\n}\n.nc-icon-outline.media-1_button-previous:before {\n    content: \"\\e800\";\n}\n.nc-icon-outline.media-1_button-record:before {\n    content: \"\\e801\";\n}\n.nc-icon-outline.media-1_button-rewind:before {\n    content: \"\\e802\";\n}\n.nc-icon-outline.media-1_button-skip:before {\n    content: \"\\e803\";\n}\n.nc-icon-outline.media-1_button-stop:before {\n    content: \"\\e804\";\n}\n.nc-icon-outline.media-1_camera-18:before {\n    content: \"\\e805\";\n}\n.nc-icon-outline.media-1_camera-19:before {\n    content: \"\\e806\";\n}\n.nc-icon-outline.media-1_camera-20:before {\n    content: \"\\e807\";\n}\n.nc-icon-outline.media-1_camera-ban-36:before {\n    content: \"\\e808\";\n}\n.nc-icon-outline.media-1_camera-ban-37:before {\n    content: \"\\e809\";\n}\n.nc-icon-outline.media-1_camera-compact:before {\n    content: \"\\e80a\";\n}\n.nc-icon-outline.media-1_camera-screen:before {\n    content: \"\\e80b\";\n}\n.nc-icon-outline.media-1_camera-square-57:before {\n    content: \"\\e80c\";\n}\n.nc-icon-outline.media-1_camera-square-58:before {\n    content: \"\\e80d\";\n}\n.nc-icon-outline.media-1_camera-time:before {\n    content: \"\\e80e\";\n}\n.nc-icon-outline.media-1_countdown-34:before {\n    content: \"\\e80f\";\n}\n.nc-icon-outline.media-1_countdown-35:before {\n    content: \"\\e810\";\n}\n.nc-icon-outline.media-1_edit-color:before {\n    content: \"\\e811\";\n}\n.nc-icon-outline.media-1_edit-contrast-42:before {\n    content: \"\\e812\";\n}\n.nc-icon-outline.media-1_edit-contrast-43:before {\n    content: \"\\e813\";\n}\n.nc-icon-outline.media-1_edit-saturation:before {\n    content: \"\\e814\";\n}\n.nc-icon-outline.media-1_flash-21:before {\n    content: \"\\e815\";\n}\n.nc-icon-outline.media-1_flash-24:before {\n    content: \"\\e816\";\n}\n.nc-icon-outline.media-1_flash-29:before {\n    content: \"\\e817\";\n}\n.nc-icon-outline.media-1_flash-auto-22:before {\n    content: \"\\e818\";\n}\n.nc-icon-outline.media-1_flash-auto-25:before {\n    content: \"\\e819\";\n}\n.nc-icon-outline.media-1_flash-off-23:before {\n    content: \"\\e81a\";\n}\n.nc-icon-outline.media-1_flash-off-26:before {\n    content: \"\\e81b\";\n}\n.nc-icon-outline.media-1_focus-32:before {\n    content: \"\\e81c\";\n}\n.nc-icon-outline.media-1_focus-38:before {\n    content: \"\\e81d\";\n}\n.nc-icon-outline.media-1_focus-40:before {\n    content: \"\\e81e\";\n}\n.nc-icon-outline.media-1_focus-circle:before {\n    content: \"\\e81f\";\n}\n.nc-icon-outline.media-1_frame-12:before {\n    content: \"\\e820\";\n}\n.nc-icon-outline.media-1_frame-41:before {\n    content: \"\\e821\";\n}\n.nc-icon-outline.media-1_grid:before {\n    content: \"\\e822\";\n}\n.nc-icon-outline.media-1_image-01:before {\n    content: \"\\e823\";\n}\n.nc-icon-outline.media-1_image-02:before {\n    content: \"\\e824\";\n}\n.nc-icon-outline.media-1_image-05:before {\n    content: \"\\e825\";\n}\n.nc-icon-outline.media-1_image-add:before {\n    content: \"\\e826\";\n}\n.nc-icon-outline.media-1_image-delete:before {\n    content: \"\\e827\";\n}\n.nc-icon-outline.media-1_image-location:before {\n    content: \"\\e828\";\n}\n.nc-icon-outline.media-1_kid:before {\n    content: \"\\e829\";\n}\n.nc-icon-outline.media-1_layers:before {\n    content: \"\\e82a\";\n}\n.nc-icon-outline.media-1_lens-31:before {\n    content: \"\\e82b\";\n}\n.nc-icon-outline.media-1_lens-56:before {\n    content: \"\\e82c\";\n}\n.nc-icon-outline.media-1_macro:before {\n    content: \"\\e82d\";\n}\n.nc-icon-outline.media-1_movie-61:before {\n    content: \"\\e82e\";\n}\n.nc-icon-outline.media-1_movie-62:before {\n    content: \"\\e82f\";\n}\n.nc-icon-outline.media-1_night:before {\n    content: \"\\e830\";\n}\n.nc-icon-outline.media-1_picture:before {\n    content: \"\\e831\";\n}\n.nc-icon-outline.media-1_play-68:before {\n    content: \"\\e832\";\n}\n.nc-icon-outline.media-1_play-69:before {\n    content: \"\\e833\";\n}\n.nc-icon-outline.media-1_player:before {\n    content: \"\\e834\";\n}\n.nc-icon-outline.media-1_polaroid-add:before {\n    content: \"\\e835\";\n}\n.nc-icon-outline.media-1_polaroid-delete:before {\n    content: \"\\e836\";\n}\n.nc-icon-outline.media-1_polaroid-multiple:before {\n    content: \"\\e837\";\n}\n.nc-icon-outline.media-1_polaroid-user:before {\n    content: \"\\e838\";\n}\n.nc-icon-outline.media-1_polaroid:before {\n    content: \"\\e839\";\n}\n.nc-icon-outline.media-1_roll:before {\n    content: \"\\e83a\";\n}\n.nc-icon-outline.media-1_rotate-left:before {\n    content: \"\\e83b\";\n}\n.nc-icon-outline.media-1_rotate-right:before {\n    content: \"\\e83c\";\n}\n.nc-icon-outline.media-1_sd:before {\n    content: \"\\e83d\";\n}\n.nc-icon-outline.media-1_selfie:before {\n    content: \"\\e83e\";\n}\n.nc-icon-outline.media-1_shake:before {\n    content: \"\\e83f\";\n}\n.nc-icon-outline.media-1_speaker:before {\n    content: \"\\e840\";\n}\n.nc-icon-outline.media-1_sport:before {\n    content: \"\\e841\";\n}\n.nc-icon-outline.media-1_ticket-75:before {\n    content: \"\\e842\";\n}\n.nc-icon-outline.media-1_ticket-76:before {\n    content: \"\\e843\";\n}\n.nc-icon-outline.media-1_touch:before {\n    content: \"\\e844\";\n}\n.nc-icon-outline.media-1_tripod:before {\n    content: \"\\e845\";\n}\n.nc-icon-outline.media-1_video-64:before {\n    content: \"\\e846\";\n}\n.nc-icon-outline.media-1_video-65:before {\n    content: \"\\e847\";\n}\n.nc-icon-outline.media-1_video-66:before {\n    content: \"\\e848\";\n}\n.nc-icon-outline.media-1_video-67:before {\n    content: \"\\e849\";\n}\n.nc-icon-outline.media-1_videocamera-71:before {\n    content: \"\\e84a\";\n}\n.nc-icon-outline.media-1_videocamera-72:before {\n    content: \"\\e84b\";\n}\n.nc-icon-outline.media-1_volume-93:before {\n    content: \"\\e84c\";\n}\n.nc-icon-outline.media-1_volume-97:before {\n    content: \"\\e84d\";\n}\n.nc-icon-outline.media-1_volume-98:before {\n    content: \"\\e84e\";\n}\n.nc-icon-outline.media-1_volume-ban:before {\n    content: \"\\e84f\";\n}\n.nc-icon-outline.media-1_volume-down:before {\n    content: \"\\e850\";\n}\n.nc-icon-outline.media-1_volume-off:before {\n    content: \"\\e851\";\n}\n.nc-icon-outline.media-1_volume-up:before {\n    content: \"\\e852\";\n}\n.nc-icon-outline.media-2_guitar:before {\n    content: \"\\e853\";\n}\n.nc-icon-outline.media-2_headphones-mic:before {\n    content: \"\\e854\";\n}\n.nc-icon-outline.media-2_headphones:before {\n    content: \"\\e855\";\n}\n.nc-icon-outline.media-2_knob:before {\n    content: \"\\e856\";\n}\n.nc-icon-outline.media-2_mic:before {\n    content: \"\\e857\";\n}\n.nc-icon-outline.media-2_music-album:before {\n    content: \"\\e858\";\n}\n.nc-icon-outline.media-2_music-cloud:before {\n    content: \"\\e859\";\n}\n.nc-icon-outline.media-2_note-03:before {\n    content: \"\\e85a\";\n}\n.nc-icon-outline.media-2_note-04:before {\n    content: \"\\e85b\";\n}\n.nc-icon-outline.media-2_piano:before {\n    content: \"\\e85c\";\n}\n.nc-icon-outline.media-2_radio:before {\n    content: \"\\e85d\";\n}\n.nc-icon-outline.media-2_remix:before {\n    content: \"\\e85e\";\n}\n.nc-icon-outline.media-2_sound-wave:before {\n    content: \"\\e85f\";\n}\n.nc-icon-outline.media-2_speaker-01:before {\n    content: \"\\e860\";\n}\n.nc-icon-outline.media-2_speaker-05:before {\n    content: \"\\e861\";\n}\n.nc-icon-outline.media-2_tape:before {\n    content: \"\\e862\";\n}\n.nc-icon-outline.location_appointment:before {\n    content: \"\\e863\";\n}\n.nc-icon-outline.location_bookmark-add:before {\n    content: \"\\e864\";\n}\n.nc-icon-outline.location_bookmark-remove:before {\n    content: \"\\e865\";\n}\n.nc-icon-outline.location_bookmark:before {\n    content: \"\\e866\";\n}\n.nc-icon-outline.location_compass-04:before {\n    content: \"\\e867\";\n}\n.nc-icon-outline.location_compass-05:before {\n    content: \"\\e868\";\n}\n.nc-icon-outline.location_compass-06:before {\n    content: \"\\e869\";\n}\n.nc-icon-outline.location_crosshair:before {\n    content: \"\\e86a\";\n}\n.nc-icon-outline.location_explore-user:before {\n    content: \"\\e86b\";\n}\n.nc-icon-outline.location_explore:before {\n    content: \"\\e86c\";\n}\n.nc-icon-outline.location_flag-complex:before {\n    content: \"\\e86d\";\n}\n.nc-icon-outline.location_flag-diagonal-33:before {\n    content: \"\\e86e\";\n}\n.nc-icon-outline.location_flag-diagonal-34:before {\n    content: \"\\e86f\";\n}\n.nc-icon-outline.location_flag-points-31:before {\n    content: \"\\e870\";\n}\n.nc-icon-outline.location_flag-points-32:before {\n    content: \"\\e871\";\n}\n.nc-icon-outline.location_flag-simple:before {\n    content: \"\\e872\";\n}\n.nc-icon-outline.location_flag-triangle:before {\n    content: \"\\e873\";\n}\n.nc-icon-outline.location_flag:before {\n    content: \"\\e874\";\n}\n.nc-icon-outline.location_gps:before {\n    content: \"\\e875\";\n}\n.nc-icon-outline.location_map-big:before {\n    content: \"\\e876\";\n}\n.nc-icon-outline.location_map-compass:before {\n    content: \"\\e877\";\n}\n.nc-icon-outline.location_map-gps:before {\n    content: \"\\e878\";\n}\n.nc-icon-outline.location_map-marker:before {\n    content: \"\\e879\";\n}\n.nc-icon-outline.location_map-pin:before {\n    content: \"\\e87a\";\n}\n.nc-icon-outline.location_map:before {\n    content: \"\\e87b\";\n}\n.nc-icon-outline.location_marker:before {\n    content: \"\\e87c\";\n}\n.nc-icon-outline.location_pin-add:before {\n    content: \"\\e87d\";\n}\n.nc-icon-outline.location_pin-copy:before {\n    content: \"\\e87e\";\n}\n.nc-icon-outline.location_pin-remove:before {\n    content: \"\\e87f\";\n}\n.nc-icon-outline.location_pin:before {\n    content: \"\\e880\";\n}\n.nc-icon-outline.location_pins:before {\n    content: \"\\e881\";\n}\n.nc-icon-outline.location_position-marker:before {\n    content: \"\\e882\";\n}\n.nc-icon-outline.location_position-pin:before {\n    content: \"\\e883\";\n}\n.nc-icon-outline.location_position-user:before {\n    content: \"\\e884\";\n}\n.nc-icon-outline.location_radar:before {\n    content: \"\\e885\";\n}\n.nc-icon-outline.location_road:before {\n    content: \"\\e886\";\n}\n.nc-icon-outline.location_route-alert:before {\n    content: \"\\e887\";\n}\n.nc-icon-outline.location_route-close:before {\n    content: \"\\e888\";\n}\n.nc-icon-outline.location_route-open:before {\n    content: \"\\e889\";\n}\n.nc-icon-outline.location_square-marker:before {\n    content: \"\\e88a\";\n}\n.nc-icon-outline.location_square-pin:before {\n    content: \"\\e88b\";\n}\n.nc-icon-outline.location_treasure-map-21:before {\n    content: \"\\e88c\";\n}\n.nc-icon-outline.location_treasure-map-40:before {\n    content: \"\\e88d\";\n}\n.nc-icon-outline.location_worl-marker:before {\n    content: \"\\e88e\";\n}\n.nc-icon-outline.location_world-pin:before {\n    content: \"\\e88f\";\n}\n.nc-icon-outline.location_world:before {\n    content: \"\\e890\";\n}\n.nc-icon-outline.health_ambulance:before {\n    content: \"\\e891\";\n}\n.nc-icon-outline.health_apple:before {\n    content: \"\\e892\";\n}\n.nc-icon-outline.health_bag-49:before {\n    content: \"\\e893\";\n}\n.nc-icon-outline.health_bag-50:before {\n    content: \"\\e894\";\n}\n.nc-icon-outline.health_brain:before {\n    content: \"\\e895\";\n}\n.nc-icon-outline.health_dna-27:before {\n    content: \"\\e896\";\n}\n.nc-icon-outline.health_dna-38:before {\n    content: \"\\e897\";\n}\n.nc-icon-outline.health_doctor:before {\n    content: \"\\e898\";\n}\n.nc-icon-outline.health_flask:before {\n    content: \"\\e899\";\n}\n.nc-icon-outline.health_heartbeat-16:before {\n    content: \"\\e89a\";\n}\n.nc-icon-outline.health_height:before {\n    content: \"\\e89b\";\n}\n.nc-icon-outline.health_hospital-32:before {\n    content: \"\\e89c\";\n}\n.nc-icon-outline.health_hospital-33:before {\n    content: \"\\e89d\";\n}\n.nc-icon-outline.health_hospital-34:before {\n    content: \"\\e89e\";\n}\n.nc-icon-outline.health_humidity-26:before {\n    content: \"\\e89f\";\n}\n.nc-icon-outline.health_humidity-52:before {\n    content: \"\\e8a0\";\n}\n.nc-icon-outline.health_intestine:before {\n    content: \"\\e8a1\";\n}\n.nc-icon-outline.health_lungs:before {\n    content: \"\\e8a2\";\n}\n.nc-icon-outline.health_molecule-39:before {\n    content: \"\\e8a3\";\n}\n.nc-icon-outline.health_molecule-40:before {\n    content: \"\\e8a4\";\n}\n.nc-icon-outline.health_notebook:before {\n    content: \"\\e8a5\";\n}\n.nc-icon-outline.health_nurse:before {\n    content: \"\\e8a6\";\n}\n.nc-icon-outline.health_patch-46:before {\n    content: \"\\e8a7\";\n}\n.nc-icon-outline.health_pill-42:before {\n    content: \"\\e8a8\";\n}\n.nc-icon-outline.health_pill-43:before {\n    content: \"\\e8a9\";\n}\n.nc-icon-outline.health_pill-container-44:before {\n    content: \"\\e8aa\";\n}\n.nc-icon-outline.health_pill-container-47:before {\n    content: \"\\e8ab\";\n}\n.nc-icon-outline.health_pulse-chart:before {\n    content: \"\\e8ac\";\n}\n.nc-icon-outline.health_pulse-phone:before {\n    content: \"\\e8ad\";\n}\n.nc-icon-outline.health_pulse-sleep:before {\n    content: \"\\e8ae\";\n}\n.nc-icon-outline.health_pulse-watch:before {\n    content: \"\\e8af\";\n}\n.nc-icon-outline.health_pulse:before {\n    content: \"\\e8b0\";\n}\n.nc-icon-outline.health_sleep:before {\n    content: \"\\e8b1\";\n}\n.nc-icon-outline.health_steps:before {\n    content: \"\\e8b2\";\n}\n.nc-icon-outline.health_syringe:before {\n    content: \"\\e8b3\";\n}\n.nc-icon-outline.health_temperature-23:before {\n    content: \"\\e8b4\";\n}\n.nc-icon-outline.health_temperature-24:before {\n    content: \"\\e8b5\";\n}\n.nc-icon-outline.health_tooth:before {\n    content: \"\\e8b6\";\n}\n.nc-icon-outline.health_weed:before {\n    content: \"\\e8b7\";\n}\n.nc-icon-outline.health_weight:before {\n    content: \"\\e8b8\";\n}\n.nc-icon-outline.health_wheelchair:before {\n    content: \"\\e8b9\";\n}\n.nc-icon-outline.health_woman:before {\n    content: \"\\e8ba\";\n}\n.nc-icon-outline.furniture_air-conditioner:before {\n    content: \"\\e8bb\";\n}\n.nc-icon-outline.furniture_armchair:before {\n    content: \"\\e8bc\";\n}\n.nc-icon-outline.furniture_bath-tub:before {\n    content: \"\\e8bd\";\n}\n.nc-icon-outline.furniture_bed-09:before {\n    content: \"\\e8be\";\n}\n.nc-icon-outline.furniture_bed-23:before {\n    content: \"\\e8bf\";\n}\n.nc-icon-outline.furniture_bed-side:before {\n    content: \"\\e8c0\";\n}\n.nc-icon-outline.furniture_cabinet:before {\n    content: \"\\e8c1\";\n}\n.nc-icon-outline.furniture_cactus:before {\n    content: \"\\e8c2\";\n}\n.nc-icon-outline.furniture_chair:before {\n    content: \"\\e8c3\";\n}\n.nc-icon-outline.furniture_coat-hanger:before {\n    content: \"\\e8c4\";\n}\n.nc-icon-outline.furniture_coffee:before {\n    content: \"\\e8c5\";\n}\n.nc-icon-outline.furniture_cradle:before {\n    content: \"\\e8c6\";\n}\n.nc-icon-outline.furniture_curtain:before {\n    content: \"\\e8c7\";\n}\n.nc-icon-outline.furniture_desk-drawer:before {\n    content: \"\\e8c8\";\n}\n.nc-icon-outline.furniture_desk:before {\n    content: \"\\e8c9\";\n}\n.nc-icon-outline.furniture_door:before {\n    content: \"\\e8ca\";\n}\n.nc-icon-outline.furniture_drawer:before {\n    content: \"\\e8cb\";\n}\n.nc-icon-outline.furniture_fridge:before {\n    content: \"\\e8cc\";\n}\n.nc-icon-outline.furniture_hanger-clothes:before {\n    content: \"\\e8cd\";\n}\n.nc-icon-outline.furniture_hanger:before {\n    content: \"\\e8ce\";\n}\n.nc-icon-outline.furniture_heater:before {\n    content: \"\\e8cf\";\n}\n.nc-icon-outline.furniture_iron:before {\n    content: \"\\e8d0\";\n}\n.nc-icon-outline.furniture_lamp-floor:before {\n    content: \"\\e8d1\";\n}\n.nc-icon-outline.furniture_lamp:before {\n    content: \"\\e8d2\";\n}\n.nc-icon-outline.furniture_library:before {\n    content: \"\\e8d3\";\n}\n.nc-icon-outline.furniture_light:before {\n    content: \"\\e8d4\";\n}\n.nc-icon-outline.furniture_mixer:before {\n    content: \"\\e8d5\";\n}\n.nc-icon-outline.furniture_oven:before {\n    content: \"\\e8d6\";\n}\n.nc-icon-outline.furniture_shower:before {\n    content: \"\\e8d7\";\n}\n.nc-icon-outline.furniture_sink-wash:before {\n    content: \"\\e8d8\";\n}\n.nc-icon-outline.furniture_sink:before {\n    content: \"\\e8d9\";\n}\n.nc-icon-outline.furniture_sofa:before {\n    content: \"\\e8da\";\n}\n.nc-icon-outline.furniture_storage-hanger:before {\n    content: \"\\e8db\";\n}\n.nc-icon-outline.furniture_storage:before {\n    content: \"\\e8dc\";\n}\n.nc-icon-outline.furniture_table:before {\n    content: \"\\e8dd\";\n}\n.nc-icon-outline.furniture_toilet-paper:before {\n    content: \"\\e8de\";\n}\n.nc-icon-outline.furniture_toilet:before {\n    content: \"\\e8df\";\n}\n.nc-icon-outline.furniture_tv:before {\n    content: \"\\e8e0\";\n}\n.nc-icon-outline.furniture_wardrobe:before {\n    content: \"\\e8e1\";\n}\n.nc-icon-outline.furniture_wash:before {\n    content: \"\\e8e2\";\n}\n.nc-icon-outline.files_add:before {\n    content: \"\\e8e3\";\n}\n.nc-icon-outline.files_archive-3d-check:before {\n    content: \"\\e8e4\";\n}\n.nc-icon-outline.files_archive-3d-content:before {\n    content: \"\\e8e5\";\n}\n.nc-icon-outline.files_archive-check:before {\n    content: \"\\e8e6\";\n}\n.nc-icon-outline.files_archive-content:before {\n    content: \"\\e8e7\";\n}\n.nc-icon-outline.files_archive-paper-check:before {\n    content: \"\\e8e8\";\n}\n.nc-icon-outline.files_archive-paper:before {\n    content: \"\\e8e9\";\n}\n.nc-icon-outline.files_archive:before {\n    content: \"\\e8ea\";\n}\n.nc-icon-outline.files_audio:before {\n    content: \"\\e8eb\";\n}\n.nc-icon-outline.files_book-07:before {\n    content: \"\\e8ec\";\n}\n.nc-icon-outline.files_book-08:before {\n    content: \"\\e8ed\";\n}\n.nc-icon-outline.files_bookmark:before {\n    content: \"\\e8ee\";\n}\n.nc-icon-outline.files_box:before {\n    content: \"\\e8ef\";\n}\n.nc-icon-outline.files_chart-bar:before {\n    content: \"\\e8f0\";\n}\n.nc-icon-outline.files_chart-pie:before {\n    content: \"\\e8f1\";\n}\n.nc-icon-outline.files_check:before {\n    content: \"\\e8f2\";\n}\n.nc-icon-outline.files_cloud:before {\n    content: \"\\e8f3\";\n}\n.nc-icon-outline.files_copy:before {\n    content: \"\\e8f4\";\n}\n.nc-icon-outline.files_dev:before {\n    content: \"\\e8f5\";\n}\n.nc-icon-outline.files_download:before {\n    content: \"\\e8f6\";\n}\n.nc-icon-outline.files_drawer:before {\n    content: \"\\e8f7\";\n}\n.nc-icon-outline.files_edit:before {\n    content: \"\\e8f8\";\n}\n.nc-icon-outline.files_exclamation:before {\n    content: \"\\e8f9\";\n}\n.nc-icon-outline.files_folder-13:before {\n    content: \"\\e8fa\";\n}\n.nc-icon-outline.files_folder-14:before {\n    content: \"\\e8fb\";\n}\n.nc-icon-outline.files_folder-15:before {\n    content: \"\\e8fc\";\n}\n.nc-icon-outline.files_folder-16:before {\n    content: \"\\e8fd\";\n}\n.nc-icon-outline.files_folder-17:before {\n    content: \"\\e8fe\";\n}\n.nc-icon-outline.files_folder-18:before {\n    content: \"\\e8ff\";\n}\n.nc-icon-outline.files_folder-19:before {\n    content: \"\\e900\";\n}\n.nc-icon-outline.files_folder-add:before {\n    content: \"\\e901\";\n}\n.nc-icon-outline.files_folder-audio:before {\n    content: \"\\e902\";\n}\n.nc-icon-outline.files_folder-bookmark:before {\n    content: \"\\e903\";\n}\n.nc-icon-outline.files_folder-chart-bar:before {\n    content: \"\\e904\";\n}\n.nc-icon-outline.files_folder-chart-pie:before {\n    content: \"\\e905\";\n}\n.nc-icon-outline.files_folder-check:before {\n    content: \"\\e906\";\n}\n.nc-icon-outline.files_folder-cloud:before {\n    content: \"\\e907\";\n}\n.nc-icon-outline.files_folder-dev:before {\n    content: \"\\e908\";\n}\n.nc-icon-outline.files_folder-download:before {\n    content: \"\\e909\";\n}\n.nc-icon-outline.files_folder-edit:before {\n    content: \"\\e90a\";\n}\n.nc-icon-outline.files_folder-exclamation:before {\n    content: \"\\e90b\";\n}\n.nc-icon-outline.files_folder-gallery:before {\n    content: \"\\e90c\";\n}\n.nc-icon-outline.files_folder-heart:before {\n    content: \"\\e90d\";\n}\n.nc-icon-outline.files_folder-image:before {\n    content: \"\\e90e\";\n}\n.nc-icon-outline.files_folder-info:before {\n    content: \"\\e90f\";\n}\n.nc-icon-outline.files_folder-link:before {\n    content: \"\\e910\";\n}\n.nc-icon-outline.files_folder-locked:before {\n    content: \"\\e911\";\n}\n.nc-icon-outline.files_folder-money:before {\n    content: \"\\e912\";\n}\n.nc-icon-outline.files_folder-music:before {\n    content: \"\\e913\";\n}\n.nc-icon-outline.files_folder-no-access:before {\n    content: \"\\e914\";\n}\n.nc-icon-outline.files_folder-play:before {\n    content: \"\\e915\";\n}\n.nc-icon-outline.files_folder-question:before {\n    content: \"\\e916\";\n}\n.nc-icon-outline.files_folder-refresh:before {\n    content: \"\\e917\";\n}\n.nc-icon-outline.files_folder-remove:before {\n    content: \"\\e918\";\n}\n.nc-icon-outline.files_folder-search:before {\n    content: \"\\e919\";\n}\n.nc-icon-outline.files_folder-settings-81:before {\n    content: \"\\e91a\";\n}\n.nc-icon-outline.files_folder-settings-97:before {\n    content: \"\\e91b\";\n}\n.nc-icon-outline.files_folder-shared:before {\n    content: \"\\e91c\";\n}\n.nc-icon-outline.files_folder-star:before {\n    content: \"\\e91d\";\n}\n.nc-icon-outline.files_folder-time:before {\n    content: \"\\e91e\";\n}\n.nc-icon-outline.files_folder-upload:before {\n    content: \"\\e91f\";\n}\n.nc-icon-outline.files_folder-user:before {\n    content: \"\\e920\";\n}\n.nc-icon-outline.files_folder-vector:before {\n    content: \"\\e921\";\n}\n.nc-icon-outline.files_gallery:before {\n    content: \"\\e922\";\n}\n.nc-icon-outline.files_heart:before {\n    content: \"\\e923\";\n}\n.nc-icon-outline.files_image:before {\n    content: \"\\e924\";\n}\n.nc-icon-outline.files_info:before {\n    content: \"\\e925\";\n}\n.nc-icon-outline.files_link:before {\n    content: \"\\e926\";\n}\n.nc-icon-outline.files_locked:before {\n    content: \"\\e927\";\n}\n.nc-icon-outline.files_money:before {\n    content: \"\\e928\";\n}\n.nc-icon-outline.files_music:before {\n    content: \"\\e929\";\n}\n.nc-icon-outline.files_no-access:before {\n    content: \"\\e92a\";\n}\n.nc-icon-outline.files_notebook:before {\n    content: \"\\e92b\";\n}\n.nc-icon-outline.files_paper:before {\n    content: \"\\e92c\";\n}\n.nc-icon-outline.files_play:before {\n    content: \"\\e92d\";\n}\n.nc-icon-outline.files_question:before {\n    content: \"\\e92e\";\n}\n.nc-icon-outline.files_refresh:before {\n    content: \"\\e92f\";\n}\n.nc-icon-outline.files_remove:before {\n    content: \"\\e930\";\n}\n.nc-icon-outline.files_replace-folder:before {\n    content: \"\\e931\";\n}\n.nc-icon-outline.files_replace:before {\n    content: \"\\e932\";\n}\n.nc-icon-outline.files_search:before {\n    content: \"\\e933\";\n}\n.nc-icon-outline.files_settings-46:before {\n    content: \"\\e934\";\n}\n.nc-icon-outline.files_settings-99:before {\n    content: \"\\e935\";\n}\n.nc-icon-outline.files_shared:before {\n    content: \"\\e936\";\n}\n.nc-icon-outline.files_single-content-02:before {\n    content: \"\\e937\";\n}\n.nc-icon-outline.files_single-content-03:before {\n    content: \"\\e938\";\n}\n.nc-icon-outline.files_single-copies:before {\n    content: \"\\e939\";\n}\n.nc-icon-outline.files_single-copy-04:before {\n    content: \"\\e93a\";\n}\n.nc-icon-outline.files_single-copy-06:before {\n    content: \"\\e93b\";\n}\n.nc-icon-outline.files_single-folded-content:before {\n    content: \"\\e93c\";\n}\n.nc-icon-outline.files_single-folded:before {\n    content: \"\\e93d\";\n}\n.nc-icon-outline.files_single-paragraph:before {\n    content: \"\\e93e\";\n}\n.nc-icon-outline.files_single:before {\n    content: \"\\e93f\";\n}\n.nc-icon-outline.files_star:before {\n    content: \"\\e940\";\n}\n.nc-icon-outline.files_time:before {\n    content: \"\\e941\";\n}\n.nc-icon-outline.files_upload:before {\n    content: \"\\e942\";\n}\n.nc-icon-outline.files_user:before {\n    content: \"\\e943\";\n}\n.nc-icon-outline.files_vector:before {\n    content: \"\\e944\";\n}\n.nc-icon-outline.files_zip-54:before {\n    content: \"\\e945\";\n}\n.nc-icon-outline.files_zip-55:before {\n    content: \"\\e946\";\n}\n.nc-icon-outline.design_album:before {\n    content: \"\\e947\";\n}\n.nc-icon-outline.design_align-bottom:before {\n    content: \"\\e948\";\n}\n.nc-icon-outline.design_align-center-horizontal:before {\n    content: \"\\e949\";\n}\n.nc-icon-outline.design_align-center-vertical:before {\n    content: \"\\e94a\";\n}\n.nc-icon-outline.design_align-left:before {\n    content: \"\\e94b\";\n}\n.nc-icon-outline.design_align-right:before {\n    content: \"\\e94c\";\n}\n.nc-icon-outline.design_align-top:before {\n    content: \"\\e94d\";\n}\n.nc-icon-outline.design_app:before {\n    content: \"\\e94e\";\n}\n.nc-icon-outline.design_artboard:before {\n    content: \"\\e94f\";\n}\n.nc-icon-outline.design_blend:before {\n    content: \"\\e950\";\n}\n.nc-icon-outline.design_book-bookmark:before {\n    content: \"\\e951\";\n}\n.nc-icon-outline.design_book-open:before {\n    content: \"\\e952\";\n}\n.nc-icon-outline.design_brush:before {\n    content: \"\\e953\";\n}\n.nc-icon-outline.design_bug:before {\n    content: \"\\e954\";\n}\n.nc-icon-outline.design_bullet-list-67:before {\n    content: \"\\e955\";\n}\n.nc-icon-outline.design_bullet-list-68:before {\n    content: \"\\e956\";\n}\n.nc-icon-outline.design_bullet-list-69:before {\n    content: \"\\e957\";\n}\n.nc-icon-outline.design_bullet-list-70:before {\n    content: \"\\e958\";\n}\n.nc-icon-outline.design_clone:before {\n    content: \"\\e959\";\n}\n.nc-icon-outline.design_code-editor:before {\n    content: \"\\e95a\";\n}\n.nc-icon-outline.design_code:before {\n    content: \"\\e95b\";\n}\n.nc-icon-outline.design_collection:before {\n    content: \"\\e95c\";\n}\n.nc-icon-outline.design_command:before {\n    content: \"\\e95d\";\n}\n.nc-icon-outline.design_compass:before {\n    content: \"\\e95e\";\n}\n.nc-icon-outline.design_contrast:before {\n    content: \"\\e95f\";\n}\n.nc-icon-outline.design_copy:before {\n    content: \"\\e960\";\n}\n.nc-icon-outline.design_crop:before {\n    content: \"\\e961\";\n}\n.nc-icon-outline.design_cursor-48:before {\n    content: \"\\e962\";\n}\n.nc-icon-outline.design_cursor-49:before {\n    content: \"\\e963\";\n}\n.nc-icon-outline.design_design-dev:before {\n    content: \"\\e964\";\n}\n.nc-icon-outline.design_design-responsive:before {\n    content: \"\\e965\";\n}\n.nc-icon-outline.design_design:before {\n    content: \"\\e966\";\n}\n.nc-icon-outline.design_distribute-horizontal:before {\n    content: \"\\e967\";\n}\n.nc-icon-outline.design_distribute-vertical:before {\n    content: \"\\e968\";\n}\n.nc-icon-outline.design_drag:before {\n    content: \"\\e969\";\n}\n.nc-icon-outline.design_eraser-32:before {\n    content: \"\\e96a\";\n}\n.nc-icon-outline.design_eraser-33:before {\n    content: \"\\e96b\";\n}\n.nc-icon-outline.design_eraser-46:before {\n    content: \"\\e96c\";\n}\n.nc-icon-outline.design_flip-horizontal:before {\n    content: \"\\e96d\";\n}\n.nc-icon-outline.design_flip-vertical:before {\n    content: \"\\e96e\";\n}\n.nc-icon-outline.design_image:before {\n    content: \"\\e96f\";\n}\n.nc-icon-outline.design_magnet:before {\n    content: \"\\e970\";\n}\n.nc-icon-outline.design_marker:before {\n    content: \"\\e971\";\n}\n.nc-icon-outline.design_measure-02:before {\n    content: \"\\e972\";\n}\n.nc-icon-outline.design_measure-17:before {\n    content: \"\\e973\";\n}\n.nc-icon-outline.design_measure-big:before {\n    content: \"\\e974\";\n}\n.nc-icon-outline.design_mobile-design:before {\n    content: \"\\e975\";\n}\n.nc-icon-outline.design_mobile-dev:before {\n    content: \"\\e976\";\n}\n.nc-icon-outline.design_mouse-08:before {\n    content: \"\\e977\";\n}\n.nc-icon-outline.design_mouse-09:before {\n    content: \"\\e978\";\n}\n.nc-icon-outline.design_mouse-10:before {\n    content: \"\\e979\";\n}\n.nc-icon-outline.design_newsletter-dev:before {\n    content: \"\\e97a\";\n}\n.nc-icon-outline.design_note-code:before {\n    content: \"\\e97b\";\n}\n.nc-icon-outline.design_paint-16:before {\n    content: \"\\e97c\";\n}\n.nc-icon-outline.design_paint-37:before {\n    content: \"\\e97d\";\n}\n.nc-icon-outline.design_paint-38:before {\n    content: \"\\e97e\";\n}\n.nc-icon-outline.design_paint-bucket-39:before {\n    content: \"\\e97f\";\n}\n.nc-icon-outline.design_paint-bucket-40:before {\n    content: \"\\e980\";\n}\n.nc-icon-outline.design_palette:before {\n    content: \"\\e981\";\n}\n.nc-icon-outline.design_pantone:before {\n    content: \"\\e982\";\n}\n.nc-icon-outline.design_paper-design:before {\n    content: \"\\e983\";\n}\n.nc-icon-outline.design_paper-dev:before {\n    content: \"\\e984\";\n}\n.nc-icon-outline.design_patch-19:before {\n    content: \"\\e985\";\n}\n.nc-icon-outline.design_patch-34:before {\n    content: \"\\e986\";\n}\n.nc-icon-outline.design_path-exclude:before {\n    content: \"\\e987\";\n}\n.nc-icon-outline.design_path-intersect:before {\n    content: \"\\e988\";\n}\n.nc-icon-outline.design_path-minus:before {\n    content: \"\\e989\";\n}\n.nc-icon-outline.design_path-unite:before {\n    content: \"\\e98a\";\n}\n.nc-icon-outline.design_pen-01:before {\n    content: \"\\e98b\";\n}\n.nc-icon-outline.design_pen-23:before {\n    content: \"\\e98c\";\n}\n.nc-icon-outline.design_pen-tool:before {\n    content: \"\\e98d\";\n}\n.nc-icon-outline.design_phone:before {\n    content: \"\\e98e\";\n}\n.nc-icon-outline.design_photo-editor:before {\n    content: \"\\e98f\";\n}\n.nc-icon-outline.design_scissors-dashed:before {\n    content: \"\\e990\";\n}\n.nc-icon-outline.design_scissors:before {\n    content: \"\\e991\";\n}\n.nc-icon-outline.design_shape-adjust:before {\n    content: \"\\e992\";\n}\n.nc-icon-outline.design_shape-circle:before {\n    content: \"\\e993\";\n}\n.nc-icon-outline.design_shape-polygon:before {\n    content: \"\\e994\";\n}\n.nc-icon-outline.design_shape-square:before {\n    content: \"\\e995\";\n}\n.nc-icon-outline.design_shape-triangle:before {\n    content: \"\\e996\";\n}\n.nc-icon-outline.design_shapes:before {\n    content: \"\\e997\";\n}\n.nc-icon-outline.design_sharpener:before {\n    content: \"\\e998\";\n}\n.nc-icon-outline.design_slice:before {\n    content: \"\\e999\";\n}\n.nc-icon-outline.design_spray:before {\n    content: \"\\e99a\";\n}\n.nc-icon-outline.design_stamp:before {\n    content: \"\\e99b\";\n}\n.nc-icon-outline.design_tablet-mobile:before {\n    content: \"\\e99c\";\n}\n.nc-icon-outline.design_tablet:before {\n    content: \"\\e99d\";\n}\n.nc-icon-outline.design_text:before {\n    content: \"\\e99e\";\n}\n.nc-icon-outline.design_todo:before {\n    content: \"\\e99f\";\n}\n.nc-icon-outline.design_usb:before {\n    content: \"\\e9a0\";\n}\n.nc-icon-outline.design_vector:before {\n    content: \"\\e9a1\";\n}\n.nc-icon-outline.design_wand-11:before {\n    content: \"\\e9a2\";\n}\n.nc-icon-outline.design_wand-99:before {\n    content: \"\\e9a3\";\n}\n.nc-icon-outline.design_watch-dev:before {\n    content: \"\\e9a4\";\n}\n.nc-icon-outline.design_web-design:before {\n    content: \"\\e9a5\";\n}\n.nc-icon-outline.design_webpage:before {\n    content: \"\\e9a6\";\n}\n.nc-icon-outline.design_window-code:before {\n    content: \"\\e9a7\";\n}\n.nc-icon-outline.design_window-dev:before {\n    content: \"\\e9a8\";\n}\n.nc-icon-outline.design_window-paragraph:before {\n    content: \"\\e9a9\";\n}\n.nc-icon-outline.design_window-responsive:before {\n    content: \"\\e9aa\";\n}\n.nc-icon-outline.clothes_baby:before {\n    content: \"\\e9ab\";\n}\n.nc-icon-outline.clothes_backpack:before {\n    content: \"\\e9ac\";\n}\n.nc-icon-outline.clothes_bag-21:before {\n    content: \"\\e9ad\";\n}\n.nc-icon-outline.clothes_bag-22:before {\n    content: \"\\e9ae\";\n}\n.nc-icon-outline.clothes_belt:before {\n    content: \"\\e9af\";\n}\n.nc-icon-outline.clothes_boot-woman:before {\n    content: \"\\e9b0\";\n}\n.nc-icon-outline.clothes_boot:before {\n    content: \"\\e9b1\";\n}\n.nc-icon-outline.clothes_bra:before {\n    content: \"\\e9b2\";\n}\n.nc-icon-outline.clothes_button:before {\n    content: \"\\e9b3\";\n}\n.nc-icon-outline.clothes_cap:before {\n    content: \"\\e9b4\";\n}\n.nc-icon-outline.clothes_coat:before {\n    content: \"\\e9b5\";\n}\n.nc-icon-outline.clothes_corset:before {\n    content: \"\\e9b6\";\n}\n.nc-icon-outline.clothes_dress-man:before {\n    content: \"\\e9b7\";\n}\n.nc-icon-outline.clothes_dress-woman:before {\n    content: \"\\e9b8\";\n}\n.nc-icon-outline.clothes_flip:before {\n    content: \"\\e9b9\";\n}\n.nc-icon-outline.clothes_glasses:before {\n    content: \"\\e9ba\";\n}\n.nc-icon-outline.clothes_gloves:before {\n    content: \"\\e9bb\";\n}\n.nc-icon-outline.clothes_hat-top:before {\n    content: \"\\e9bc\";\n}\n.nc-icon-outline.clothes_hat:before {\n    content: \"\\e9bd\";\n}\n.nc-icon-outline.clothes_hoodie:before {\n    content: \"\\e9be\";\n}\n.nc-icon-outline.clothes_iron-dont:before {\n    content: \"\\e9bf\";\n}\n.nc-icon-outline.clothes_iron:before {\n    content: \"\\e9c0\";\n}\n.nc-icon-outline.clothes_jeans-41:before {\n    content: \"\\e9c1\";\n}\n.nc-icon-outline.clothes_jeans-43:before {\n    content: \"\\e9c2\";\n}\n.nc-icon-outline.clothes_jeans-pocket:before {\n    content: \"\\e9c3\";\n}\n.nc-icon-outline.clothes_kitchen:before {\n    content: \"\\e9c4\";\n}\n.nc-icon-outline.clothes_long-sleeve:before {\n    content: \"\\e9c5\";\n}\n.nc-icon-outline.clothes_makeup:before {\n    content: \"\\e9c6\";\n}\n.nc-icon-outline.clothes_needle:before {\n    content: \"\\e9c7\";\n}\n.nc-icon-outline.clothes_pajamas:before {\n    content: \"\\e9c8\";\n}\n.nc-icon-outline.clothes_ring:before {\n    content: \"\\e9c9\";\n}\n.nc-icon-outline.clothes_scarf:before {\n    content: \"\\e9ca\";\n}\n.nc-icon-outline.clothes_shirt-business:before {\n    content: \"\\e9cb\";\n}\n.nc-icon-outline.clothes_shirt-buttons:before {\n    content: \"\\e9cc\";\n}\n.nc-icon-outline.clothes_shirt-neck:before {\n    content: \"\\e9cd\";\n}\n.nc-icon-outline.clothes_shirt:before {\n    content: \"\\e9ce\";\n}\n.nc-icon-outline.clothes_shoe-man:before {\n    content: \"\\e9cf\";\n}\n.nc-icon-outline.clothes_shoe-sport:before {\n    content: \"\\e9d0\";\n}\n.nc-icon-outline.clothes_shoe-woman:before {\n    content: \"\\e9d1\";\n}\n.nc-icon-outline.clothes_skirt:before {\n    content: \"\\e9d2\";\n}\n.nc-icon-outline.clothes_slacks-12:before {\n    content: \"\\e9d3\";\n}\n.nc-icon-outline.clothes_slacks-13:before {\n    content: \"\\e9d4\";\n}\n.nc-icon-outline.clothes_sock:before {\n    content: \"\\e9d5\";\n}\n.nc-icon-outline.clothes_tie-bow:before {\n    content: \"\\e9d6\";\n}\n.nc-icon-outline.clothes_tshirt-53:before {\n    content: \"\\e9d7\";\n}\n.nc-icon-outline.clothes_tshirt-54:before {\n    content: \"\\e9d8\";\n}\n.nc-icon-outline.clothes_tshirt-sport:before {\n    content: \"\\e9d9\";\n}\n.nc-icon-outline.clothes_underwear-man:before {\n    content: \"\\e9da\";\n}\n.nc-icon-outline.clothes_underwear:before {\n    content: \"\\e9db\";\n}\n.nc-icon-outline.clothes_vest-sport:before {\n    content: \"\\e9dc\";\n}\n.nc-icon-outline.clothes_vest:before {\n    content: \"\\e9dd\";\n}\n.nc-icon-outline.clothes_wash-30:before {\n    content: \"\\e9de\";\n}\n.nc-icon-outline.clothes_wash-60:before {\n    content: \"\\e9df\";\n}\n.nc-icon-outline.clothes_wash-90:before {\n    content: \"\\e9e0\";\n}\n.nc-icon-outline.clothes_wash-hand:before {\n    content: \"\\e9e1\";\n}\n.nc-icon-outline.clothes_wash:before {\n    content: \"\\e9e2\";\n}\n.nc-icon-outline.business_agenda:before {\n    content: \"\\e9e3\";\n}\n.nc-icon-outline.business_atm:before {\n    content: \"\\e9e4\";\n}\n.nc-icon-outline.business_award-48:before {\n    content: \"\\e9e5\";\n}\n.nc-icon-outline.business_award-49:before {\n    content: \"\\e9e6\";\n}\n.nc-icon-outline.business_award-74:before {\n    content: \"\\e9e7\";\n}\n.nc-icon-outline.business_badge:before {\n    content: \"\\e9e8\";\n}\n.nc-icon-outline.business_bank:before {\n    content: \"\\e9e9\";\n}\n.nc-icon-outline.business_board-27:before {\n    content: \"\\e9ea\";\n}\n.nc-icon-outline.business_board-28:before {\n    content: \"\\e9eb\";\n}\n.nc-icon-outline.business_board-29:before {\n    content: \"\\e9ec\";\n}\n.nc-icon-outline.business_board-30:before {\n    content: \"\\e9ed\";\n}\n.nc-icon-outline.business_books:before {\n    content: \"\\e9ee\";\n}\n.nc-icon-outline.business_briefcase-24:before {\n    content: \"\\e9ef\";\n}\n.nc-icon-outline.business_briefcase-25:before {\n    content: \"\\e9f0\";\n}\n.nc-icon-outline.business_briefcase-26:before {\n    content: \"\\e9f1\";\n}\n.nc-icon-outline.business_building:before {\n    content: \"\\e9f2\";\n}\n.nc-icon-outline.business_bulb-61:before {\n    content: \"\\e9f3\";\n}\n.nc-icon-outline.business_bulb-62:before {\n    content: \"\\e9f4\";\n}\n.nc-icon-outline.business_bulb-63:before {\n    content: \"\\e9f5\";\n}\n.nc-icon-outline.business_business-contact-85:before {\n    content: \"\\e9f6\";\n}\n.nc-icon-outline.business_business-contact-86:before {\n    content: \"\\e9f7\";\n}\n.nc-icon-outline.business_business-contact-87:before {\n    content: \"\\e9f8\";\n}\n.nc-icon-outline.business_business-contact-88:before {\n    content: \"\\e9f9\";\n}\n.nc-icon-outline.business_business-contact-89:before {\n    content: \"\\e9fa\";\n}\n.nc-icon-outline.business_businessman-03:before {\n    content: \"\\e9fb\";\n}\n.nc-icon-outline.business_businessman-04:before {\n    content: \"\\e9fc\";\n}\n.nc-icon-outline.business_calculator:before {\n    content: \"\\e9fd\";\n}\n.nc-icon-outline.business_chair:before {\n    content: \"\\e9fe\";\n}\n.nc-icon-outline.business_chart-bar-32:before {\n    content: \"\\e9ff\";\n}\n.nc-icon-outline.business_chart-bar-33:before {\n    content: \"\\ea00\";\n}\n.nc-icon-outline.business_chart-growth:before {\n    content: \"\\ea01\";\n}\n.nc-icon-outline.business_chart-pie-35:before {\n    content: \"\\ea02\";\n}\n.nc-icon-outline.business_chart-pie-36:before {\n    content: \"\\ea03\";\n}\n.nc-icon-outline.business_chart:before {\n    content: \"\\ea04\";\n}\n.nc-icon-outline.business_cheque:before {\n    content: \"\\ea05\";\n}\n.nc-icon-outline.business_coins:before {\n    content: \"\\ea06\";\n}\n.nc-icon-outline.business_connect:before {\n    content: \"\\ea07\";\n}\n.nc-icon-outline.business_contacts:before {\n    content: \"\\ea08\";\n}\n.nc-icon-outline.business_currency-dollar:before {\n    content: \"\\ea09\";\n}\n.nc-icon-outline.business_currency-euro:before {\n    content: \"\\ea0a\";\n}\n.nc-icon-outline.business_currency-pound:before {\n    content: \"\\ea0b\";\n}\n.nc-icon-outline.business_currency-yen:before {\n    content: \"\\ea0c\";\n}\n.nc-icon-outline.business_factory:before {\n    content: \"\\ea0d\";\n}\n.nc-icon-outline.business_globe:before {\n    content: \"\\ea0e\";\n}\n.nc-icon-outline.business_goal-64:before {\n    content: \"\\ea0f\";\n}\n.nc-icon-outline.business_goal-65:before {\n    content: \"\\ea10\";\n}\n.nc-icon-outline.business_gold:before {\n    content: \"\\ea11\";\n}\n.nc-icon-outline.business_hammer:before {\n    content: \"\\ea12\";\n}\n.nc-icon-outline.business_handout:before {\n    content: \"\\ea13\";\n}\n.nc-icon-outline.business_handshake:before {\n    content: \"\\ea14\";\n}\n.nc-icon-outline.business_hat:before {\n    content: \"\\ea15\";\n}\n.nc-icon-outline.business_hierarchy-53:before {\n    content: \"\\ea16\";\n}\n.nc-icon-outline.business_hierarchy-54:before {\n    content: \"\\ea17\";\n}\n.nc-icon-outline.business_hierarchy-55:before {\n    content: \"\\ea18\";\n}\n.nc-icon-outline.business_hierarchy-56:before {\n    content: \"\\ea19\";\n}\n.nc-icon-outline.business_laptop-71:before {\n    content: \"\\ea1a\";\n}\n.nc-icon-outline.business_laptop-72:before {\n    content: \"\\ea1b\";\n}\n.nc-icon-outline.business_laptop-91:before {\n    content: \"\\ea1c\";\n}\n.nc-icon-outline.business_law:before {\n    content: \"\\ea1d\";\n}\n.nc-icon-outline.business_math:before {\n    content: \"\\ea1e\";\n}\n.nc-icon-outline.business_money-11:before {\n    content: \"\\ea1f\";\n}\n.nc-icon-outline.business_money-12:before {\n    content: \"\\ea20\";\n}\n.nc-icon-outline.business_money-13:before {\n    content: \"\\ea21\";\n}\n.nc-icon-outline.business_money-bag:before {\n    content: \"\\ea22\";\n}\n.nc-icon-outline.business_money-coins:before {\n    content: \"\\ea23\";\n}\n.nc-icon-outline.business_money-growth:before {\n    content: \"\\ea24\";\n}\n.nc-icon-outline.business_money-time:before {\n    content: \"\\ea25\";\n}\n.nc-icon-outline.business_net:before {\n    content: \"\\ea26\";\n}\n.nc-icon-outline.business_notes:before {\n    content: \"\\ea27\";\n}\n.nc-icon-outline.business_payment:before {\n    content: \"\\ea28\";\n}\n.nc-icon-outline.business_percentage-38:before {\n    content: \"\\ea29\";\n}\n.nc-icon-outline.business_percentage-39:before {\n    content: \"\\ea2a\";\n}\n.nc-icon-outline.business_pig:before {\n    content: \"\\ea2b\";\n}\n.nc-icon-outline.business_pin:before {\n    content: \"\\ea2c\";\n}\n.nc-icon-outline.business_plug:before {\n    content: \"\\ea2d\";\n}\n.nc-icon-outline.business_progress:before {\n    content: \"\\ea2e\";\n}\n.nc-icon-outline.business_round-dollar:before {\n    content: \"\\ea2f\";\n}\n.nc-icon-outline.business_round-euro:before {\n    content: \"\\ea30\";\n}\n.nc-icon-outline.business_round-pound:before {\n    content: \"\\ea31\";\n}\n.nc-icon-outline.business_round-yen:before {\n    content: \"\\ea32\";\n}\n.nc-icon-outline.business_safe:before {\n    content: \"\\ea33\";\n}\n.nc-icon-outline.business_scale:before {\n    content: \"\\ea34\";\n}\n.nc-icon-outline.business_sign:before {\n    content: \"\\ea35\";\n}\n.nc-icon-outline.business_signature:before {\n    content: \"\\ea36\";\n}\n.nc-icon-outline.business_stock:before {\n    content: \"\\ea37\";\n}\n.nc-icon-outline.business_strategy:before {\n    content: \"\\ea38\";\n}\n.nc-icon-outline.business_tie-01:before {\n    content: \"\\ea39\";\n}\n.nc-icon-outline.business_tie-02:before {\n    content: \"\\ea3a\";\n}\n.nc-icon-outline.business_wallet-43:before {\n    content: \"\\ea3b\";\n}\n.nc-icon-outline.business_wallet-44:before {\n    content: \"\\ea3c\";\n}\n.nc-icon-outline.business_wallet-90:before {\n    content: \"\\ea3d\";\n}\n.nc-icon-outline.arrows-1_back-78:before {\n    content: \"\\ea3e\";\n}\n.nc-icon-outline.arrows-1_back-80:before {\n    content: \"\\ea3f\";\n}\n.nc-icon-outline.arrows-1_bold-direction:before {\n    content: \"\\ea40\";\n}\n.nc-icon-outline.arrows-1_bold-down:before {\n    content: \"\\ea41\";\n}\n.nc-icon-outline.arrows-1_bold-left:before {\n    content: \"\\ea42\";\n}\n.nc-icon-outline.arrows-1_bold-right:before {\n    content: \"\\ea43\";\n}\n.nc-icon-outline.arrows-1_bold-up:before {\n    content: \"\\ea44\";\n}\n.nc-icon-outline.arrows-1_circle-down-12:before {\n    content: \"\\ea45\";\n}\n.nc-icon-outline.arrows-1_circle-down-40:before {\n    content: \"\\ea46\";\n}\n.nc-icon-outline.arrows-1_circle-left-10:before {\n    content: \"\\ea47\";\n}\n.nc-icon-outline.arrows-1_circle-left-38:before {\n    content: \"\\ea48\";\n}\n.nc-icon-outline.arrows-1_circle-right-09:before {\n    content: \"\\ea49\";\n}\n.nc-icon-outline.arrows-1_circle-right-37:before {\n    content: \"\\ea4a\";\n}\n.nc-icon-outline.arrows-1_circle-up-11:before {\n    content: \"\\ea4b\";\n}\n.nc-icon-outline.arrows-1_circle-up-39:before {\n    content: \"\\ea4c\";\n}\n.nc-icon-outline.arrows-1_cloud-download-93:before {\n    content: \"\\ea4d\";\n}\n.nc-icon-outline.arrows-1_cloud-download-95:before {\n    content: \"\\ea4e\";\n}\n.nc-icon-outline.arrows-1_cloud-upload-94:before {\n    content: \"\\ea4f\";\n}\n.nc-icon-outline.arrows-1_cloud-upload-96:before {\n    content: \"\\ea50\";\n}\n.nc-icon-outline.arrows-1_curved-next:before {\n    content: \"\\ea51\";\n}\n.nc-icon-outline.arrows-1_curved-previous:before {\n    content: \"\\ea52\";\n}\n.nc-icon-outline.arrows-1_direction-53:before {\n    content: \"\\ea53\";\n}\n.nc-icon-outline.arrows-1_direction-56:before {\n    content: \"\\ea54\";\n}\n.nc-icon-outline.arrows-1_double-left:before {\n    content: \"\\ea55\";\n}\n.nc-icon-outline.arrows-1_double-right:before {\n    content: \"\\ea56\";\n}\n.nc-icon-outline.arrows-1_download:before {\n    content: \"\\ea57\";\n}\n.nc-icon-outline.arrows-1_enlarge-diagonal-43:before {\n    content: \"\\ea58\";\n}\n.nc-icon-outline.arrows-1_enlarge-diagonal-44:before {\n    content: \"\\ea59\";\n}\n.nc-icon-outline.arrows-1_enlarge-horizontal:before {\n    content: \"\\ea5a\";\n}\n.nc-icon-outline.arrows-1_enlarge-vertical:before {\n    content: \"\\ea5b\";\n}\n.nc-icon-outline.arrows-1_fit-horizontal:before {\n    content: \"\\ea5c\";\n}\n.nc-icon-outline.arrows-1_fit-vertical:before {\n    content: \"\\ea5d\";\n}\n.nc-icon-outline.arrows-1_fullscreen-70:before {\n    content: \"\\ea5e\";\n}\n.nc-icon-outline.arrows-1_fullscreen-71:before {\n    content: \"\\ea5f\";\n}\n.nc-icon-outline.arrows-1_fullscreen-76:before {\n    content: \"\\ea60\";\n}\n.nc-icon-outline.arrows-1_fullscreen-77:before {\n    content: \"\\ea61\";\n}\n.nc-icon-outline.arrows-1_fullscreen-double-74:before {\n    content: \"\\ea62\";\n}\n.nc-icon-outline.arrows-1_fullscreen-double-75:before {\n    content: \"\\ea63\";\n}\n.nc-icon-outline.arrows-1_fullscreen-split-72:before {\n    content: \"\\ea64\";\n}\n.nc-icon-outline.arrows-1_fullscreen-split-73:before {\n    content: \"\\ea65\";\n}\n.nc-icon-outline.arrows-1_log-in:before {\n    content: \"\\ea66\";\n}\n.nc-icon-outline.arrows-1_log-out:before {\n    content: \"\\ea67\";\n}\n.nc-icon-outline.arrows-1_loop-82:before {\n    content: \"\\ea68\";\n}\n.nc-icon-outline.arrows-1_loop-83:before {\n    content: \"\\ea69\";\n}\n.nc-icon-outline.arrows-1_minimal-down:before {\n    content: \"\\ea6a\";\n}\n.nc-icon-outline.arrows-1_minimal-left:before {\n    content: \"\\ea6b\";\n}\n.nc-icon-outline.arrows-1_minimal-right:before {\n    content: \"\\ea6c\";\n}\n.nc-icon-outline.arrows-1_minimal-up:before {\n    content: \"\\ea6d\";\n}\n.nc-icon-outline.arrows-1_redo-79:before {\n    content: \"\\ea6e\";\n}\n.nc-icon-outline.arrows-1_redo-81:before {\n    content: \"\\ea6f\";\n}\n.nc-icon-outline.arrows-1_refresh-68:before {\n    content: \"\\ea70\";\n}\n.nc-icon-outline.arrows-1_refresh-69:before {\n    content: \"\\ea71\";\n}\n.nc-icon-outline.arrows-1_round-down:before {\n    content: \"\\ea72\";\n}\n.nc-icon-outline.arrows-1_round-left:before {\n    content: \"\\ea73\";\n}\n.nc-icon-outline.arrows-1_round-right:before {\n    content: \"\\ea74\";\n}\n.nc-icon-outline.arrows-1_round-up:before {\n    content: \"\\ea75\";\n}\n.nc-icon-outline.arrows-1_share-66:before {\n    content: \"\\ea76\";\n}\n.nc-icon-outline.arrows-1_share-91:before {\n    content: \"\\ea77\";\n}\n.nc-icon-outline.arrows-1_share-92:before {\n    content: \"\\ea78\";\n}\n.nc-icon-outline.arrows-1_shuffle-97:before {\n    content: \"\\ea79\";\n}\n.nc-icon-outline.arrows-1_shuffle-98:before {\n    content: \"\\ea7a\";\n}\n.nc-icon-outline.arrows-1_simple-down:before {\n    content: \"\\ea7b\";\n}\n.nc-icon-outline.arrows-1_simple-left:before {\n    content: \"\\ea7c\";\n}\n.nc-icon-outline.arrows-1_simple-right:before {\n    content: \"\\ea7d\";\n}\n.nc-icon-outline.arrows-1_simple-up:before {\n    content: \"\\ea7e\";\n}\n.nc-icon-outline.arrows-1_small-triangle-down:before {\n    content: \"\\ea7f\";\n}\n.nc-icon-outline.arrows-1_small-triangle-left:before {\n    content: \"\\ea80\";\n}\n.nc-icon-outline.arrows-1_small-triangle-right:before {\n    content: \"\\ea81\";\n}\n.nc-icon-outline.arrows-1_small-triangle-up:before {\n    content: \"\\ea82\";\n}\n.nc-icon-outline.arrows-1_square-down:before {\n    content: \"\\ea83\";\n}\n.nc-icon-outline.arrows-1_square-left:before {\n    content: \"\\ea84\";\n}\n.nc-icon-outline.arrows-1_square-right:before {\n    content: \"\\ea85\";\n}\n.nc-icon-outline.arrows-1_square-up:before {\n    content: \"\\ea86\";\n}\n.nc-icon-outline.arrows-1_strong-down:before {\n    content: \"\\ea87\";\n}\n.nc-icon-outline.arrows-1_strong-left:before {\n    content: \"\\ea88\";\n}\n.nc-icon-outline.arrows-1_strong-right:before {\n    content: \"\\ea89\";\n}\n.nc-icon-outline.arrows-1_strong-up:before {\n    content: \"\\ea8a\";\n}\n.nc-icon-outline.arrows-1_tail-down:before {\n    content: \"\\ea8b\";\n}\n.nc-icon-outline.arrows-1_tail-left:before {\n    content: \"\\ea8c\";\n}\n.nc-icon-outline.arrows-1_tail-right:before {\n    content: \"\\ea8d\";\n}\n.nc-icon-outline.arrows-1_tail-triangle-down:before {\n    content: \"\\ea8e\";\n}\n.nc-icon-outline.arrows-1_tail-triangle-left:before {\n    content: \"\\ea8f\";\n}\n.nc-icon-outline.arrows-1_tail-triangle-right:before {\n    content: \"\\ea90\";\n}\n.nc-icon-outline.arrows-1_tail-triangle-up:before {\n    content: \"\\ea91\";\n}\n.nc-icon-outline.arrows-1_tail-up:before {\n    content: \"\\ea92\";\n}\n.nc-icon-outline.arrows-1_trend-down:before {\n    content: \"\\ea93\";\n}\n.nc-icon-outline.arrows-1_trend-up:before {\n    content: \"\\ea94\";\n}\n.nc-icon-outline.arrows-1_triangle-down-20:before {\n    content: \"\\ea95\";\n}\n.nc-icon-outline.arrows-1_triangle-down-65:before {\n    content: \"\\ea96\";\n}\n.nc-icon-outline.arrows-1_triangle-left-18:before {\n    content: \"\\ea97\";\n}\n.nc-icon-outline.arrows-1_triangle-left-63:before {\n    content: \"\\ea98\";\n}\n.nc-icon-outline.arrows-1_triangle-right-17:before {\n    content: \"\\ea99\";\n}\n.nc-icon-outline.arrows-1_triangle-right-62:before {\n    content: \"\\ea9a\";\n}\n.nc-icon-outline.arrows-1_triangle-up-19:before {\n    content: \"\\ea9b\";\n}\n.nc-icon-outline.arrows-1_triangle-up-64:before {\n    content: \"\\ea9c\";\n}\n.nc-icon-outline.arrows-1_window-zoom-in:before {\n    content: \"\\ea9d\";\n}\n.nc-icon-outline.arrows-1_window-zoom-out:before {\n    content: \"\\ea9e\";\n}\n.nc-icon-outline.arrows-1_zoom-88:before {\n    content: \"\\ea9f\";\n}\n.nc-icon-outline.arrows-1_zoom-99:before {\n    content: \"\\eaa0\";\n}\n.nc-icon-outline.arrows-1_zoom-100:before {\n    content: \"\\eaa1\";\n}\n.nc-icon-outline.arrows-2_block-down:before {\n    content: \"\\eaa2\";\n}\n.nc-icon-outline.arrows-2_block-left:before {\n    content: \"\\eaa3\";\n}\n.nc-icon-outline.arrows-2_block-right:before {\n    content: \"\\eaa4\";\n}\n.nc-icon-outline.arrows-2_block-up:before {\n    content: \"\\eaa5\";\n}\n.nc-icon-outline.arrows-2_circle-in:before {\n    content: \"\\eaa6\";\n}\n.nc-icon-outline.arrows-2_circle-out:before {\n    content: \"\\eaa7\";\n}\n.nc-icon-outline.arrows-2_circuit-round:before {\n    content: \"\\eaa8\";\n}\n.nc-icon-outline.arrows-2_circuit:before {\n    content: \"\\eaa9\";\n}\n.nc-icon-outline.arrows-2_computer-upload:before {\n    content: \"\\eaaa\";\n}\n.nc-icon-outline.arrows-2_conversion:before {\n    content: \"\\eaab\";\n}\n.nc-icon-outline.arrows-2_corner-down-round:before {\n    content: \"\\eaac\";\n}\n.nc-icon-outline.arrows-2_corner-down:before {\n    content: \"\\eaad\";\n}\n.nc-icon-outline.arrows-2_corner-left-down:before {\n    content: \"\\eaae\";\n}\n.nc-icon-outline.arrows-2_corner-left-round:before {\n    content: \"\\eaaf\";\n}\n.nc-icon-outline.arrows-2_corner-left:before {\n    content: \"\\eab0\";\n}\n.nc-icon-outline.arrows-2_corner-right-down:before {\n    content: \"\\eab1\";\n}\n.nc-icon-outline.arrows-2_corner-right-round:before {\n    content: \"\\eab2\";\n}\n.nc-icon-outline.arrows-2_corner-right:before {\n    content: \"\\eab3\";\n}\n.nc-icon-outline.arrows-2_corner-up-left:before {\n    content: \"\\eab4\";\n}\n.nc-icon-outline.arrows-2_corner-up-right:before {\n    content: \"\\eab5\";\n}\n.nc-icon-outline.arrows-2_corner-up-round:before {\n    content: \"\\eab6\";\n}\n.nc-icon-outline.arrows-2_corner-up:before {\n    content: \"\\eab7\";\n}\n.nc-icon-outline.arrows-2_cross-down:before {\n    content: \"\\eab8\";\n}\n.nc-icon-outline.arrows-2_cross-horizontal:before {\n    content: \"\\eab9\";\n}\n.nc-icon-outline.arrows-2_cross-left:before {\n    content: \"\\eaba\";\n}\n.nc-icon-outline.arrows-2_cross-right:before {\n    content: \"\\eabb\";\n}\n.nc-icon-outline.arrows-2_cross-up:before {\n    content: \"\\eabc\";\n}\n.nc-icon-outline.arrows-2_cross-vertical:before {\n    content: \"\\eabd\";\n}\n.nc-icon-outline.arrows-2_curve-circuit:before {\n    content: \"\\eabe\";\n}\n.nc-icon-outline.arrows-2_curve-directions:before {\n    content: \"\\eabf\";\n}\n.nc-icon-outline.arrows-2_curve-split:before {\n    content: \"\\eac0\";\n}\n.nc-icon-outline.arrows-2_delete-49:before {\n    content: \"\\eac1\";\n}\n.nc-icon-outline.arrows-2_delete-50:before {\n    content: \"\\eac2\";\n}\n.nc-icon-outline.arrows-2_direction:before {\n    content: \"\\eac3\";\n}\n.nc-icon-outline.arrows-2_dots-download:before {\n    content: \"\\eac4\";\n}\n.nc-icon-outline.arrows-2_dots-upload:before {\n    content: \"\\eac5\";\n}\n.nc-icon-outline.arrows-2_eject:before {\n    content: \"\\eac6\";\n}\n.nc-icon-outline.arrows-2_enlarge-circle:before {\n    content: \"\\eac7\";\n}\n.nc-icon-outline.arrows-2_file-download-87:before {\n    content: \"\\eac8\";\n}\n.nc-icon-outline.arrows-2_file-download-89:before {\n    content: \"\\eac9\";\n}\n.nc-icon-outline.arrows-2_file-download-94:before {\n    content: \"\\eaca\";\n}\n.nc-icon-outline.arrows-2_file-upload-86:before {\n    content: \"\\eacb\";\n}\n.nc-icon-outline.arrows-2_file-upload-88:before {\n    content: \"\\eacc\";\n}\n.nc-icon-outline.arrows-2_file-upload-93:before {\n    content: \"\\eacd\";\n}\n.nc-icon-outline.arrows-2_fork-round:before {\n    content: \"\\eace\";\n}\n.nc-icon-outline.arrows-2_fork:before {\n    content: \"\\eacf\";\n}\n.nc-icon-outline.arrows-2_hit-down:before {\n    content: \"\\ead0\";\n}\n.nc-icon-outline.arrows-2_hit-left:before {\n    content: \"\\ead1\";\n}\n.nc-icon-outline.arrows-2_hit-right:before {\n    content: \"\\ead2\";\n}\n.nc-icon-outline.arrows-2_hit-up:before {\n    content: \"\\ead3\";\n}\n.nc-icon-outline.arrows-2_lines:before {\n    content: \"\\ead4\";\n}\n.nc-icon-outline.arrows-2_log-out:before {\n    content: \"\\ead5\";\n}\n.nc-icon-outline.arrows-2_loop:before {\n    content: \"\\ead6\";\n}\n.nc-icon-outline.arrows-2_merge-round:before {\n    content: \"\\ead7\";\n}\n.nc-icon-outline.arrows-2_merge:before {\n    content: \"\\ead8\";\n}\n.nc-icon-outline.arrows-2_move-05:before {\n    content: \"\\ead9\";\n}\n.nc-icon-outline.arrows-2_move-06:before {\n    content: \"\\eada\";\n}\n.nc-icon-outline.arrows-2_move-92:before {\n    content: \"\\eadb\";\n}\n.nc-icon-outline.arrows-2_move-down-right:before {\n    content: \"\\eadc\";\n}\n.nc-icon-outline.arrows-2_move-down:before {\n    content: \"\\eadd\";\n}\n.nc-icon-outline.arrows-2_move-left:before {\n    content: \"\\eade\";\n}\n.nc-icon-outline.arrows-2_move-right:before {\n    content: \"\\eadf\";\n}\n.nc-icon-outline.arrows-2_move-up-left:before {\n    content: \"\\eae0\";\n}\n.nc-icon-outline.arrows-2_move-up:before {\n    content: \"\\eae1\";\n}\n.nc-icon-outline.arrows-2_push-next:before {\n    content: \"\\eae2\";\n}\n.nc-icon-outline.arrows-2_push-previous:before {\n    content: \"\\eae3\";\n}\n.nc-icon-outline.arrows-2_reload:before {\n    content: \"\\eae4\";\n}\n.nc-icon-outline.arrows-2_replay:before {\n    content: \"\\eae5\";\n}\n.nc-icon-outline.arrows-2_rotate-left:before {\n    content: \"\\eae6\";\n}\n.nc-icon-outline.arrows-2_rotate-right:before {\n    content: \"\\eae7\";\n}\n.nc-icon-outline.arrows-2_round-left-down:before {\n    content: \"\\eae8\";\n}\n.nc-icon-outline.arrows-2_round-right-down:before {\n    content: \"\\eae9\";\n}\n.nc-icon-outline.arrows-2_round-up-left:before {\n    content: \"\\eaea\";\n}\n.nc-icon-outline.arrows-2_round-up-right:before {\n    content: \"\\eaeb\";\n}\n.nc-icon-outline.arrows-2_select-83:before {\n    content: \"\\eaec\";\n}\n.nc-icon-outline.arrows-2_select-84:before {\n    content: \"\\eaed\";\n}\n.nc-icon-outline.arrows-2_separate-round:before {\n    content: \"\\eaee\";\n}\n.nc-icon-outline.arrows-2_separate:before {\n    content: \"\\eaef\";\n}\n.nc-icon-outline.arrows-2_share-left:before {\n    content: \"\\eaf0\";\n}\n.nc-icon-outline.arrows-2_share-right:before {\n    content: \"\\eaf1\";\n}\n.nc-icon-outline.arrows-2_skew-down:before {\n    content: \"\\eaf2\";\n}\n.nc-icon-outline.arrows-2_skew-left:before {\n    content: \"\\eaf3\";\n}\n.nc-icon-outline.arrows-2_skew-right:before {\n    content: \"\\eaf4\";\n}\n.nc-icon-outline.arrows-2_skew-up:before {\n    content: \"\\eaf5\";\n}\n.nc-icon-outline.arrows-2_small-left:before {\n    content: \"\\eaf6\";\n}\n.nc-icon-outline.arrows-2_small-right:before {\n    content: \"\\eaf7\";\n}\n.nc-icon-outline.arrows-2_split-horizontal:before {\n    content: \"\\eaf8\";\n}\n.nc-icon-outline.arrows-2_split-round:before {\n    content: \"\\eaf9\";\n}\n.nc-icon-outline.arrows-2_split-vertical:before {\n    content: \"\\eafa\";\n}\n.nc-icon-outline.arrows-2_split:before {\n    content: \"\\eafb\";\n}\n.nc-icon-outline.arrows-2_square-download:before {\n    content: \"\\eafc\";\n}\n.nc-icon-outline.arrows-2_square-upload:before {\n    content: \"\\eafd\";\n}\n.nc-icon-outline.arrows-2_time:before {\n    content: \"\\eafe\";\n}\n.nc-icon-outline.arrows-2_triangle-down:before {\n    content: \"\\eaff\";\n}\n.nc-icon-outline.arrows-2_triangle-left:before {\n    content: \"\\eb00\";\n}\n.nc-icon-outline.arrows-2_triangle-right:before {\n    content: \"\\eb01\";\n}\n.nc-icon-outline.arrows-2_triangle-up:before {\n    content: \"\\eb02\";\n}\n.nc-icon-outline.arrows-2_unite-round:before {\n    content: \"\\eb03\";\n}\n.nc-icon-outline.arrows-2_unite:before {\n    content: \"\\eb04\";\n}\n.nc-icon-outline.arrows-2_zoom:before {\n    content: \"\\eb05\";\n}\n.nc-icon-outline.arrows-3_circle-down:before {\n    content: \"\\eb06\";\n}\n.nc-icon-outline.arrows-3_circle-left:before {\n    content: \"\\eb07\";\n}\n.nc-icon-outline.arrows-3_circle-right:before {\n    content: \"\\eb08\";\n}\n.nc-icon-outline.arrows-3_circle-simple-down:before {\n    content: \"\\eb09\";\n}\n.nc-icon-outline.arrows-3_circle-simple-left:before {\n    content: \"\\eb0a\";\n}\n.nc-icon-outline.arrows-3_circle-simple-right:before {\n    content: \"\\eb0b\";\n}\n.nc-icon-outline.arrows-3_circle-simple-up:before {\n    content: \"\\eb0c\";\n}\n.nc-icon-outline.arrows-3_circle-up:before {\n    content: \"\\eb0d\";\n}\n.nc-icon-outline.arrows-3_cloud-refresh:before {\n    content: \"\\eb0e\";\n}\n.nc-icon-outline.arrows-3_separate:before {\n    content: \"\\eb0f\";\n}\n.nc-icon-outline.arrows-3_small-down:before {\n    content: \"\\eb10\";\n}\n.nc-icon-outline.arrows-3_small-up:before {\n    content: \"\\eb11\";\n}\n.nc-icon-outline.arrows-3_square-corner-down-left-17:before {\n    content: \"\\eb12\";\n}\n.nc-icon-outline.arrows-3_square-corner-down-left-18:before {\n    content: \"\\eb13\";\n}\n.nc-icon-outline.arrows-3_square-corner-up-left:before {\n    content: \"\\eb14\";\n}\n.nc-icon-outline.arrows-3_square-corner-up-right:before {\n    content: \"\\eb15\";\n}\n.nc-icon-outline.arrows-3_square-down-06:before {\n    content: \"\\eb16\";\n}\n.nc-icon-outline.arrows-3_square-down-22:before {\n    content: \"\\eb17\";\n}\n.nc-icon-outline.arrows-3_square-enlarge:before {\n    content: \"\\eb18\";\n}\n.nc-icon-outline.arrows-3_square-left-04:before {\n    content: \"\\eb19\";\n}\n.nc-icon-outline.arrows-3_square-left-20:before {\n    content: \"\\eb1a\";\n}\n.nc-icon-outline.arrows-3_square-right-03:before {\n    content: \"\\eb1b\";\n}\n.nc-icon-outline.arrows-3_square-right-19:before {\n    content: \"\\eb1c\";\n}\n.nc-icon-outline.arrows-3_square-simple-down:before {\n    content: \"\\eb1d\";\n}\n.nc-icon-outline.arrows-3_square-simple-left:before {\n    content: \"\\eb1e\";\n}\n.nc-icon-outline.arrows-3_square-simple-right:before {\n    content: \"\\eb1f\";\n}\n.nc-icon-outline.arrows-3_square-simple-up:before {\n    content: \"\\eb20\";\n}\n.nc-icon-outline.arrows-3_square-up-05:before {\n    content: \"\\eb21\";\n}\n.nc-icon-outline.arrows-3_square-up-21:before {\n    content: \"\\eb22\";\n}\n.nc-icon-outline.arrows-3_square-zoom:before {\n    content: \"\\eb23\";\n}\n.nc-icon-outline.arrows-3_super-bold-down:before {\n    content: \"\\eb24\";\n}\n.nc-icon-outline.arrows-3_super-bold-left:before {\n    content: \"\\eb25\";\n}\n.nc-icon-outline.arrows-3_super-bold-right:before {\n    content: \"\\eb26\";\n}\n.nc-icon-outline.arrows-3_super-bold-up:before {\n    content: \"\\eb27\";\n}"
  },
  {
    "path": "lib/shared/styles/nucleo/outline/less/mixins.less",
    "content": ".nc-rotate(@degrees, @rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);\n  -webkit-transform: rotate(@degrees);\n  -moz-transform: rotate(@degrees);\n  -ms-transform: rotate(@degrees);\n  -o-transform: rotate(@degrees);\n  transform: rotate(@degrees); \n}\n\n.nc-flip(@horiz, @vert, @rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);\n  -webkit-transform: scale(@horiz, @vert);\n  -moz-transform: scale(@horiz, @vert);\n  -ms-transform: scale(@horiz, @vert);\n  -o-transform: scale(@horiz, @vert);\n  transform: scale(@horiz, @vert);\n}\n"
  },
  {
    "path": "lib/shared/styles/nucleo/outline/less/nucleo-outline.less",
    "content": "/* --------------------------------\n\nNucleo Outline Web Font - nucleoapp.com/\nLicense - nucleoapp.com/license/\nCreated using IcoMoon - icomoon.io\n\n-------------------------------- */\n@import \"./variables.less\";\n\n@font-face {\n  font-family: 'Nucleo Outline';\n  src: url('/fonts/nucleo-outline.eot');\n  src:  url('/fonts/nucleo-outline.eot') format('embedded-opentype'),\n        url('/fonts/nucleo-outline.woff2') format('woff2'),\n        url('/fonts/nucleo-outline.woff') format('woff'),\n        url('/fonts/nucleo-outline.ttf') format('truetype'),\n        url('/fonts/nucleo-outline.svg') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n\n:global {\n  /*------------------------\n  base class definition\n  -------------------------*/\n  .nc-icon-outline {\n    display: inline-block;\n    font: normal normal normal @nc-font-size-base/1 'Nucleo Outline';\n    font-size: inherit;\n    speak: none;\n    text-transform: none;\n    /* Better Font Rendering */\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n  }\n\n  @import \"./icons.less\";\n}\n"
  },
  {
    "path": "lib/shared/styles/nucleo/outline/less/variables.less",
    "content": "@nc-font-path:        \"../fonts\";\n@nc-font-size-base:   14px;\n@nc-background-color:     #eee;\n@nc-li-width:         (30em / 14);\n@nc-padding-width:    (1em/3);\n"
  },
  {
    "path": "lib/shared/styles/sizes.less",
    "content": "@topMenuHeight: 45px;\n@tabsHeight: 20px;\n@actionsHeight: 25px;\n@menuWidth: 290px;\n"
  },
  {
    "path": "migrations/.gitempty",
    "content": ""
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"relax\",\n  \"version\": \"0.0.0\",\n  \"description\": \"New generation CMS on top of React and Node.js\",\n  \"license\": \"GPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/relax/relax.git\"\n  },\n  \"scripts\": {\n    \"build\": \"NODE_ENV=production ./node_modules/.bin/webpack --output-public-path /public/js/ && cp -r assets/images/* public/images\",\n    \"start\": \"NODE_ENV=production ./node_modules/.bin/babel-node app\",\n    \"dev\": \"./node_modules/.bin/parallelshell 'npm run webpackServer' 'npm run watchServer'\",\n    \"watchServer\": \"./node_modules/.bin/nodemon -e js,jsx,json -w app.js -w lib -i lib/client -x './node_modules/webpack/bin/webpack.js --config ./webpack/webpack.node.config.js --progress && node build/app'\",\n    \"webpackServer\": \"node_modules/.bin/webpack-dev-server --config ./webpack/webpack.browser.config.js --inline --hot --progress --display-error-details\",\n    \"lint\": \"node_modules/.bin/eslint lib/** --quiet\"\n  },\n  \"dependencies\": {\n    \"babel-polyfill\": \"^6.3.14\",\n    \"body-parser\": \"^1.13.3\",\n    \"classnames\": \"^2.1.3\",\n    \"colr\": \"^1.2.2\",\n    \"connect-mongo\": \"^0.8.2\",\n    \"dropzone\": \"git://github.com/relax/dropzone.git\",\n    \"express\": \"^4.13.3\",\n    \"express-graphql\": \"^0.4.0\",\n    \"express-session\": \"^1.11.3\",\n    \"file-size\": \"^1.0.0\",\n    \"graphql\": \"^0.4.7\",\n    \"history\": \"1.17.0\",\n    \"hoist-non-react-statics\": \"^1.0.3\",\n    \"invariant\": \"^2.2.0\",\n    \"js-md5\": \"^0.3.0\",\n    \"kerberos\": \"0.0.17\",\n    \"keymaster\": \"git://github.com/relax/keymaster.git\",\n    \"lodash.clone\": \"^3.0.3\",\n    \"lodash.clonedeep\": \"^3.0.2\",\n    \"lodash.debounce\": \"^3.1.1\",\n    \"lodash.filter\": \"^3.1.1\",\n    \"lodash.find\": \"^3.2.1\",\n    \"lodash.findindex\": \"^4.2.0\",\n    \"lodash.foreach\": \"^3.0.3\",\n    \"lodash.merge\": \"^3.3.2\",\n    \"lodash.omit\": \"^3.1.0\",\n    \"lodash.sortby\": \"^3.1.5\",\n    \"medium-editor\": \"git://github.com/relax/medium-editor.git\",\n    \"mkdirp\": \"^0.5.1\",\n    \"moment\": \"^2.10.6\",\n    \"mongoose\": \"^4.1.12\",\n    \"morgan\": \"^1.6.1\",\n    \"multer\": \"^1.0.6\",\n    \"nodemailer\": \"^1.5.0\",\n    \"passport\": \"^0.3.0\",\n    \"passport-local\": \"^1.0.0\",\n    \"passport-local-mongoose\": \"^3.1.0\",\n    \"q\": \"^1.4.1\",\n    \"query-string\": \"^3.0.0\",\n    \"rc\": \"^1.1.1\",\n    \"react\": \"^0.14.0\",\n    \"react-colorpicker\": \"git://github.com/relax/react-colorpicker.git#relay\",\n    \"react-counter\": \"git://github.com/relax/react-counter.git#relay\",\n    \"react-dom\": \"^0.14.0\",\n    \"react-dropzone\": \"^3.2.2\",\n    \"react-gemini-scrollbar\": \"^2.0.1\",\n    \"react-google-maps\": \"^4.6.0\",\n    \"react-redux\": \"^4.4.0\",\n    \"react-router\": \"^1.0.2\",\n    \"redux\": \"^3.3.1\",\n    \"redux-combine-actions\": \"^0.1.2\",\n    \"redux-logger\": \"^2.0.4\",\n    \"redux-router\": \"1.0.0-beta5\",\n    \"redux-thunk\": \"^1.0.0\",\n    \"relate-js\": \"^0.2.7\",\n    \"relax-fragments\": \"0.1.1\",\n    \"relax-jss\": \"0.2.0\",\n    \"rimraf\": \"^2.4.3\",\n    \"semver\": \"^5.0.3\",\n    \"serialize-javascript\": \"^1.1.2\",\n    \"sharp\": \"^0.12.0\",\n    \"slug\": \"^0.9.1\",\n    \"soundmanager2\": \"git://github.com/relax/SoundManager2.git\",\n    \"superagent\": \"^1.6.1\",\n    \"touch\": \"^1.0.0\",\n    \"velocity-animate\": \"git://github.com/relax/velocity.git\",\n    \"warning\": \"^2.1.0\",\n    \"winston\": \"^2.1.0\"\n  },\n  \"devDependencies\": {\n    \"autoprefixer-loader\": \"^3.1.0\",\n    \"babel-core\": \"^6.4.5\",\n    \"babel-eslint\": \"^6.0.2\",\n    \"babel-loader\": \"^6.2.2\",\n    \"babel-plugin-react-transform\": \"^2.0.0\",\n    \"babel-plugin-transform-decorators-legacy\": \"^1.3.4\",\n    \"babel-preset-es2015\": \"^6.3.13\",\n    \"babel-preset-react\": \"^6.3.13\",\n    \"babel-preset-stage-0\": \"^6.3.13\",\n    \"css-loader\": \"^0.23.1\",\n    \"eslint\": \"^2.8.0\",\n    \"eslint-config-airbnb\": \"^7.0.0\",\n    \"eslint-plugin-react\": \"^4.2.2\",\n    \"extract-text-webpack-plugin\": \"^0.9.1\",\n    \"file-loader\": \"^0.8.4\",\n    \"json-loader\": \"^0.5.3\",\n    \"less\": \"^2.6.0\",\n    \"less-loader\": \"^2.2.2\",\n    \"nodemon\": \"^1.8.1\",\n    \"parallelshell\": \"^2.0.0\",\n    \"react-transform-catch-errors\": \"^1.0.2\",\n    \"react-transform-hmr\": \"^1.0.2\",\n    \"redbox-react\": \"^1.2.0\",\n    \"source-map-support\": \"^0.4.0\",\n    \"style-loader\": \"^0.13.0\",\n    \"url-loader\": \"^0.5.6\",\n    \"webpack\": \"^1.12.6\",\n    \"webpack-dev-server\": \"^1.12.1\",\n    \"webpack-hot-middleware\": \"^2.5.0\"\n  },\n  \"apps\": [\n    {\n      \"name\": \"relax\",\n      \"script\": \"index.js\",\n      \"instances\": 1,\n      \"exec_mode\": \"cluster\",\n      \"error_file\": \"../shared/logs/stderr.log\",\n      \"out_file\": \"../shared/logs/stdout.log\",\n      \"pid_file\": \"../shared/pids/pid\",\n      \"merge_logs\": true,\n      \"env\": {\n        \"NODE_ENV\": \"production\"\n      }\n    }\n  ],\n  \"deploy\": {\n    \"test\": {\n      \"user\": \"node\",\n      \"host\": \"178.62.64.146\",\n      \"path\": \"/home/node/apps/relax\",\n      \"ref\": \"origin/master\",\n      \"repo\": \"https://github.com/relax/relax.git\",\n      \"post-deploy\": \". /home/node/.nvm/nvm.sh && npm install && npm run build && pm2 startOrGracefulReload package.json --env production\"\n    }\n  }\n}\n"
  },
  {
    "path": "uploads/.gitignore",
    "content": "# Ignore everything in this directory\n*\n# Except this file\n!.gitignore\n"
  },
  {
    "path": "webpack/webpack.browser.config.js",
    "content": "var webpack = require('webpack');\nvar ExtractTextPlugin = require('extract-text-webpack-plugin');\nvar config = require('../config');\n\nvar NoErrorsPlugin = webpack.NoErrorsPlugin;\nvar optimize = webpack.optimize;\n\nvar webpackConfig = module.exports = {\n  entry: {\n    admin: ['./lib/client/admin.js'],\n    auth: ['./lib/client/auth.js'],\n    public: ['./lib/client/public.js']\n  },\n  output: {\n    path: './public/js',\n    filename: '[name].js',\n    publicPath: 'http://localhost:' + config.devPort + '/js/'\n  },\n  resolve: {\n    modulesDirectories: ['shared', 'node_modules'],\n    extensions: ['', '.js', '.jsx', '.json']\n  },\n  plugins: [\n    new optimize.OccurenceOrderPlugin(),\n    new optimize.CommonsChunkPlugin('common.js', ['admin', 'auth', 'public'])\n  ],\n  module: {\n    loaders: [\n      {\n        test: /\\.(js|jsx)$/,\n        loader: 'babel',\n        exclude: /node_modules/,\n        query: {\n          cacheDirectory: true,\n          presets: ['react', 'es2015', 'stage-0'],\n          plugins: [\n            ['transform-decorators-legacy'],\n            ['react-transform', {\n              transforms: [\n                {\n                  transform: 'react-transform-hmr',\n                  imports: ['react'],\n                  locals: ['module']\n                },\n                {\n                  transform: 'react-transform-catch-errors',\n                  imports: ['react', 'redbox-react']\n                }\n              ]\n            }]\n          ]\n        }\n      },\n      {\n        test: /\\.json$/,\n        loader: 'json'\n      },\n      {\n        test: /\\.(png|jpg|jpeg|gif)(\\?v=[0-9]\\.[0-9]\\.[0-9])?$/,\n        loader: 'url'\n      },\n      {\n        test: /\\.(woff|woff2|ttf|eot|svg)$/,\n        loader: 'file-loader?name=fonts/[name].[ext]'\n      }\n    ]\n  },\n  devServer: {\n    port: config.devPort,\n    contentBase: 'http://localhost:' + config.port\n  }\n};\n\nif (process.env.NODE_ENV === 'production') {\n  webpackConfig.plugins.push(new ExtractTextPlugin('../css/[name].css'));\n  webpackConfig.module.loaders.push({\n    test: /\\.(css)$/,\n    loader: ExtractTextPlugin.extract(\n      'style-loader',\n      'css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!autoprefixer!postcss-loader',\n      {\n        publicPath: '../css/'\n      }\n    )\n  });\n  webpackConfig.plugins.push(\n    new webpack.optimize.UglifyJsPlugin({\n      mangle: true,\n      compress: {\n        sequences: true,\n        dead_code: true,\n        conditionals: true,\n        booleans: true,\n        unused: true,\n        if_return: true,\n        join_vars: true,\n        drop_console: true,\n        warnings: false\n      }\n    }),\n  \tnew webpack.optimize.DedupePlugin(),\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: JSON.stringify('production')\n      }\n    }),\n    new NoErrorsPlugin()\n  );\n\n  webpackConfig.devtool = 'source-map';\n} else {\n  webpackConfig.module.loaders.push({\n    test: /\\.(css|less)$/,\n    loader: 'style!css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!less'\n  });\n  webpackConfig.devtool = 'eval';\n}\n"
  },
  {
    "path": "webpack/webpack.node.config.js",
    "content": "var webpack = require('webpack');\nvar path = require('path');\nvar fs = require('fs');\n\nvar nodeModules = {};\nfs.readdirSync('node_modules')\n  .filter(function (x) {\n    return ['.bin'].indexOf(x) === -1;\n  })\n  .forEach(function (mod) {\n    nodeModules[mod] = 'commonjs ' + mod;\n  });\n\nmodule.exports = {\n  entry: './app.js',\n  target: 'node',\n  output: {\n    path: path.join(__dirname, '..', 'build'),\n    filename: 'app.js'\n  },\n  resolve: {\n    modulesDirectories: ['shared', 'node_modules'],\n    extensions: ['', '.js', '.jsx', '.json']\n  },\n  externals: nodeModules,\n  plugins: [\n    new webpack.BannerPlugin('require(\"source-map-support\").install();', {\n      raw: true,\n      entryOnly: false\n    })\n  ],\n  devtool: 'sourcemap',\n  module: {\n    loaders: [\n      {\n        test: /\\.(js|jsx)$/,\n        loader: 'babel',\n        exclude: /node_modules/,\n        query: {\n          cacheDirectory: true,\n          presets: ['react', 'es2015', 'stage-0'],\n          plugins: [\n            ['transform-decorators-legacy'],\n            ['react-transform', {\n              transforms: [\n                {\n                  transform: 'react-transform-catch-errors',\n                  imports: ['react', 'redbox-react']\n                }\n              ]\n            }]\n          ]\n        }\n      },\n      {\n        test: /\\.(css|less)$/,\n        loader: 'css-loader!less'\n      },\n      {\n        test: /\\.(woff|woff2|ttf|eot|svg|png|jpg|jpeg|gif)(\\?v=[0-9]\\.[0-9]\\.[0-9])?$/,\n        loader: 'url'\n      }\n    ]\n  }\n};\n"
  }
]