├── .github ├── FUNDING.yml └── workflows │ └── build.yaml ├── .gitignore ├── .init.stamp ├── AUTHORS.txt ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── CONTRIBUTORS.txt ├── Makefile ├── OFL.txt ├── README.md ├── build_instances.sh ├── documentation ├── DESCRIPTION.en_us.html ├── image1.py └── readme │ ├── demo_1.png │ ├── demo_2.png │ ├── header.png │ ├── social_preview.png │ ├── title.png │ └── variable.png ├── fonts ├── otf │ ├── Urbanist-Black.otf │ ├── Urbanist-BlackItalic.otf │ ├── Urbanist-Bold.otf │ ├── Urbanist-BoldItalic.otf │ ├── Urbanist-ExtraBold.otf │ ├── Urbanist-ExtraBoldItalic.otf │ ├── Urbanist-ExtraLight.otf │ ├── Urbanist-ExtraLightItalic.otf │ ├── Urbanist-Italic.otf │ ├── Urbanist-Light.otf │ ├── Urbanist-LightItalic.otf │ ├── Urbanist-Medium.otf │ ├── Urbanist-MediumItalic.otf │ ├── Urbanist-Regular.otf │ ├── Urbanist-SemiBold.otf │ ├── Urbanist-SemiBoldItalic.otf │ ├── Urbanist-Thin.otf │ └── Urbanist-ThinItalic.otf ├── ttf │ ├── Urbanist-Black.ttf │ ├── Urbanist-BlackItalic.ttf │ ├── Urbanist-Bold.ttf │ ├── Urbanist-BoldItalic.ttf │ ├── Urbanist-ExtraBold.ttf │ ├── Urbanist-ExtraBoldItalic.ttf │ ├── Urbanist-ExtraLight.ttf │ ├── Urbanist-ExtraLightItalic.ttf │ ├── Urbanist-Italic.ttf │ ├── Urbanist-Light.ttf │ ├── Urbanist-LightItalic.ttf │ ├── Urbanist-Medium.ttf │ ├── Urbanist-MediumItalic.ttf │ ├── Urbanist-Regular.ttf │ ├── Urbanist-SemiBold.ttf │ ├── Urbanist-SemiBoldItalic.ttf │ ├── Urbanist-Thin.ttf │ └── Urbanist-ThinItalic.ttf ├── variable │ ├── Urbanist-Italic[wght].ttf │ ├── Urbanist[ital,wght].ttf │ └── Urbanist[wght].ttf └── webfonts │ ├── Urbanist-Black.woff2 │ ├── Urbanist-BlackItalic.woff2 │ ├── Urbanist-Bold.woff2 │ ├── Urbanist-BoldItalic.woff2 │ ├── Urbanist-ExtraBold.woff2 │ ├── Urbanist-ExtraBoldItalic.woff2 │ ├── Urbanist-ExtraLight.woff2 │ ├── Urbanist-ExtraLightItalic.woff2 │ ├── Urbanist-Italic.woff2 │ ├── Urbanist-Light.woff2 │ ├── Urbanist-LightItalic.woff2 │ ├── Urbanist-Medium.woff2 │ ├── Urbanist-MediumItalic.woff2 │ ├── Urbanist-Regular.woff2 │ ├── Urbanist-SemiBold.woff2 │ ├── Urbanist-SemiBoldItalic.woff2 │ ├── Urbanist-Thin.woff2 │ ├── Urbanist-ThinItalic.woff2 │ └── Urbanist[ital,wght].woff2 ├── requirements-test.txt ├── requirements.txt ├── scripts ├── first-run.py ├── index.html ├── postprocess.py └── read-config.py └── sources ├── Urbanist.glyphs └── config.yaml /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [coreyhu] 4 | -------------------------------------------------------------------------------- /.github/workflows/build.yaml: -------------------------------------------------------------------------------- 1 | name: Build font and specimen 2 | 3 | on: [push, release] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v2 10 | - name: Set up Python 3.10 11 | uses: actions/setup-python@v2 12 | with: 13 | python-version: "3.10" 14 | - name: Install sys tools/deps 15 | run: | 16 | sudo apt-get update 17 | sudo apt-get install ttfautohint 18 | sudo snap install yq 19 | - uses: actions/cache@v2 20 | with: 21 | path: ./venv/ 22 | key: ${{ runner.os }}-venv-${{ hashFiles('**/requirements*.txt') }} 23 | restore-keys: | 24 | ${{ runner.os }}-venv- 25 | - name: Do first-run script if necessary 26 | run: make .init.stamp 27 | if: github.repository != 'googlefonts/googlefonts-project-template' 28 | - uses: stefanzweifel/git-auto-commit-action@v4 29 | name: First-run setup 30 | if: github.repository != 'googlefonts/googlefonts-project-template' 31 | with: 32 | file_pattern: .init.stamp README.md requirements.txt OFL.txt 33 | commit_message: "Personalize for this repo" 34 | - name: gen zip file name 35 | id: zip-name 36 | shell: bash 37 | # Set the archive name to repo name + "-assets" e.g "MavenPro-assets" 38 | run: echo "ZIP_NAME=$(echo '${{ github.repository }}' | awk -F '/' '{print $2}')-fonts" >> $GITHUB_ENV 39 | # If a new release is cut, use the release tag to auto-bump the source files 40 | - name: Bump release 41 | if: github.event_name == 'release' 42 | run: | 43 | . venv/bin/activate 44 | SRCS=$(yq e ".sources[]" sources/config.yaml) 45 | TAG_NAME=${GITHUB_REF/refs\/tags\//} 46 | echo "Bumping $SRCS to $TAG_NAME" 47 | for src in $SRCS 48 | do 49 | bumpfontversion sources/$src --new-version $TAG_NAME; 50 | done 51 | - name: Build font 52 | run: make build 53 | - name: Check with fontbakery 54 | run: make test 55 | continue-on-error: true 56 | - name: proof 57 | run: make proof 58 | - name: setup site 59 | run: cp scripts/index.html out/index.html 60 | - name: Deploy 61 | uses: peaceiris/actions-gh-pages@v3 62 | if: ${{ github.ref == 'refs/heads/main' }} 63 | with: 64 | github_token: ${{ secrets.GITHUB_TOKEN }} 65 | publish_dir: ./out 66 | - name: Archive artifacts 67 | uses: actions/upload-artifact@v2 68 | with: 69 | name: ${{ env.ZIP_NAME }} 70 | path: | 71 | fonts 72 | out 73 | outputs: 74 | zip_name: ${{ env.ZIP_NAME }} 75 | release: 76 | # only run if the commit is tagged... 77 | if: github.event_name == 'release' 78 | # ... and it builds successfully 79 | needs: 80 | - build 81 | runs-on: ubuntu-latest 82 | env: 83 | ZIP_NAME: ${{ needs.build.outputs.zip_name }} 84 | steps: 85 | - uses: actions/checkout@v2 86 | - name: Download artefact files 87 | uses: actions/download-artifact@v2 88 | with: 89 | name: ${{ env.ZIP_NAME }} 90 | path: ${{ env.ZIP_NAME }} 91 | - name: Zip files 92 | run: zip -r ${{ env.ZIP_NAME }}.zip ${{ env.ZIP_NAME }} 93 | - name: Upload binaries to release 94 | uses: svenstaro/upload-release-action@v2 95 | with: 96 | repo_token: ${{ secrets.GITHUB_TOKEN }} 97 | file: ${{ env.ZIP_NAME }}.zip 98 | asset_name: ${{ env.ZIP_NAME }}.zip 99 | tag: ${{ github.ref }} 100 | overwrite: true 101 | body: "Production ready fonts" -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | venv* 3 | build.stamp 4 | proof 5 | node_modules 6 | package-lock.json 7 | package.json 8 | **/master_ufo 9 | **/instance_ufo 10 | out 11 | 12 | # OS generated files # 13 | ###################### 14 | .DS_Store 15 | .DS_Store? 16 | ._* 17 | .Spotlight-V100 18 | .Trashes 19 | ehthumbs.db 20 | Thumbs.db 21 | 22 | # Autosaved by application when editing 23 | ###################### 24 | *(Autosaved).* 25 | 26 | # Build files 27 | ###################### 28 | .ninja_log 29 | build.ninja 30 | -------------------------------------------------------------------------------- /.init.stamp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/.init.stamp -------------------------------------------------------------------------------- /AUTHORS.txt: -------------------------------------------------------------------------------- 1 | # This is the official list of authors for copyright purposes. 2 | # This file is distinct from the CONTRIBUTORS files. 3 | # See the latter for an explanation. 4 | # 5 | # Names should be added to this file as: 6 | # Name or Organization 7 | 8 | Corey Hu 9 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | contact@coreyhu.com. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | When contributing to this repository, please first discuss the change you wish to make via issue, 4 | email, or any other method with the owners of this repository before making a change. 5 | 6 | Please note we have a code of conduct, please follow it in all your interactions with the project. 7 | 8 | ## Pull Request Process 9 | 10 | 1. Clone a fork of this repository and make changes to sources/Urbanist.glyphs with an editor like Glyphs. 11 | Export new variable and static font files to fonts/variable and fonts/static respectively. 12 | 2. Update the README.md to reflect any changes including changes to glyphs, version numbers, weights, 13 | or styles 14 | 3. Increment the version numbers in the .glyphs source file, exported font files, and the README.md 15 | to the new version that this Pull Request would represent. 16 | 4. Push changes to your fork and submit a Pull Request to this repository. 17 | 18 | ## Code of Conduct 19 | 20 | ### Our Pledge 21 | 22 | In the interest of fostering an open and welcoming environment, we as 23 | contributors and maintainers pledge to making participation in our project and 24 | our community a harassment-free experience for everyone, regardless of age, body 25 | size, disability, ethnicity, gender identity and expression, level of experience, 26 | nationality, personal appearance, race, religion, or sexual identity and 27 | orientation. 28 | 29 | ### Our Standards 30 | 31 | Examples of behavior that contributes to creating a positive environment 32 | include: 33 | 34 | * Using welcoming and inclusive language 35 | * Being respectful of differing viewpoints and experiences 36 | * Gracefully accepting constructive criticism 37 | * Focusing on what is best for the community 38 | * Showing empathy towards other community members 39 | 40 | Examples of unacceptable behavior by participants include: 41 | 42 | * The use of sexualized language or imagery and unwelcome sexual attention or 43 | advances 44 | * Trolling, insulting/derogatory comments, and personal or political attacks 45 | * Public or private harassment 46 | * Publishing others' private information, such as a physical or electronic 47 | address, without explicit permission 48 | * Other conduct which could reasonably be considered inappropriate in a 49 | professional setting 50 | 51 | ### Our Responsibilities 52 | 53 | Project maintainers are responsible for clarifying the standards of acceptable 54 | behavior and are expected to take appropriate and fair corrective action in 55 | response to any instances of unacceptable behavior. 56 | 57 | Project maintainers have the right and responsibility to remove, edit, or 58 | reject comments, commits, code, wiki edits, issues, and other contributions 59 | that are not aligned to this Code of Conduct, or to ban temporarily or 60 | permanently any contributor for other behaviors that they deem inappropriate, 61 | threatening, offensive, or harmful. 62 | 63 | ### Scope 64 | 65 | This Code of Conduct applies both within project spaces and in public spaces 66 | when an individual is representing the project or its community. Examples of 67 | representing a project or community include using an official project e-mail 68 | address, posting via an official social media account, or acting as an appointed 69 | representative at an online or offline event. Representation of a project may be 70 | further defined and clarified by project maintainers. 71 | 72 | ### Enforcement 73 | 74 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 75 | reported by contacting the project team at [INSERT EMAIL ADDRESS]. All 76 | complaints will be reviewed and investigated and will result in a response that 77 | is deemed necessary and appropriate to the circumstances. The project team is 78 | obligated to maintain confidentiality with regard to the reporter of an incident. 79 | Further details of specific enforcement policies may be posted separately. 80 | 81 | Project maintainers who do not follow or enforce the Code of Conduct in good 82 | faith may face temporary or permanent repercussions as determined by other 83 | members of the project's leadership. 84 | 85 | ### Attribution 86 | 87 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 88 | available at [http://contributor-covenant.org/version/1/4][version] 89 | 90 | [homepage]: http://contributor-covenant.org 91 | [version]: http://contributor-covenant.org/version/1/4/ 92 | -------------------------------------------------------------------------------- /CONTRIBUTORS.txt: -------------------------------------------------------------------------------- 1 | # This is the list of people who have contributed to this project, 2 | # and includes those not listed in AUTHORS.txt because they are not 3 | # copyright authors. For example, company employees may be listed 4 | # here because their company holds the copyright and is listed there. 5 | # 6 | # When adding J Random Contributor's name to this file, either J's 7 | # name or J's organization's name should be added to AUTHORS.txt 8 | # 9 | # Names should be added to this file as: 10 | # Name 11 | 12 | Corey Hu -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | SOURCES=$(shell python3 scripts/read-config.py --sources ) 2 | FAMILY=$(shell python3 scripts/read-config.py --family ) 3 | DRAWBOT_SCRIPTS=$(shell ls documentation/*.py) 4 | DRAWBOT_OUTPUT=$(shell ls documentation/*.py | sed 's/\.py/.png/g') 5 | 6 | help: 7 | @echo "###" 8 | @echo "# Build targets for $(FAMILY)" 9 | @echo "###" 10 | @echo 11 | @echo " make build: Builds the fonts and places them in the fonts/ directory" 12 | @echo " make test: Tests the fonts with fontbakery" 13 | @echo " make proof: Creates HTML proof documents in the proof/ directory" 14 | @echo " make images: Creates PNG specimen images in the documentation/ directory" 15 | @echo 16 | 17 | build: build.stamp 18 | 19 | venv: venv/touchfile 20 | 21 | venv-test: venv-test/touchfile 22 | 23 | build.stamp: venv .init.stamp sources/config.yaml $(SOURCES) 24 | rm -rf fonts 25 | (for config in sources/config*.yaml; do . venv/bin/activate; gftools builder $$config; done) && ./build_instances.sh && touch build.stamp 26 | 27 | .init.stamp: venv 28 | . venv/bin/activate; python3 scripts/first-run.py 29 | 30 | venv/touchfile: requirements.txt 31 | test -d venv || python3 -m venv venv 32 | . venv/bin/activate; pip install -Ur requirements.txt 33 | touch venv/touchfile 34 | 35 | venv-test/touchfile: requirements-test.txt 36 | test -d venv-test || python3 -m venv venv-test 37 | . venv-test/bin/activate; pip install -Ur requirements-test.txt 38 | touch venv-test/touchfile 39 | 40 | test: venv-test build.stamp 41 | . venv-test/bin/activate; mkdir -p out/ out/fontbakery; fontbakery check-googlefonts -l WARN --full-lists --succinct --badges out/badges --html out/fontbakery/fontbakery-report.html --ghmarkdown out/fontbakery/fontbakery-report.md $(shell find fonts/ttf -type f) || echo '::warning file=sources/config.yaml,title=Fontbakery failures::The fontbakery QA check reported errors in your font. Please check the generated report.' 42 | 43 | proof: venv build.stamp 44 | . venv/bin/activate; mkdir -p out/ out/proof; diffenator2 proof $(shell find fonts/ttf -type f) -o out/proof 45 | 46 | images: venv $(DRAWBOT_OUTPUT) 47 | 48 | %.png: %.py build.stamp 49 | . venv/bin/activate; python3 $< --output $@ 50 | 51 | clean: 52 | rm -rf venv 53 | find . -name "*.pyc" -delete 54 | 55 | update-project-template: 56 | npx update-template https://github.com/googlefonts/googlefonts-project-template/ 57 | 58 | update: 59 | pip install --upgrade $(dependency); pip freeze > requirements.txt -------------------------------------------------------------------------------- /OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright 2024 The Urbanist Project Authors (https://github.com/coreyhu/Urbanist) 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | http://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 | # Urbanist 6 | 7 | [![][Fontbakery]](https://coreyhu.github.io/Urbanist/fontbakery/fontbakery-report.html) 8 | [![][Universal]](https://coreyhu.github.io/Urbanist/fontbakery/fontbakery-report.html) 9 | [![][GF Profile]](https://coreyhu.github.io/Urbanist/fontbakery/fontbakery-report.html) 10 | [![][Outline Correctness]](https://coreyhu.github.io/Urbanist/fontbakery/fontbakery-report.html) 11 | [![][Shaping]](https://coreyhu.github.io/Urbanist/fontbakery/fontbakery-report.html) 12 | 13 | [Fontbakery]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fcoreyhu%2FUrbanist%2Fgh-pages%2Fbadges%2Foverall.json 14 | [GF Profile]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fcoreyhu%2FUrbanist%2Fgh-pages%2Fbadges%2FGoogleFonts.json 15 | [Outline Correctness]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fcoreyhu%2FUrbanist%2Fgh-pages%2Fbadges%2FOutlineCorrectnessChecks.json 16 | [Shaping]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fcoreyhu%2FUrbanist%2Fgh-pages%2Fbadges%2FShapingChecks.json 17 | [Universal]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fcoreyhu%2FUrbanist%2Fgh-pages%2Fbadges%2FUniversal.json 18 | 19 |

