Alternates $ 0 1 l LineHeight XS S M L XL Tracking Tight ½Tight Normal ½Loose Loose Ligatures On Off Download Monoisome GitHub

Theme White Light Dark Black Example test c py swift js less html

Instructions, supported editors, fontlog (versions, dates, authors + roadmap) and more in the readme .

Contribute on GitHub . Please report any bugs/issues. Libre licenses .

Images . I'm writing about it on Medium and others have found it interesting too.

Can be turned off <!-- --> > < <=> <==> ==> <== >>= =<< -- := =:= == !== != <= >= // /** /* */ && .& || !! :: >> << ¯\_(ツ)_/¯ __ ___ .. ...

Monoid + Font Awesome = Monoisome. See the icons directly in your code. <i class="fa fa-thumbs-o-up"></i> becomes <i class="fa fa-thumbs-o-up"></i> Test it in the "test" example.

Monoid comes in regular, bold, oblique and retina versions with >750 latin, greek, cyrillic, ligature, alternate and Powerline glyphs.

Semi-condensed and distinguishable glyphs with short ascenders + descenders, big apertures and supersized operators + punctuation.

Monoid is customizable and optimized for coding with bitmap-like sharpness at 12px/9pt even on low res displays.

import Foundation private class GCD { class func mainQueue () -> dispatch_queue_t { return dispatch_get_main_queue() } class func userInteractiveQueue () -> dispatch_queue_t { return dispatch_get_global_queue( QOS_CLASS_USER_INTERACTIVE , 0 ) } class func userInitiatedQueue () -> dispatch_queue_t { return dispatch_get_global_queue( QOS_CLASS_USER_INITIATED , 0 ) } class func utilityQueue () -> dispatch_queue_t { return dispatch_get_global_queue( QOS_CLASS_UTILITY , 0 ) } class func backgroundQueue () -> dispatch_queue_t { return dispatch_get_global_queue( QOS_CLASS_BACKGROUND , 0 ) } } public struct Async { private let block: dispatch_block_t private init ( _ block: dispatch_block_t) { self .block = block } } public extension Async { private static func async (block: dispatch_block_t, inQueue queue: dispatch_queue_t) -> Async { let _block = dispatch_block_create( DISPATCH_BLOCK_INHERIT_QOS_CLASS , block) dispatch_async(queue, _block) return Async (_block) } static func main (block: dispatch_block_t) -> Async { return Async .async(block, inQueue: GCD .mainQueue()) } static func userInteractive (block: dispatch_block_t) -> Async { return Async .async(block, inQueue: GCD .userInteractiveQueue()) } static func userInitiated (block: dispatch_block_t) -> Async { return Async .async(block, inQueue: GCD .userInitiatedQueue()) } static func utility (block: dispatch_block_t) -> Async { return Async .async(block, inQueue: GCD .utilityQueue()) } static func background (block: dispatch_block_t) -> Async { return Async .async(block, inQueue: GCD .backgroundQueue()) } static func customQueue (queue: dispatch_queue_t, block: dispatch_block_t) -> Async { return Async .async(block, inQueue: queue) } private static func after (seconds: Double, block: dispatch_block_t, inQueue queue: dispatch_queue_t) -> Async { let nanoSeconds = Int64 (seconds * Double ( NSEC_PER_SEC )) let time = dispatch_time( DISPATCH_TIME_NOW , nanoSeconds) return at(time, block: block, inQueue: queue) } private static func at (time: dispatch_time_t, block: dispatch_block_t, inQueue queue: dispatch_queue_t) -> Async { let _block = dispatch_block_create( DISPATCH_BLOCK_INHERIT_QOS_CLASS , block) dispatch_after(time, queue, _block) return Async (_block) } static func main (#after: Double, block: dispatch_block_t) -> Async { return Async .after(after, block: block, inQueue: GCD .mainQueue()) } static func userInteractive (#after: Double, block: dispatch_block_t) -> Async { return Async .after(after, block: block, inQueue: GCD .userInteractiveQueue()) } static func userInitiated (#after: Double, block: dispatch_block_t) -> Async { return Async .after(after, block: block, inQueue: GCD .userInitiatedQueue()) } static func utility (#after: Double, block: dispatch_block_t) -> Async { return Async .after(after, block: block, inQueue: GCD .utilityQueue()) } static func background (#after: Double, block: dispatch_block_t) -> Async { return Async .after(after, block: block, inQueue: GCD .backgroundQueue()) } static func customQueue (#after: Double, queue: dispatch_queue_t, block: dispatch_block_t) -> Async { return Async .after(after, block: block, inQueue: queue) } }

lang( af, "Voix ambiguë d'un cœur qui, au zéphyr, préfère les jattes de kiwis." ) lang( bg, "Щурчо Цоньо хапваше ловджийско кюфте с бяла гъмза." ) lang( cz, "Příliš žluťoučký kůň úpěl ďábelské ódy." ) lang( de, "Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich." ) lang( dk, "Høj bly gom vandt fræk sexquiz på wc." ) lang( ee, "Põdur Zagrebi tšellomängija-följetonist Ciqo külmetas kehvas garaažis." ) lang( fi, "Charles Darwin jammaili Åken hevixylofonilla Qatarin yöpub Zeligissä." ) lang( fro, "Je puis mangier del voirre. Ne me nuit." ) lang( ga, "Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig." ) lang( gd, "S urrainn dhomh gloinne ithe; cha ghoirtich i mi." ) lang( gl, "Eu podo xantar cristais e non cortarme." ) lang( gr, "Ταχίστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός." ) lang( gv, "Foddym gee glonney agh cha jean eh gortaghey mee." ) lang( haw, "Hiki iaʻu ke ʻai i ke aniani; ʻaʻole nō lā au e ʻeha." ) lang( hr, "Gojazni đačić s biciklom drži hmelj i finu vatu u džepu nošnje." ) lang( hu, "Jó foxim és don Quijote húszwattos lámpánál ülve egy pár bűvös cipőt készít." ) lang( is, "Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa" ) lang( it, "Ma la volpe, col suo balzo, ha raggiunto il quieto Fido." ) lang( jam, "Chruu, a kwik di kwik brong fox a jomp huova di liezi daag de, yu no siit?" ) lang( jbo, ".o'i mu xagji sofybakni cu zvati le purdi" ) lang( jv, "Aku isa mangan beling tanpa lara." ) lang( kw, "Mý a yl dybry gwéder hag éf ny wra ow ankenya." ) lang( la, "Sic surgens, dux, zelotypos quam karus haberis" ) lang( lt, "Įlinkdama fechtuotojo špaga sublykčiojusi pragręžė apvalų arbūzą." ) lang( lv, "Sarkanās jūrascūciņas peld pa jūru." ) lang( map , "E koʻana e kai i te karahi, mea ʻā, ʻaʻe hauhau." ) lang( mk, "Можам да јадам стакло, а не ме штета." ) lang( ms, "Saya boleh makan kaca dan ia tidak mencederakan saya." ) lang( nap, "M' pozz magna' o'vetr, e nun m' fa mal." ) lang( nb, "Vår sære Zulu fra badeøya spilte jo whist og quickstep i min taxi." ) lang( nl, "Pa's wijze lynx bezag vroom het fikse aquaduct." ) lang( nn, "Eg kan eta glas utan å skada meg." ) lang( no, "Vår sære Zulu fra badeøya spilte jo whist og quickstep i min taxi." ) lang( nv, "Tsésǫʼ yishą́ągo bííníshghah dóó doo shił neezgai da." ) lang( oc, "Pòdi manjar de veire, me nafrariá pas." ) lang( pcd, "Ch'peux mingi du verre, cha m'foé mie n'ma." ) lang( pl, "Pchnąć w tę łódź jeża lub ośm skrzyń fig." ) lang( pt, "Luís argüia à Júlia que «brações, fé, chá, óxido, pôr, zângão» eram palavras do português." ) lang( pt - br, "À noite, vovô Kowalsky vê o ímã cair no pé do pingüim queixoso e vovó põe açúcar no chá de tâmaras do jabuti feliz." ) lang( ro, "Fumegând hipnotic sașiul azvârle mreje în bălți." ) lang( ru, "В чащах юга жил бы цитрус? Да, но фальшивый экземпляр!" ) lang( scn, "Puotsu mangiari u vitru, nun mi fa mali." ) lang( sk, "Starý kôň na hŕbe kníh žuje tíško povädnuté ruže, na stĺpe sa ďateľ učí kvákať novú ódu o živote." ) lang( sl, "Šerif bo za vajo spet kuhal domače žgance." ) lang( sq, "Unë mund të ha qelq dhe nuk më gjen gjë." ) lang( sr, "Чешће цeђење мрeжастим џаком побољшава фертилизацију генских хибрида." ) # if 0 lang( sr - [email protected] latin, "Češće ceđenje mrežastim džakom poboljšava fertilizaciju genskih hibrida." ) # endif lang( sv, "Flygande bäckasiner söka strax hwila på mjuka tuvor." ) lang( swg, "I kå Glas frässa, ond des macht mr nix!" ) lang( tl, "Kaya kong kumain nang bubog at hindi ako masaktan." ) lang( tr, "Pijamalı hasta yağız şoföre çabucak güvendi." ) lang( tw, "Metumi awe tumpan, ɜnyɜ me hwee." ) lang( ua, "Чуєш їх, доцю, га? Кумедна ж ти, прощайся без ґольфів!" ) lang( vec, "Mi posso magnare el vetro, no'l me fa mae." ) lang( wa, "Dji pou magnî do vêre, çoula m' freut nén må." ) lang( yo, "Mo lè je̩ dígí, kò ní pa mí lára." ) lang( zlm, "Saya boleh makan kaca dan ia tidak mencederakan saya." )

+ function ($) { 'use strict' ; var dismiss = '[data-dismiss="alert"]' var Alert = function (el) { $(el).on( 'click' , dismiss, this .close) } Alert.VERSION = '3.3.4' Alert.TRANSITION_DURATION = 150 Alert.prototype.close = function (e) { var $ this = $( this ) var selector = $ this .attr( 'data-target' ) if (!selector) { selector = $ this .attr( 'href' ) selector = selector && selector.replace( /.*(?=#[^\s]*$)/ , '' ) } var $parent = $(selector) if (e) e.preventDefault() if (!$parent.length) { $parent = $ this .closest( '.alert' ) } $parent.trigger(e = $.Event( 'close.bs.alert' )) if (e.isDefaultPrevented()) return $parent.removeClass( 'in' ) function removeElement () { $parent.detach().trigger( 'closed.bs.alert' ).remove() } $.support.transition && $parent.hasClass( 'fade' ) ? $parent .one( 'bsTransitionEnd' , removeElement) .emulateTransitionEnd(Alert.TRANSITION_DURATION) : removeElement() } function Plugin (option) { return this .each( function () { var $ this = $( this ) var data = $ this .data( 'bs.alert' ) if (!data) $ this .data( 'bs.alert' , (data = new Alert( this ))) if ( typeof option == 'string' ) data[option].call($ this ) }) } var old = $.fn.alert $.fn.alert = Plugin $.fn.alert.Constructor = Alert $.fn.alert.noConflict = function () { $.fn.alert = old return this } $( document ).on( 'click.bs.alert.data-api' , dismiss, Alert.prototype.close) }(jQuery);

.btn { display : inline-block; margin-bottom : 0 ; font-weight : @btn-font-weight ; text-align : center; vertical-align : middle; touch-action : manipulation; cursor : pointer; background-image : none; border : 1px solid transparent; white-space : nowrap; .button-size ( @padding-base-vertical ; @padding-base-horizontal ; @font-size-base ; @line-height-base ; @border-radius-base ); .user-select (none); & , & :active , & .active { & :focus , & .focus { .tab-focus (); } } & :hover , & :focus , & .focus { color : @btn-default-color ; text-decoration : none; } & :active , & .active { outline : 0 ; background-image : none; .box-shadow (inset 0 3px 5px rgba ( 0 , 0 , 0 ,. 125 )); } & .disabled , & [disabled] , fieldset [disabled] & { cursor : @cursor-disabled ; .opacity (. 65 ); .box-shadow (none); } a & { & .disabled , fieldset [disabled] & { pointer-events : none; } } } .btn-default { .button-variant ( @btn-default-color ; @btn-default-bg ; @btn-default-border ); } .btn-primary { .button-variant ( @btn-primary-color ; @btn-primary-bg ; @btn-primary-border ); } .btn-success { .button-variant ( @btn-success-color ; @btn-success-bg ; @btn-success-border ); } .btn-info { .button-variant ( @btn-info-color ; @btn-info-bg ; @btn-info-border ); } .btn-warning { .button-variant ( @btn-warning-color ; @btn-warning-bg ; @btn-warning-border ); } .btn-danger { .button-variant ( @btn-danger-color ; @btn-danger-bg ; @btn-danger-border ); } .btn-link { color : @link-color ; font-weight : normal; border-radius : 0 ; & , & :active , & .active , & [disabled] , fieldset [disabled] & { background-color : transparent; .box-shadow (none); } & , & :hover , & :focus , & :active { border-color : transparent; } & :hover , & :focus { color : @link-hover-color ; text-decoration : @link-hover-decoration ; background-color : transparent; } & [disabled] , fieldset [disabled] & { & :hover , & :focus { color : @btn-link-disabled-color ; text-decoration : none; } } } .btn-lg { .button-size ( @padding-large-vertical ; @padding-large-horizontal ; @font-size-large ; @line-height-large ; @border-radius-large ); } .btn-sm { .button-size ( @padding-small-vertical ; @padding-small-horizontal ; @font-size-small ; @line-height-small ; @border-radius-small ); } .btn-xs { .button-size ( @padding-xs-vertical ; @padding-xs-horizontal ; @font-size-small ; @line-height-small ; @border-radius-small ); } .btn-block { display : block; width : 100% ; } .btn-block + .btn-block { margin-top : 5px ; } input [type="submit"] , input [type="reset"] , input [type="button"] { & .btn-block { width : 100% ; } }

import fontforge from itertools import compress from os.path import basename, splitext, join def style (name, does) : try : does = list(does) except TypeError: does = [does] if type(does) is not list: does = list(does) option(name, name, [Variation(name)] + does) return name def option (abrv, name, does) : option.operations[abrv] = does option.count += 1 for permutation in option.permutations: permutation.append(abrv) return abrv option.operations = {} option.count = 0 option.permutations = [[]] def conflicting (*args) : permutations = option.permutations for arg in args: for p in permutations: p.pop() option.count -= len(args) - 1 option.permutations = [ p + [arg] for p in permutations for arg in args ] def walk (walker) : bitmap_max = 1 << option.count for i in xrange(bitmap_max): bitmap = map( lambda n: i >> n & 1 , xrange(option.count)) last = None for p in option.permutations: current = list(compress(p, bitmap)) if current == last: break last = current walker(current) def build (outdir, font) : fnt = fontforge.open(join(source, font)) name = join(outdir, splitext(basename(font))[ 0 ]) for opt in opts: name += '-' + str(opt) fnt.generate(name + ".ttf" ) fnt.close() def Bearing (left= 0 , right= 0 ) : def op (fnt) : fnt.genericGlyphChange( hCounterType= "nonUniform" , hCounterScale= 1.0 , lsbScale= 1.0 , rsbScale= 1.0 , lsbAdd=left, rsbAdd=right) return op def Swap (glyph1, glyph2) : def op (fnt) : fnt.selection.select(glyph1) fnt.copy() fnt.selection.select( 127 ) fnt.paste() fnt.selection.select(glyph2) fnt.copy() fnt.selection.select(glyph1) fnt.paste() fnt.selection.select( 127 ) fnt.copy() fnt.selection.select(glyph2) fnt.paste() fnt.selection.select( 127 ) fnt.clear() return op def Variation (name) : def op (fnt) : basename = f.fontname.split( '-' )[ 0 ] fontname = [basename] + name.split() f.fontname = '-' .join(fontname) f.fullname = ' ' .join(fontname) return op