0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-02-25 16:25:56 -05:00

Merge pull request #2459 from penpot/hiru-refactor-types

♻️ Move internal.xxx namespaces to separated files
This commit is contained in:
Andrey Antukh 2022-10-18 11:58:46 +02:00 committed by GitHub
commit aaf645bad4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 298 additions and 224 deletions

View file

@ -8,7 +8,7 @@
(:require (:require
[app.common.spec :as us] [app.common.spec :as us]
[app.common.types.color :as ctc] [app.common.types.color :as ctc]
[app.common.types.file :as ctf] [app.common.types.file.media-object :as ctfm]
[app.common.types.page :as ctp] [app.common.types.page :as ctp]
[app.common.types.shape :as cts] [app.common.types.shape :as cts]
[app.common.types.typography :as ctt] [app.common.types.typography :as ctt]
@ -126,7 +126,7 @@
(s/keys :req-un [:internal.changes.add-recent-color/color])) (s/keys :req-un [:internal.changes.add-recent-color/color]))
(s/def :internal.changes.add-media/object ::ctf/media-object) (s/def :internal.changes.add-media/object ::ctfm/media-object)
(defmethod change-spec :add-media [_] (defmethod change-spec :add-media [_]
(s/keys :req-un [:internal.changes.add-media/object])) (s/keys :req-un [:internal.changes.add-media/object]))

View file