20 | 21 |

22 | 23 | Urbanist is a low-contrast, geometric sans-serif inspired by Modernist design and typography. The project was launched by Corey Hu in 2020 with 9 weights and accompanying italics. Conceived from elementary shapes, Urbanist's neutrality makes it a versatile display font for print and digital mediums. The font is currently available as a variable font with "Weight" and "Italic" axes. 24 | 25 | ### Download the latest release here 26 | #### Download Urbanist v1.303 on Google Fonts 27 | 28 |

29 | 30 |

31 | 32 | There are 9 predefined weights, each with an italic set. 33 | 34 | - Thin 35 | - ExtraLight 36 | - Light 37 | - Regular 38 | - Medium 39 | - SemiBold 40 | - Bold 41 | - ExtraBold 42 | - Black 43 | 44 | The variable font file utilizes 2 axes for tuning weight (100-900) and italics (0-1). 45 | 46 | 47 | ## Want to suggest an improvement? 48 | To suggest an improvement or fix, open an issue (please check if a similar issue exists first). If you have changes, open a pull request. See more details in CONTRIBUTING.md 49 | 50 | 51 | ## Build from source 52 | 53 | To build fonts from the source file, use the build command in your terminal: 54 | 1. Clone this repostory: `git clone https://github.com/coreyhu/Urbanist.git && cd Urbanist` 55 | 2. Use the build command: `make build` 56 | 3. Find the built font files in the `fonts/` directory 57 | 58 | ## Copyright 59 | 60 | Copyright (c) 2024, Corey Hu (corey@coreyhu.com) 61 | 62 | ## License 63 | 64 | This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: https://scripts.sil.org/OFL 65 | -------------------------------------------------------------------------------- /build_instances.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | fonttools varLib.instancer fonts/variable/Urbanist\[ital,wght\].ttf ital=0 -o fonts/variable/Urbanist\[wght\].ttf --update-name-table 4 | fonttools varLib.instancer fonts/variable/Urbanist\[ital,wght\].ttf ital=1 -o fonts/variable/Urbanist-Italic\[wght\].ttf --update-name-table 5 | -------------------------------------------------------------------------------- /documentation/DESCRIPTION.en_us.html: -------------------------------------------------------------------------------- 1 |

