diff --git a/examples/common.nim b/examples/common.nim index 17ca731..c1eb738 100644 --- a/examples/common.nim +++ b/examples/common.nim @@ -1,5 +1,7 @@ +import options import os import nanovg +import icons type StyleConfig* = ref object @@ -8,10 +10,19 @@ type cornerRadiusBottomLeft*: float cornerRadiusBottomRight*: float + paddingLeft*: float + paddingRight*: float + paddingBottom*: float + paddingTop*: float + + icon*: Option[Icon] + iconFont*: string + fontBlur*: float font*: string fontSize*: float fontColor*: Color + hasFontShadow*: bool fontShadowColor*: Color fontShadowXOffset*: float fontShadowYOffset*: float @@ -26,8 +37,8 @@ type highlightWidth*: float fillColor*: Color - fillOverlay*: Paint - + gradientStartColor*: Color + gradientEndColor*: Color WindowConfig* = object cornerRadiusTopLeft*: float @@ -35,27 +46,6 @@ type cornerRadiusBottomLeft*: float cornerRadiusBottomRight*: float -let DEFAULT_BUTTON_STYLE = StyleConfig( - cornerRadiusTopLeft: 3.0, - cornerRadiusTopRight: 3.0, - cornerRadiusBottomLeft: 3.0, - cornerRadiusBottomRight: 3.0, - fontBlur: 0.0, - font: "sans", - fontSize: 20.0, - fontColor: rgba(255, 255, 255, 160), - fontShadowColor: rgba(0, 0, 0, 60) -) - - -# To see icons in code, use a nerd font -const ICON_TRASH* = "" -const ICON_SEARCH* = "🔍" -const ICON_CIRCLED_CROSS* = "✖" -const ICON_CHEVRON_RIGHT* = "\uE75E" -const ICON_CHECK* = "✓" -const ICON_LOGIN* = "\uE740" - proc currentSourceDir*(): string {.inline.} = return currentSourcePath.parentDir() @@ -136,6 +126,62 @@ proc cpToUtf8*(code: int): string = return res +let Colors: tuple[Red, Green, Blue, Yellow, Orange, Purple, White, Grey, Black: Color] = + ( + Red: rgb(231, 64, 74), + Green: rgb(40, 184, 115), + Blue: rgb(43, 183, 209), + Yellow: rgb(243, 203, 57), + Orange: rgb(255, 130, 76), + Purple: rgb(97, 18, 204), + White: rgb(255, 255, 255), + Grey: rgb(129, 110, 96), + Black: rgb(0, 0, 0) + ) + +proc defaultButtonStyle(fillColor: Color): StyleConfig {.inline.} = + StyleConfig( + cornerRadiusTopLeft: 3.0, + cornerRadiusTopRight: 3.0, + cornerRadiusBottomLeft: 3.0, + cornerRadiusBottomRight: 3.0, + paddingLeft: 10.0, + paddingRight: 10.0, + paddingTop: 5.0, + paddingBottom: 5.0, + iconFont: "fa", + fontBlur: 0.0, + font: "sans-bold", + fontSize: 20.0, + fontColor: rgba(255, 255, 255, 160), + hasFontShadow: true, + fontShadowColor: rgba(0, 0, 0, 160), + fontShadowXOffset: 0.0, + fontShadowYOffset: 1.0, + highlightColor: rgba(255, 255, 255, 100), + highlightWidth: 0.5, + hasShadow: true, + shadowColor: rgba(0, 0, 0, 90), + shadowXOffset: 3.0, + shadowYOffset: 3.0, + gradientStartColor: rgba(255, 255, 255, if fillColor.isBlack: 16 else: 32), + gradientEndColor: rgba(0, 0, 0, if fillColor.isBlack: 16 else: 32), + textAlignments: @[Alignment.Center, Alignment.Middle] + ) + +let DefaultButtonStyles: tuple[Red, Green, Blue, Yellow, Orange, Purple, White, Grey, Black: StyleConfig] = + ( + Red: defaultButtonStyle(Colors.Red), + Green: defaultButtonStyle(Colors.Green), + Blue: defaultButtonStyle(Colors.Blue), + Yellow: defaultButtonStyle(Colors.Yellow), + Orange: defaultButtonStyle(Colors.Orange), + Purple: defaultButtonStyle(Colors.Purple), + White: defaultButtonStyle(Colors.White), + Grey: defaultButtonStyle(Colors.Grey), + Black: defaultButtonStyle(Colors.Black) + ) + proc drawButton*(vg: Context, text: string, x, y, width, height: float) = let bg = vg.linearGradient( x, y, x, y+height, @@ -172,8 +218,69 @@ proc drawButton*(vg: Context, text: string, x, y, width, height: float) = vg.pathLineTo(x+width-(radius), y+lightWidth+1) vg.pathStroke() +proc drawButton*(vg: Context, text: string, x, y: float, style: StyleConfig = DefaultButtonStyles.Blue) = -proc drawButton*(vg: Context, preicon: string, text: string, x, y, w, h: float, color: Color) = + vg.setFontSize(style.fontSize) + vg.setFont(style.font) + let textBounds = vg.textBounds(text, 0.0, 0.0) + let textWidth = textBounds.horizontalAdvance + let height = (textBounds.bounds.ymax - textBounds.bounds.ymin) + style.paddingTop + style.paddingBottom + + vg.setFontSize(height * 0.5) + vg.setFont(style.iconFont) + let iconBounds = vg.textBounds($style.icon, 0, 0) + var iconWidth = iconBounds.horizontalAdvance + # iconWidth += height*0.15 + + let width = textWidth + iconWidth + style.paddingLeft + style.paddingRight + + let bg = vg.linearGradient( + x, y, x, y+height, + style.gradientStartColor, + style.gradientEndColor + ) + + let color = style.fillColor + let shadowColor = style.shadowColor + let lightWidth = style.highlightWidth + + if style.hasShadow: + vg.beginPath() + vg.pathRoundedRect( + x+1+style.shadowXOffset, + y+1+style.shadowYOffset, + width-2, height-2, + style.cornerRadiusTopLeft, style.cornerRadiusTopRight, + style.cornerRadiusBottomRight, style.cornerRadiusBottomLeft + ) + vg.setFillColor(style.shadowColor) + vg.pathFill() + + vg.beginPath() + vg.pathRoundedRect( + x+1, y+1, width-2, height-2, + style.cornerRadiusTopLeft, style.cornerRadiusTopRight, + style.cornerRadiusBottomRight, style.cornerRadiusBottomLeft + ) + vg.setFillColor(style.fillColor) + vg.pathFill() + + vg.setFillPaint(bg) + vg.pathFill() + + vg.beginPath() + vg.pathMoveTo(x+style.cornerRadiusBottomLeft, y+lightWidth+1) + vg.setStrokeWidth(lightWidth) + vg.setStrokeColor(style.highlightColor) + vg.pathLineTo(x+width-(style.cornerRadiusBottomLeft), y+lightWidth+1) + vg.pathStroke() + + vg.setFont(style.font) + vg.textAlign(style.textAlignments) + vg.setFillColor(style.fontColor) + vg.text(text, x + width, y + height - 1) + +proc drawButton*(vg: Context, preicon: Icon, text: string, x, y, w, h: float, color: Color) = var bg: Paint @@ -211,7 +318,7 @@ proc drawButton*(vg: Context, preicon: string, text: string, x, y, w, h: float, vg.setFontSize(h*0.5) vg.setFont("fa") - ib = vg.textBounds(preicon, 0, 0) + ib = vg.textBounds($preicon, 0, 0) iw = ib.horizontalAdvance iw += h*0.15 @@ -219,7 +326,7 @@ proc drawButton*(vg: Context, preicon: string, text: string, x, y, w, h: float, vg.setFont("fa") vg.setFillColor(rgba(255,255,255,96)) vg.textAlign("left middle") - vg.text(preicon, x+w*0.5-tw*0.5-iw*0.75, y+h*0.5) + vg.text($preicon, x+w*0.5-tw*0.5-iw*0.75, y+h*0.5) vg.setFontSize(20.0) vg.setFont("sans-bold") @@ -242,7 +349,7 @@ proc drawSearchBox*(vg: Context, text: string, x, y, w, h: float) = vg.setFont("icons") vg.setFillColor(rgba(255,255,255,64)) vg.textAlign("center middle") - vg.text(ICON_SEARCH, x+h*0.55f, y+h*0.55f) + vg.text($Icon.Search, x+h*0.55f, y+h*0.55f) vg.setFontSize(20.0f) vg.setFont("sans") @@ -255,4 +362,4 @@ proc drawSearchBox*(vg: Context, text: string, x, y, w, h: float) = vg.setFont("icons") vg.setFillColor(rgba(255,255,255,32)) vg.textAlign("center middle") - vg.text(ICON_CIRCLED_CROSS, x+w-h*0.55f, y+h*0.55f) + vg.text($Icon.TimesCircle, x+w-h*0.55f, y+h*0.55f) diff --git a/examples/demo.nim b/examples/demo.nim index 0511d94..8f2abf1 100644 --- a/examples/demo.nim +++ b/examples/demo.nim @@ -3,6 +3,7 @@ import nanovg import glfw, glew import perf import common +import icons proc frameBufferSize*(window: ptr Window): tuple[w, h: int32] = var fbWidth, fbHeight: cint @@ -17,7 +18,6 @@ proc size*(window: ptr Window): tuple[w, h: int32] = return (w: width, h: height) proc main = - let fps = newGraph(RenderStyle.FPS, "Frame Time") cpuGraph = newGraph(RenderStyle.MS, "CPU Time") @@ -67,9 +67,9 @@ proc main = let x = vg.glyphPositions("Some仮名thing is up", 0, 0) vg.drawWindow("Title", 50, 50, 300, 400) vg.drawLabel("Hello!", 10, 10, 280, 20) - vg.drawButton(ICON_TRASH, "Delete", 100, 200, 160, 28, rgba(128, 16, 8, 255)) - vg.drawButton(ICON_TRASH, "Deleter", 100, 250, 160, 28, rgba(12, 130, 80, 255)) - vg.drawButton("Testing", 100, 300, 160, 28) + vg.drawButton(Icon.Trash, "Delete", 100, 200, 160, 28, rgba(128, 16, 8, 255)) + vg.drawButton(Icon.Trash, "Deleter", 100, 250, 160, 28, rgba(12, 130, 80, 255)) + vg.drawButton("Testing", 100, 300) vg.render(fps, 5, 5) vg.render(cpuGraph, 210, 5) diff --git a/examples/demo_sdl2.nim b/examples/demo_sdl2.nim index 412023c..bbc9dc1 100644 --- a/examples/demo_sdl2.nim +++ b/examples/demo_sdl2.nim @@ -5,6 +5,7 @@ import os import nanovg import perf import common +import icons proc events(): bool = result = false @@ -92,8 +93,8 @@ proc main() = vg.text("Some仮名thing is up", 100, 100, 100) vg.drawWindow("Title", 50, 50, 300, 400) vg.drawLabel("Hello!", 10, 10, 280, 20) - vg.drawButton(ICON_TRASH, "Delete", 100, 200, 160, 28, rgba(128, 16, 8, 255)) - vg.drawButton(ICON_TRASH, "Deleter", 100, 250, 160, 28, rgba(12, 130, 80, 255)) + vg.drawButton(Icon.Trash, "Delete", 100, 200, 160, 28, rgba(128, 16, 8, 255)) + vg.drawButton(Icon.Trash, "Deleter", 100, 250, 160, 28, rgba(12, 130, 80, 255)) vg.drawButton("Testing", 100, 300, 160, 28) vg.render(fps, 5, 5) diff --git a/examples/demo_sdl2_gpu.nim b/examples/demo_sdl2_gpu.nim index 65b5003..a83e25f 100644 --- a/examples/demo_sdl2_gpu.nim +++ b/examples/demo_sdl2_gpu.nim @@ -6,6 +6,7 @@ import os import nanovg import perf import common +import icons proc events(): bool = result = false @@ -114,8 +115,8 @@ proc main() = vg.text("Some仮名thing is up", 100, 100, 100) vg.drawWindow("Title", 50, 50, 300, 400) vg.drawLabel("Hello!", 10, 10, 500, 20) - vg.drawButton(ICON_TRASH, "Delete", 100, 200, 160, 28, rgba(128, 16, 8, 255)) - vg.drawButton(ICON_TRASH, "Deleter", 100, 250, 160, 28, rgba(12, 130, 80, 255)) + vg.drawButton(Icon.Trash, "Delete", 100, 200, 160, 28, rgba(128, 16, 8, 255)) + vg.drawButton(Icon.Trash, "Deleter", 100, 250, 160, 28, rgba(12, 130, 80, 255)) vg.drawButton("Testing", 100, 300, 160, 28) vg.drawSearchBox("Search...", 60, 400, 280, 25) diff --git a/examples/generate_icons.nim b/examples/generate_icons.nim new file mode 100644 index 0000000..e91d982 --- /dev/null +++ b/examples/generate_icons.nim @@ -0,0 +1,51 @@ +import os +import json, algorithm +import strutils, strformat +import httpcore +import httpclient + +template camelCase(str: string, sep = '-'): string = + var res = newStringOfCap(str.len) + var i = 1 + res.add(str[0].toUpperAscii) + while i < str.len: + if str[i] == sep and i < str.len - 1: + res.add(str[i+1].toUpperAscii) + i += 1 + else: + res.add(str[i]) + i += 1 + res + +proc main() = + const fontLicense {.strdefine.} = "free" + + let url = "https://api.fontawesome.com/" + + let client = newHttpClient() + let query = "{ \"query\": \"query { release(version:\\\"latest\\\") { icons(license:\\\"" & fontLicense & "\\\") {id, unicode} } }\" }" + let resp = client.request(url, HttpPost, body=query, headers = newHttpHeaders({"Content-type": "application/json"})) + let jsonStr = resp.body + + let json = parseJson(jsonStr) + let icons = json{"data", "release", "icons"} + + var res = """# NOTE: This file is autogenerated by generate_icons.nim +type + Icon* {.pure.} = enum +""" + + if icons.isNil: + raise newException(CatchableError, "Icons is nil") + + for icon in icons.getElems.sorted(proc (a, b: JsonNode): int = cmp(a["id"].to(string), b["id"].to(string))): + var id = icon["id"].to(string).camelCase() + if id[0] in {'0' .. '9'}: + id = "I" & id + let code = icon["unicode"].to(string).toUpperAscii + res.add(fmt" {id} = " & """"\u""" & code & "\"" & "\n") + + writeFile(currentSourcePath().parentDir / "icons.nim", res) + +when isMainModule: + main() \ No newline at end of file diff --git a/examples/icons.nim b/examples/icons.nim new file mode 100644 index 0000000..f7b2046 --- /dev/null +++ b/examples/icons.nim @@ -0,0 +1,1450 @@ +# NOTE: This file is autogenerated by generate_icons.nim +type + Icon* {.pure.} = enum + I500px = "\uF26E" + AccessibleIcon = "\uF368" + Accusoft = "\uF369" + AcquisitionsIncorporated = "\uF6AF" + Ad = "\uF641" + AddressBook = "\uF2B9" + AddressCard = "\uF2BB" + Adjust = "\uF042" + Adn = "\uF170" + Adobe = "\uF778" + Adversal = "\uF36A" + Affiliatetheme = "\uF36B" + AirFreshener = "\uF5D0" + Airbnb = "\uF834" + Algolia = "\uF36C" + AlignCenter = "\uF037" + AlignJustify = "\uF039" + AlignLeft = "\uF036" + AlignRight = "\uF038" + Alipay = "\uF642" + Allergies = "\uF461" + Amazon = "\uF270" + AmazonPay = "\uF42C" + Ambulance = "\uF0F9" + AmericanSignLanguageInterpreting = "\uF2A3" + Amilia = "\uF36D" + Anchor = "\uF13D" + Android = "\uF17B" + Angellist = "\uF209" + AngleDoubleDown = "\uF103" + AngleDoubleLeft = "\uF100" + AngleDoubleRight = "\uF101" + AngleDoubleUp = "\uF102" + AngleDown = "\uF107" + AngleLeft = "\uF104" + AngleRight = "\uF105" + AngleUp = "\uF106" + Angry = "\uF556" + Angrycreative = "\uF36E" + Angular = "\uF420" + Ankh = "\uF644" + AppStore = "\uF36F" + AppStoreIos = "\uF370" + Apper = "\uF371" + Apple = "\uF179" + AppleAlt = "\uF5D1" + ApplePay = "\uF415" + Archive = "\uF187" + Archway = "\uF557" + ArrowAltCircleDown = "\uF358" + ArrowAltCircleLeft = "\uF359" + ArrowAltCircleRight = "\uF35A" + ArrowAltCircleUp = "\uF35B" + ArrowCircleDown = "\uF0AB" + ArrowCircleLeft = "\uF0A8" + ArrowCircleRight = "\uF0A9" + ArrowCircleUp = "\uF0AA" + ArrowDown = "\uF063" + ArrowLeft = "\uF060" + ArrowRight = "\uF061" + ArrowUp = "\uF062" + ArrowsAlt = "\uF0B2" + ArrowsAltH = "\uF337" + ArrowsAltV = "\uF338" + Artstation = "\uF77A" + AssistiveListeningSystems = "\uF2A2" + Asterisk = "\uF069" + Asymmetrik = "\uF372" + At = "\uF1FA" + Atlas = "\uF558" + Atlassian = "\uF77B" + Atom = "\uF5D2" + Audible = "\uF373" + AudioDescription = "\uF29E" + Autoprefixer = "\uF41C" + Avianex = "\uF374" + Aviato = "\uF421" + Award = "\uF559" + Aws = "\uF375" + Baby = "\uF77C" + BabyCarriage = "\uF77D" + Backspace = "\uF55A" + Backward = "\uF04A" + Bacon = "\uF7E5" + Bacteria = "\uE059" + Bacterium = "\uE05A" + Bahai = "\uF666" + BalanceScale = "\uF24E" + BalanceScaleLeft = "\uF515" + BalanceScaleRight = "\uF516" + Ban = "\uF05E" + BandAid = "\uF462" + Bandcamp = "\uF2D5" + Barcode = "\uF02A" + Bars = "\uF0C9" + BaseballBall = "\uF433" + BasketballBall = "\uF434" + Bath = "\uF2CD" + BatteryEmpty = "\uF244" + BatteryFull = "\uF240" + BatteryHalf = "\uF242" + BatteryQuarter = "\uF243" + BatteryThreeQuarters = "\uF241" + BattleNet = "\uF835" + Bed = "\uF236" + Beer = "\uF0FC" + Behance = "\uF1B4" + BehanceSquare = "\uF1B5" + Bell = "\uF0F3" + BellSlash = "\uF1F6" + BezierCurve = "\uF55B" + Bible = "\uF647" + Bicycle = "\uF206" + Biking = "\uF84A" + Bimobject = "\uF378" + Binoculars = "\uF1E5" + Biohazard = "\uF780" + BirthdayCake = "\uF1FD" + Bitbucket = "\uF171" + Bitcoin = "\uF379" + Bity = "\uF37A" + BlackTie = "\uF27E" + Blackberry = "\uF37B" + Blender = "\uF517" + BlenderPhone = "\uF6B6" + Blind = "\uF29D" + Blog = "\uF781" + Blogger = "\uF37C" + BloggerB = "\uF37D" + Bluetooth = "\uF293" + BluetoothB = "\uF294" + Bold = "\uF032" + Bolt = "\uF0E7" + Bomb = "\uF1E2" + Bone = "\uF5D7" + Bong = "\uF55C" + Book = "\uF02D" + BookDead = "\uF6B7" + BookMedical = "\uF7E6" + BookOpen = "\uF518" + BookReader = "\uF5DA" + Bookmark = "\uF02E" + Bootstrap = "\uF836" + BorderAll = "\uF84C" + BorderNone = "\uF850" + BorderStyle = "\uF853" + BowlingBall = "\uF436" + Box = "\uF466" + BoxOpen = "\uF49E" + BoxTissue = "\uE05B" + Boxes = "\uF468" + Braille = "\uF2A1" + Brain = "\uF5DC" + BreadSlice = "\uF7EC" + Briefcase = "\uF0B1" + BriefcaseMedical = "\uF469" + BroadcastTower = "\uF519" + Broom = "\uF51A" + Brush = "\uF55D" + Btc = "\uF15A" + Buffer = "\uF837" + Bug = "\uF188" + Building = "\uF1AD" + Bullhorn = "\uF0A1" + Bullseye = "\uF140" + Burn = "\uF46A" + Buromobelexperte = "\uF37F" + Bus = "\uF207" + BusAlt = "\uF55E" + BusinessTime = "\uF64A" + BuyNLarge = "\uF8A6" + Buysellads = "\uF20D" + Calculator = "\uF1EC" + Calendar = "\uF133" + CalendarAlt = "\uF073" + CalendarCheck = "\uF274" + CalendarDay = "\uF783" + CalendarMinus = "\uF272" + CalendarPlus = "\uF271" + CalendarTimes = "\uF273" + CalendarWeek = "\uF784" + Camera = "\uF030" + CameraRetro = "\uF083" + Campground = "\uF6BB" + CanadianMapleLeaf = "\uF785" + CandyCane = "\uF786" + Cannabis = "\uF55F" + Capsules = "\uF46B" + Car = "\uF1B9" + CarAlt = "\uF5DE" + CarBattery = "\uF5DF" + CarCrash = "\uF5E1" + CarSide = "\uF5E4" + Caravan = "\uF8FF" + CaretDown = "\uF0D7" + CaretLeft = "\uF0D9" + CaretRight = "\uF0DA" + CaretSquareDown = "\uF150" + CaretSquareLeft = "\uF191" + CaretSquareRight = "\uF152" + CaretSquareUp = "\uF151" + CaretUp = "\uF0D8" + Carrot = "\uF787" + CartArrowDown = "\uF218" + CartPlus = "\uF217" + CashRegister = "\uF788" + Cat = "\uF6BE" + CcAmazonPay = "\uF42D" + CcAmex = "\uF1F3" + CcApplePay = "\uF416" + CcDinersClub = "\uF24C" + CcDiscover = "\uF1F2" + CcJcb = "\uF24B" + CcMastercard = "\uF1F1" + CcPaypal = "\uF1F4" + CcStripe = "\uF1F5" + CcVisa = "\uF1F0" + Centercode = "\uF380" + Centos = "\uF789" + Certificate = "\uF0A3" + Chair = "\uF6C0" + Chalkboard = "\uF51B" + ChalkboardTeacher = "\uF51C" + ChargingStation = "\uF5E7" + ChartArea = "\uF1FE" + ChartBar = "\uF080" + ChartLine = "\uF201" + ChartPie = "\uF200" + Check = "\uF00C" + CheckCircle = "\uF058" + CheckDouble = "\uF560" + CheckSquare = "\uF14A" + Cheese = "\uF7EF" + Chess = "\uF439" + ChessBishop = "\uF43A" + ChessBoard = "\uF43C" + ChessKing = "\uF43F" + ChessKnight = "\uF441" + ChessPawn = "\uF443" + ChessQueen = "\uF445" + ChessRook = "\uF447" + ChevronCircleDown = "\uF13A" + ChevronCircleLeft = "\uF137" + ChevronCircleRight = "\uF138" + ChevronCircleUp = "\uF139" + ChevronDown = "\uF078" + ChevronLeft = "\uF053" + ChevronRight = "\uF054" + ChevronUp = "\uF077" + Child = "\uF1AE" + Chrome = "\uF268" + Chromecast = "\uF838" + Church = "\uF51D" + Circle = "\uF111" + CircleNotch = "\uF1CE" + City = "\uF64F" + ClinicMedical = "\uF7F2" + Clipboard = "\uF328" + ClipboardCheck = "\uF46C" + ClipboardList = "\uF46D" + Clock = "\uF017" + Clone = "\uF24D" + ClosedCaptioning = "\uF20A" + Cloud = "\uF0C2" + CloudDownloadAlt = "\uF381" + CloudMeatball = "\uF73B" + CloudMoon = "\uF6C3" + CloudMoonRain = "\uF73C" + CloudRain = "\uF73D" + CloudShowersHeavy = "\uF740" + CloudSun = "\uF6C4" + CloudSunRain = "\uF743" + CloudUploadAlt = "\uF382" + Cloudscale = "\uF383" + Cloudsmith = "\uF384" + Cloudversify = "\uF385" + Cocktail = "\uF561" + Code = "\uF121" + CodeBranch = "\uF126" + Codepen = "\uF1CB" + Codiepie = "\uF284" + Coffee = "\uF0F4" + Cog = "\uF013" + Cogs = "\uF085" + Coins = "\uF51E" + Columns = "\uF0DB" + Comment = "\uF075" + CommentAlt = "\uF27A" + CommentDollar = "\uF651" + CommentDots = "\uF4AD" + CommentMedical = "\uF7F5" + CommentSlash = "\uF4B3" + Comments = "\uF086" + CommentsDollar = "\uF653" + CompactDisc = "\uF51F" + Compass = "\uF14E" + Compress = "\uF066" + CompressAlt = "\uF422" + CompressArrowsAlt = "\uF78C" + ConciergeBell = "\uF562" + Confluence = "\uF78D" + Connectdevelop = "\uF20E" + Contao = "\uF26D" + Cookie = "\uF563" + CookieBite = "\uF564" + Copy = "\uF0C5" + Copyright = "\uF1F9" + CottonBureau = "\uF89E" + Couch = "\uF4B8" + Cpanel = "\uF388" + CreativeCommons = "\uF25E" + CreativeCommonsBy = "\uF4E7" + CreativeCommonsNc = "\uF4E8" + CreativeCommonsNcEu = "\uF4E9" + CreativeCommonsNcJp = "\uF4EA" + CreativeCommonsNd = "\uF4EB" + CreativeCommonsPd = "\uF4EC" + CreativeCommonsPdAlt = "\uF4ED" + CreativeCommonsRemix = "\uF4EE" + CreativeCommonsSa = "\uF4EF" + CreativeCommonsSampling = "\uF4F0" + CreativeCommonsSamplingPlus = "\uF4F1" + CreativeCommonsShare = "\uF4F2" + CreativeCommonsZero = "\uF4F3" + CreditCard = "\uF09D" + CriticalRole = "\uF6C9" + Crop = "\uF125" + CropAlt = "\uF565" + Cross = "\uF654" + Crosshairs = "\uF05B" + Crow = "\uF520" + Crown = "\uF521" + Crutch = "\uF7F7" + Css3 = "\uF13C" + Css3Alt = "\uF38B" + Cube = "\uF1B2" + Cubes = "\uF1B3" + Cut = "\uF0C4" + Cuttlefish = "\uF38C" + DAndD = "\uF38D" + DAndDBeyond = "\uF6CA" + Dailymotion = "\uE052" + Dashcube = "\uF210" + Database = "\uF1C0" + Deaf = "\uF2A4" + Deezer = "\uE077" + Delicious = "\uF1A5" + Democrat = "\uF747" + Deploydog = "\uF38E" + Deskpro = "\uF38F" + Desktop = "\uF108" + Dev = "\uF6CC" + Deviantart = "\uF1BD" + Dharmachakra = "\uF655" + Dhl = "\uF790" + Diagnoses = "\uF470" + Diaspora = "\uF791" + Dice = "\uF522" + DiceD20 = "\uF6CF" + DiceD6 = "\uF6D1" + DiceFive = "\uF523" + DiceFour = "\uF524" + DiceOne = "\uF525" + DiceSix = "\uF526" + DiceThree = "\uF527" + DiceTwo = "\uF528" + Digg = "\uF1A6" + DigitalOcean = "\uF391" + DigitalTachograph = "\uF566" + Directions = "\uF5EB" + Discord = "\uF392" + Discourse = "\uF393" + Disease = "\uF7FA" + Divide = "\uF529" + Dizzy = "\uF567" + Dna = "\uF471" + Dochub = "\uF394" + Docker = "\uF395" + Dog = "\uF6D3" + DollarSign = "\uF155" + Dolly = "\uF472" + DollyFlatbed = "\uF474" + Donate = "\uF4B9" + DoorClosed = "\uF52A" + DoorOpen = "\uF52B" + DotCircle = "\uF192" + Dove = "\uF4BA" + Download = "\uF019" + Draft2digital = "\uF396" + DraftingCompass = "\uF568" + Dragon = "\uF6D5" + DrawPolygon = "\uF5EE" + Dribbble = "\uF17D" + DribbbleSquare = "\uF397" + Dropbox = "\uF16B" + Drum = "\uF569" + DrumSteelpan = "\uF56A" + DrumstickBite = "\uF6D7" + Drupal = "\uF1A9" + Dumbbell = "\uF44B" + Dumpster = "\uF793" + DumpsterFire = "\uF794" + Dungeon = "\uF6D9" + Dyalog = "\uF399" + Earlybirds = "\uF39A" + Ebay = "\uF4F4" + Edge = "\uF282" + EdgeLegacy = "\uE078" + Edit = "\uF044" + Egg = "\uF7FB" + Eject = "\uF052" + Elementor = "\uF430" + EllipsisH = "\uF141" + EllipsisV = "\uF142" + Ello = "\uF5F1" + Ember = "\uF423" + Empire = "\uF1D1" + Envelope = "\uF0E0" + EnvelopeOpen = "\uF2B6" + EnvelopeOpenText = "\uF658" + EnvelopeSquare = "\uF199" + Envira = "\uF299" + Equals = "\uF52C" + Eraser = "\uF12D" + Erlang = "\uF39D" + Ethereum = "\uF42E" + Ethernet = "\uF796" + Etsy = "\uF2D7" + EuroSign = "\uF153" + Evernote = "\uF839" + ExchangeAlt = "\uF362" + Exclamation = "\uF12A" + ExclamationCircle = "\uF06A" + ExclamationTriangle = "\uF071" + Expand = "\uF065" + ExpandAlt = "\uF424" + ExpandArrowsAlt = "\uF31E" + Expeditedssl = "\uF23E" + ExternalLinkAlt = "\uF35D" + ExternalLinkSquareAlt = "\uF360" + Eye = "\uF06E" + EyeDropper = "\uF1FB" + EyeSlash = "\uF070" + Facebook = "\uF09A" + FacebookF = "\uF39E" + FacebookMessenger = "\uF39F" + FacebookSquare = "\uF082" + Fan = "\uF863" + FantasyFlightGames = "\uF6DC" + FastBackward = "\uF049" + FastForward = "\uF050" + Faucet = "\uE005" + Fax = "\uF1AC" + Feather = "\uF52D" + FeatherAlt = "\uF56B" + Fedex = "\uF797" + Fedora = "\uF798" + Female = "\uF182" + FighterJet = "\uF0FB" + Figma = "\uF799" + File = "\uF15B" + FileAlt = "\uF15C" + FileArchive = "\uF1C6" + FileAudio = "\uF1C7" + FileCode = "\uF1C9" + FileContract = "\uF56C" + FileCsv = "\uF6DD" + FileDownload = "\uF56D" + FileExcel = "\uF1C3" + FileExport = "\uF56E" + FileImage = "\uF1C5" + FileImport = "\uF56F" + FileInvoice = "\uF570" + FileInvoiceDollar = "\uF571" + FileMedical = "\uF477" + FileMedicalAlt = "\uF478" + FilePdf = "\uF1C1" + FilePowerpoint = "\uF1C4" + FilePrescription = "\uF572" + FileSignature = "\uF573" + FileUpload = "\uF574" + FileVideo = "\uF1C8" + FileWord = "\uF1C2" + Fill = "\uF575" + FillDrip = "\uF576" + Film = "\uF008" + Filter = "\uF0B0" + Fingerprint = "\uF577" + Fire = "\uF06D" + FireAlt = "\uF7E4" + FireExtinguisher = "\uF134" + Firefox = "\uF269" + FirefoxBrowser = "\uE007" + FirstAid = "\uF479" + FirstOrder = "\uF2B0" + FirstOrderAlt = "\uF50A" + Firstdraft = "\uF3A1" + Fish = "\uF578" + FistRaised = "\uF6DE" + Flag = "\uF024" + FlagCheckered = "\uF11E" + FlagUsa = "\uF74D" + Flask = "\uF0C3" + Flickr = "\uF16E" + Flipboard = "\uF44D" + Flushed = "\uF579" + Fly = "\uF417" + Folder = "\uF07B" + FolderMinus = "\uF65D" + FolderOpen = "\uF07C" + FolderPlus = "\uF65E" + Font = "\uF031" + FontAwesome = "\uF2B4" + FontAwesomeAlt = "\uF35C" + FontAwesomeFlag = "\uF425" + Fonticons = "\uF280" + FonticonsFi = "\uF3A2" + FootballBall = "\uF44E" + FortAwesome = "\uF286" + FortAwesomeAlt = "\uF3A3" + Forumbee = "\uF211" + Forward = "\uF04E" + Foursquare = "\uF180" + FreeCodeCamp = "\uF2C5" + Freebsd = "\uF3A4" + Frog = "\uF52E" + Frown = "\uF119" + FrownOpen = "\uF57A" + Fulcrum = "\uF50B" + FunnelDollar = "\uF662" + Futbol = "\uF1E3" + GalacticRepublic = "\uF50C" + GalacticSenate = "\uF50D" + Gamepad = "\uF11B" + GasPump = "\uF52F" + Gavel = "\uF0E3" + Gem = "\uF3A5" + Genderless = "\uF22D" + GetPocket = "\uF265" + Gg = "\uF260" + GgCircle = "\uF261" + Ghost = "\uF6E2" + Gift = "\uF06B" + Gifts = "\uF79C" + Git = "\uF1D3" + GitAlt = "\uF841" + GitSquare = "\uF1D2" + Github = "\uF09B" + GithubAlt = "\uF113" + GithubSquare = "\uF092" + Gitkraken = "\uF3A6" + Gitlab = "\uF296" + Gitter = "\uF426" + GlassCheers = "\uF79F" + GlassMartini = "\uF000" + GlassMartiniAlt = "\uF57B" + GlassWhiskey = "\uF7A0" + Glasses = "\uF530" + Glide = "\uF2A5" + GlideG = "\uF2A6" + Globe = "\uF0AC" + GlobeAfrica = "\uF57C" + GlobeAmericas = "\uF57D" + GlobeAsia = "\uF57E" + GlobeEurope = "\uF7A2" + Gofore = "\uF3A7" + GolfBall = "\uF450" + Goodreads = "\uF3A8" + GoodreadsG = "\uF3A9" + Google = "\uF1A0" + GoogleDrive = "\uF3AA" + GooglePay = "\uE079" + GooglePlay = "\uF3AB" + GooglePlus = "\uF2B3" + GooglePlusG = "\uF0D5" + GooglePlusSquare = "\uF0D4" + GoogleWallet = "\uF1EE" + Gopuram = "\uF664" + GraduationCap = "\uF19D" + Gratipay = "\uF184" + Grav = "\uF2D6" + GreaterThan = "\uF531" + GreaterThanEqual = "\uF532" + Grimace = "\uF57F" + Grin = "\uF580" + GrinAlt = "\uF581" + GrinBeam = "\uF582" + GrinBeamSweat = "\uF583" + GrinHearts = "\uF584" + GrinSquint = "\uF585" + GrinSquintTears = "\uF586" + GrinStars = "\uF587" + GrinTears = "\uF588" + GrinTongue = "\uF589" + GrinTongueSquint = "\uF58A" + GrinTongueWink = "\uF58B" + GrinWink = "\uF58C" + GripHorizontal = "\uF58D" + GripLines = "\uF7A4" + GripLinesVertical = "\uF7A5" + GripVertical = "\uF58E" + Gripfire = "\uF3AC" + Grunt = "\uF3AD" + Guitar = "\uF7A6" + Gulp = "\uF3AE" + HSquare = "\uF0FD" + HackerNews = "\uF1D4" + HackerNewsSquare = "\uF3AF" + Hackerrank = "\uF5F7" + Hamburger = "\uF805" + Hammer = "\uF6E3" + Hamsa = "\uF665" + HandHolding = "\uF4BD" + HandHoldingHeart = "\uF4BE" + HandHoldingMedical = "\uE05C" + HandHoldingUsd = "\uF4C0" + HandHoldingWater = "\uF4C1" + HandLizard = "\uF258" + HandMiddleFinger = "\uF806" + HandPaper = "\uF256" + HandPeace = "\uF25B" + HandPointDown = "\uF0A7" + HandPointLeft = "\uF0A5" + HandPointRight = "\uF0A4" + HandPointUp = "\uF0A6" + HandPointer = "\uF25A" + HandRock = "\uF255" + HandScissors = "\uF257" + HandSparkles = "\uE05D" + HandSpock = "\uF259" + Hands = "\uF4C2" + HandsHelping = "\uF4C4" + HandsWash = "\uE05E" + Handshake = "\uF2B5" + HandshakeAltSlash = "\uE05F" + HandshakeSlash = "\uE060" + Hanukiah = "\uF6E6" + HardHat = "\uF807" + Hashtag = "\uF292" + HatCowboy = "\uF8C0" + HatCowboySide = "\uF8C1" + HatWizard = "\uF6E8" + Hdd = "\uF0A0" + HeadSideCough = "\uE061" + HeadSideCoughSlash = "\uE062" + HeadSideMask = "\uE063" + HeadSideVirus = "\uE064" + Heading = "\uF1DC" + Headphones = "\uF025" + HeadphonesAlt = "\uF58F" + Headset = "\uF590" + Heart = "\uF004" + HeartBroken = "\uF7A9" + Heartbeat = "\uF21E" + Helicopter = "\uF533" + Highlighter = "\uF591" + Hiking = "\uF6EC" + Hippo = "\uF6ED" + Hips = "\uF452" + HireAHelper = "\uF3B0" + History = "\uF1DA" + HockeyPuck = "\uF453" + HollyBerry = "\uF7AA" + Home = "\uF015" + Hooli = "\uF427" + Hornbill = "\uF592" + Horse = "\uF6F0" + HorseHead = "\uF7AB" + Hospital = "\uF0F8" + HospitalAlt = "\uF47D" + HospitalSymbol = "\uF47E" + HospitalUser = "\uF80D" + HotTub = "\uF593" + Hotdog = "\uF80F" + Hotel = "\uF594" + Hotjar = "\uF3B1" + Hourglass = "\uF254" + HourglassEnd = "\uF253" + HourglassHalf = "\uF252" + HourglassStart = "\uF251" + HouseDamage = "\uF6F1" + HouseUser = "\uE065" + Houzz = "\uF27C" + Hryvnia = "\uF6F2" + Html5 = "\uF13B" + Hubspot = "\uF3B2" + ICursor = "\uF246" + IceCream = "\uF810" + Icicles = "\uF7AD" + Icons = "\uF86D" + IdBadge = "\uF2C1" + IdCard = "\uF2C2" + IdCardAlt = "\uF47F" + Ideal = "\uE013" + Igloo = "\uF7AE" + Image = "\uF03E" + Images = "\uF302" + Imdb = "\uF2D8" + Inbox = "\uF01C" + Indent = "\uF03C" + Industry = "\uF275" + Infinity = "\uF534" + Info = "\uF129" + InfoCircle = "\uF05A" + Instagram = "\uF16D" + InstagramSquare = "\uE055" + Intercom = "\uF7AF" + InternetExplorer = "\uF26B" + Invision = "\uF7B0" + Ioxhost = "\uF208" + Italic = "\uF033" + ItchIo = "\uF83A" + Itunes = "\uF3B4" + ItunesNote = "\uF3B5" + Java = "\uF4E4" + Jedi = "\uF669" + JediOrder = "\uF50E" + Jenkins = "\uF3B6" + Jira = "\uF7B1" + Joget = "\uF3B7" + Joint = "\uF595" + Joomla = "\uF1AA" + JournalWhills = "\uF66A" + Js = "\uF3B8" + JsSquare = "\uF3B9" + Jsfiddle = "\uF1CC" + Kaaba = "\uF66B" + Kaggle = "\uF5FA" + Key = "\uF084" + Keybase = "\uF4F5" + Keyboard = "\uF11C" + Keycdn = "\uF3BA" + Khanda = "\uF66D" + Kickstarter = "\uF3BB" + KickstarterK = "\uF3BC" + Kiss = "\uF596" + KissBeam = "\uF597" + KissWinkHeart = "\uF598" + KiwiBird = "\uF535" + Korvue = "\uF42F" + Landmark = "\uF66F" + Language = "\uF1AB" + Laptop = "\uF109" + LaptopCode = "\uF5FC" + LaptopHouse = "\uE066" + LaptopMedical = "\uF812" + Laravel = "\uF3BD" + Lastfm = "\uF202" + LastfmSquare = "\uF203" + Laugh = "\uF599" + LaughBeam = "\uF59A" + LaughSquint = "\uF59B" + LaughWink = "\uF59C" + LayerGroup = "\uF5FD" + Leaf = "\uF06C" + Leanpub = "\uF212" + Lemon = "\uF094" + Less = "\uF41D" + LessThan = "\uF536" + LessThanEqual = "\uF537" + LevelDownAlt = "\uF3BE" + LevelUpAlt = "\uF3BF" + LifeRing = "\uF1CD" + Lightbulb = "\uF0EB" + Line = "\uF3C0" + Link = "\uF0C1" + Linkedin = "\uF08C" + LinkedinIn = "\uF0E1" + Linode = "\uF2B8" + Linux = "\uF17C" + LiraSign = "\uF195" + List = "\uF03A" + ListAlt = "\uF022" + ListOl = "\uF0CB" + ListUl = "\uF0CA" + LocationArrow = "\uF124" + Lock = "\uF023" + LockOpen = "\uF3C1" + LongArrowAltDown = "\uF309" + LongArrowAltLeft = "\uF30A" + LongArrowAltRight = "\uF30B" + LongArrowAltUp = "\uF30C" + LowVision = "\uF2A8" + LuggageCart = "\uF59D" + Lungs = "\uF604" + LungsVirus = "\uE067" + Lyft = "\uF3C3" + Magento = "\uF3C4" + Magic = "\uF0D0" + Magnet = "\uF076" + MailBulk = "\uF674" + Mailchimp = "\uF59E" + Male = "\uF183" + Mandalorian = "\uF50F" + Map = "\uF279" + MapMarked = "\uF59F" + MapMarkedAlt = "\uF5A0" + MapMarker = "\uF041" + MapMarkerAlt = "\uF3C5" + MapPin = "\uF276" + MapSigns = "\uF277" + Markdown = "\uF60F" + Marker = "\uF5A1" + Mars = "\uF222" + MarsDouble = "\uF227" + MarsStroke = "\uF229" + MarsStrokeH = "\uF22B" + MarsStrokeV = "\uF22A" + Mask = "\uF6FA" + Mastodon = "\uF4F6" + Maxcdn = "\uF136" + Mdb = "\uF8CA" + Medal = "\uF5A2" + Medapps = "\uF3C6" + Medium = "\uF23A" + MediumM = "\uF3C7" + Medkit = "\uF0FA" + Medrt = "\uF3C8" + Meetup = "\uF2E0" + Megaport = "\uF5A3" + Meh = "\uF11A" + MehBlank = "\uF5A4" + MehRollingEyes = "\uF5A5" + Memory = "\uF538" + Mendeley = "\uF7B3" + Menorah = "\uF676" + Mercury = "\uF223" + Meteor = "\uF753" + Microblog = "\uE01A" + Microchip = "\uF2DB" + Microphone = "\uF130" + MicrophoneAlt = "\uF3C9" + MicrophoneAltSlash = "\uF539" + MicrophoneSlash = "\uF131" + Microscope = "\uF610" + Microsoft = "\uF3CA" + Minus = "\uF068" + MinusCircle = "\uF056" + MinusSquare = "\uF146" + Mitten = "\uF7B5" + Mix = "\uF3CB" + Mixcloud = "\uF289" + Mixer = "\uE056" + Mizuni = "\uF3CC" + Mobile = "\uF10B" + MobileAlt = "\uF3CD" + Modx = "\uF285" + Monero = "\uF3D0" + MoneyBill = "\uF0D6" + MoneyBillAlt = "\uF3D1" + MoneyBillWave = "\uF53A" + MoneyBillWaveAlt = "\uF53B" + MoneyCheck = "\uF53C" + MoneyCheckAlt = "\uF53D" + Monument = "\uF5A6" + Moon = "\uF186" + MortarPestle = "\uF5A7" + Mosque = "\uF678" + Motorcycle = "\uF21C" + Mountain = "\uF6FC" + Mouse = "\uF8CC" + MousePointer = "\uF245" + MugHot = "\uF7B6" + Music = "\uF001" + Napster = "\uF3D2" + Neos = "\uF612" + NetworkWired = "\uF6FF" + Neuter = "\uF22C" + Newspaper = "\uF1EA" + Nimblr = "\uF5A8" + Node = "\uF419" + NodeJs = "\uF3D3" + NotEqual = "\uF53E" + NotesMedical = "\uF481" + Npm = "\uF3D4" + Ns8 = "\uF3D5" + Nutritionix = "\uF3D6" + ObjectGroup = "\uF247" + ObjectUngroup = "\uF248" + Odnoklassniki = "\uF263" + OdnoklassnikiSquare = "\uF264" + OilCan = "\uF613" + OldRepublic = "\uF510" + Om = "\uF679" + Opencart = "\uF23D" + Openid = "\uF19B" + Opera = "\uF26A" + OptinMonster = "\uF23C" + Orcid = "\uF8D2" + Osi = "\uF41A" + Otter = "\uF700" + Outdent = "\uF03B" + Page4 = "\uF3D7" + Pagelines = "\uF18C" + Pager = "\uF815" + PaintBrush = "\uF1FC" + PaintRoller = "\uF5AA" + Palette = "\uF53F" + Palfed = "\uF3D8" + Pallet = "\uF482" + PaperPlane = "\uF1D8" + Paperclip = "\uF0C6" + ParachuteBox = "\uF4CD" + Paragraph = "\uF1DD" + Parking = "\uF540" + Passport = "\uF5AB" + Pastafarianism = "\uF67B" + Paste = "\uF0EA" + Patreon = "\uF3D9" + Pause = "\uF04C" + PauseCircle = "\uF28B" + Paw = "\uF1B0" + Paypal = "\uF1ED" + Peace = "\uF67C" + Pen = "\uF304" + PenAlt = "\uF305" + PenFancy = "\uF5AC" + PenNib = "\uF5AD" + PenSquare = "\uF14B" + PencilAlt = "\uF303" + PencilRuler = "\uF5AE" + PennyArcade = "\uF704" + PeopleArrows = "\uE068" + PeopleCarry = "\uF4CE" + PepperHot = "\uF816" + Percent = "\uF295" + Percentage = "\uF541" + Periscope = "\uF3DA" + PersonBooth = "\uF756" + Phabricator = "\uF3DB" + PhoenixFramework = "\uF3DC" + PhoenixSquadron = "\uF511" + Phone = "\uF095" + PhoneAlt = "\uF879" + PhoneSlash = "\uF3DD" + PhoneSquare = "\uF098" + PhoneSquareAlt = "\uF87B" + PhoneVolume = "\uF2A0" + PhotoVideo = "\uF87C" + Php = "\uF457" + PiedPiper = "\uF2AE" + PiedPiperAlt = "\uF1A8" + PiedPiperHat = "\uF4E5" + PiedPiperPp = "\uF1A7" + PiedPiperSquare = "\uE01E" + PiggyBank = "\uF4D3" + Pills = "\uF484" + Pinterest = "\uF0D2" + PinterestP = "\uF231" + PinterestSquare = "\uF0D3" + PizzaSlice = "\uF818" + PlaceOfWorship = "\uF67F" + Plane = "\uF072" + PlaneArrival = "\uF5AF" + PlaneDeparture = "\uF5B0" + PlaneSlash = "\uE069" + Play = "\uF04B" + PlayCircle = "\uF144" + Playstation = "\uF3DF" + Plug = "\uF1E6" + Plus = "\uF067" + PlusCircle = "\uF055" + PlusSquare = "\uF0FE" + Podcast = "\uF2CE" + Poll = "\uF681" + PollH = "\uF682" + Poo = "\uF2FE" + PooStorm = "\uF75A" + Poop = "\uF619" + Portrait = "\uF3E0" + PoundSign = "\uF154" + PowerOff = "\uF011" + Pray = "\uF683" + PrayingHands = "\uF684" + Prescription = "\uF5B1" + PrescriptionBottle = "\uF485" + PrescriptionBottleAlt = "\uF486" + Print = "\uF02F" + Procedures = "\uF487" + ProductHunt = "\uF288" + ProjectDiagram = "\uF542" + PumpMedical = "\uE06A" + PumpSoap = "\uE06B" + Pushed = "\uF3E1" + PuzzlePiece = "\uF12E" + Python = "\uF3E2" + Qq = "\uF1D6" + Qrcode = "\uF029" + Question = "\uF128" + QuestionCircle = "\uF059" + Quidditch = "\uF458" + Quinscape = "\uF459" + Quora = "\uF2C4" + QuoteLeft = "\uF10D" + QuoteRight = "\uF10E" + Quran = "\uF687" + RProject = "\uF4F7" + Radiation = "\uF7B9" + RadiationAlt = "\uF7BA" + Rainbow = "\uF75B" + Random = "\uF074" + RaspberryPi = "\uF7BB" + Ravelry = "\uF2D9" + React = "\uF41B" + Reacteurope = "\uF75D" + Readme = "\uF4D5" + Rebel = "\uF1D0" + Receipt = "\uF543" + RecordVinyl = "\uF8D9" + Recycle = "\uF1B8" + RedRiver = "\uF3E3" + Reddit = "\uF1A1" + RedditAlien = "\uF281" + RedditSquare = "\uF1A2" + Redhat = "\uF7BC" + Redo = "\uF01E" + RedoAlt = "\uF2F9" + Registered = "\uF25D" + RemoveFormat = "\uF87D" + Renren = "\uF18B" + Reply = "\uF3E5" + ReplyAll = "\uF122" + Replyd = "\uF3E6" + Republican = "\uF75E" + Researchgate = "\uF4F8" + Resolving = "\uF3E7" + Restroom = "\uF7BD" + Retweet = "\uF079" + Rev = "\uF5B2" + Ribbon = "\uF4D6" + Ring = "\uF70B" + Road = "\uF018" + Robot = "\uF544" + Rocket = "\uF135" + Rocketchat = "\uF3E8" + Rockrms = "\uF3E9" + Route = "\uF4D7" + Rss = "\uF09E" + RssSquare = "\uF143" + RubleSign = "\uF158" + Ruler = "\uF545" + RulerCombined = "\uF546" + RulerHorizontal = "\uF547" + RulerVertical = "\uF548" + Running = "\uF70C" + RupeeSign = "\uF156" + Rust = "\uE07A" + SadCry = "\uF5B3" + SadTear = "\uF5B4" + Safari = "\uF267" + Salesforce = "\uF83B" + Sass = "\uF41E" + Satellite = "\uF7BF" + SatelliteDish = "\uF7C0" + Save = "\uF0C7" + Schlix = "\uF3EA" + School = "\uF549" + Screwdriver = "\uF54A" + Scribd = "\uF28A" + Scroll = "\uF70E" + SdCard = "\uF7C2" + Search = "\uF002" + SearchDollar = "\uF688" + SearchLocation = "\uF689" + SearchMinus = "\uF010" + SearchPlus = "\uF00E" + Searchengin = "\uF3EB" + Seedling = "\uF4D8" + Sellcast = "\uF2DA" + Sellsy = "\uF213" + Server = "\uF233" + Servicestack = "\uF3EC" + Shapes = "\uF61F" + Share = "\uF064" + ShareAlt = "\uF1E0" + ShareAltSquare = "\uF1E1" + ShareSquare = "\uF14D" + ShekelSign = "\uF20B" + ShieldAlt = "\uF3ED" + ShieldVirus = "\uE06C" + Ship = "\uF21A" + ShippingFast = "\uF48B" + Shirtsinbulk = "\uF214" + ShoePrints = "\uF54B" + Shopify = "\uE057" + ShoppingBag = "\uF290" + ShoppingBasket = "\uF291" + ShoppingCart = "\uF07A" + Shopware = "\uF5B5" + Shower = "\uF2CC" + ShuttleVan = "\uF5B6" + Sign = "\uF4D9" + SignInAlt = "\uF2F6" + SignLanguage = "\uF2A7" + SignOutAlt = "\uF2F5" + Signal = "\uF012" + Signature = "\uF5B7" + SimCard = "\uF7C4" + Simplybuilt = "\uF215" + Sink = "\uE06D" + Sistrix = "\uF3EE" + Sitemap = "\uF0E8" + Sith = "\uF512" + Skating = "\uF7C5" + Sketch = "\uF7C6" + Skiing = "\uF7C9" + SkiingNordic = "\uF7CA" + Skull = "\uF54C" + SkullCrossbones = "\uF714" + Skyatlas = "\uF216" + Skype = "\uF17E" + Slack = "\uF198" + SlackHash = "\uF3EF" + Slash = "\uF715" + Sleigh = "\uF7CC" + SlidersH = "\uF1DE" + Slideshare = "\uF1E7" + Smile = "\uF118" + SmileBeam = "\uF5B8" + SmileWink = "\uF4DA" + Smog = "\uF75F" + Smoking = "\uF48D" + SmokingBan = "\uF54D" + Sms = "\uF7CD" + Snapchat = "\uF2AB" + SnapchatGhost = "\uF2AC" + SnapchatSquare = "\uF2AD" + Snowboarding = "\uF7CE" + Snowflake = "\uF2DC" + Snowman = "\uF7D0" + Snowplow = "\uF7D2" + Soap = "\uE06E" + Socks = "\uF696" + SolarPanel = "\uF5BA" + Sort = "\uF0DC" + SortAlphaDown = "\uF15D" + SortAlphaDownAlt = "\uF881" + SortAlphaUp = "\uF15E" + SortAlphaUpAlt = "\uF882" + SortAmountDown = "\uF160" + SortAmountDownAlt = "\uF884" + SortAmountUp = "\uF161" + SortAmountUpAlt = "\uF885" + SortDown = "\uF0DD" + SortNumericDown = "\uF162" + SortNumericDownAlt = "\uF886" + SortNumericUp = "\uF163" + SortNumericUpAlt = "\uF887" + SortUp = "\uF0DE" + Soundcloud = "\uF1BE" + Sourcetree = "\uF7D3" + Spa = "\uF5BB" + SpaceShuttle = "\uF197" + Speakap = "\uF3F3" + SpeakerDeck = "\uF83C" + SpellCheck = "\uF891" + Spider = "\uF717" + Spinner = "\uF110" + Splotch = "\uF5BC" + Spotify = "\uF1BC" + SprayCan = "\uF5BD" + Square = "\uF0C8" + SquareFull = "\uF45C" + SquareRootAlt = "\uF698" + Squarespace = "\uF5BE" + StackExchange = "\uF18D" + StackOverflow = "\uF16C" + Stackpath = "\uF842" + Stamp = "\uF5BF" + Star = "\uF005" + StarAndCrescent = "\uF699" + StarHalf = "\uF089" + StarHalfAlt = "\uF5C0" + StarOfDavid = "\uF69A" + StarOfLife = "\uF621" + Staylinked = "\uF3F5" + Steam = "\uF1B6" + SteamSquare = "\uF1B7" + SteamSymbol = "\uF3F6" + StepBackward = "\uF048" + StepForward = "\uF051" + Stethoscope = "\uF0F1" + StickerMule = "\uF3F7" + StickyNote = "\uF249" + Stop = "\uF04D" + StopCircle = "\uF28D" + Stopwatch = "\uF2F2" + Stopwatch20 = "\uE06F" + Store = "\uF54E" + StoreAlt = "\uF54F" + StoreAltSlash = "\uE070" + StoreSlash = "\uE071" + Strava = "\uF428" + Stream = "\uF550" + StreetView = "\uF21D" + Strikethrough = "\uF0CC" + Stripe = "\uF429" + StripeS = "\uF42A" + Stroopwafel = "\uF551" + Studiovinari = "\uF3F8" + Stumbleupon = "\uF1A4" + StumbleuponCircle = "\uF1A3" + Subscript = "\uF12C" + Subway = "\uF239" + Suitcase = "\uF0F2" + SuitcaseRolling = "\uF5C1" + Sun = "\uF185" + Superpowers = "\uF2DD" + Superscript = "\uF12B" + Supple = "\uF3F9" + Surprise = "\uF5C2" + Suse = "\uF7D6" + Swatchbook = "\uF5C3" + Swift = "\uF8E1" + Swimmer = "\uF5C4" + SwimmingPool = "\uF5C5" + Symfony = "\uF83D" + Synagogue = "\uF69B" + Sync = "\uF021" + SyncAlt = "\uF2F1" + Syringe = "\uF48E" + Table = "\uF0CE" + TableTennis = "\uF45D" + Tablet = "\uF10A" + TabletAlt = "\uF3FA" + Tablets = "\uF490" + TachometerAlt = "\uF3FD" + Tag = "\uF02B" + Tags = "\uF02C" + Tape = "\uF4DB" + Tasks = "\uF0AE" + Taxi = "\uF1BA" + Teamspeak = "\uF4F9" + Teeth = "\uF62E" + TeethOpen = "\uF62F" + Telegram = "\uF2C6" + TelegramPlane = "\uF3FE" + TemperatureHigh = "\uF769" + TemperatureLow = "\uF76B" + TencentWeibo = "\uF1D5" + Tenge = "\uF7D7" + Terminal = "\uF120" + TextHeight = "\uF034" + TextWidth = "\uF035" + Th = "\uF00A" + ThLarge = "\uF009" + ThList = "\uF00B" + TheRedYeti = "\uF69D" + TheaterMasks = "\uF630" + Themeco = "\uF5C6" + Themeisle = "\uF2B2" + Thermometer = "\uF491" + ThermometerEmpty = "\uF2CB" + ThermometerFull = "\uF2C7" + ThermometerHalf = "\uF2C9" + ThermometerQuarter = "\uF2CA" + ThermometerThreeQuarters = "\uF2C8" + ThinkPeaks = "\uF731" + ThumbsDown = "\uF165" + ThumbsUp = "\uF164" + Thumbtack = "\uF08D" + TicketAlt = "\uF3FF" + Tiktok = "\uE07B" + Times = "\uF00D" + TimesCircle = "\uF057" + Tint = "\uF043" + TintSlash = "\uF5C7" + Tired = "\uF5C8" + ToggleOff = "\uF204" + ToggleOn = "\uF205" + Toilet = "\uF7D8" + ToiletPaper = "\uF71E" + ToiletPaperSlash = "\uE072" + Toolbox = "\uF552" + Tools = "\uF7D9" + Tooth = "\uF5C9" + Torah = "\uF6A0" + ToriiGate = "\uF6A1" + Tractor = "\uF722" + TradeFederation = "\uF513" + Trademark = "\uF25C" + TrafficLight = "\uF637" + Trailer = "\uE041" + Train = "\uF238" + Tram = "\uF7DA" + Transgender = "\uF224" + TransgenderAlt = "\uF225" + Trash = "\uF1F8" + TrashAlt = "\uF2ED" + TrashRestore = "\uF829" + TrashRestoreAlt = "\uF82A" + Tree = "\uF1BB" + Trello = "\uF181" + Tripadvisor = "\uF262" + Trophy = "\uF091" + Truck = "\uF0D1" + TruckLoading = "\uF4DE" + TruckMonster = "\uF63B" + TruckMoving = "\uF4DF" + TruckPickup = "\uF63C" + Tshirt = "\uF553" + Tty = "\uF1E4" + Tumblr = "\uF173" + TumblrSquare = "\uF174" + Tv = "\uF26C" + Twitch = "\uF1E8" + Twitter = "\uF099" + TwitterSquare = "\uF081" + Typo3 = "\uF42B" + Uber = "\uF402" + Ubuntu = "\uF7DF" + Uikit = "\uF403" + Umbraco = "\uF8E8" + Umbrella = "\uF0E9" + UmbrellaBeach = "\uF5CA" + Underline = "\uF0CD" + Undo = "\uF0E2" + UndoAlt = "\uF2EA" + Uniregistry = "\uF404" + Unity = "\uE049" + UniversalAccess = "\uF29A" + University = "\uF19C" + Unlink = "\uF127" + Unlock = "\uF09C" + UnlockAlt = "\uF13E" + Unsplash = "\uE07C" + Untappd = "\uF405" + Upload = "\uF093" + Ups = "\uF7E0" + Usb = "\uF287" + User = "\uF007" + UserAlt = "\uF406" + UserAltSlash = "\uF4FA" + UserAstronaut = "\uF4FB" + UserCheck = "\uF4FC" + UserCircle = "\uF2BD" + UserClock = "\uF4FD" + UserCog = "\uF4FE" + UserEdit = "\uF4FF" + UserFriends = "\uF500" + UserGraduate = "\uF501" + UserInjured = "\uF728" + UserLock = "\uF502" + UserMd = "\uF0F0" + UserMinus = "\uF503" + UserNinja = "\uF504" + UserNurse = "\uF82F" + UserPlus = "\uF234" + UserSecret = "\uF21B" + UserShield = "\uF505" + UserSlash = "\uF506" + UserTag = "\uF507" + UserTie = "\uF508" + UserTimes = "\uF235" + Users = "\uF0C0" + UsersCog = "\uF509" + UsersSlash = "\uE073" + Usps = "\uF7E1" + Ussunnah = "\uF407" + UtensilSpoon = "\uF2E5" + Utensils = "\uF2E7" + Vaadin = "\uF408" + VectorSquare = "\uF5CB" + Venus = "\uF221" + VenusDouble = "\uF226" + VenusMars = "\uF228" + Viacoin = "\uF237" + Viadeo = "\uF2A9" + ViadeoSquare = "\uF2AA" + Vial = "\uF492" + Vials = "\uF493" + Viber = "\uF409" + Video = "\uF03D" + VideoSlash = "\uF4E2" + Vihara = "\uF6A7" + Vimeo = "\uF40A" + VimeoSquare = "\uF194" + VimeoV = "\uF27D" + Vine = "\uF1CA" + Virus = "\uE074" + VirusSlash = "\uE075" + Viruses = "\uE076" + Vk = "\uF189" + Vnv = "\uF40B" + Voicemail = "\uF897" + VolleyballBall = "\uF45F" + VolumeDown = "\uF027" + VolumeMute = "\uF6A9" + VolumeOff = "\uF026" + VolumeUp = "\uF028" + VoteYea = "\uF772" + VrCardboard = "\uF729" + Vuejs = "\uF41F" + Walking = "\uF554" + Wallet = "\uF555" + Warehouse = "\uF494" + Water = "\uF773" + WaveSquare = "\uF83E" + Waze = "\uF83F" + Weebly = "\uF5CC" + Weibo = "\uF18A" + Weight = "\uF496" + WeightHanging = "\uF5CD" + Weixin = "\uF1D7" + Whatsapp = "\uF232" + WhatsappSquare = "\uF40C" + Wheelchair = "\uF193" + Whmcs = "\uF40D" + Wifi = "\uF1EB" + WikipediaW = "\uF266" + Wind = "\uF72E" + WindowClose = "\uF410" + WindowMaximize = "\uF2D0" + WindowMinimize = "\uF2D1" + WindowRestore = "\uF2D2" + Windows = "\uF17A" + WineBottle = "\uF72F" + WineGlass = "\uF4E3" + WineGlassAlt = "\uF5CE" + Wix = "\uF5CF" + WizardsOfTheCoast = "\uF730" + WolfPackBattalion = "\uF514" + WonSign = "\uF159" + Wordpress = "\uF19A" + WordpressSimple = "\uF411" + Wpbeginner = "\uF297" + Wpexplorer = "\uF2DE" + Wpforms = "\uF298" + Wpressr = "\uF3E4" + Wrench = "\uF0AD" + XRay = "\uF497" + Xbox = "\uF412" + Xing = "\uF168" + XingSquare = "\uF169" + YCombinator = "\uF23B" + Yahoo = "\uF19E" + Yammer = "\uF840" + Yandex = "\uF413" + YandexInternational = "\uF414" + Yarn = "\uF7E3" + Yelp = "\uF1E9" + YenSign = "\uF157" + YinYang = "\uF6AD" + Yoast = "\uF2B1" + Youtube = "\uF167" + YoutubeSquare = "\uF431" + Zhihu = "\uF63F" diff --git a/src/nanovg/nanovg.nim b/src/nanovg/nanovg.nim index 36b3685..50594fb 100644 --- a/src/nanovg/nanovg.nim +++ b/src/nanovg/nanovg.nim @@ -73,7 +73,7 @@ cDefine("NANOVG_GL3", "") cOverride: # Standard Nim code to wrap types, consts, procs, etc. type - NVGcolor* {.bycopy, importc: "struct NVGcolor".} = object + NVGcolor* {.bycopy, impnanovgHdr, importc: "struct NVGcolor".} = object r*: cfloat g*: cfloat b*: cfloat