@ -9,77 +9,77 @@
[app.common.data :as d] [app.common.data :as d]
[app.common.spec :as us] [app.common.spec :as us]
[app.common.text :as txt] [app.common.text :as txt]
[app.common.types.color.generic :as-alias color-generic]
[app.common.types.color.gradient :as-alias color-gradient]
[app.common.types.color.gradient.stop :as-alias color-gradient-stop]
[clojure.spec.alpha :as s])) [clojure.spec.alpha :as s]))
;; TODO: waiting clojure 1.11 to rename this all :internal.stuff to a
;; more consistent name.
;; TODO: maybe define ::color-hex-string with proper hex color spec? ;; TODO: maybe define ::color-hex-string with proper hex color spec?
;; --- GRADIENTS ;; --- GRADIENTS
(s/def ::id uuid?) (s/def ::id uuid?)
(s/def :internal.gradient.stop/color string?) (s/def ::color-gradient/type #{:linear :radial})
(s/def :internal.gradient.stop/opacity ::us/safe-number) (s/def ::color-gradient/start-x ::us/safe-number)
(s/def :internal.gradient.stop/offset ::us/safe-number) (s/def ::color-gradient/start-y ::us/safe-number)
(s/def ::color-gradient/end-x ::us/safe-number)
(s/def ::color-gradient/end-y ::us/safe-number)
(s/def ::color-gradient/width ::us/safe-number)
(s/def :internal.gradient/type #{:linear :radial}) (s/def ::color-gradient-stop/color string?)
(s/def :internal.gradient/start-x ::us/safe-number) (s/def ::color-gradient-stop/opacity ::us/safe-number)
(s/def :internal.gradient/start-y ::us/safe-number) (s/def ::color-gradient-stop/offset ::us/safe-number)
(s/def :internal.gradient/end-x ::us/safe-number)
(s/def :internal.gradient/end-y ::us/safe-number)
(s/def :internal.gradient/width ::us/safe-number)
(s/def :internal.gradient/stop (s/def ::color-gradient/stop
(s/keys :req-un [:internal.gradient.stop/color (s/keys :req-un [::color-gradient-stop/color
:internal.gradient.stop/opacity ::color-gradient-stop/opacity
:internal.gradient.stop/offset])) ::color-gradient-stop/offset]))
(s/def :internal.gradient/stops (s/def ::color-gradient/stops
(s/coll-of :internal.gradient/stop :kind vector?)) (s/coll-of ::color-gradient/stop :kind vector?))
(s/def ::gradient (s/def ::gradient
(s/keys :req-un [:internal.gradient/type (s/keys :req-un [::color-gradient/type
:internal.gradient/start-x ::color-gradient/start-x
:internal.gradient/start-y ::color-gradient/start-y
:internal.gradient/end-x ::color-gradient/end-x
:internal.gradient/end-y ::color-gradient/end-y
:internal.gradient/width ::color-gradient/width
:internal.gradient/stops])) ::color-gradient/stops]))
;; --- COLORS ;; --- COLORS
(s/def :internal.color/name string?) (s/def ::color-generic/name string?)
(s/def :internal.color/path (s/nilable string?)) (s/def ::color-generic/path (s/nilable string?))
(s/def :internal.color/value (s/nilable string?)) (s/def ::color-generic/value (s/nilable string?))
(s/def :internal.color/color (s/nilable string?)) (s/def ::color-generic/color (s/nilable string?))
(s/def :internal.color/opacity (s/nilable ::us/safe-number)) (s/def ::color-generic/opacity (s/nilable ::us/safe-number))
(s/def :internal.color/gradient (s/nilable ::gradient)) (s/def ::color-generic/gradient (s/nilable ::gradient))
(s/def :internal.color/ref-id uuid?) (s/def ::color-generic/ref-id uuid?)
(s/def :internal.color/ref-file uuid?) (s/def ::color-generic/ref-file uuid?)
(s/def ::shape-color (s/def ::shape-color
(s/keys :req-un [:us/color (s/keys :req-un [:us/color
:internal.color/opacity] ::color-generic/opacity]
:opt-un [:internal.color/gradient :opt-un [::color-generic/gradient
:internal.color/ref-id ::color-generic/ref-id
:internal.color/ref-file])) ::color-generic/ref-file]))
(s/def ::color (s/def ::color
(s/keys :opt-un [::id (s/keys :opt-un [::id
:internal.color/name ::color-generic/name
:internal.color/path ::color-generic/path
:internal.color/value ::color-generic/value
:internal.color/color ::color-generic/color
:internal.color/opacity ::color-generic/opacity
:internal.color/gradient])) ::color-generic/gradient]))
(s/def ::recent-color (s/def ::recent-color
(s/keys :opt-un [:internal.color/value (s/keys :opt-un [::color-generic/value
:internal.color/color ::color-generic/color
:internal.color/opacity ::color-generic/opacity
:internal.color/gradient])) ::color-generic/gradient]))
;; --- Helpers for color in different parts of a shape ;; --- Helpers for color in different parts of a shape

View file

@ -11,12 +11,12 @@
[app.common.geom.shapes :as gsh] [app.common.geom.shapes :as gsh]
[app.common.pages.common :refer [file-version]] [app.common.pages.common :refer [file-version]]
[app.common.pages.helpers :as cph] [app.common.pages.helpers :as cph]
[app.common.spec :as us]
[app.common.types.color :as ctc] [app.common.types.color :as ctc]
[app.common.types.colors-list :as ctcl] [app.common.types.colors-list :as ctcl]
[app.common.types.component :as ctk] [app.common.types.component :as ctk]
[app.common.types.components-list :as ctkl] [app.common.types.components-list :as ctkl]
[app.common.types.container :as ctn] [app.common.types.container :as ctn]
[app.common.types.file.media-object :as ctfm]
[app.common.types.page :as ctp] [app.common.types.page :as ctp]
[app.common.types.pages-list :as ctpl] [app.common.types.pages-list :as ctpl]
[app.common.types.shape-tree :as ctst] [app.common.types.shape-tree :as ctst]
@ -28,24 +28,6 @@
;; Specs ;; Specs
(s/def :internal.media-object/name string?)
(s/def :internal.media-object/width ::us/safe-integer)
(s/def :internal.media-object/height ::us/safe-integer)
(s/def :internal.media-object/mtype string?)
;; NOTE: This is marked as nilable for backward compatibility, but
;; right now is just exists or not exists. We can thin in a gradual
;; migration and then mark it as not nilable.
(s/def :internal.media-object/path (s/nilable string?))
(s/def ::media-object
(s/keys :req-un [::id
::name
:internal.media-object/width
:internal.media-object/height
:internal.media-object/mtype]
:opt-un [:internal.media-object/path]))
(s/def ::colors (s/def ::colors
(s/map-of uuid? ::ctc/color)) (s/map-of uuid? ::ctc/color))
@ -59,7 +41,7 @@
(s/coll-of uuid? :kind vector?)) (s/coll-of uuid? :kind vector?))
(s/def ::media (s/def ::media
(s/map-of uuid? ::media-object)) (s/map-of uuid? ::ctfm/media-object))
(s/def ::pages-index (s/def ::pages-index
(s/map-of uuid? ::ctp/page)) (s/map-of uuid? ::ctp/page))