2 | Urbanist is a low-contrast, geometric sans-serif inspired by Modernist typography and design. The project was launched by Corey Hu in 2020 with 9 weights and accompanying italics. Conceived from elementary shapes, Urbanist's neutrality makes it a versatile display font for print and digital mediums. It is currently available as a variable font with "Weight" and "Italic" axes. To contribute, see github.com/coreyhu/Urbanist. 3 |

4 | -------------------------------------------------------------------------------- /documentation/image1.py: -------------------------------------------------------------------------------- 1 | # This script is meant to be run from the root level 2 | # of your font's git repository. For example, from a Unix terminal: 3 | # $ git clone my-font 4 | # $ cd my-font 5 | # $ python3 documentation/image1.py --output documentation/image1.png 6 | 7 | # Import moduels from external python packages: https://pypi.org/ 8 | from drawbot_skia.drawbot import * 9 | from fontTools.ttLib import TTFont 10 | from fontTools.misc.fixedTools import floatToFixedToStr 11 | 12 | # Import moduels from the Python Standard Library: https://docs.python.org/3/library/ 13 | import subprocess 14 | import sys 15 | import argparse 16 | 17 | # Constants, these are the main "settings" for the image 18 | WIDTH, HEIGHT, MARGIN, FRAMES = 2048, 2048, 128, 1 19 | FONT_PATH = "fonts/ttf/Urbanist-Regular.ttf" 20 | FONT_LICENSE = "OFL v1.1" 21 | AUXILIARY_FONT = "Helvetica" 22 | AUXILIARY_FONT_SIZE = 48 23 | BIG_TEXT = "Aa" 24 | BIG_TEXT_FONT_SIZE = 1024 25 | BIG_TEXT_SIDE_MARGIN = MARGIN * 3.1 26 | BIG_TEXT_BOTTOM_MARGIN = MARGIN * 5.5 27 | GRID_VIEW = False # Change this to "True" for a grid overlay 28 | 29 | # Handel the "--output" flag 30 | # For example: $ python3 documentation/image1.py --output documentation/image1.png 31 | parser = argparse.ArgumentParser() 32 | parser.add_argument("--output", metavar="PNG", help="where to write the PNG file") 33 | args = parser.parse_args() 34 | 35 | # Load the font with the parts of fonttools that are imported with the line: 36 | # from fontTools.ttLib import TTFont 37 | # Docs Link: https://fonttools.readthedocs.io/en/latest/ttLib/ttFont.html 38 | ttFont = TTFont(FONT_PATH) 39 | 40 | # Constants that are worked out dynamically 41 | MY_URL = subprocess.check_output("git remote get-url origin", shell=True).decode() 42 | MY_HASH = subprocess.check_output("git rev-parse --short HEAD", shell=True).decode() 43 | FONT_NAME = ttFont["name"].getDebugName(4) 44 | FONT_VERSION = "v%s" % floatToFixedToStr(ttFont["head"].fontRevision, 16) 45 | 46 | 47 | # Draws a grid 48 | def grid(): 49 | stroke(1, 0, 0, 0.75) 50 | strokeWidth(2) 51 | STEP_X, STEP_Y = 0, 0 52 | INCREMENT_X, INCREMENT_Y = MARGIN / 2, MARGIN / 2 53 | rect(MARGIN, MARGIN, WIDTH - (MARGIN * 2), HEIGHT - (MARGIN * 2)) 54 | for x in range(29): 55 | polygon((MARGIN + STEP_X, MARGIN), (MARGIN + STEP_X, HEIGHT - MARGIN)) 56 | STEP_X += INCREMENT_X 57 | for y in range(29): 58 | polygon((MARGIN, MARGIN + STEP_Y), (WIDTH - MARGIN, MARGIN + STEP_Y)) 59 | STEP_Y += INCREMENT_Y 60 | polygon((WIDTH / 2, 0), (WIDTH / 2, HEIGHT)) 61 | polygon((0, HEIGHT / 2), (WIDTH, HEIGHT / 2)) 62 | 63 | 64 | # Remap input range to VF axis range 65 | # This is useful for animation 66 | # (E.g. sinewave(-1,1) to wght(100,900)) 67 | def remap(value, inputMin, inputMax, outputMin, outputMax): 68 | inputSpan = inputMax - inputMin # FIND INPUT RANGE SPAN 69 | outputSpan = outputMax - outputMin # FIND OUTPUT RANGE SPAN 70 | valueScaled = float(value - inputMin) / float(inputSpan) 71 | return outputMin + (valueScaled * outputSpan) 72 | 73 | 74 | # Draw the page/frame and a grid if "GRID_VIEW" is set to "True" 75 | def draw_background(): 76 | newPage(WIDTH, HEIGHT) 77 | fill(0) 78 | rect(-2, -2, WIDTH + 2, HEIGHT + 2) 79 | if GRID_VIEW: 80 | grid() 81 | else: 82 | pass 83 | 84 | 85 | # Draw main text 86 | def draw_main_text(): 87 | fill(1) 88 | stroke(None) 89 | font(FONT_PATH) 90 | fontSize(BIG_TEXT_FONT_SIZE) 91 | # Adjust this line to center main text manually. 92 | # TODO: This should be done automatically when drawbot-skia 93 | # has support for textBox() and FormattedString 94 | #text(BIG_TEXT, ((WIDTH / 2) - MARGIN * 4.75, (HEIGHT / 2) - MARGIN * 2.5)) 95 | text(BIG_TEXT, (BIG_TEXT_SIDE_MARGIN, BIG_TEXT_BOTTOM_MARGIN)) 96 | 97 | 98 | # Divider lines 99 | def draw_divider_lines(): 100 | stroke(1) 101 | strokeWidth(4) 102 | lineCap("round") 103 | line((MARGIN, HEIGHT - MARGIN), (WIDTH - MARGIN, HEIGHT - MARGIN)) 104 | line((MARGIN, MARGIN + (MARGIN / 2)), (WIDTH - MARGIN, MARGIN + (MARGIN / 2))) 105 | stroke(None) 106 | 107 | 108 | # Draw text describing the font and it's git status & repo URL 109 | def draw_auxiliary_text(): 110 | # Setup 111 | font(AUXILIARY_FONT) 112 | fontSize(AUXILIARY_FONT_SIZE) 113 | POS_TOP_LEFT = (MARGIN, HEIGHT - MARGIN * 1.5) 114 | POS_TOP_RIGHT = (WIDTH - MARGIN, HEIGHT - MARGIN * 1.5) 115 | POS_BOTTOM_LEFT = (MARGIN, MARGIN) 116 | POS_BOTTOM_RIGHT = (WIDTH - MARGIN * 0.95, MARGIN) 117 | URL_AND_HASH = MY_URL + "at commit " + MY_HASH 118 | URL_AND_HASH = URL_AND_HASH.replace("\n", " ") 119 | # Draw Text 120 | text(FONT_NAME, POS_TOP_LEFT, align="left") 121 | text(FONT_VERSION, POS_TOP_RIGHT, align="right") 122 | text(URL_AND_HASH, POS_BOTTOM_LEFT, align="left") 123 | text(FONT_LICENSE, POS_BOTTOM_RIGHT, align="right") 124 | 125 | 126 | # Build and save the image 127 | if __name__ == "__main__": 128 | draw_background() 129 | draw_main_text() 130 | draw_divider_lines() 131 | draw_auxiliary_text() 132 | # Save output, using the "--output" flag location 133 | saveImage(args.output) 134 | # Print done in the terminal 135 | print("DrawBot: Done") 136 | -------------------------------------------------------------------------------- /documentation/readme/demo_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/documentation/readme/demo_1.png -------------------------------------------------------------------------------- /documentation/readme/demo_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/documentation/readme/demo_2.png -------------------------------------------------------------------------------- /documentation/readme/header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/documentation/readme/header.png -------------------------------------------------------------------------------- /documentation/readme/social_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/documentation/readme/social_preview.png -------------------------------------------------------------------------------- /documentation/readme/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/documentation/readme/title.png -------------------------------------------------------------------------------- /documentation/readme/variable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/documentation/readme/variable.png -------------------------------------------------------------------------------- /fonts/otf/Urbanist-Black.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-Black.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-BlackItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-BlackItalic.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-Bold.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-BoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-BoldItalic.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-ExtraBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-ExtraBold.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-ExtraBoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-ExtraBoldItalic.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-ExtraLight.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-ExtraLight.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-ExtraLightItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-ExtraLightItalic.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-Italic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-Italic.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-Light.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-LightItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-LightItalic.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-Medium.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-MediumItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-MediumItalic.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-Regular.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-SemiBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-SemiBold.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-SemiBoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-SemiBoldItalic.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-Thin.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-Thin.otf -------------------------------------------------------------------------------- /fonts/otf/Urbanist-ThinItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/otf/Urbanist-ThinItalic.otf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-Black.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-BlackItalic.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-Bold.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-BoldItalic.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-ExtraBold.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-ExtraLight.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-ExtraLightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-ExtraLightItalic.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-Italic.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-Light.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-LightItalic.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-Medium.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-MediumItalic.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-Regular.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-SemiBold.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-Thin.ttf -------------------------------------------------------------------------------- /fonts/ttf/Urbanist-ThinItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/ttf/Urbanist-ThinItalic.ttf -------------------------------------------------------------------------------- /fonts/variable/Urbanist-Italic[wght].ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/variable/Urbanist-Italic[wght].ttf -------------------------------------------------------------------------------- /fonts/variable/Urbanist[ital,wght].ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/variable/Urbanist[ital,wght].ttf -------------------------------------------------------------------------------- /fonts/variable/Urbanist[wght].ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/variable/Urbanist[wght].ttf -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-Black.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-BlackItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-BlackItalic.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-Bold.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-BoldItalic.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-ExtraBold.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-ExtraBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-ExtraBoldItalic.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-ExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-ExtraLight.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-ExtraLightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-ExtraLightItalic.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-Italic.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-Light.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-LightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-LightItalic.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-Medium.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-MediumItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-MediumItalic.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-Regular.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-SemiBold.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-SemiBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-SemiBoldItalic.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-Thin.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist-ThinItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist-ThinItalic.woff2 -------------------------------------------------------------------------------- /fonts/webfonts/Urbanist[ital,wght].woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coreyhu/Urbanist/549716453f76335ccc5a9e537cbe0da03d6fed34/fonts/webfonts/Urbanist[ital,wght].woff2 -------------------------------------------------------------------------------- /requirements-test.txt: -------------------------------------------------------------------------------- 1 | fontbakery[googlefonts]>=0.9.2 2 | gftools[qa]>=0.9.23 -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | absl-py==2.0.0 2 | afdko==4.0.0 3 | appdirs==1.4.4 4 | attrs==23.1.0 5 | axisregistry==0.4.5 6 | babelfont==3.0.1 7 | beautifulsoup4==4.12.2 8 | beziers==0.5.0 9 | blackrenderer==0.6.0 10 | booleanOperations==0.9.0 11 | Brotli==1.1.0 12 | bump2version==1.0.1 13 | bumpfontversion==0.4.1 14 | cattrs==23.2.3 15 | certifi==2023.11.17 16 | cffi==1.16.0 17 | cffsubr==0.2.9.post1 18 | charset-normalizer==3.3.2 19 | click==8.1.7 20 | cmarkgfm==2022.10.27 21 | collidoscope==0.6.5 22 | colorlog==6.8.0 23 | commandlines==0.4.1 24 | compreffor==0.5.5 25 | cryptography==41.0.7 26 | cu2qu==1.6.7.post2 27 | defcon==0.10.3 28 | dehinter==4.0.0 29 | Deprecated==1.2.14 30 | diffenator2==0.3.5 31 | docopt==0.6.2 32 | drawbot-skia==0.5.0 33 | exceptiongroup==1.2.0 34 | font-v==2.1.0 35 | fontbakery==0.10.8 36 | fontFeatures==1.8.0 37 | fontmake==3.7.1 38 | fontMath==0.9.3 39 | fontParts==0.12.1 40 | fontPens==0.2.4 41 | fonttools==4.46.0 42 | freetype-py==2.3.0 43 | fs==2.4.16 44 | gflanguages==0.5.13 45 | gftools==0.9.41 46 | gitdb==4.0.11 47 | GitPython==3.1.40 48 | glyphsets==0.6.11 49 | glyphsLib==6.6.0 50 | h11==0.14.0 51 | hyperglot==0.4.5 52 | idna==3.6 53 | Jinja2==3.1.2 54 | kurbopy==0.10.40 55 | lxml==4.9.3 56 | markdown-it-py==3.0.0 57 | MarkupSafe==2.1.3 58 | mdurl==0.1.2 59 | munkres==1.1.4 60 | MutatorMath==3.0.1 61 | nanoemoji==0.15.1 62 | ninja==1.11.1.1 63 | num2words==0.5.13 64 | numpy==1.26.2 65 | openstep-plist==0.3.1 66 | opentype-sanitizer==9.1.0 67 | opentypespec==1.9.1 68 | orjson==3.9.10 69 | outcome==1.3.0.post0 70 | packaging==23.2 71 | picosvg==0.22.1 72 | Pillow==10.1.0 73 | pip-api==0.0.30 74 | pngquant-cli==2.17.0.post5 75 | protobuf==3.20.3 76 | psautohint==2.4.0 77 | pyahocorasick==2.0.0 78 | pybind11==2.11.1 79 | pycairo==1.25.1 80 | pyclipper==1.3.0.post5 81 | pycparser==2.21 82 | pygit2==1.13.3 83 | PyGithub==2.1.1 84 | Pygments==2.17.2 85 | PyJWT==2.8.0 86 | PyNaCl==1.5.0 87 | pyparsing==3.1.1 88 | PySocks==1.7.1 89 | python-bidi==0.4.2 90 | python-dateutil==2.8.2 91 | PyYAML==6.0.1 92 | regex==2023.10.3 93 | requests==2.31.0 94 | resvg-cli==0.22.0.post3 95 | rich==13.7.0 96 | rstr==3.2.2 97 | selenium==4.16.0 98 | sh==2.0.6 99 | shaperglot==0.3.1 100 | six==1.16.0 101 | skia-pathops==0.8.0.post1 102 | skia-python==87.5 103 | smmap==5.0.1 104 | sniffio==1.3.0 105 | sortedcontainers==2.4.0 106 | soupsieve==2.5 107 | sre-yield==1.2 108 | statmake==0.6.0 109 | strictyaml==1.7.3 110 | stringbrewer==0.0.1 111 | tabulate==0.9.0 112 | termcolor==2.4.0 113 | toml==0.10.2 114 | tqdm==4.66.1 115 | trio==0.23.2 116 | trio-websocket==0.11.1 117 | ttfautohint-py==0.5.1 118 | typing_extensions==4.9.0 119 | ufo2ft==2.33.4 120 | ufoLib2==0.16.0 121 | ufolint==1.2.0 122 | ufonormalizer==0.6.1 123 | ufoProcessor==1.9.0 124 | uharfbuzz==0.37.3 125 | unicodedata2==15.1.0 126 | Unidecode==1.3.7 127 | urllib3==2.1.0 128 | vharfbuzz==0.2.0 129 | vttLib==0.12.0 130 | wrapt==1.16.0 131 | wsproto==1.2.0 132 | youseedee==0.3.0 133 | zopfli==0.2.3 134 | -------------------------------------------------------------------------------- /scripts/first-run.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # This script is run the first time any action is performed after the repository 4 | # is cloned. If you are reading this because the automatic initialization failed, 5 | # skip down to the section headed "INITIALIZATION STEPS". 6 | 7 | from sh import git 8 | import datetime 9 | import re 10 | import sys 11 | from urllib.parse import quote 12 | import subprocess 13 | 14 | BASE_OWNER = "coreyhu" 15 | BASE_REPONAME = "Urbanist" 16 | DUMMY_URL = "https://coreyhu.github.io/Urbanist" 17 | 18 | 19 | def repo_url(owner, name): 20 | return f"https://github.com/{owner}/{name}" 21 | 22 | 23 | def web_url(owner, name): 24 | return f"https://{owner}.github.io/{name}" 25 | 26 | 27 | def raw_url(owner, name): 28 | return f"https://raw.githubusercontent.com/{owner}/{name}" 29 | 30 | 31 | def touch(): 32 | open(".init.stamp", "w").close() 33 | 34 | 35 | def lose(msg, e=None): 36 | print(msg) 37 | print("You will need to do the initialization steps manually.") 38 | print("Read scripts/first-run.py for more instructions how to do this.") 39 | if e: 40 | print( 41 | "\nHere's an additional error message which may help diagnose the problem." 42 | ) 43 | raise e 44 | sys.exit(1) 45 | 46 | 47 | try: 48 | my_repo_url = git.remote("get-url", "origin") 49 | except Exception as e: 50 | lose("Could not use git to find my own repository URL", e) 51 | 52 | m = re.match(r"(?:https://github.com/|git@github.com:)(.*)/(.*)/?", str(my_repo_url)) 53 | if not m: 54 | lose( 55 | f"My git repository URL ({my_repo_url}) didn't look what I expected - are you hosting this on github?" 56 | ) 57 | 58 | owner, reponame = m[1], m[2] 59 | 60 | if owner == BASE_OWNER and reponame == BASE_REPONAME: 61 | print("I am being run on the upstream repository (probably due to CI)") 62 | print("All I'm going to do is create the touch file and quit.") 63 | touch() 64 | sys.exit() 65 | 66 | # INITIALIZATION STEPS 67 | 68 | # First, the README file contains URLs to pages in the `gh-pages` branch of the 69 | # repo. When initially cloned, these URLs will point to the 70 | # googlefonts/Unified-Font-Repository itself. But downstream users want links 71 | # and badges about their own font, not ours! So any URLs need to be adjusted to 72 | # refer to the end user's repository. 73 | 74 | # We will also pin the dependencies so future builds are reproducible. 75 | 76 | readme = open("README.md").read() 77 | 78 | print( 79 | "Fixing URLs:", web_url(BASE_OWNER, BASE_REPONAME), "->", web_url(owner, reponame) 80 | ) 81 | 82 | readme = readme.replace(web_url(BASE_OWNER, BASE_REPONAME), web_url(owner, reponame)) 83 | # In the badges, the URLs to raw.githubusercontent.com are URL-encoded as they 84 | # are passed to shields.io. 85 | print( 86 | "Fixing URLs:", 87 | quote(raw_url(BASE_OWNER, BASE_REPONAME), safe=""), 88 | "->", 89 | quote(raw_url(owner, reponame), safe=""), 90 | ) 91 | readme = readme.replace( 92 | quote(raw_url(BASE_OWNER, BASE_REPONAME), safe=""), 93 | quote(raw_url(owner, reponame), safe=""), 94 | ) 95 | 96 | print( 97 | "Fixing URLs:", 98 | DUMMY_URL, 99 | "->", 100 | web_url(owner, reponame), 101 | ) 102 | readme = readme.replace( 103 | f"`{DUMMY_URL}`", 104 | web_url(owner, reponame), 105 | ) 106 | 107 | with open("README.md", "w") as fh: 108 | fh.write(readme) 109 | 110 | # Fix the OFL 111 | 112 | ofl = open("OFL.txt").read() 113 | ofl = ofl.replace(web_url(BASE_OWNER, BASE_REPONAME), web_url(owner, reponame)) 114 | ofl = ofl.replace("My Font", reponame.title()) 115 | ofl = ofl.replace("20**", str(datetime.date.today().year)) 116 | with open("OFL.txt", "w") as fh: 117 | fh.write(ofl) 118 | 119 | # Pin the dependencies 120 | print("Pinning dependencies") 121 | dependencies = subprocess.check_output(["pip", "freeze"]) 122 | with open("requirements.txt", "wb") as dependency_file: 123 | dependency_file.write(dependencies) 124 | 125 | # Finally, we add a "touch file" called ".init.stamp" to the repository which 126 | # prevents this first-run process from being run again. 127 | touch() -------------------------------------------------------------------------------- /scripts/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | My Font development 7 | 8 | 9 |

My Font testing pages

10 | 18 | 19 | -------------------------------------------------------------------------------- /scripts/postprocess.py: -------------------------------------------------------------------------------- 1 | import re 2 | import os 3 | import glob 4 | import shutil 5 | from fontTools import ttLib 6 | from fontTools.varLib import instancer 7 | from fontTools.ttLib import TTFont 8 | from fontTools.ttLib.ttFont import newTable 9 | from fontbakery.constants import MacStyle, FsSelection, NameID, PlatformID, WindowsEncodingID, WindowsLanguageID, MacintoshEncodingID, MacintoshLanguageID 10 | 11 | def fix_italic_angle(ttFont, angle=-8.0): 12 | post = ttLib.getTableClass("post")() 13 | post.decompile(ttFont.getTableData("post"), ttFont) 14 | post.italicAngle = angle 15 | ttFont['post'] = post 16 | 17 | 18 | def add_avar_table(ttFont): 19 | avar = newTable("avar") 20 | avar.segments = { 21 | "wght": { 22 | -1.0: -1.0, 23 | 0: 0, 24 | 1.0: 1.0 25 | }, 26 | "ital": { 27 | -1.0: -1.0, 28 | 0: 0, 29 | 1.0: 1.0 30 | } 31 | } 32 | ttFont['avar'] = avar 33 | 34 | def fix_postscript_names(ttFont, ps_nameids, prefix): 35 | 36 | ttFont['name'].setName( 37 | prefix, 38 | 25, 39 | PlatformID.WINDOWS, 40 | WindowsEncodingID.UNICODE_BMP, 41 | WindowsLanguageID.ENGLISH_USA 42 | ) 43 | 44 | ttFont['name'].setName( 45 | prefix, 46 | 25, 47 | PlatformID.MACINTOSH, 48 | MacintoshEncodingID.ROMAN, 49 | MacintoshLanguageID.ENGLISH 50 | ) 51 | 52 | for nameid in ps_nameids: 53 | cur_name = ttFont['name'].getName( 54 | nameid, 55 | PlatformID.WINDOWS, 56 | WindowsEncodingID.UNICODE_BMP, 57 | WindowsLanguageID.ENGLISH_USA 58 | ) 59 | suffix = str(cur_name).split("-")[-1] 60 | if suffix != "Italic" and suffix.endswith("Italic"): 61 | suffix = suffix[:-6] 62 | 63 | if suffix == "": 64 | suffix = "Regular" 65 | 66 | new_name = "{}-{}".format(prefix, suffix) 67 | print("Renaming instance {} to {}".format(str(cur_name), new_name)) 68 | 69 | ttFont['name'].setName( 70 | new_name, 71 | nameid, 72 | PlatformID.WINDOWS, 73 | WindowsEncodingID.UNICODE_BMP, 74 | WindowsLanguageID.ENGLISH_USA 75 | ) 76 | 77 | ttFont['name'].setName( 78 | new_name, 79 | nameid, 80 | PlatformID.MACINTOSH, 81 | MacintoshEncodingID.ROMAN, 82 | MacintoshLanguageID.ENGLISH 83 | ) 84 | 85 | 86 | if __name__ == "__main__": 87 | 88 | roman_path = "../fonts/variable/Urbanist[wght].ttf" 89 | with open(roman_path, "rb") as f: 90 | # Fix roman postscript names 91 | ttFont = TTFont(f) 92 | ps_nameids = [instance.postscriptNameID for instance in ttFont['fvar'].instances] 93 | fix_postscript_names(ttFont, ps_nameids, "Urbanist") 94 | 95 | # Fix OS/2.fsSelection bit 7 96 | 97 | 98 | ttFont.save(roman_path) 99 | 100 | 101 | 102 | italic_path = "../fonts/variable/Urbanist-Italic[wght].ttf" 103 | with open(italic_path, "rb") as f: 104 | # Fix italic postscript names 105 | ttFont = TTFont(f) 106 | ps_nameids = [instance.postscriptNameID for instance in ttFont['fvar'].instances] 107 | fix_postscript_names(ttFont, ps_nameids, "UrbanistItalic") 108 | 109 | # Fix OS/2.fsSelection bit 7 110 | 111 | ttFont.save(italic_path) 112 | 113 | 114 | for font_path in glob.glob("../fonts/variable/Urbanist-Italic*.ttf"): 115 | # set windows subfamily name to Italic in name table 116 | # For Urbanist-Italic, set ttFont["head"].macStyle = MacStyle.ITALIC 117 | # Change OS/2.fsSelection to 0x0081 118 | with open(font_path, "rb") as f: 119 | print("Fix italic naming in {}".format(font_path)) 120 | ttFont = TTFont(f) 121 | ttFont["head"].macStyle = MacStyle.ITALIC 122 | ttFont['OS/2'].fsSelection = FsSelection.USETYPOMETRICS | FsSelection.ITALIC 123 | ttFont.save(font_path) 124 | -------------------------------------------------------------------------------- /scripts/read-config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # Yes, this is a Bad YAML Parser, but at this stage we are not in the 3 | # venv and do not know what modules the user has available, so for 4 | # maximum compatibility, we are just assuming a plain Python distribution. 5 | import argparse 6 | import re 7 | import sys 8 | import os 9 | 10 | parser = argparse.ArgumentParser() 11 | group = parser.add_mutually_exclusive_group(required=True) 12 | group.add_argument("--sources", action="store_true") 13 | group.add_argument("--family", action="store_true") 14 | args = parser.parse_args() 15 | 16 | with open(os.path.join("sources", "config.yaml")) as config: 17 | data = config.read() 18 | 19 | if args.family: 20 | m = re.search(r"(?m)^familyName: (.*)", data) 21 | if m: 22 | print(m[1]) 23 | sys.exit(0) 24 | else: 25 | print("Could not determine family name from config file!") 26 | sys.exit(1) 27 | 28 | toggle = False 29 | sources = [] 30 | for line in data.splitlines(): 31 | if re.match("^sources:", line): 32 | toggle = True 33 | continue 34 | if toggle: 35 | m = re.match(r"^\s*-\s*(.*)", line) 36 | if m: 37 | sources.append("sources/" + m[1]) 38 | else: 39 | toggle = False 40 | if sources: 41 | print(" ".join(sources)) 42 | sys.exit(0) 43 | else: 44 | print("Could not determine sources from config file!") 45 | sys.exit(1) -------------------------------------------------------------------------------- /sources/config.yaml: -------------------------------------------------------------------------------- 1 | sources: 2 | - Urbanist.glyphs 3 | axisOrder: 4 | - wght 5 | - ital 6 | familyName: Urbanist 7 | --------------------------------------------------------------------------------