0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-01-21 06:02:32 -05:00

Add initial working export tokens-json

This commit is contained in:
Akshay Gupta 2024-06-23 00:10:02 +05:30
parent 4c236ab423
commit 62fc2cf652
No known key found for this signature in database
4 changed files with 245 additions and 2 deletions

View file

@ -273,5 +273,171 @@
(binding [cfeat/*current* cfeat/default-features]
(File. (fb/create-file name))))
(def tokens-json
{:core
{:dimension
{:scale {:value "2" :type "dimension"}
:xs {:value "4" :type "dimension"}
:sm {:value "{dimension.xs} * {dimension.scale}" :type "dimension"}
:md {:value "{dimension.sm} * {dimension.scale}" :type "dimension"}
:lg {:value "{dimension.md} * {dimension.scale}" :type "dimension"}
:xl {:value "{dimension.lg} * {dimension.scale}" :type "dimension"}}
:spacing
{:xs {:value "{dimension.xs}" :type "spacing"}
:sm {:value "{dimension.sm}" :type "spacing"}
:md {:value "{dimension.md}" :type "spacing"}
:lg {:value "{dimension.lg}" :type "spacing"}
:xl {:value "{dimension.xl}" :type "spacing"}
:multi-value {:value "{dimension.sm} {dimension.xl}" :type "spacing"
:description "You can have multiple values in a single spacing token. Read more on these: https://docs.tokens.studio/available-tokens/spacing-tokens#multi-value-spacing-tokens"}}
:borderRadius
{:sm {:value "4" :type "borderRadius"}
:lg {:value "8" :type "borderRadius"}
:xl {:value "16" :type "borderRadius"}
:multi-value {:value "{borderRadius.sm} {borderRadius.lg}" :type "borderRadius"
:description "You can have multiple values in a single radius token. Read more on these: https://docs.tokens.studio/available-tokens/border-radius-tokens#single--multiple-values"}}
:colors
{:black {:value "#000000" :type "color"}
:white {:value "#ffffff" :type "color"}
:gray
{"100" {:value "#f7fafc" :type "color"}
"200" {:value "#edf2f7" :type "color"}
"300" {:value "#e2e8f0" :type "color"}
"400" {:value "#cbd5e0" :type "color"}
"500" {:value "#a0aec0" :type "color"}
"600" {:value "#718096" :type "color"}
"700" {:value "#4a5568" :type "color"}
"800" {:value "#2d3748" :type "color"}
"900" {:value "#1a202c" :type "color"}}
:red
{"100" {:value "#fff5f5" :type "color"}
"200" {:value "#fed7d7" :type "color"}
"300" {:value "#feb2b2" :type "color"}
"400" {:value "#fc8181" :type "color"}
"500" {:value "#f56565" :type "color"}
"600" {:value "#e53e3e" :type "color"}
"700" {:value "#c53030" :type "color"}
"800" {:value "#9b2c2c" :type "color"}
"900" {:value "#742a2a" :type "color"}}
:orange
{"100" {:value "#fffaf0" :type "color"}
"200" {:value "#feebc8" :type "color"}
"300" {:value "#fbd38d" :type "color"}
"400" {:value "#f6ad55" :type "color"}
"500" {:value "#ed8936" :type "color"}
"600" {:value "#dd6b20" :type "color"}
"700" {:value "#c05621" :type "color"}
"800" {:value "#9c4221" :type "color"}
"900" {:value "#7b341e" :type "color"}}
:yellow
{"100" {:value "#fffff0" :type "color"}
"200" {:value "#fefcbf" :type "color"}
"300" {:value "#faf089" :type "color"}
"400" {:value "#f6e05e" :type "color"}
"500" {:value "#ecc94b" :type "color"}
"600" {:value "#d69e2e" :type "color"}
"700" {:value "#b7791f" :type "color"}
"800" {:value "#975a16" :type "color"}
"900" {:value "#744210" :type "color"}}
:green
{"100" {:value "#f0fff4" :type "color"}
"200" {:value "#c6f6d5" :type "color"}
"300" {:value "#9ae6b4" :type "color"}
"400" {:value "#68d391" :type "color"}
"500" {:value "#48bb78" :type "color"}
"600" {:value "#38a169" :type "color"}
"700" {:value "#2f855a" :type "color"}
"800" {:value "#276749" :type "color"}
"900" {:value "#22543d" :type "color"}}
:teal
{"100" {:value "#e6fffa" :type "color"}
"200" {:value "#b2f5ea" :type "color"}
"300" {:value "#81e6d9" :type "color"}
"400" {:value "#4fd1c5" :type "color"}
"500" {:value "#38b2ac" :type "color"}
"600" {:value "#319795" :type "color"}
"700" {:value "#2c7a7b" :type "color"}
"800" {:value "#285e61" :type "color"}
"900" {:value "#234e52" :type "color"}}
:blue
{"100" {:value "#ebf8ff" :type "color"}
"200" {:value "#bee3f8" :type "color"}
"300" {:value "#90cdf4" :type "color"}
"400" {:value "#63b3ed" :type "color"}
"500" {:value "#4299e1" :type "color"}
"600" {:value "#3182ce" :type "color"}
"700" {:value "#2b6cb0" :type "color"}
"800" {:value "#2c5282" :type "color"}
"900" {:value "#2a4365" :type "color"}}
:indigo
{"100" {:value "#ebf4ff" :type "color"}
"200" {:value "#c3dafe" :type "color"}
"300" {:value "#a3bffa" :type "color"}
"400" {:value "#7f9cf5" :type "color"}
"500" {:value "#667eea" :type "color"}
"600" {:value "#5a67d8" :type "color"}
"700" {:value "#4c51bf" :type "color"}
"800" {:value "#434190" :type "color"}
"900" {:value "#3c366b" :type "color"}}
:purple
{"100" {:value "#faf5ff" :type "color"}
"200" {:value "#e9d8fd" :type "color"}
"300" {:value "#d6bcfa" :type "color"}
"400" {:value "#b794f4" :type "color"}
"500" {:value "#9f7aea" :type "color"}
"600" {:value "#805ad5" :type "color"}
"700" {:value "#6b46c1" :type "color"}
"800" {:value "#553c9a" :type "color"}
"900" {:value "#44337a" :type "color"}}
:pink
{"100" {:value "#fff5f7" :type "color"}
"200" {:value "#fed7e2" :type "color"}
"300" {:value "#fbb6ce" :type "color"}
"400" {:value "#f687b3" :type "color"}
"500" {:value "#ed64a6" :type "color"}
"600" {:value "#d53f8c" :type "color"}
"700" {:value "#b83280" :type "color"}
"800" {:value "#97266d" :type "color"}
"900" {:value "#702459" :type "color"}}}
:opacity
{:low {:value "10%" :type "opacity"}
:md {:value "50%" :type "opacity"}
:high {:value "90%" :type "opacity"}}
:fontFamilies
{:heading {:value "Inter" :type "fontFamilies"}
:body {:value "Roboto" :type "fontFamilies"}}
:lineHeights
{:heading {:value "110%" :type "lineHeights"}
:body {:value "140%" :type "lineHeights"}}
:letterSpacing
{:default {:value "0" :type "letterSpacing"}
:increased {:value "150%" :type "letterSpacing"}
:decreased {:value "-5%" :type "letterSpacing"}}
:paragraphSpacing
{:h1 {:value "32" :type "paragraphSpacing"}
:h2 {:value "26" :type "paragraphSpacing"}}
:fontWeights
{:headingRegular {:value "Regular" :type "fontWeights"}
:headingBold {:value "Bold" :type "fontWeights"}
:bodyRegular {:value "Regular" :type "fontWeights"}
:bodyBold {:value "Bold" :type "fontWeights"}}
:fontSizes
{:h1 {:value "{fontSizes.h2} * 1.25" :type "fontSizes"}
:h2 {:value "{fontSizes.h3} * 1.25" :type "fontSizes"}
:h3 {:value "{fontSizes.h4} * 1.25" :type "fontSizes"}
:h4 {:value "{fontSizes.h5} * 1.25" :type "fontSizes"}
:h5 {:value "{fontSizes.h6} * 1.25" :type "fontSizes"}
:h6 {:value "{fontSizes.body} * 1" :type "fontSizes"}
:body {:value "16" :type "fontSizes"}
:sm {:value "{fontSizes.body} * 0.85" :type "fontSizes"}
:xs {:value "{fontSizes.body} * 0.65" :type "fontSizes"}}}})
(defn export-tokens-file [tokens-json]
(let [file-name "tokens.json"
file-content (json/encode-tokens tokens-json)
blob (wapi/create-blob (clj->js file-content) "application/json")]
(dom/trigger-download file-name blob)))
(defn exports []
#js {:createFile create-file-export})
#js {:createFile create-file-export
:exportTokens export-tokens-file})

View file

@ -8,6 +8,7 @@
(:require-macros [app.main.style :as stl])
(:require
[app.common.data :as d]
[app.libs.file-builder :as fb]
[app.main.data.modal :as modal]
[app.main.data.tokens :as dt]
[app.main.refs :as refs]
@ -25,6 +26,32 @@
(def lens:token-type-open-status
(l/derived (l/in [:workspace-tokens :open-status]) st/state))
(def ^:private download-icon
(i/icon-xref :download (stl/css :download-icon)))
(defn transform-tokens [tokens]
(let [grouped-tokens (group-by (comp keyword :type second) tokens)
map-token (fn [[_ token]]
[(keyword (:name token))
{:value (:value token)
:type (:type token)}])]
(js/console.log grouped-tokens)
(js/console.log map-token)
{:core (into (sorted-map)
(map (fn [[type tokens]]
[type
(into (sorted-map)
(map map-token tokens))])
grouped-tokens))}))
(defn download-tokens-as-json []
(let [all-tokens (deref refs/workspace-tokens)
transformed-tokens-json (transform-tokens all-tokens)]
(js/console.log transformed-tokens-json)
(fb/export-tokens-file transformed-tokens-json)))
(mf/defc token-pill
{::mf/wrap-props false}
[{:keys [on-click token highlighted? on-context-menu]}]
@ -163,4 +190,10 @@
::mf/wrap-props false}
[_props]
[:div {:class (stl/css :sidebar-tab-wrapper)}
[:& tokens-explorer]])
[:& tokens-explorer]
[:button {:class (stl/css :download-json-button)
:on-click download-tokens-as-json} "Download Tokens as JSON"
[:span.separator]
download-icon]
])

View file

@ -49,3 +49,41 @@
// Align better with the label
translate: 0px -1px;
}
.download-json-button {
position: absolute;
bottom: $s-12;
right: $s-12;
padding: $s-8 $s-16;
font-size: $fs-12;
background-color: var(--button-primary-background-color-rest);
color: var(--button-primary-foreground-color-rest);
border: none;
border-radius: $br-4;
display: flex;
align-items: center;
cursor: pointer;
&:hover {
background-color: var(--button-primary-background-color-hover);
}
&:active {
background-color: var(--button-primary-background-color-active);
}
.download-icon {
@extend .button-icon;
stroke: var(--icon-foreground);
width:20px;
height:20px;
margin-left: $s-8;
}
.separator {
height: 16px;
width: 1px;
background-color: var(--button-primary-foreground-color-rest);
margin-left: $s-8;
}
}

View file

@ -17,3 +17,9 @@
(-> data
(clj->js)
(js/JSON.stringify)))
(defn encode-tokens
[data]
(-> data
(clj->js)
(js/JSON.stringify nil 2)))