View file

@ -0,0 +1,30 @@
;; 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.common.types.file.media-object
(:require
[app.common.spec :as us]
[clojure.spec.alpha :as s]))
(s/def ::id uuid?)
(s/def ::name string?)
(s/def ::width ::us/safe-integer)
(s/def ::height ::us/safe-integer)
(s/def ::mtype string?)
;; NOTE: This is marked as nilable for backward compatibility, but
;; right now is just exists or not exists. We can thin in a gradual
;; migration and then mark it as not nilable.
(s/def ::path (s/nilable string?))
(s/def ::media-object
(s/keys :req-un [::id
::name
::width
::height
::mtype]
:opt-un [::path]))

View file

@ -7,85 +7,24 @@
(ns app.common.types.page (ns app.common.types.page
(:require (:require
[app.common.data :as d] [app.common.data :as d]
[app.common.spec :as us] [app.common.types.page.flow :as ctpf]
[app.common.types.page.grid :as ctpg]
[app.common.types.page.guide :as ctpu]
[app.common.types.shape :as cts] [app.common.types.shape :as cts]
[app.common.uuid :as uuid] [app.common.uuid :as uuid]
[clojure.spec.alpha :as s])) [clojure.spec.alpha :as s]))
;; --- Grid options ;; --- Background color
(s/def :internal.grid.color/color string?)
(s/def :internal.grid.color/opacity ::us/safe-number)
(s/def :internal.grid/size (s/nilable ::us/safe-integer))
(s/def :internal.grid/item-length (s/nilable ::us/safe-number))
(s/def :internal.grid/color (s/keys :req-un [:internal.grid.color/color
:internal.grid.color/opacity]))
(s/def :internal.grid/type #{:stretch :left :center :right})
(s/def :internal.grid/gutter (s/nilable ::us/safe-integer))
(s/def :internal.grid/margin (s/nilable ::us/safe-integer))
(s/def :internal.grid/square
(s/keys :req-un [:internal.grid/size
:internal.grid/color]))
(s/def :internal.grid/column
(s/keys :req-un [:internal.grid/color]
:opt-un [:internal.grid/size
:internal.grid/type
:internal.grid/item-length
:internal.grid/margin
:internal.grid/gutter]))
(s/def :internal.grid/row :internal.grid/column)
(s/def ::saved-grids
(s/keys :opt-un [:internal.grid/square
:internal.grid/row
:internal.grid/column]))
;; --- Background options
(s/def ::background string?) (s/def ::background string?)
;; --- Flow options ;; --- Page options
(s/def :internal.flow/id uuid?)
(s/def :internal.flow/name string?)
(s/def :internal.flow/starting-frame uuid?)
(s/def ::flow
(s/keys :req-un [:internal.flow/id
:internal.flow/name
:internal.flow/starting-frame]))
(s/def ::flows
(s/coll-of ::flow :kind vector?))
;; --- Guides
(s/def :internal.guides/id uuid?)
(s/def :internal.guides/axis #{:x :y})
(s/def :internal.guides/position ::us/safe-number)
(s/def :internal.guides/frame-id (s/nilable uuid?))
(s/def ::guide
(s/keys :req-un [:internal.guides/id
:internal.guides/axis
:internal.guides/position]
:opt-un [:internal.guides/frame-id]))
(s/def ::guides
(s/map-of uuid? ::guide))
;; --- Page Options
(s/def ::options (s/def ::options
(s/keys :opt-un [::background (s/keys :opt-un [::background
::saved-grids ::ctpg/saved-grids
::flows ::ctpf/flows
::guides])) ::ctpu/guides]))
;; --- Page ;; --- Page

View file

@ -0,0 +1,24 @@
;; 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.common.types.page.flow
(:require
[clojure.spec.alpha :as s]))
;; --- Interaction Flows
(s/def ::id uuid?)
(s/def ::name string?)
(s/def ::starting-frame uuid?)
(s/def ::flow
(s/keys :req-un [::id
::name
::starting-frame]))
(s/def ::flows
(s/coll-of ::flow :kind vector?))

View file

@ -0,0 +1,46 @@
;; 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.common.types.page.grid
(:require
[app.common.spec :as us]
[app.common.types.page.grid.color :as-alias grid-color]
[clojure.spec.alpha :as s]))
;; --- Board grids
(s/def ::grid-color/color string?)
(s/def ::grid-color/opacity ::us/safe-number)
(s/def ::size (s/nilable ::us/safe-integer))
(s/def ::item-length (s/nilable ::us/safe-number))
(s/def ::color (s/keys :req-un [::grid-color/color
::grid-color/opacity]))
(s/def ::type #{:stretch :left :center :right})
(s/def ::gutter (s/nilable ::us/safe-integer))
(s/def ::margin (s/nilable ::us/safe-integer))
(s/def ::square
(s/keys :req-un [::size
::color]))
(s/def ::column
(s/keys :req-un [::color]
:opt-un [::size
::type
::item-length
::margin
::gutter]))
(s/def ::row ::column)
(s/def ::saved-grids
(s/keys :opt-un [::square
::row
::column]))

View file

@ -0,0 +1,27 @@
;; 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.common.types.page.guide
(:require
[app.common.spec :as us]
[clojure.spec.alpha :as s]))
;; --- Page guides
(s/def ::id uuid?)
(s/def ::axis #{:x :y})
(s/def ::position ::us/safe-number)
(s/def ::frame-id (s/nilable uuid?))
(s/def ::guide
(s/keys :req-un [::id
::axis
::position]
:opt-un [::frame-id]))
(s/def ::guides
(s/map-of uuid? ::guide))

View file

@ -19,8 +19,10 @@
[app.common.types.shape.export :as ctse] [app.common.types.shape.export :as ctse]
[app.common.types.shape.interactions :as ctsi] [app.common.types.shape.interactions :as ctsi]
[app.common.types.shape.layout :as ctsl] [app.common.types.shape.layout :as ctsl]
[app.common.types.shape.path :as ctsp]
[app.common.types.shape.radius :as ctsr] [app.common.types.shape.radius :as ctsr]
[app.common.types.shape.shadow :as ctss] [app.common.types.shape.shadow :as ctss]
[app.common.types.shape.text :as ctsx]
[app.common.uuid :as uuid] [app.common.uuid :as uuid]
[clojure.set :as set] [clojure.set :as set]
[clojure.spec.alpha :as s])) [clojure.spec.alpha :as s]))
@ -229,74 +231,6 @@
::opacity ::opacity
::blend-mode]))) ::blend-mode])))
(s/def :internal.shape.text/type #{"root" "paragraph-set" "paragraph"})
(s/def :internal.shape.text/children
(s/coll-of :internal.shape.text/content
:kind vector?
:min-count 1))
(s/def :internal.shape.text/text string?)
(s/def :internal.shape.text/key string?)
(s/def :internal.shape.text/content
(s/nilable
(s/or :text-container
(s/keys :req-un [:internal.shape.text/type]
:opt-un [:internal.shape.text/key
:internal.shape.text/children])
:text-content
(s/keys :req-un [:internal.shape.text/text]))))
(s/def :internal.shape.text/position-data
(s/coll-of :internal.shape.text/position-data-element
:kind vector?
:min-count 1))
(s/def :internal.shape.text/position-data-element
(s/keys :req-un [:internal.shape.text.position-data/x
:internal.shape.text.position-data/y
:internal.shape.text.position-data/width
:internal.shape.text.position-data/height]
:opt-un [:internal.shape.text.position-data/fill-color
:internal.shape.text.position-data/fill-opacity
:internal.shape.text.position-data/font-family
:internal.shape.text.position-data/font-size
:internal.shape.text.position-data/font-style
:internal.shape.text.position-data/font-weight
:internal.shape.text.position-data/rtl
:internal.shape.text.position-data/text
:internal.shape.text.position-data/text-decoration
:internal.shape.text.position-data/text-transform]))
(s/def :internal.shape.text.position-data/x ::us/safe-number)
(s/def :internal.shape.text.position-data/y ::us/safe-number)
(s/def :internal.shape.text.position-data/width ::us/safe-number)
(s/def :internal.shape.text.position-data/height ::us/safe-number)
(s/def :internal.shape.text.position-data/fill-color ::fill-color)
(s/def :internal.shape.text.position-data/fill-opacity ::fill-opacity)
(s/def :internal.shape.text.position-data/fill-color-gradient ::fill-color-gradient)
(s/def :internal.shape.text.position-data/font-family string?)
(s/def :internal.shape.text.position-data/font-size string?)
(s/def :internal.shape.text.position-data/font-style string?)
(s/def :internal.shape.text.position-data/font-weight string?)
(s/def :internal.shape.text.position-data/rtl boolean?)
(s/def :internal.shape.text.position-data/text string?)
(s/def :internal.shape.text.position-data/text-decoration string?)
(s/def :internal.shape.text.position-data/text-transform string?)
(s/def :internal.shape.path/command keyword?)
(s/def :internal.shape.path/params
(s/nilable (s/map-of keyword? any?)))
(s/def :internal.shape.path/command-item
(s/keys :req-un [:internal.shape.path/command]
:opt-un [:internal.shape.path/params]))
(s/def :internal.shape.path/content
(s/coll-of :internal.shape.path/command-item :kind vector?))
(defmulti shape-spec :type) (defmulti shape-spec :type)
(defmethod shape-spec :default [_] (defmethod shape-spec :default [_]
@ -304,12 +238,12 @@
(defmethod shape-spec :text [_] (defmethod shape-spec :text [_]
(s/and ::shape-attrs (s/and ::shape-attrs
(s/keys :opt-un [:internal.shape.text/content (s/keys :opt-un [::ctsx/content
:internal.shape.text/position-data]))) ::ctsx/position-data])))
(defmethod shape-spec :path [_] (defmethod shape-spec :path [_]
(s/and ::shape-attrs (s/and ::shape-attrs
(s/keys :opt-un [:internal.shape.path/content]))) (s/keys :opt-un [::ctsp/content])))
(defmethod shape-spec :frame [_] (defmethod shape-spec :frame [_]
(s/and ::shape-attrs (s/and ::shape-attrs

View file

@ -2,7 +2,7 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; 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/. ;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;; ;;
;; Copyright (c) UXBOX Labs SL ;; Copyright (c) KALEIDOS INC
(ns app.common.types.shape.blur (ns app.common.types.shape.blur
(:require (:require

View file

@ -2,7 +2,7 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; 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/. ;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;; ;;
;; Copyright (c) UXBOX Labs SL ;; Copyright (c) KALEIDOS INC
(ns app.common.types.shape.export (ns app.common.types.shape.export
(:require (:require

View file

@ -2,7 +2,7 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; 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/. ;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;; ;;
;; Copyright (c) UXBOX Labs SL ;; Copyright (c) KALEIDOS INC
(ns app.common.types.shape.interactions (ns app.common.types.shape.interactions
(:require (:require

View file

@ -2,7 +2,7 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; 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/. ;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;; ;;
;; Copyright (c) UXBOX Labs SL ;; Copyright (c) KALEIDOS INC
(ns app.common.types.shape.layout (ns app.common.types.shape.layout
(:require (:require

View file

@ -0,0 +1,20 @@
;; 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.common.types.shape.path
(:require
[clojure.spec.alpha :as s]))
(s/def ::command keyword?)
(s/def ::params (s/nilable (s/map-of keyword? any?)))
(s/def ::command-item
(s/keys :req-un [::command]
:opt-un [::params]))
(s/def ::content
(s/coll-of ::command-item :kind vector?))

View file

@ -2,7 +2,7 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; 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/. ;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;; ;;
;; Copyright (c) UXBOX Labs SL ;; Copyright (c) KALEIDOS INC
(ns app.common.types.shape.radius (ns app.common.types.shape.radius
(:require (:require

View file

@ -2,7 +2,7 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; 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/. ;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;; ;;
;; Copyright (c) UXBOX Labs SL ;; Copyright (c) KALEIDOS INC
(ns app.common.types.shape.shadow (ns app.common.types.shape.shadow
(:require (:require
@ -21,7 +21,6 @@
(s/def ::spread ::us/safe-number) (s/def ::spread ::us/safe-number)
(s/def ::hidden boolean?) (s/def ::hidden boolean?)
(s/def ::color string?) (s/def ::color string?)
(s/def ::opacity ::us/safe-number) (s/def ::opacity ::us/safe-number)
(s/def ::gradient (s/nilable ::ctc/gradient)) (s/def ::gradient (s/nilable ::ctc/gradient))
@ -36,14 +35,14 @@
::id])) ::id]))
(s/def ::shadow-props (s/def ::shadow-props
(s/keys :req-un [:internal.shadow/id (s/keys :req-un [::id
:internal.shadow/style ::style
:shadow/color ::color
:internal.shadow/offset-x ::offset-x
:internal.shadow/offset-y ::offset-y
:internal.shadow/blur ::blur
:internal.shadow/spread ::spread
:internal.shadow/hidden])) ::hidden]))
(s/def ::shadow (s/def ::shadow
(s/coll-of ::shadow-props :kind vector?)) (s/coll-of ::shadow-props :kind vector?))

View file

@ -0,0 +1,73 @@
;; 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.common.types.shape.text
(:require
[app.common.spec :as us]
[app.common.types.color :as ctc]
[app.common.types.shape.text.position-data :as-alias position-data]
[clojure.spec.alpha :as s]))
(s/def ::type #{"root" "paragraph-set" "paragraph"})
(s/def ::text string?)
(s/def ::key string?)
(s/def ::fill-color string?)
(s/def ::fill-opacity ::us/safe-number)
(s/def ::fill-color-gradient (s/nilable ::ctc/gradient))
(s/def ::content
(s/nilable
(s/or :text-container
(s/keys :req-un [::type]
:opt-un [::key
::children])
:text-content
(s/keys :req-un [::text]))))
(s/def ::children
(s/coll-of ::content
:kind vector?
:min-count 1))
(s/def ::position-data
(s/coll-of ::position-data-element
:kind vector?
:min-count 1))
(s/def ::position-data-element
(s/keys :req-un [::position-data/x
::position-data/y
::position-data/width
::position-data/height]
:opt-un [::position-data/fill-color
::position-data/fill-opacity
::position-data/font-family
::position-data/font-size
::position-data/font-style
::position-data/font-weight
::position-data/rtl
::position-data/text
::position-data/text-decoration
::position-data/text-transform]))
(s/def ::position-data/x ::us/safe-number)
(s/def ::position-data/y ::us/safe-number)
(s/def ::position-data/width ::us/safe-number)
(s/def ::position-data/height ::us/safe-number)
(s/def ::position-data/fill-color ::fill-color)
(s/def ::position-data/fill-opacity ::fill-opacity)
(s/def ::position-data/fill-color-gradient ::fill-color-gradient)
(s/def ::position-data/font-family string?)
(s/def ::position-data/font-size string?)
(s/def ::position-data/font-style string?)
(s/def ::position-data/font-weight string?)
(s/def ::position-data/rtl boolean?)
(s/def ::position-data/text string?)
(s/def ::position-data/text-decoration string?)
(s/def ::position-data/text-transform string?)