Created
March 22, 2018 21:56
-
-
Save roman01la/98475669cfe36568ae14d7d3f85574eb to your computer and use it in GitHub Desktop.
Figma File API specs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns figma.specs | |
(:require [clojure.spec.alpha :as s])) | |
(def color-chan | |
(s/and number? #(<= 0 % 1))) | |
(def alpha-chan | |
(s/and number? #(<= 0 % 1))) | |
;;============================================= | |
;; File Format Types | |
;;============================================= | |
;; Color | |
(s/def :figma.types.color/r color-chan) | |
(s/def :figma.types.color/g color-chan) | |
(s/def :figma.types.color/b color-chan) | |
(s/def :figma.types.color/a alpha-chan) | |
(s/def :figma.types/color | |
(s/keys :req-un [:figma.types.color/r | |
:figma.types.color/g | |
:figma.types.color/b | |
:figma.types.color/a])) | |
;; Rectangle | |
(s/def :figma.types.rect/x int?) | |
(s/def :figma.types.rect/y int?) | |
(s/def :figma.types.rect/width int?) | |
(s/def :figma.types.rect/height int?) | |
(s/def :figma.types/rect | |
(s/keys :req-un [:figma.types.rect/x | |
:figma.types.rect/y | |
:figma.types.rect/width | |
:figma.types.rect/height])) | |
;; Vector | |
(s/def :figma.types.vector/x int?) | |
(s/def :figma.types.vector/y int?) | |
(s/def :figma.types/vector | |
(s/keys :req-un [:figma.types.vector/x | |
:figma.types.vector/y])) | |
;; ColorStop | |
(s/def :figma.types.color-stop/position | |
(s/and number? #(<= 0 % 1))) | |
(s/def :figma.types.color-stop/color | |
:figma.types/color) | |
(s/def :figma.types/color-stop | |
(s/keys :req-un [:figma.types.color-stop/position | |
:figma.types.color-stop/color])) | |
;; Effect | |
(s/def :figma.types.effect/type #{"INNER_SHADOW" "DROP_SHADOW"}) | |
(s/def :figma.types.effect/visible boolean?) | |
(s/def :figma.types.effect/radius int?) | |
(s/def :figma.types.effect/color :figma.types/color) | |
(s/def :figma.types.effect/offset :figma.types/vector) | |
(s/def :figma.types/effect | |
(s/keys :req-un [:figma.types.effect/type | |
:figma.types.effect/visible | |
:figma.types.effect/radius | |
:figma.types.effect/color | |
:figma.types.effect/offset])) | |
;; Paint | |
(s/def :figma.types.paint/type #{"SOLID" "GRADIENT_LINEAR"}) | |
(s/def :figma.types.paint/visible boolean?) | |
(s/def :figma.types.paint/opacity (s/and number? #(<= 0 % 1))) | |
(s/def :figma.types.paint/color :figma.types/color) | |
(s/def :figma.types.paint/gradientHandlePositions | |
(s/coll-of :figma.types/vector)) | |
(s/def :figma.types.paint/gradientStops | |
(s/coll-of :figma.types/color-stop)) | |
(s/def :figma.types/paint | |
(s/keys :req-un [:figma.types.paint/type | |
:figma.types.paint/visible | |
:figma.types.paint/opacity | |
:figma.types.paint/color | |
:figma.types.paint/gradientHandlePositions | |
:figma.types.paint/gradientStops])) | |
;; TypeStyle | |
(s/def :figma.types.type-style/fontFamily string?) | |
(s/def :figma.types.type-style/italic boolean?) | |
(s/def :figma.types.type-style/fontWeight pos-int?) | |
(s/def :figma.types.type-style/fontSize pos-int?) | |
(s/def :figma.types.type-style/textAlignHorizontal #{"LEFT" "RIGHT" "CENTER" "JUSTIFIED"}) | |
(s/def :figma.types.type-style/letterSpacing int?) | |
(s/def :figma.types.type-style/fills | |
(s/coll-of :figma.types/paint)) | |
(s/def :figma.types.type-style/lineHeightPx int?) | |
(s/def :figma.types/type-style | |
(s/keys :req-un [:figma.types.type-style/fontFamily | |
:figma.types.type-style/italic | |
:figma.types.type-style/fontWeight | |
:figma.types.type-style/fontSize | |
:figma.types.type-style/textAlignHorizontal | |
:figma.types.type-style/letterSpacing | |
:figma.types.type-style/fills | |
:figma.types.type-style/lineHeightPx])) | |
;; Component | |
(s/def :figma.types.component/name string?) | |
(s/def :figma.types.component/description string?) | |
(s/def :figma.types/component | |
(s/keys :req-un [:figma.types.component/name | |
:figma.types.component/description])) | |
;;============================================= | |
;; JSON File Format Types / Node Properties | |
;;============================================= | |
(s/def :figma.types/children | |
(s/coll-of :figma.nodes/node)) | |
(s/def :figma.types/backgroundColor | |
:figma.types/color) | |
(s/def :figma.types/opacity | |
(s/and int? #(<= 0 % 1))) | |
(s/def :figma.types/absoluteBoundingBox | |
:figma.types/rect) | |
(s/def :figma.types/effects | |
(s/coll-of :figma.types/effect)) | |
(s/def :figma.types/fills | |
(s/coll-of :figma.types/paint)) | |
(s/def :figma.types/strokes | |
(s/coll-of :figma.types/paint)) | |
(s/def :figma.types/strokeWeight pos-int?) | |
(s/def :figma.types/cornerRadius pos-int?) | |
(s/def :figma.types/characters string?) | |
(s/def :figma.types/style :figma.types/type-style) | |
(s/def :figma.types/componentId string?) | |
;; Node | |
(s/def :figma.nodes.node/id string?) | |
(s/def :figma.nodes.node/name string?) | |
(s/def :figma.nodes.node/visible boolean?) | |
(s/def :figma.nodes.node/type | |
#{"DOCUMENT" "CANVAS" "FRAME" "GROUP" "VECTOR" | |
"RECTANGLE" "TEXT" "COMPONENT" "INSTANCE"}) | |
(s/def :figma.nodes/node | |
(s/keys :req-un [:figma.nodes.node/id | |
:figma.nodes.node/name | |
:figma.nodes.node/type] | |
:opt-un [:figma.nodes.node/visible])) | |
;; Document | |
(s/def :figma.nodes/document | |
(s/keys :req-un [:figma.types/children])) | |
;; Canvas | |
(s/def :figma.nodes/canvas | |
(s/keys :req-un [:figma.types/children | |
:figma.types/backgroundColor])) | |
;; Frame | |
(s/def :figma.nodes/frame | |
(s/keys :req-un [:figma.types/children | |
:figma.types/backgroundColor | |
:figma.types/opacity | |
:figma.types/absoluteBoundingBox | |
:figma.types/effects])) | |
;; Group | |
(s/def :figma.nodes/group | |
:figma.nodes/frame) | |
;; Vector | |
(s/def :figma.nodes/vector | |
(s/keys :req-un [:figma.types/opacity | |
:figma.types/absoluteBoundingBox | |
:figma.types/effects | |
:figma.types/fills | |
:figma.types/strokes | |
:figma.types/strokeWeight])) | |
;; Rectangle | |
(s/def :figma.nodes/rect | |
(s/merge :figma.nodes/vector | |
(s/keys :req-un [:figma.types/cornerRadius]))) | |
;; Text | |
(s/def :figma.nodes/text | |
(s/merge :figma.nodes/vector | |
(s/keys :req-un [:figma.types/characters | |
:figma.types/style]))) | |
;; Component | |
(s/def :figma.nodes/component | |
:figma.nodes/frame) | |
;; Instance | |
(s/def :figma.nodes/instance | |
(s/merge :figma.nodes/frame | |
(s/keys :req-un [:figma.types/componentId]))) | |
;; Generic Node | |
(defmulti figma-node :type) | |
(defmethod figma-node "DOCUMENT" [_] | |
:figma.nodes/document) | |
(defmethod figma-node "CANVAS" [_] | |
:figma.nodes/canvas) | |
(defmethod figma-node "FRAME" [_] | |
:figma.nodes/frame) | |
(defmethod figma-node "GROUP" [_] | |
:figma.nodes/group) | |
(defmethod figma-node "VECTOR" [_] | |
:figma.nodes/vector) | |
(defmethod figma-node "RECTANGLE" [_] | |
:figma.nodes/rect) | |
(defmethod figma-node "TEXT" [_] | |
:figma.nodes/text) | |
(defmethod figma-node "COMPONENT" [_] | |
:figma.nodes/component) | |
(defmethod figma-node "INSTANCE" [_] | |
:figma.nodes/instance) | |
(s/def :figma/node | |
(s/multi-spec figma-node :figma/node)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment