mirror of
https://github.com/penpot/penpot.git
synced 2025-05-30 03:56:11 +02:00
♻️ Refactor penpot library
This commit is contained in:
parent
8bdec66927
commit
0b7b6e2c23
18 changed files with 817 additions and 1034 deletions
|
@ -1,281 +0,0 @@
|
|||
;; This Source Code Form is subject to the terms of the Mozilla Public
|
||||
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
;;
|
||||
;; Copyright (c) KALEIDOS INC
|
||||
|
||||
(ns app.libs.file-builder
|
||||
(:require
|
||||
[app.common.data :as d]
|
||||
[app.common.features :as cfeat]
|
||||
[app.common.files.builder :as fb]
|
||||
[app.common.media :as cm]
|
||||
[app.common.types.components-list :as ctkl]
|
||||
[app.common.uuid :as uuid]
|
||||
[app.util.json :as json]
|
||||
[app.util.webapi :as wapi]
|
||||
[app.util.zip :as uz]
|
||||
[app.worker.export :as e]
|
||||
[beicon.v2.core :as rx]
|
||||
[cuerdas.core :as str]
|
||||
[promesa.core :as p]))
|
||||
|
||||
(defn parse-data [data]
|
||||
(as-> data $
|
||||
(js->clj $ :keywordize-keys true)
|
||||
;; Transforms camelCase to kebab-case
|
||||
(d/deep-mapm
|
||||
(fn [[key value]]
|
||||
(let [value (if (= (type value) js/Symbol)
|
||||
(keyword (js/Symbol.keyFor value))
|
||||
value)
|
||||
key (-> key d/name str/kebab keyword)]
|
||||
[key value])) $)))
|
||||
|
||||
(defn data-uri->blob
|
||||
[data-uri]
|
||||
(let [[mtype b64-data] (str/split data-uri ";base64,")
|
||||
mtype (subs mtype (inc (str/index-of mtype ":")))
|
||||
decoded (.atob js/window b64-data)
|
||||
size (.-length ^js decoded)
|
||||
content (js/Uint8Array. size)]
|
||||
|
||||
(doseq [i (range 0 size)]
|
||||
(aset content i (.charCodeAt decoded i)))
|
||||
|
||||
(wapi/create-blob content mtype)))
|
||||
|
||||
(defn parse-library-media
|
||||
[[file-id media]]
|
||||
(rx/merge
|
||||
(let [markup
|
||||
(->> (vals media)
|
||||
(reduce e/collect-media {})
|
||||
(json/encode))]
|
||||
(rx/of (vector (str file-id "/media.json") markup)))
|
||||
|
||||
(->> (rx/from (vals media))
|
||||
(rx/map #(assoc % :file-id file-id))
|
||||
(rx/merge-map
|
||||
(fn [media]
|
||||
(let [file-path (str/concat file-id "/media/" (:id media) (cm/mtype->extension (:mtype media)))
|
||||
blob (data-uri->blob (:uri media))]
|
||||
(rx/of (vector file-path blob))))))))
|
||||
|
||||
(defn export-file
|
||||
[file]
|
||||
(let [file (assoc file
|
||||
:name (:name file)
|
||||
:file-name (:name file)
|
||||
:is-shared false)
|
||||
|
||||
files-stream (->> (rx/of {(:id file) file})
|
||||
(rx/share))
|
||||
|
||||
manifest-stream
|
||||
(->> files-stream
|
||||
(rx/map #(e/create-manifest (uuid/next) (:id file) :all % cfeat/default-features))
|
||||
(rx/map (fn [a]
|
||||
(vector "manifest.json" a))))
|
||||
|
||||
render-stream
|
||||
(->> files-stream
|
||||
(rx/merge-map vals)
|
||||
(rx/merge-map e/process-pages)
|
||||
(rx/observe-on :async)
|
||||
(rx/merge-map e/get-page-data)
|
||||
(rx/share))
|
||||
|
||||
colors-stream
|
||||
(->> files-stream
|
||||
(rx/merge-map vals)
|
||||
(rx/map #(vector (:id %) (get-in % [:data :colors])))
|
||||
(rx/filter #(d/not-empty? (second %)))
|
||||
(rx/map e/parse-library-color))
|
||||
|
||||
typographies-stream
|
||||
(->> files-stream
|
||||
(rx/merge-map vals)
|
||||
(rx/map #(vector (:id %) (get-in % [:data :typographies])))
|
||||
(rx/filter #(d/not-empty? (second %)))
|
||||
(rx/map e/parse-library-typographies))
|
||||
|
||||
media-stream
|
||||
(->> files-stream
|
||||
(rx/merge-map vals)
|
||||
(rx/map #(vector (:id %) (get-in % [:data :media])))
|
||||
(rx/filter #(d/not-empty? (second %)))
|
||||
(rx/merge-map parse-library-media))
|
||||
|
||||
components-stream
|
||||
(->> files-stream
|
||||
(rx/merge-map vals)
|
||||
(rx/filter #(d/not-empty? (ctkl/components-seq (:data %))))
|
||||
(rx/merge-map e/parse-library-components))
|
||||
|
||||
pages-stream
|
||||
(->> render-stream
|
||||
(rx/map e/collect-page))]
|
||||
|
||||
(rx/merge
|
||||
(->> render-stream
|
||||
(rx/map #(hash-map
|
||||
:type :progress
|
||||
:file (:id file)
|
||||
:data (str "Render " (:file-name %) " - " (:name %)))))
|
||||
|
||||
(->> (rx/merge
|
||||
manifest-stream
|
||||
pages-stream
|
||||
components-stream
|
||||
media-stream
|
||||
colors-stream
|
||||
typographies-stream)
|
||||
(rx/reduce conj [])
|
||||
(rx/with-latest-from files-stream)
|
||||
(rx/merge-map (fn [[data _]]
|
||||
(->> (uz/compress-files data)
|
||||
(rx/map #(vector file %)))))))))
|
||||
|
||||
(deftype File [^:mutable file]
|
||||
Object
|
||||
|
||||
(addPage [_ name]
|
||||
(set! file (fb/add-page file {:name name}))
|
||||
(str (:current-page-id file)))
|
||||
|
||||
(addPage [_ name options]
|
||||
(set! file (fb/add-page file {:name name :options (parse-data options)}))
|
||||
(str (:current-page-id file)))
|
||||
|
||||
(closePage [_]
|
||||
(set! file (fb/close-page file)))
|
||||
|
||||
(addArtboard [_ data]
|
||||
(set! file (fb/add-artboard file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(closeArtboard [_]
|
||||
(set! file (fb/close-artboard file)))
|
||||
|
||||
(addGroup [_ data]
|
||||
(set! file (fb/add-group file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(closeGroup [_]
|
||||
(set! file (fb/close-group file)))
|
||||
|
||||
(addBool [_ data]
|
||||
(set! file (fb/add-bool file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(closeBool [_]
|
||||
(set! file (fb/close-bool file)))
|
||||
|
||||
(createRect [_ data]
|
||||
(set! file (fb/create-rect file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(createCircle [_ data]
|
||||
(set! file (fb/create-circle file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(createPath [_ data]
|
||||
(set! file (fb/create-path file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(createText [_ data]
|
||||
(set! file (fb/create-text file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(createImage [_ data]
|
||||
(set! file (fb/create-image file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(createSVG [_ data]
|
||||
(set! file (fb/create-svg-raw file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(closeSVG [_]
|
||||
(set! file (fb/close-svg-raw file)))
|
||||
|
||||
(addLibraryColor [_ data]
|
||||
(set! file (fb/add-library-color file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(updateLibraryColor [_ data]
|
||||
(set! file (fb/update-library-color file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(deleteLibraryColor [_ data]
|
||||
(set! file (fb/delete-library-color file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(addLibraryMedia [_ data]
|
||||
(set! file (fb/add-library-media file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(deleteLibraryMedia [_ data]
|
||||
(set! file (fb/delete-library-media file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(addLibraryTypography [_ data]
|
||||
(set! file (fb/add-library-typography file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(deleteLibraryTypography [_ data]
|
||||
(set! file (fb/delete-library-typography file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(startComponent [_ data]
|
||||
(set! file (fb/start-component file (parse-data data)))
|
||||
(str (:current-component-id file)))
|
||||
|
||||
(finishComponent [_]
|
||||
(set! file (fb/finish-component file)))
|
||||
|
||||
(createComponentInstance [_ data]
|
||||
(set! file (fb/create-component-instance file (parse-data data)))
|
||||
(str (:last-id file)))
|
||||
|
||||
(lookupShape [_ shape-id]
|
||||
(clj->js (fb/lookup-shape file (uuid/parse shape-id))))
|
||||
|
||||
(updateObject [_ id new-obj]
|
||||
(let [old-obj (fb/lookup-shape file (uuid/parse id))
|
||||
new-obj (d/deep-merge old-obj (parse-data new-obj))]
|
||||
(set! file (fb/update-object file old-obj new-obj))))
|
||||
|
||||
(deleteObject [_ id]
|
||||
(set! file (fb/delete-object file (uuid/parse id))))
|
||||
|
||||
(getId [_]
|
||||
(:id file))
|
||||
|
||||
(getCurrentPageId [_]
|
||||
(:current-page-id file))
|
||||
|
||||
(asMap [_]
|
||||
(clj->js file))
|
||||
|
||||
(newId [_]
|
||||
(uuid/next))
|
||||
|
||||
(export [_]
|
||||
(p/create
|
||||
(fn [resolve reject]
|
||||
(->> (export-file file)
|
||||
(rx/filter #(not= (:type %) :progress))
|
||||
(rx/take 1)
|
||||
(rx/subs!
|
||||
(fn [value]
|
||||
(let [[_ export-blob] value]
|
||||
(resolve export-blob)))
|
||||
reject))))))
|
||||
|
||||
(defn create-file-export [^string name]
|
||||
(binding [cfeat/*current* cfeat/default-features]
|
||||
(File. (fb/create-file name))))
|
||||
|
||||
(defn exports []
|
||||
#js {:createFile create-file-export})
|
|
@ -1,28 +0,0 @@
|
|||
;; This Source Code Form is subject to the terms of the Mozilla Public
|
||||
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
;;
|
||||
;; Copyright (c) KALEIDOS INC
|
||||
|
||||
(ns app.libs.render
|
||||
(:require
|
||||
[app.common.uuid :as uuid]
|
||||
[app.main.render :as r]
|
||||
[beicon.v2.core :as rx]
|
||||
[promesa.core :as p]))
|
||||
|
||||
(defn render-page-export
|
||||
[file ^string page-id]
|
||||
|
||||
;; Better to expose the api as a promise to be consumed from JS
|
||||
(let [page-id (uuid/parse page-id)
|
||||
file-data (.-file file)
|
||||
data (get-in file-data [:data :pages-index page-id])]
|
||||
(p/create
|
||||
(fn [resolve reject]
|
||||
(->> (r/render-page data)
|
||||
(rx/take 1)
|
||||
(rx/subs! resolve reject))))))
|
||||
|
||||
(defn exports []
|
||||
#js {:renderPage render-page-export})
|
|
@ -771,12 +771,12 @@
|
|||
|
||||
;; --- Update Shape Attrs
|
||||
|
||||
;; FIXME: revisit this before merge
|
||||
;; FIXME: rename to update-shape-generic-attrs because on the end we
|
||||
;; only allow here to update generic attrs
|
||||
(defn update-shape
|
||||
[id attrs]
|
||||
(assert (uuid? id) "expected valid uuid for `id`")
|
||||
|
||||
(let [attrs (cts/check-shape-attrs attrs)]
|
||||
(let [attrs (cts/check-shape-generic-attrs attrs)]
|
||||
(ptk/reify ::update-shape
|
||||
ptk/WatchEvent
|
||||
(watch [_ _ _]
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
[app.common.geom.shapes :as gsh]
|
||||
[app.common.types.component :as ctc]
|
||||
[app.common.types.container :as ctn]
|
||||
[app.common.types.path :as path]
|
||||
[app.common.types.path.bool :as bool]
|
||||
[app.common.types.shape :as cts]
|
||||
[app.common.types.shape.layout :as ctl]
|
||||
|
@ -30,9 +29,6 @@
|
|||
(let [shape-id
|
||||
(or id (uuid/next))
|
||||
|
||||
shapes
|
||||
(mapv #(path/convert-to-path % objects) shapes)
|
||||
|
||||
head
|
||||
(if (= type :difference) (first shapes) (last shapes))
|
||||
|
||||
|
@ -48,13 +44,13 @@
|
|||
:frame-id (:frame-id head)
|
||||
:parent-id (:parent-id head)
|
||||
:name name
|
||||
:shapes (mapv :id shapes)}
|
||||
:shapes (vec shapes)}
|
||||
|
||||
shape
|
||||
(-> shape
|
||||
(merge (select-keys head bool/style-properties))
|
||||
(cts/setup-shape)
|
||||
(gsh/update-bool shapes objects))]
|
||||
(gsh/update-bool objects))]
|
||||
|
||||
[shape (cph/get-position-on-parent objects (:id head))]))
|
||||
|
||||
|
@ -108,19 +104,16 @@
|
|||
(defn group->bool
|
||||
[type group objects]
|
||||
(let [shapes (->> (:shapes group)
|
||||
(map #(get objects %))
|
||||
(mapv #(path/convert-to-path % objects)))
|
||||
(map (d/getf objects)))
|
||||
head (if (= type :difference) (first shapes) (last shapes))
|
||||
head (cond-> head
|
||||
(and (contains? head :svg-attrs) (empty? (:fills head)))
|
||||
(assoc :fills bool/default-fills))
|
||||
head-data (select-keys head bool/style-properties)]
|
||||
|
||||
(assoc :fills bool/default-fills))]
|
||||
(-> group
|
||||
(assoc :type :bool)
|
||||
(assoc :bool-type type)
|
||||
(merge head-data)
|
||||
(gsh/update-bool shapes objects))))
|
||||
(merge (select-keys head bool/style-properties))
|
||||
(gsh/update-bool objects))))
|
||||
|
||||
(defn group-to-bool
|
||||
[shape-id type]
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
(ns app.util.object
|
||||
"A collection of helpers for work with javascript objects."
|
||||
(:refer-clojure :exclude [set! new get merge clone contains? array? into-array reify])
|
||||
(:refer-clojure :exclude [set! new get merge clone contains? array? into-array reify class])
|
||||
#?(:cljs (:require-macros [app.util.object]))
|
||||
(:require
|
||||
[clojure.core :as c]))
|
||||
|
|
250
frontend/src/lib/file_builder.cljs
Normal file
250
frontend/src/lib/file_builder.cljs
Normal file
|
@ -0,0 +1,250 @@
|
|||
;; This Source Code Form is subject to the terms of the Mozilla Public
|
||||
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
;;
|
||||
;; Copyright (c) KALEIDOS INC
|
||||
|
||||
(ns lib.file-builder
|
||||
(:require
|
||||
[app.common.data :as d]
|
||||
[app.common.data.macros :as dm]
|
||||
[app.common.files.builder :as fb]
|
||||
[app.common.json :as json]
|
||||
[app.common.schema :as sm]
|
||||
[app.common.uuid :as uuid]
|
||||
[app.util.object :as obj]))
|
||||
|
||||
(def BuilderError
|
||||
(obj/class
|
||||
:name "BuilderError"
|
||||
:extends js/Error
|
||||
:constructor
|
||||
(fn [this type code hint cause]
|
||||
(.call js/Error this hint)
|
||||
(set! (.-name this) (str "Exception: " hint))
|
||||
(set! (.-type this) type)
|
||||
(set! (.-code this) code)
|
||||
(set! (.-hint this) hint)
|
||||
|
||||
(when (exists? js/Error.captureStackTrace)
|
||||
(.captureStackTrace js/Error this))
|
||||
|
||||
(obj/add-properties!
|
||||
this
|
||||
{:name "cause"
|
||||
:enumerable true
|
||||
:this false
|
||||
:get (fn [] cause)}
|
||||
{:name "data"
|
||||
:enumerable true
|
||||
:this false
|
||||
:get (fn []
|
||||
(let [data (ex-data cause)]
|
||||
(when-let [explain (::sm/explain data)]
|
||||
(json/->js (sm/simplify explain)))))}))))
|
||||
|
||||
(defn- handle-exception
|
||||
[cause]
|
||||
(let [data (ex-data cause)]
|
||||
(throw (new BuilderError
|
||||
(d/name (get data :type :unknown))
|
||||
(d/name (get data :code :unknown))
|
||||
(or (get data :hint) (ex-message cause))
|
||||
cause))))
|
||||
|
||||
(defn- decode-params
|
||||
[params]
|
||||
(if (obj/plain-object? params)
|
||||
(json/->js params)
|
||||
params))
|
||||
|
||||
(defn- create-file*
|
||||
[file]
|
||||
(let [state* (volatile! file)]
|
||||
(obj/reify {:name "File"}
|
||||
:id
|
||||
{:get #(dm/str (:id @state*))}
|
||||
|
||||
:currentFrameId
|
||||
{:get #(dm/str (::fb/current-frame-id @state*))}
|
||||
|
||||
:currentPageId
|
||||
{:get #(dm/str (::fb/current-page-id @state*))}
|
||||
|
||||
:lastId
|
||||
{:get #(dm/str (::fb/last-id @state*))}
|
||||
|
||||
:addPage
|
||||
(fn [params]
|
||||
(try
|
||||
(let [params (-> params
|
||||
(decode-params)
|
||||
(fb/decode-page))]
|
||||
(vswap! state* fb/add-page params)
|
||||
(dm/str (::fb/current-page-id @state*)))
|
||||
(catch :default cause
|
||||
(handle-exception cause))))
|
||||
|
||||
:closePage
|
||||
(fn []
|
||||
(vswap! state* fb/close-page))
|
||||
|
||||
:addArtboard
|
||||
(fn [params]
|
||||
(try
|
||||
(let [params (-> params
|
||||
(json/->clj)
|
||||
(assoc :type :frame)
|
||||
(fb/decode-shape))]
|
||||
(vswap! state* fb/add-artboard params)
|
||||
(dm/str (::fb/last-id @state*)))
|
||||
(catch :default cause
|
||||
(handle-exception cause))))
|
||||
|
||||
:closeArtboard
|
||||
(fn []
|
||||
(vswap! state* fb/close-artboard))
|
||||
|
||||
:addGroup
|
||||
(fn [params]
|
||||
(try
|
||||
(let [params (-> params
|
||||
(json/->clj)
|
||||
(assoc :type :group)
|
||||
(fb/decode-shape))]
|
||||
(vswap! state* fb/add-group params)
|
||||
(dm/str (::fb/last-id @state*)))
|
||||
(catch :default cause
|
||||
(handle-exception cause))))
|
||||
|
||||
:closeGroup
|
||||
(fn []
|
||||
(vswap! state* fb/close-group))
|
||||
|
||||
:addBool
|
||||
(fn [params]
|
||||
(try
|
||||
(let [params (-> params
|
||||
(json/->clj)
|
||||
(fb/decode-add-bool))]
|
||||
(vswap! state* fb/add-bool params)
|
||||
(dm/str (::fb/last-id @state*)))
|
||||
(catch :default cause
|
||||
(handle-exception cause))))
|
||||
|
||||
:addRect
|
||||
(fn [params]
|
||||
(try
|
||||
(let [params (-> params
|
||||
(json/->clj)
|
||||
(assoc :type :rect)
|
||||
(fb/decode-shape))]
|
||||
(vswap! state* fb/add-shape params)
|
||||
(dm/str (::fb/last-id @state*)))
|
||||
(catch :default cause
|
||||
(handle-exception cause))))
|
||||
|
||||
:addCircle
|
||||
(fn [params]
|
||||
(try
|
||||
(let [params (-> params
|
||||
(json/->clj)
|
||||
(assoc :type :circle)
|
||||
(fb/decode-shape))]
|
||||
(vswap! state* fb/add-shape params)
|
||||
(dm/str (::fb/last-id @state*)))
|
||||
(catch :default cause
|
||||
(handle-exception cause))))
|
||||
|
||||
:addPath
|
||||
(fn [params]
|
||||
(try
|
||||
(let [params (-> params
|
||||
(json/->clj)
|
||||
(assoc :type :path)
|
||||
(fb/decode-shape))]
|
||||
(vswap! state* fb/add-shape params)
|
||||
(dm/str (::fb/last-id @state*)))
|
||||
(catch :default cause
|
||||
(handle-exception cause))))
|
||||
|
||||
:addText
|
||||
(fn [params]
|
||||
(try
|
||||
(let [params (-> params
|
||||
(json/->clj)
|
||||
(assoc :type :text)
|
||||
(fb/decode-shape))]
|
||||
(vswap! state* fb/add-shape params)
|
||||
(dm/str (::fb/last-id @state*)))
|
||||
(catch :default cause
|
||||
(handle-exception cause))))
|
||||
|
||||
:addLibraryColor
|
||||
(fn [params]
|
||||
(try
|
||||
(let [params (-> params
|
||||
(json/->clj)
|
||||
(fb/decode-library-color)
|
||||
(d/without-nils))]
|
||||
(vswap! state* fb/add-library-color params)
|
||||
(dm/str (::fb/last-id @state*)))
|
||||
(catch :default cause
|
||||
(handle-exception cause))))
|
||||
|
||||
:addLibraryTypography
|
||||
(fn [params]
|
||||
(try
|
||||
(let [params (-> params
|
||||
(json/->clj)
|
||||
(fb/decode-library-typography)
|
||||
(d/without-nils))]
|
||||
(vswap! state* fb/add-library-typography params)
|
||||
(dm/str (::fb/last-id @state*)))
|
||||
(catch :default cause
|
||||
(handle-exception cause))))
|
||||
|
||||
:addComponent
|
||||
(fn [params]
|
||||
(try
|
||||
(let [params (-> params
|
||||
(json/->clj)
|
||||
(fb/decode-component)
|
||||
(d/without-nils))]
|
||||
(vswap! state* fb/add-component params)
|
||||
(dm/str (::fb/last-id @state*)))
|
||||
(catch :default cause
|
||||
(handle-exception cause))))
|
||||
|
||||
:addComponentInstance
|
||||
(fn [params]
|
||||
(try
|
||||
(let [params (-> params
|
||||
(json/->clj)
|
||||
(fb/decode-add-component-instance)
|
||||
(d/without-nils))]
|
||||
(vswap! state* fb/add-component-instance params)
|
||||
(dm/str (::fb/last-id @state*)))
|
||||
(catch :default cause
|
||||
(handle-exception cause))))
|
||||
|
||||
:getShape
|
||||
(fn [shape-id]
|
||||
(let [shape-id (uuid/parse shape-id)]
|
||||
(some-> (fb/lookup-shape @state* shape-id)
|
||||
(json/->js))))
|
||||
|
||||
:toMap
|
||||
(fn []
|
||||
(-> @state*
|
||||
(d/without-qualified)
|
||||
(json/->js))))))
|
||||
|
||||
(defn create-file
|
||||
[params]
|
||||
(try
|
||||
(let [params (-> params json/->clj fb/decode-file)
|
||||
file (fb/create-file params)]
|
||||
(create-file* file))
|
||||
(catch :default cause
|
||||
(handle-exception cause))))
|
30
frontend/src/lib/playground/sample1.js
Normal file
30
frontend/src/lib/playground/sample1.js
Normal file
|
@ -0,0 +1,30 @@
|
|||
import * as penpot from "../../../target/library/penpot.js";
|
||||
|
||||
console.log(penpot);
|
||||
|
||||
try {
|
||||
const file = penpot.createFile({name: "Test"});
|
||||
file.addPage({name: "Foo Page"})
|
||||
const boardId = file.addArtboard({name: "Foo Board"})
|
||||
const rectId = file.addRect({name: "Foo Rect", width:100, height: 200})
|
||||
|
||||
file.addLibraryColor({color: "#fabada", opacity: 0.5})
|
||||
|
||||
console.log("created board", boardId);
|
||||
console.log("created rect", rectId);
|
||||
|
||||
const board = file.getShape(boardId);
|
||||
console.log("=========== BOARD =============")
|
||||
console.dir(board, {depth: 10});
|
||||
|
||||
const rect = file.getShape(rectId);
|
||||
console.log("=========== RECT =============")
|
||||
console.dir(rect, {depth: 10});
|
||||
|
||||
// console.dir(file.toMap(), {depth:10});
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
// console.log(e.data);
|
||||
}
|
||||
|
||||
process.exit(0);
|
Loading…
Add table
Add a link
Reference in a new issue