diff --git a/package.json b/package.json index fc6af9e..78fd287 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,6 @@ "description": "Penpot exporter", "main": "code.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", "build": "webpack", "watch": "webpack watch" }, @@ -31,7 +30,7 @@ "crypto": "^1.0.1", "crypto-browserify": "^3.12.0", "react": "^17.0.2", - "react-dev-utils": "^11.0.4", + "react-dev-utils": "^12.0.1", "react-dom": "^17.0.2", "slugify": "^1.6.5" } diff --git a/src/gfonts.json b/src/gfonts.json new file mode 100644 index 0000000..7432d40 --- /dev/null +++ b/src/gfonts.json @@ -0,0 +1,1434 @@ +[ + "abeezee", + "abel", + "abhaya-libre", + "abril-fatface", + "aclonica", + "acme", + "actor", + "adamina", + "advent-pro", + "aguafina-script", + "akaya-kanadaka", + "akaya-telivigala", + "akronim", + "akshar", + "aladin", + "alata", + "alatsi", + "albert-sans", + "aldrich", + "alef", + "alegreya", + "alegreya-sc", + "alegreya-sans", + "alegreya-sans-sc", + "aleo", + "alex-brush", + "alfa-slab-one", + "alice", + "alike", + "alike-angular", + "allan", + "allerta", + "allerta-stencil", + "allison", + "allura", + "almarai", + "almendra", + "almendra-display", + "almendra-sc", + "alumni-sans", + "alumni-sans-inline-one", + "amarante", + "amaranth", + "amatic-sc", + "amethysta", + "amiko", + "amiri", + "amita", + "anaheim", + "andada-pro", + "andika", + "andika-new-basic", + "anek-bangla", + "anek-devanagari", + "anek-gujarati", + "anek-gurmukhi", + "anek-kannada", + "anek-latin", + "anek-malayalam", + "anek-odia", + "anek-tamil", + "anek-telugu", + "angkor", + "annie-use-your-telescope", + "anonymous-pro", + "antic", + "antic-didone", + "antic-slab", + "anton", + "antonio", + "anybody", + "arapey", + "arbutus", + "arbutus-slab", + "architects-daughter", + "archivo", + "archivo-black", + "archivo-narrow", + "are-you-serious", + "aref-ruqaa", + "arima", + "arima-madurai", + "arimo", + "arizonia", + "armata", + "arsenal", + "artifika", + "arvo", + "arya", + "asap", + "asap-condensed", + "asar", + "asset", + "assistant", + "astloch", + "asul", + "athiti", + "atkinson-hyperlegible", + "atma", + "atomic-age", + "aubrey", + "audiowide", + "autour-one", + "average", + "average-sans", + "averia-gruesa-libre", + "averia-libre", + "averia-sans-libre", + "averia-serif-libre", + "azeret-mono", + "b612", + "b612-mono", + "biz-udgothic", + "biz-udmincho", + "biz-udpgothic", + "biz-udpmincho", + "babylonica", + "bad-script", + "bahiana", + "bahianita", + "bai-jamjuree", + "bakbak-one", + "ballet", + "baloo-2", + "baloo-bhai-2", + "baloo-bhaijaan-2", + "baloo-bhaina-2", + "baloo-chettan-2", + "baloo-da-2", + "baloo-paaji-2", + "baloo-tamma-2", + "baloo-tammudu-2", + "baloo-thambi-2", + "balsamiq-sans", + "balthazar", + "bangers", + "barlow", + "barlow-condensed", + "barlow-semi-condensed", + "barriecito", + "barrio", + "basic", + "baskervville", + "battambang", + "baumans", + "bayon", + "be-vietnam-pro", + "beau-rivage", + "bebas-neue", + "belgrano", + "bellefair", + "belleza", + "bellota", + "bellota-text", + "benchnine", + "benne", + "bentham", + "berkshire-swash", + "besley", + "beth-ellen", + "bevan", + "bhutuka-expanded-one", + "big-shoulders-display", + "big-shoulders-inline-display", + "big-shoulders-inline-text", + "big-shoulders-stencil-display", + "big-shoulders-stencil-text", + "big-shoulders-text", + "bigelow-rules", + "bigshot-one", + "bilbo", + "bilbo-swash-caps", + "biorhyme", + "biorhyme-expanded", + "birthstone", + "birthstone-bounce", + "biryani", + "bitter", + "black-and-white-picture", + "black-han-sans", + "black-ops-one", + "blaka", + "blaka-hollow", + "blinker", + "bodoni-moda", + "bokor", + "bona-nova", + "bonbon", + "bonheur-royale", + "boogaloo", + "bowlby-one", + "bowlby-one-sc", + "brawler", + "bree-serif", + "brygada-1918", + "bubblegum-sans", + "bubbler-one", + "buda", + "buenard", + "bungee", + "bungee-hairline", + "bungee-inline", + "bungee-outline", + "bungee-shade", + "butcherman", + "butterfly-kids", + "cabin", + "cabin-condensed", + "cabin-sketch", + "caesar-dressing", + "cagliostro", + "cairo", + "caladea", + "calistoga", + "calligraffitti", + "cambay", + "cambo", + "candal", + "cantarell", + "cantata-one", + "cantora-one", + "capriola", + "caramel", + "carattere", + "cardo", + "carme", + "carrois-gothic", + "carrois-gothic-sc", + "carter-one", + "castoro", + "catamaran", + "caudex", + "caveat", + "caveat-brush", + "cedarville-cursive", + "ceviche-one", + "chakra-petch", + "changa", + "changa-one", + "chango", + "charis-sil", + "charm", + "charmonman", + "chathura", + "chau-philomene-one", + "chela-one", + "chelsea-market", + "chenla", + "cherish", + "cherry-cream-soda", + "cherry-swash", + "chewy", + "chicle", + "chilanka", + "chivo", + "chonburi", + "cinzel", + "cinzel-decorative", + "clicker-script", + "coda", + "coda-caption", + "codystar", + "coiny", + "combo", + "comfortaa", + "comforter", + "comforter-brush", + "comic-neue", + "coming-soon", + "commissioner", + "concert-one", + "condiment", + "content", + "contrail-one", + "convergence", + "cookie", + "copse", + "corben", + "corinthia", + "cormorant", + "cormorant-garamond", + "cormorant-infant", + "cormorant-sc", + "cormorant-unicase", + "cormorant-upright", + "courgette", + "courier-prime", + "cousine", + "coustard", + "covered-by-your-grace", + "crafty-girls", + "creepster", + "crete-round", + "crimson-pro", + "crimson-text", + "croissant-one", + "crushed", + "cuprum", + "cute-font", + "cutive", + "cutive-mono", + "dm-mono", + "dm-sans", + "dm-serif-display", + "dm-serif-text", + "damion", + "dancing-script", + "dangrek", + "darker-grotesque", + "david-libre", + "dawning-of-a-new-day", + "days-one", + "dekko", + "dela-gothic-one", + "delius", + "delius-swash-caps", + "delius-unicase", + "della-respira", + "denk-one", + "devonshire", + "dhurjati", + "didact-gothic", + "diplomata", + "diplomata-sc", + "do-hyeon", + "dokdo", + "domine", + "donegal-one", + "dongle", + "doppio-one", + "dorsa", + "dosis", + "dotgothic16", + "dr-sugiyama", + "duru-sans", + "dynalight", + "eb-garamond", + "eagle-lake", + "east-sea-dokdo", + "eater", + "economica", + "eczar", + "edu-nsw-act-foundation", + "edu-qld-beginner", + "edu-sa-beginner", + "edu-tas-beginner", + "edu-vic-wa-nt-beginner", + "el-messiri", + "electrolize", + "elsie", + "elsie-swash-caps", + "emblema-one", + "emilys-candy", + "encode-sans", + "encode-sans-condensed", + "encode-sans-expanded", + "encode-sans-sc", + "encode-sans-semi-condensed", + "encode-sans-semi-expanded", + "engagement", + "englebert", + "enriqueta", + "ephesis", + "epilogue", + "erica-one", + "esteban", + "estonia", + "euphoria-script", + "ewert", + "exo", + "exo-2", + "expletus-sans", + "explora", + "fahkwang", + "familjen-grotesk", + "fanwood-text", + "farro", + "farsan", + "fascinate", + "fascinate-inline", + "faster-one", + "fasthand", + "fauna-one", + "faustina", + "federant", + "federo", + "felipa", + "fenix", + "festive", + "finger-paint", + "finlandica", + "fira-code", + "fira-mono", + "fira-sans", + "fira-sans-condensed", + "fira-sans-extra-condensed", + "fjalla-one", + "fjord-one", + "flamenco", + "flavors", + "fleur-de-leah", + "flow-block", + "flow-circular", + "flow-rounded", + "fondamento", + "fontdiner-swanky", + "forum", + "francois-one", + "frank-ruhl-libre", + "fraunces", + "freckle-face", + "fredericka-the-great", + "fredoka", + "fredoka-one", + "freehand", + "fresca", + "frijole", + "fruktur", + "fugaz-one", + "fuggles", + "fuzzy-bubbles", + "gfs-didot", + "gfs-neohellenic", + "gabriela", + "gaegu", + "gafata", + "galada", + "galdeano", + "galindo", + "gamja-flower", + "gantari", + "gayathri", + "gelasio", + "gemunu-libre", + "genos", + "gentium-basic", + "gentium-book-basic", + "gentium-book-plus", + "gentium-plus", + "geo", + "georama", + "geostar", + "geostar-fill", + "germania-one", + "gideon-roman", + "gidugu", + "gilda-display", + "girassol", + "give-you-glory", + "glass-antiqua", + "glegoo", + "gloria-hallelujah", + "glory", + "gluten", + "goblin-one", + "gochi-hand", + "goldman", + "gorditas", + "gothic-a1", + "gotu", + "goudy-bookletter-1911", + "gowun-batang", + "gowun-dodum", + "graduate", + "grand-hotel", + "grandstander", + "grape-nuts", + "gravitas-one", + "great-vibes", + "grechen-fuemen", + "grenze", + "grenze-gotisch", + "grey-qo", + "griffy", + "gruppo", + "gudea", + "gugi", + "gulzar", + "gupter", + "gurajada", + "gwendolyn", + "habibi", + "hachi-maru-pop", + "hahmlet", + "halant", + "hammersmith-one", + "hanalei", + "hanalei-fill", + "handlee", + "hanuman", + "happy-monkey", + "harmattan", + "headland-one", + "heebo", + "henny-penny", + "hepta-slab", + "herr-von-muellerhoff", + "hi-melody", + "hina-mincho", + "hind", + "hind-guntur", + "hind-madurai", + "hind-siliguri", + "hind-vadodara", + "holtwood-one-sc", + "homemade-apple", + "homenaje", + "hubballi", + "hurricane", + "ibm-plex-mono", + "ibm-plex-sans", + "ibm-plex-sans-arabic", + "ibm-plex-sans-condensed", + "ibm-plex-sans-devanagari", + "ibm-plex-sans-hebrew", + "ibm-plex-sans-kr", + "ibm-plex-sans-thai", + "ibm-plex-sans-thai-looped", + "ibm-plex-serif", + "im-fell-dw-pica", + "im-fell-dw-pica-sc", + "im-fell-double-pica", + "im-fell-double-pica-sc", + "im-fell-english", + "im-fell-english-sc", + "im-fell-french-canon", + "im-fell-french-canon-sc", + "im-fell-great-primer", + "im-fell-great-primer-sc", + "ibarra-real-nova", + "iceberg", + "iceland", + "imbue", + "imperial-script", + "imprima", + "inconsolata", + "inder", + "indie-flower", + "ingrid-darling", + "inika", + "inknut-antiqua", + "inria-sans", + "inria-serif", + "inspiration", + "inter", + "irish-grover", + "island-moments", + "istok-web", + "italiana", + "italianno", + "itim", + "jacques-francois", + "jacques-francois-shadow", + "jaldi", + "jetbrains-mono", + "jim-nightshade", + "joan", + "jockey-one", + "jolly-lodger", + "jomhuria", + "jomolhari", + "josefin-sans", + "josefin-slab", + "jost", + "joti-one", + "jua", + "judson", + "julee", + "julius-sans-one", + "junge", + "jura", + "just-another-hand", + "just-me-again-down-here", + "k2d", + "kadwa", + "kaisei-decol", + "kaisei-harunoumi", + "kaisei-opti", + "kaisei-tokumin", + "kalam", + "kameron", + "kanit", + "kantumruy", + "kantumruy-pro", + "karantina", + "karla", + "karma", + "katibeh", + "kaushan-script", + "kavivanar", + "kavoon", + "kdam-thmor", + "kdam-thmor-pro", + "keania-one", + "kelly-slab", + "kenia", + "khand", + "khmer", + "khula", + "kings", + "kirang-haerang", + "kite-one", + "kiwi-maru", + "klee-one", + "knewave", + "koho", + "kodchasan", + "koh-santepheap", + "kolker-brush", + "kosugi", + "kosugi-maru", + "kotta-one", + "koulen", + "kranky", + "kreon", + "kristi", + "krona-one", + "krub", + "kufam", + "kulim-park", + "kumar-one", + "kumar-one-outline", + "kumbh-sans", + "kurale", + "la-belle-aurore", + "lacquer", + "laila", + "lakki-reddy", + "lalezar", + "lancelot", + "langar", + "lateef", + "lato", + "lavishly-yours", + "league-gothic", + "league-script", + "league-spartan", + "leckerli-one", + "ledger", + "lekton", + "lemon", + "lemonada", + "lexend", + "lexend-deca", + "lexend-exa", + "lexend-giga", + "lexend-mega", + "lexend-peta", + "lexend-tera", + "lexend-zetta", + "libre-barcode-128", + "libre-barcode-128-text", + "libre-barcode-39", + "libre-barcode-39-extended", + "libre-barcode-39-extended-text", + "libre-barcode-39-text", + "libre-barcode-ean13-text", + "libre-baskerville", + "libre-bodoni", + "libre-caslon-display", + "libre-caslon-text", + "libre-franklin", + "licorice", + "life-savers", + "lilita-one", + "lily-script-one", + "limelight", + "linden-hill", + "literata", + "liu-jian-mao-cao", + "livvic", + "lobster", + "lobster-two", + "londrina-outline", + "londrina-shadow", + "londrina-sketch", + "londrina-solid", + "long-cang", + "lora", + "love-light", + "love-ya-like-a-sister", + "loved-by-the-king", + "lovers-quarrel", + "luckiest-guy", + "lusitana", + "lustria", + "luxurious-roman", + "luxurious-script", + "m-plus-1", + "m-plus-1-code", + "m-plus-1p", + "m-plus-2", + "m-plus-code-latin", + "m-plus-rounded-1c", + "ma-shan-zheng", + "macondo", + "macondo-swash-caps", + "mada", + "magra", + "maiden-orange", + "maitree", + "major-mono-display", + "mako", + "mali", + "mallanna", + "mandali", + "manjari", + "manrope", + "mansalva", + "manuale", + "marcellus", + "marcellus-sc", + "marck-script", + "margarine", + "markazi-text", + "marko-one", + "marmelad", + "martel", + "martel-sans", + "marvel", + "mate", + "mate-sc", + "maven-pro", + "mclaren", + "mea-culpa", + "meddon", + "medievalsharp", + "medula-one", + "meera-inimai", + "megrim", + "meie-script", + "meow-script", + "merienda", + "merienda-one", + "merriweather", + "merriweather-sans", + "metal", + "metal-mania", + "metamorphous", + "metrophobic", + "michroma", + "milonga", + "miltonian", + "miltonian-tattoo", + "mina", + "mingzat", + "miniver", + "miriam-libre", + "mirza", + "miss-fajardose", + "mitr", + "mochiy-pop-one", + "mochiy-pop-p-one", + "modak", + "modern-antiqua", + "mogra", + "mohave", + "molengo", + "molle", + "monda", + "monofett", + "monoton", + "monsieur-la-doulaise", + "montaga", + "montagu-slab", + "montecarlo", + "montez", + "montserrat", + "montserrat-alternates", + "montserrat-subrayada", + "moo-lah-lah", + "moon-dance", + "moul", + "moulpali", + "mountains-of-christmas", + "mouse-memoirs", + "mr-bedfort", + "mr-dafoe", + "mr-de-haviland", + "mrs-saint-delafield", + "mrs-sheppards", + "ms-madi", + "mukta", + "mukta-mahee", + "mukta-malar", + "mukta-vaani", + "mulish", + "murecho", + "museomoderno", + "my-soul", + "mystery-quest", + "ntr", + "nanum-brush-script", + "nanum-gothic", + "nanum-gothic-coding", + "nanum-myeongjo", + "nanum-pen-script", + "neonderthaw", + "nerko-one", + "neucha", + "neuton", + "new-rocker", + "new-tegomin", + "news-cycle", + "newsreader", + "niconne", + "niramit", + "nixie-one", + "nobile", + "nokora", + "norican", + "nosifer", + "notable", + "nothing-you-could-do", + "noticia-text", + "noto-emoji", + "noto-kufi-arabic", + "noto-music", + "noto-naskh-arabic", + "noto-nastaliq-urdu", + "noto-rashi-hebrew", + "noto-sans", + "noto-sans-adlam", + "noto-sans-adlam-unjoined", + "noto-sans-anatolian-hieroglyphs", + "noto-sans-arabic", + "noto-sans-armenian", + "noto-sans-avestan", + "noto-sans-balinese", + "noto-sans-bamum", + "noto-sans-bassa-vah", + "noto-sans-batak", + "noto-sans-bengali", + "noto-sans-bhaiksuki", + "noto-sans-brahmi", + "noto-sans-buginese", + "noto-sans-buhid", + "noto-sans-canadian-aboriginal", + "noto-sans-carian", + "noto-sans-caucasian-albanian", + "noto-sans-chakma", + "noto-sans-cham", + "noto-sans-cherokee", + "noto-sans-coptic", + "noto-sans-cuneiform", + "noto-sans-cypriot", + "noto-sans-deseret", + "noto-sans-devanagari", + "noto-sans-display", + "noto-sans-duployan", + "noto-sans-egyptian-hieroglyphs", + "noto-sans-elbasan", + "noto-sans-elymaic", + "noto-sans-georgian", + "noto-sans-glagolitic", + "noto-sans-gothic", + "noto-sans-grantha", + "noto-sans-gujarati", + "noto-sans-gunjala-gondi", + "noto-sans-gurmukhi", + "noto-sans-hk", + "noto-sans-hanifi-rohingya", + "noto-sans-hanunoo", + "noto-sans-hatran", + "noto-sans-hebrew", + "noto-sans-imperial-aramaic", + "noto-sans-indic-siyaq-numbers", + "noto-sans-inscriptional-pahlavi", + "noto-sans-inscriptional-parthian", + "noto-sans-jp", + "noto-sans-javanese", + "noto-sans-kr", + "noto-sans-kaithi", + "noto-sans-kannada", + "noto-sans-kayah-li", + "noto-sans-kharoshthi", + "noto-sans-khmer", + "noto-sans-khojki", + "noto-sans-khudawadi", + "noto-sans-lao", + "noto-sans-lepcha", + "noto-sans-limbu", + "noto-sans-linear-a", + "noto-sans-linear-b", + "noto-sans-lisu", + "noto-sans-lycian", + "noto-sans-lydian", + "noto-sans-mahajani", + "noto-sans-malayalam", + "noto-sans-mandaic", + "noto-sans-manichaean", + "noto-sans-marchen", + "noto-sans-masaram-gondi", + "noto-sans-math", + "noto-sans-mayan-numerals", + "noto-sans-medefaidrin", + "noto-sans-meetei-mayek", + "noto-sans-meroitic", + "noto-sans-miao", + "noto-sans-modi", + "noto-sans-mongolian", + "noto-sans-mono", + "noto-sans-mro", + "noto-sans-multani", + "noto-sans-myanmar", + "noto-sans-n-ko", + "noto-sans-nabataean", + "noto-sans-new-tai-lue", + "noto-sans-newa", + "noto-sans-nushu", + "noto-sans-ogham", + "noto-sans-ol-chiki", + "noto-sans-old-hungarian", + "noto-sans-old-italic", + "noto-sans-old-north-arabian", + "noto-sans-old-permic", + "noto-sans-old-persian", + "noto-sans-old-sogdian", + "noto-sans-old-south-arabian", + "noto-sans-old-turkic", + "noto-sans-oriya", + "noto-sans-osage", + "noto-sans-osmanya", + "noto-sans-pahawh-hmong", + "noto-sans-palmyrene", + "noto-sans-pau-cin-hau", + "noto-sans-phags-pa", + "noto-sans-phoenician", + "noto-sans-psalter-pahlavi", + "noto-sans-rejang", + "noto-sans-runic", + "noto-sans-sc", + "noto-sans-samaritan", + "noto-sans-saurashtra", + "noto-sans-sharada", + "noto-sans-shavian", + "noto-sans-siddham", + "noto-sans-sinhala", + "noto-sans-sogdian", + "noto-sans-sora-sompeng", + "noto-sans-soyombo", + "noto-sans-sundanese", + "noto-sans-syloti-nagri", + "noto-sans-symbols", + "noto-sans-symbols-2", + "noto-sans-syriac", + "noto-sans-tc", + "noto-sans-tagalog", + "noto-sans-tagbanwa", + "noto-sans-tai-le", + "noto-sans-tai-tham", + "noto-sans-tai-viet", + "noto-sans-takri", + "noto-sans-tamil", + "noto-sans-tamil-supplement", + "noto-sans-telugu", + "noto-sans-thaana", + "noto-sans-thai", + "noto-sans-thai-looped", + "noto-sans-tifinagh", + "noto-sans-tirhuta", + "noto-sans-ugaritic", + "noto-sans-vai", + "noto-sans-wancho", + "noto-sans-warang-citi", + "noto-sans-yi", + "noto-sans-zanabazar-square", + "noto-serif", + "noto-serif-ahom", + "noto-serif-armenian", + "noto-serif-balinese", + "noto-serif-bengali", + "noto-serif-devanagari", + "noto-serif-display", + "noto-serif-dogra", + "noto-serif-ethiopic", + "noto-serif-georgian", + "noto-serif-grantha", + "noto-serif-gujarati", + "noto-serif-gurmukhi", + "noto-serif-hebrew", + "noto-serif-jp", + "noto-serif-kr", + "noto-serif-kannada", + "noto-serif-khmer", + "noto-serif-lao", + "noto-serif-malayalam", + "noto-serif-myanmar", + "noto-serif-nyiakeng-puachue-hmong", + "noto-serif-sc", + "noto-serif-sinhala", + "noto-serif-tc", + "noto-serif-tamil", + "noto-serif-tangut", + "noto-serif-telugu", + "noto-serif-thai", + "noto-serif-tibetan", + "noto-serif-yezidi", + "noto-traditional-nushu", + "nova-cut", + "nova-flat", + "nova-mono", + "nova-oval", + "nova-round", + "nova-script", + "nova-slim", + "nova-square", + "numans", + "nunito", + "nunito-sans", + "nuosu-sil", + "odibee-sans", + "odor-mean-chey", + "offside", + "oi", + "old-standard-tt", + "oldenburg", + "ole", + "oleo-script", + "oleo-script-swash-caps", + "oooh-baby", + "open-sans", + "oranienbaum", + "orbitron", + "oregano", + "orelega-one", + "orienta", + "original-surfer", + "oswald", + "outfit", + "over-the-rainbow", + "overlock", + "overlock-sc", + "overpass", + "overpass-mono", + "ovo", + "oxanium", + "oxygen", + "oxygen-mono", + "pt-mono", + "pt-sans", + "pt-sans-caption", + "pt-sans-narrow", + "pt-serif", + "pt-serif-caption", + "pacifico", + "padauk", + "palanquin", + "palanquin-dark", + "pangolin", + "paprika", + "parisienne", + "passero-one", + "passion-one", + "passions-conflict", + "pathway-gothic-one", + "patrick-hand", + "patrick-hand-sc", + "pattaya", + "patua-one", + "pavanam", + "paytone-one", + "peddana", + "peralta", + "permanent-marker", + "petemoss", + "petit-formal-script", + "petrona", + "philosopher", + "piazzolla", + "piedra", + "pinyon-script", + "pirata-one", + "plaster", + "play", + "playball", + "playfair-display", + "playfair-display-sc", + "plus-jakarta-sans", + "podkova", + "poiret-one", + "poller-one", + "poly", + "pompiere", + "pontano-sans", + "poor-story", + "poppins", + "port-lligat-sans", + "port-lligat-slab", + "potta-one", + "pragati-narrow", + "praise", + "prata", + "preahvihear", + "press-start-2p", + "pridi", + "princess-sofia", + "prociono", + "prompt", + "prosto-one", + "proza-libre", + "public-sans", + "puppies-play", + "puritan", + "purple-purse", + "qahiri", + "quando", + "quantico", + "quattrocento", + "quattrocento-sans", + "questrial", + "quicksand", + "quintessential", + "qwigley", + "qwitcher-grypen", + "racing-sans-one", + "radio-canada", + "radley", + "rajdhani", + "rakkas", + "raleway", + "raleway-dots", + "ramabhadra", + "ramaraja", + "rambla", + "rammetto-one", + "rampart-one", + "ranchers", + "rancho", + "ranga", + "rasa", + "rationale", + "ravi-prakash", + "readex-pro", + "recursive", + "red-hat-display", + "red-hat-mono", + "red-hat-text", + "red-rose", + "redacted", + "redacted-script", + "redressed", + "reem-kufi", + "reenie-beanie", + "reggae-one", + "revalia", + "rhodium-libre", + "ribeye", + "ribeye-marrow", + "righteous", + "risque", + "road-rage", + "roboto", + "roboto-condensed", + "roboto-flex", + "roboto-mono", + "roboto-serif", + "roboto-slab", + "rochester", + "rock-salt", + "rocknroll-one", + "rokkitt", + "romanesco", + "ropa-sans", + "rosario", + "rosarivo", + "rouge-script", + "rowdies", + "rozha-one", + "rubik", + "rubik-beastly", + "rubik-bubbles", + "rubik-glitch", + "rubik-microbe", + "rubik-mono-one", + "rubik-moonrocks", + "rubik-puddles", + "rubik-wet-paint", + "ruda", + "rufina", + "ruge-boogie", + "ruluko", + "rum-raisin", + "ruslan-display", + "russo-one", + "ruthie", + "rye", + "stix-two-text", + "sacramento", + "sahitya", + "sail", + "saira", + "saira-condensed", + "saira-extra-condensed", + "saira-semi-condensed", + "saira-stencil-one", + "salsa", + "sanchez", + "sancreek", + "sansita", + "sansita-swashed", + "sarabun", + "sarala", + "sarina", + "sarpanch", + "sassy-frass", + "satisfy", + "sawarabi-gothic", + "sawarabi-mincho", + "scada", + "scheherazade-new", + "schoolbell", + "scope-one", + "seaweed-script", + "secular-one", + "sedgwick-ave", + "sedgwick-ave-display", + "sen", + "send-flowers", + "sevillana", + "seymour-one", + "shadows-into-light", + "shadows-into-light-two", + "shalimar", + "shanti", + "share", + "share-tech", + "share-tech-mono", + "shippori-antique", + "shippori-antique-b1", + "shippori-mincho", + "shippori-mincho-b1", + "shojumaru", + "short-stack", + "shrikhand", + "siemreap", + "sigmar-one", + "signika", + "signika-negative", + "simonetta", + "single-day", + "sintony", + "sirin-stencil", + "six-caps", + "skranji", + "slabo-13px", + "slabo-27px", + "slackey", + "smokum", + "smooch", + "smooch-sans", + "smythe", + "sniglet", + "snippet", + "snowburst-one", + "sofadi-one", + "sofia", + "solway", + "song-myung", + "sonsie-one", + "sora", + "sorts-mill-goudy", + "source-code-pro", + "source-sans-3", + "source-sans-pro", + "source-serif-4", + "source-serif-pro", + "space-grotesk", + "space-mono", + "special-elite", + "spectral", + "spectral-sc", + "spicy-rice", + "spinnaker", + "spirax", + "splash", + "spline-sans", + "spline-sans-mono", + "squada-one", + "square-peg", + "sree-krushnadevaraya", + "sriracha", + "srisakdi", + "staatliches", + "stalemate", + "stalinist-one", + "stardos-stencil", + "stick", + "stick-no-bills", + "stint-ultra-condensed", + "stint-ultra-expanded", + "stoke", + "strait", + "style-script", + "stylish", + "sue-ellen-francisco", + "suez-one", + "sulphur-point", + "sumana", + "sunflower", + "sunshiney", + "supermercado-one", + "sura", + "suranna", + "suravaram", + "suwannaphum", + "swanky-and-moo-moo", + "syncopate", + "syne", + "syne-mono", + "syne-tactile", + "tai-heritage-pro", + "tajawal", + "tangerine", + "tapestry", + "taprom", + "tauri", + "taviraj", + "teko", + "telex", + "tenali-ramakrishna", + "tenor-sans", + "text-me-one", + "texturina", + "thasadith", + "the-girl-next-door", + "the-nautigal", + "tienne", + "tillana", + "timmana", + "tinos", + "tiro-bangla", + "tiro-devanagari-hindi", + "tiro-devanagari-marathi", + "tiro-devanagari-sanskrit", + "tiro-gurmukhi", + "tiro-kannada", + "tiro-tamil", + "tiro-telugu", + "titan-one", + "titillium-web", + "tomorrow", + "tourney", + "trade-winds", + "train-one", + "trirong", + "trispace", + "trocchi", + "trochut", + "truculenta", + "trykker", + "tulpen-one", + "turret-road", + "twinkle-star", + "ubuntu", + "ubuntu-condensed", + "ubuntu-mono", + "uchen", + "ultra", + "uncial-antiqua", + "underdog", + "unica-one", + "unifrakturcook", + "unifrakturmaguntia", + "unkempt", + "unlock", + "unna", + "updock", + "urbanist", + "vt323", + "vampiro-one", + "varela", + "varela-round", + "varta", + "vast-shadow", + "vazirmatn", + "vesper-libre", + "viaoda-libre", + "vibes", + "vibur", + "vidaloka", + "viga", + "voces", + "volkhov", + "vollkorn", + "vollkorn-sc", + "voltaire", + "vujahday-script", + "waiting-for-the-sunrise", + "wallpoet", + "walter-turncoat", + "warnes", + "water-brush", + "waterfall", + "wellfleet", + "wendy-one", + "whisper", + "windsong", + "wire-one", + "work-sans", + "xanh-mono", + "yaldevi", + "yanone-kaffeesatz", + "yantramanav", + "yatra-one", + "yellowtail", + "yeon-sung", + "yeseva-one", + "yesteryear", + "yomogi", + "yrsa", + "yuji-boku", + "yuji-mai", + "yuji-syuku", + "yusei-magic", + "zcool-kuaile", + "zcool-qingke-huangyou", + "zcool-xiaowei", + "zen-antique", + "zen-antique-soft", + "zen-dots", + "zen-kaku-gothic-antique", + "zen-kaku-gothic-new", + "zen-kurenaido", + "zen-loop", + "zen-maru-gothic", + "zen-old-mincho", + "zen-tokyo-zoo", + "zeyada", + "zhi-mang-xing", + "zilla-slab", + "zilla-slab-highlight" +] \ No newline at end of file diff --git a/src/ui.css b/src/ui.css index c03cded..5dd95ff 100644 --- a/src/ui.css +++ b/src/ui.css @@ -92,6 +92,7 @@ section { justify-content: center; margin-bottom: 1rem; } + section > * + * { margin-top: 0.5rem; } @@ -103,3 +104,14 @@ img { height: auto; width: 2rem; } + +.missing-fonts small { + font-size: 0.5rem; + padding-top: 5px; + padding-bottom: 5px; +} + +ul { + padding: 0; + list-style-type: none; +} \ No newline at end of file diff --git a/src/ui.tsx b/src/ui.tsx index 87df9bf..4ad8e43 100644 --- a/src/ui.tsx +++ b/src/ui.tsx @@ -8,6 +8,9 @@ import slugify from "slugify"; declare function require(path: string): any; +// Open resources/gfonts.json and create a set of matched font names +const gfonts = new Set(); +require("./gfonts.json").forEach((font) => gfonts.add(font)); type PenpotExporterProps = { } @@ -21,6 +24,7 @@ type FigmaImageData = { type PenpotExporterState = { isDebug: boolean, penpotFileData: string + missingFonts: Set figmaFileData: string figmaRootNode: NodeData images: { [id: string] : FigmaImageData; }; @@ -31,6 +35,7 @@ export default class PenpotExporter extends React.Component { window.addEventListener("message", this.onMessage); } + + componentDidUpdate = () => { + this.setDimensions(); + } + componentWillUnmount = () =>{ window.removeEventListener('message', this.onMessage); } @@ -113,6 +123,13 @@ export default class PenpotExporter extends React.Component ({missingFonts: newMissingFonts })); + } + createPenpotPage(file, node){ file.addPage(node.name); for (var child of node.children){ @@ -200,9 +217,19 @@ export default class PenpotExporter extends React.Component { + + this.validateFont(val.fontName); + return { lineHeight: val.lineHeight, fontStyle: "normal", @@ -219,6 +246,8 @@ export default class PenpotExporter extends React.Component { + + const isMissingFonts = this.state.missingFonts.size > 0; + + let width = 300; + let height = 280; + + if (isMissingFonts) { + height += (this.state.missingFonts.size * 20); + width = 400; + } + + if (this.state.isDebug){ + height += 600; + width = 800; + } + + parent.postMessage({ pluginMessage: { type: "resize", width: width, height: height } }, "*"); + } + toggleDebug = (event) => { const isDebug = event.currentTarget.checked; - this.setState (state => ({isDebug: isDebug})) - if (isDebug){ - parent.postMessage({ pluginMessage: { type: "resize", width:800, height:800 } }, "*"); - } else { - parent.postMessage({ pluginMessage: { type: "resize", width:300, height:200 } }, "*"); - } + this.setState (state => ({isDebug: isDebug})); + } + + renderFontWarnings = () => { + return ( +
    + {Array.from(this.state.missingFonts).map((font) => ( +
  • {font}
  • + ))} +
+ ); } render() { + // Update the dimensions of the plugin window based on available data and selections return (
@@ -386,7 +441,14 @@ export default class PenpotExporter extends React.ComponentPenpot Exporter
-
+
0 ? "inline" : "none"}}> +
{this.state.missingFonts.size} non-default font{this.state.missingFonts.size > 1 ? 's' : ''}:
+ Ensure fonts are installed in Penpot before importing. +
+ {this.renderFontWarnings()} +
+
+