This commit is contained in:
Rasmus Andersson 2017-08-28 02:36:29 -07:00
parent f582d72059
commit 4f790d0ae8
12 changed files with 38821 additions and 323 deletions

235
docs/glyphs/glyphs.css Normal file
View file

@ -0,0 +1,235 @@
h1 span.glyph-name {}
h1 span.glyph-name:before {
content: " / ";
color: rgba(0,0,0,0.2);
font-weight:400;
}
body.iframe {
background-color:#fff;
padding:20px 10px;
}
#glyphs {
display: flex;
flex-wrap: wrap;
padding-left: 6px;
overflow: hidden;
width:200%;
box-sizing: border-box;
transform-origin: 0 0;
transform: scale(0.5);
justify-content: center;
transition: transform 50ms ease-out;
}
body.single #glyphs {
justify-content: flex-start;
max-width:888px;
margin:0 auto;
padding-left: 0;
}
.glyph {
height: 346px;
width: 346px;
background-image: none !important; /* since .glyph is an `a` */
background-color: white;
border-radius: 9px;
margin-right: 6px;
margin-bottom: 6px;
display: flex;
justify-content: center;
position: relative;
text-shadow: none;
}
.glyph .baseline {
background: rgba(0,90,230,.6);
position: absolute;
left:0; right:0; bottom:64px;
height: 1px;
z-index:0;
visibility: hidden;
}
.glyph .names {
position: absolute;
left:20px; right:20px; bottom:6px;
color:white;
text-align: center;
font-size:1em;
}
.glyph:hover .name {
color: rgba(0,0,0,0.8);
}
.glyph .advance {
box-sizing: border-box;
position: relative;
width: 1px;
}
.glyph.zero-width .advance {
background: transparent;
border-left: 1px dashed transparent;
}
.glyph:hover .baseline {
visibility: visible;
}
.glyph:hover .advance {
background: rgba(0,90,200,0.1);
}
.glyph.zero-width:hover .advance {
border-color: #aaa;
}
/*#glyphs .glyph .img*/
.glyph svg {
/*min-width: 346px;*/
/*height: 346px;*/
background-repeat: no-repeat;
/*background-size: contain;*/
/*background-color: #f5f5f5;*/
position: absolute;
top:0; bottom:0;
z-index:1;
opacity:0.95;
}
.glyph .advancez {
display: block;
background: salmon;
z-index:0;
}
body.single .intro {
padding-bottom: 1em;
}
body.single .intro p {
display: none;
}
#single-info {
max-width: 500px;
}
#single-info ul {
list-style: none;
}
#single-info ul li {
margin-bottom: 6px;
}
#single-info .num {
font-feature-settings: 'ss01' 1, 'zero' 1;
}
#single-info .unicodeName {
font-feature-settings: 'case' 1;
padding-left:0.3em;
}
#single-info .colorMark {
display:inline-block;
vertical-align:baseline;
width:20px;
height:20px;
border-radius:50%;
border: 1px solid rgba(0,0,0,0.2);
}
#single-info .colorMark.none {
border: 1px dashed rgba(0,0,0,0.4);
}
#svgs {
display: none;
}
.row.kerning {
display: none;
}
body.single .row.kerning {
display: flex;
}
.row.kerning .empty {
opacity:0.3;
}
#kerning-list {
display: flex;
/*flex-direction: column;*/
flex-wrap: wrap;
}
#kerning-list .divider {
clear:both;
width:100%;
flex: 1 0 100%;
height: 1px;
background:rgba(0,0,0,0.1);
margin-bottom: 1em;
}
.kernpair {
/*background: white;*/
border-radius:3px;
background-image: none !important;
display: flex;
flex-direction: row;
flex-wrap: wrap;
position: relative;
margin:0 2em 2em 0;
text-shadow: none;
}
.kernpair:hover {
background: white;
}
.kernpair:target, .kernpair.selected {
background: rgba(250, 240, 0, 0.9);
}
.kernpair:focus {
outline: none;
box-shadow: 0 0 0 2px rgba(0,0,0,0.4);
}
.kernpair .left, .kernpair .right {
width:100px;
height:100px;
/*background:rgba(40,240,90,0.3);*/
background-size: contain;
background-repeat: no-repeat;
opacity:0.8;
}
.kernpair:hover .left, .kernpair:hover .right {
opacity:0.9;
}
.kernpair.selected .left, .kernpair.selected .right {
opacity:1;
}
/*.kernpair .left { background-color:rgba(120,90,140,0.3); }*/
.kernpair .kern {
position: absolute;
/*background-color: blue;*/
background-color: rgba(255,0,0,0.1);
right:0; top:0; bottom:0;
z-index:9;
}
.kernpair .kern.pos {
background-color: rgba(36,207,128,0.3);
}
.kernpair:hover .kern, .kernpair.selected .kern {
background-color: rgba(255,0,0,0.5);
}
.kernpair:hover .kern.pos, .kernpair.selected .kern.pos {
background-color: rgba(36,207,128,0.5);
}
.kernpair .kern .label {
position: absolute;
white-space: nowrap;
opacity:0.9;
height: 20px;
right:-8px; bottom:-20px;
z-index:1;
text-align: center;
color: rgba(255,0,0,0.8);
visibility:hidden;
}
.kernpair .kern.pos .label {
color: rgba(36,207,128,0.8);
}
.kernpair:hover .kern .label,
.kernpair.selected .kern .label {
visibility:visible;
}

757
docs/glyphs/glyphs.js Normal file
View file

@ -0,0 +1,757 @@
// constants
var kSVGScale = 0.1 // how bmuch metrics are scaled in the SVGs
var kGlyphSize = 346 // at kSVGScale. In sync with CSS and SVGs
var kUPM = 2816
if (!isMac) {
Array.prototype.forEach.call(document.querySelectorAll('kbd'), function(e) {
if (e.innerText == '\u2318') {
e.innerText = 'Ctrl'
}
})
}
function httpget(url, cb) {
var req = new XMLHttpRequest();
req.addEventListener("load", function() {
cb(this.responseText, this)
})
req.open("GET", url)
req.send()
}
function fetchGlyphInfo(cb) {
httpget("../lab/glyphinfo.json", function(res) {
cb(JSON.parse(res).glyphs)
})
}
function fetchMetrics(cb) {
httpget("metrics.json", function(res) {
cb(JSON.parse(res))
})
}
var glyphInfo = null
var glyphMetrics = null
function initMetrics(data) {
// metrics.json uses a compact format with numerical glyph indentifiers
// in order to minimize file size.
// We expand the glyph IDs to glyph names here.
var nameIds = data.nameids
// console.log(data)
var metrics = {}
var metrics0 = data.metrics
Object.keys(metrics0).forEach(function (id) {
var name = nameIds[id]
var v = metrics0[id]
// v : [width, advance, left, right]
metrics[name] = {
width: v[0],
advance: v[1],
left: v[2],
right: v[3]
}
})
var kerningLeft = {} // { glyphName: {rightGlyphName: kerningValue, ...}, ... }
var kerningRight = {}
data.kerning.forEach(function (t) {
// each entry looks like this:
// [leftGlyphId, rightGlyphId, kerningValue]
var leftName = nameIds[t[0]]
if (!leftName) {
console.error('nameIds missing', t[0])
}
var rightName = nameIds[t[1]]
if (!rightName) {
console.error('nameIds missing', t[1])
}
var kerningValue = t[2]
var lm = kerningLeft[leftName]
if (!lm) {
kerningLeft[leftName] = lm = {}
}
lm[rightName] = kerningValue
var rm = kerningRight[rightName]
if (!rm) {
kerningRight[rightName] = rm = {}
}
rm[leftName] = kerningValue
})
glyphMetrics = {
metrics: metrics,
kerningLeft: kerningLeft,
kerningRight: kerningRight,
}
// console.log('glyphMetrics', glyphMetrics)
}
function fetchAll(cb) {
var i = 0
var res = {}
var decr = function(){
if (--i == 0) {
cb(res)
}
}
i++
fetchGlyphInfo(function(r){ glyphInfo = r; decr() })
i++
fetchMetrics(function(r){
initMetrics(r)
decr()
})
}
fetchAll(render)
var styleSheet = document.styleSheets[document.styleSheets.length-1]
var glyphRule, baselineRule, zeroWidthAdvRule
var currentScale = 0
var defaultSingleScale = 1
var currentSingleScale = 1
var defaultGridScale = 0.4
var currentGridScale = defaultGridScale
var glyphs = document.getElementById('glyphs')
function updateLayoutAfterChanges() {
var height = parseInt(window.getComputedStyle(glyphs).height)
var margin = height - (height * currentScale)
// console.log('scale:', currentScale, 'height:', height, 'margin:', margin)
if (currentScale > 1) {
glyphs.style.marginBottom = null
} else {
glyphs.style.marginBottom = -margin + 'px'
}
}
function setScale(scale) {
if (queryString.iframe !== undefined) {
scale = 0.11
} else if (queryString.g) {
scale = Math.min(Math.max(1, scale), 3)
} else {
scale = Math.min(Math.max(0.05, scale), 3)
}
if (currentScale == scale) {
return
}
currentScale = scale
if (queryString.g) {
currentSingleScale = scale
} else {
currentGridScale = scale
}
var hairline = Math.ceil(1 / window.devicePixelRatio / scale)
var spacing = Math.ceil(6 / scale)
var s = glyphs.style
if (queryString.g || queryString.iframe !== undefined) {
s.paddingLeft = null
} else {
s.paddingLeft = spacing + 'px'
}
s.width = (100 / scale) + '%'
s.transform = 'scale(' + scale + ')'
if (!glyphRule) {
glyphRule = styleSheet.cssRules[styleSheet.insertRule('#glyphs .glyph {}', styleSheet.cssRules.length)]
baselineRule = styleSheet.cssRules[styleSheet.insertRule('#glyphs .glyph .baseline {}', styleSheet.cssRules.length)]
zeroWidthAdvRule = styleSheet.cssRules[styleSheet.insertRule('#glyphs .glyph.zero-width .advance {}', styleSheet.cssRules.length)]
}
if (queryString.g) {
glyphRule.style.marginRight = null
glyphRule.style.marginBottom = null
} else {
glyphRule.style.marginRight = Math.ceil(6 / scale) + 'px';
glyphRule.style.marginBottom = Math.ceil(6 / scale) + 'px';
if (queryString.iframe !== undefined) {
glyphRule.style.marginBottom = Math.ceil(16 / scale) + 'px';
}
}
baselineRule.style.height = hairline + 'px'
zeroWidthAdvRule.style.borderWidth = (hairline) + 'px'
updateLayoutAfterChanges()
requestAnimationFrame(updateLayoutAfterChanges)
}
function encodeQueryString(q) {
return Object.keys(q).map(function(k) {
if (k) {
var v = q[k]
return encodeURIComponent(k) + (v ? '=' + encodeURIComponent(v) : '')
}
}).filter(function(s) { return !!s }).join('&')
}
function parseQueryString(qs) {
var q = {}
qs.replace(/^\?/,'').split('&').forEach(function(c) {
var kv = c.split('=')
var k = decodeURIComponent(kv[0])
if (k) {
q[k] = kv[1] ? decodeURIComponent(kv[1]) : null
}
})
return q
}
var queryString = parseQueryString(location.search)
var glyphNameEl = null
var baseTitle = document.title
var flippedLocationHash = false
var singleInfo = document.querySelector('#single-info')
singleInfo.parentElement.removeChild(singleInfo)
singleInfo.style.display = 'block'
function updateLocation() {
queryString = parseQueryString(location.search)
// var glyphs = document.getElementById('glyphs')
var h1 = document.querySelector('h1')
if (queryString.g) {
if (!glyphNameEl) {
glyphNameEl = document.createElement('span')
glyphNameEl.className = 'glyph-name'
}
document.title = queryString.g + ' ' + baseTitle
glyphNameEl.innerText = queryString.g
h1.appendChild(glyphNameEl)
document.body.classList.add('single')
setScale(currentSingleScale)
} else {
document.title = baseTitle
if (glyphNameEl) {
h1.removeChild(glyphNameEl)
}
document.body.classList.remove('single')
setScale(currentGridScale)
}
document.querySelector('.row.intro').style.display = (
queryString.iframe !== undefined ? 'none' : null
)
if (queryString.iframe !== undefined) {
document.body.classList.add('iframe')
} else {
document.body.classList.remove('iframe')
}
render()
}
window.onpopstate = function(ev) {
updateLocation()
}
function navto(url) {
history.pushState({}, "Glyphs", url)
updateLocation()
window.scrollTo(0,0)
}
function wrapIntLink(a) {
a.addEventListener('click', function(ev) {
if (!ev.metaKey && !ev.ctrlKey && !ev.shiftKey) {
ev.preventDefault()
navto(a.href)
}
})
}
wrapIntLink(document.querySelector('h1 > a'))
// keep refs to svgs so we don't have to refcount while using
var svgRepository = {}
;(function(){
var svgs = document.getElementById('svgs'), svg, name
for (var i = 0; i < svgs.children.length; ++i) {
svg = svgs.children[i]
name = svg.id.substr(4) // strip "svg-" prefix
svgRepository[name] = svg
}
})()
// Maps glyphname to glyphInfo. Only links to first found entry for a flyph.
var glyphInfoMap = {}
var needsUpdateGlyphInfoMap = true
function render() {
if (!glyphInfo) {
return
}
var rootEl = document.getElementById('glyphs')
rootEl.style.display = 'none'
rootEl.innerText = ''
// glyphInfo: {
// "glyphs": [
// [name :string, unicode? :int|null, unicodeName? :string, color? :string|null],
// ["A", 65, "LATIN CAPITAL LETTER A", "#dbeaf7"],
// ...
// ],
// }
//
// Note: Glyph names might appear multiple times (always adjacent) when a glyph is
// represented by multiple Unicode code points. For example:
//
// ["Delta", 916, "GREEK CAPITAL LETTER DELTA"],
// ["Delta", 8710, "INCREMENT"],
//
var glyphs = glyphInfo
var singleGlyph = null
var lastGlyphEl = null
var lastGlyphName = ''
glyphInfo.forEach(function(g, i) {
var name = g[0]
if (needsUpdateGlyphInfoMap && !glyphInfoMap[name]) {
glyphInfoMap[name] = g
}
if (queryString.g && name != queryString.g) {
// ignore
return
}
var glyph = renderGlyphGraphicG(g, lastGlyphName, lastGlyphEl, singleGlyph)
if (glyph) {
rootEl.appendChild(glyph.element)
lastGlyphEl = glyph.element
lastGlyphName = name
if (queryString.g) {
singleGlyph = glyph
}
}
})
needsUpdateGlyphInfoMap = false
if (singleGlyph) {
renderSingleInfo(singleGlyph)
rootEl.appendChild(singleInfo)
}
rootEl.style.display = null
updateLayoutAfterChanges()
}
function renderGlyphGraphic(glyphName) {
var g = glyphInfoMap[glyphName]
return g ? renderGlyphGraphicG(g) : null
}
function renderGlyphGraphicG(g, lastGlyphName, lastGlyphEl, singleGlyph) {
var name = g[0]
var names, glyph
var svg = svgRepository[name]
if (!svg) {
// ignore
return null
}
var metrics = glyphMetrics.metrics[name]
if (!metrics) {
console.error('missing metrics for', name)
}
var info = {
name: name,
unicode: g[1],
unicodeName: g[2],
color: g[3],
// These are all in 1:1 UPM (not scaled)
advance: metrics.advance,
left: metrics.left,
right: metrics.right,
width: metrics.width,
element: null,
}
if (name == lastGlyphName) {
// additional Unicode code point for same glyph
glyph = lastGlyphEl
names = glyph.querySelector('.names')
names.innerText += ','
if (info.unicode) {
var ucid = ' U+' + fmthex(info.unicode)
names.innerText += ' U+' + fmthex(info.unicode)
if (!queryString.g) {
glyph.title += ucid
}
}
if (info.unicodeName) {
names.innerText += ' ' + info.unicodeName
if (!queryString.g) {
glyph.title += ' (' + info.unicodeName + ')'
}
}
if (queryString.g) {
if (singleGlyph) {
if (!singleGlyph.alternates) {
singleGlyph.alternates = []
}
singleGlyph.alternates.push(info)
} else {
throw new Error('alternate glyph UC, but appears first in glyphinfo data')
}
}
return
}
// console.log('svg for', name, svg.width.baseVal.value, '->', svg, '\n', info)
glyph = document.createElement('a')
glyph.className = 'glyph'
glyph.href = '?g=' + encodeURIComponent(name)
wrapIntLink(glyph)
info.element = glyph
if (!queryString.g) {
glyph.title = name
}
var baseline = document.createElement('div')
baseline.className = 'baseline'
glyph.appendChild(baseline)
names = document.createElement('div')
names.className = 'names'
names.innerText = name
if (info.unicode) {
var ucid = ' U+' + fmthex(info.unicode)
names.innerText += ' U+' + fmthex(info.unicode, 4)
if (!queryString.g) {
glyph.title += ucid
}
}
if (info.unicodeName) {
names.innerText += ' ' + info.unicodeName
if (!queryString.g) {
glyph.title += ' (' + info.unicodeName + ')'
}
}
glyph.appendChild(names)
var scaledAdvance = info.advance * kSVGScale
if (scaledAdvance > kGlyphSize) {
glyph.style.width = scaledAdvance.toFixed(2) + 'px'
}
var adv = document.createElement('div')
adv.className = 'advance'
glyph.appendChild(adv)
adv.appendChild(svg)
svg.style.left = (info.left * kSVGScale).toFixed(2) + 'px'
if (info.advance <= 0) {
glyph.className += ' zero-width'
} else {
adv.style.width = scaledAdvance.toFixed(2) + 'px'
}
return info
}
function renderSingleInfo(g) {
var e = singleInfo
e.querySelector('.name').innerText = g.name
function setv(el, name, textValue) {
el.querySelector('.' + name).innerText = textValue
}
var unicode = e.querySelector('.unicode')
function configureUnicodeView(el, g) {
setv(el, 'unicodeCodePoint', g.unicode ? 'U+' + fmthex(g.unicode, 4) : '')
setv(el, 'unicodeName', g.unicodeName || '')
}
// remove any previous alternate unicode list items
var rmli = unicode
while ((rmli = rmli.nextSibling)) {
if (rmli.nodeType == Node.ELEMENT_NODE) {
if (!rmli.parentElement || !rmli.classList.contains('unicode')) {
break
}
rmli.parentElement.removeChild(rmli)
}
}
configureUnicodeView(unicode, g)
if (g.alternates) {
var refnode = unicode.nextSibling
g.alternates.forEach(function(g) {
var li = unicode.cloneNode(true)
configureUnicodeView(li, g)
if (refnode) {
unicode.parentElement.insertBefore(li, unicode.nextSibling)
} else {
unicode.parentElement.appendChild(li)
}
})
}
e.querySelector('.advanceWidth').innerText = g.advance
e.querySelector('.marginLeft').innerText = g.left
e.querySelector('.marginRight').innerText = g.right
var colorMark = e.querySelector('.colorMark')
if (g.color) {
colorMark.title = g.color.toUpperCase()
colorMark.style.background = g.color
colorMark.classList.remove('none')
} else {
colorMark.title = '(None)'
colorMark.style.background = null
colorMark.classList.add('none')
}
var svg = svgRepository[g.name]
var svgFile = e.querySelector('.svgFile')
svgFile.download = g.name + '.svg'
svgFile.href = getSvgDataURI(svg)
renderSingleKerning(g)
}
var cachedSVGDataURIs = {}
function getSvgDataURI(svg) {
var cached = cachedSVGDataURIs[svg.id]
if (!cached) {
cached = 'data:image/svg+xml,' + svg.outerHTML.replace(/[\r\n]+/g, '')
cachedSVGDataURIs[svg.id] = cached
}
return cached
}
function pxround(n) {
return Math.round(n * 2) / 2
}
function selectKerningPair(id, directly) {
Array.prototype.forEach.call(
document.querySelectorAll('.kernpair.selected'),
function(e) {
e.classList.remove('selected')
}
)
var el = document.getElementById(id)
if (el) {
el.classList.add('selected')
if (!directly) {
el.scrollIntoViewIfNeeded()
}
}
history.replaceState({}, '', location.search + '#' + id)
}
// return true if some kerning was rendered
function renderSingleKerning(g) {
var kerningList = document.getElementById('kerning-list')
kerningList.style.display = 'none'
kerningList.innerText = ''
var thisSvg = svgRepository[g.name]
var thisSvgURI = getSvgDataURI(thisSvg)
if (!thisSvg) {
kerningList.style.display = null
return false
}
var kerningAsLeft = glyphMetrics.kerningLeft[g.name] || {}
var kerningAsRight = glyphMetrics.kerningRight[g.name] || {}
var kerningAsLeftKeys = Object.keys(kerningAsLeft)
var kerningAsRightKeys = Object.keys(kerningAsRight)
if (kerningAsLeftKeys.length == 0 && kerningAsRightKeys.length == 0) {
var p = document.createElement('p')
p.className = 'empty'
p.innerText = 'No kerning'
kerningList.appendChild(p)
kerningList.style.display = null
return false
}
var lilGlyphSize = 128
var lilScale = lilGlyphSize / kGlyphSize
function mkpairGlyph(glyphName, side, kerningValue, svgURI) {
var metrics = glyphMetrics.metrics[glyphName]
var svgWidth = pxround(metrics.width * kSVGScale * lilScale)
var el = document.createElement('div')
var leftMargin = metrics.left
var rightMargin = metrics.right
if (side == 'left') {
rightMargin += kerningValue
} else {
leftMargin += kerningValue
}
leftMargin = leftMargin * kSVGScale * lilScale
rightMargin = rightMargin * kSVGScale * lilScale
el.className = side
el.style.backgroundImage = "url('" + svgURI + "')"
el.style.backgroundSize = svgWidth + 'px ' + lilGlyphSize + 'px'
el.style.width = svgWidth + 'px'
el.style.height = lilGlyphSize + 'px'
el.style.marginLeft = pxround(leftMargin) + 'px'
el.style.marginRight = pxround(rightMargin) + 'px'
return el
}
function mkpairs(kerningInfo, selfName, self, side) {
var asLeftSide = side == 'left'
var idPrefix = asLeftSide ? 'kernl-' : 'kernr-'
var keys = Object.keys(kerningInfo)
var otherSide = asLeftSide ? 'right' : 'left'
keys.forEach(function(glyphName) {
var kerningValue = kerningInfo[glyphName]
var otherSvg = svgRepository[glyphName]
var pair = document.createElement('a')
pair.className = 'kernpair'
pair.title = (
asLeftSide ? selfName + '/' + glyphName + ' ' + kerningValue :
glyphName + '/' + selfName + ' ' + kerningValue
)
pair.id = idPrefix + glyphName
pair.href = '#' + pair.id
pair.onclick = function(ev) {
selectKerningPair(pair.id)
ev.preventDefault()
ev.stopPropagation()
}
var otherEl = mkpairGlyph(glyphName, otherSide, kerningValue, getSvgDataURI(otherSvg))
if (asLeftSide) {
if (self.parentNode) {
pair.appendChild(self.cloneNode(true))
} else {
pair.appendChild(self)
}
pair.appendChild(otherEl)
} else {
pair.appendChild(otherEl)
if (self.parentNode) {
pair.appendChild(self.cloneNode(true))
} else {
pair.appendChild(self)
}
}
var kern = document.createElement('div')
kern.className = 'kern ' + (kerningValue < 0 ? 'neg' : 'pos')
var absKernVal = Math.abs(kerningValue)
var kernWidth = Math.max(1, pxround(absKernVal * kSVGScale * lilScale))
kern.style.width = kernWidth + 'px'
var leftMetrics = glyphMetrics.metrics[asLeftSide ? selfName : glyphName]
var leftAdvance = leftMetrics.advance
kern.style.left = pxround((leftAdvance - absKernVal) * kSVGScale * lilScale) + 'px'
pair.appendChild(kern)
var label = document.createElement('div')
label.className = 'label'
label.innerText = kerningValue
kern.appendChild(label)
kerningList.appendChild(pair)
})
return keys.length != 0
}
var selfLeft = mkpairGlyph(g.name, 'left', 0, thisSvgURI)
var selfRight = mkpairGlyph(g.name, 'right', 0, thisSvgURI)
if (mkpairs(kerningAsLeft, g.name, selfLeft, 'left')) {
var div = document.createElement('div')
div.className = 'divider'
kerningList.appendChild(div)
}
mkpairs(kerningAsRight, g.name, selfRight, 'right')
if (location.hash && location.hash.indexOf('#kern') == 0) {
var id = location.hash.substr(1)
setTimeout(function(){
selectKerningPair(id)
},1)
}
kerningList.style.display = null
return true
}
function fmthex(cp, minWidth) {
let s = cp.toString(16).toUpperCase()
while (s.length < minWidth) {
s = '0' + s
}
return s
}
document.addEventListener('keydown', function(ev) {
if (!queryString.g && (ev.metaKey || ev.ctrlKey)) {
if (ev.keyCode == 187 || ev.key == '+') {
setScale(parseFloat((currentScale + 0.1).toFixed(2)))
ev.preventDefault()
} else if (ev.keyCode == 189 || ev.key == '-') {
setScale(parseFloat((currentScale - 0.1).toFixed(2)))
ev.preventDefault()
} else if (ev.keyCode == 48 || ev.key == '0') {
setScale(queryString.g ? defaultSingleScale : defaultGridScale)
ev.preventDefault()
}
}
})
updateLocation()

3202
docs/glyphs/index.html Normal file

File diff suppressed because it is too large Load diff

33977
docs/glyphs/metrics.json Normal file

File diff suppressed because it is too large Load diff

393
docs/index.css Normal file
View file

@ -0,0 +1,393 @@
* { margin:0; padding:0; }
html { }
body {
background-color: #f4f4f4;
color: #414141;
font: 16px/22px Interface, sans-serif;
letter-spacing: -0.1px;
font-weight: 400;
padding-bottom: 30px;
font-kerning: normal;
-moz-font-feature-settings: "kern" 1;
-webkit-font-feature-settings: "kern" 1;
font-feature-settings: "kern" 1;
}
a {
color: inherit;
text-decoration: underline;
word-break: break-word;
word-wrap: break-word;
}
a:hover {
color: rgb(48, 112, 232);
}
a.plain, a.fat {
/* !important needed for qualification over @media further down */
background: none !important;
text-shadow: none !important;
text-decoration: none;
}
a.fat {
font-weight:500;
}
p {
margin: 20px 0;
}
code, pre, q {
font-family: "SFMono-Regular", Menlo, Consolas, Inconsolata, monospace;
font-size:0.96em;
}
code {
display: block;
border-radius:1px;
padding: 0.5em 0;
overflow: auto;
}
pre, q {
display: inline;
white-space: pre-wrap;
}
q {
display: inline;
}
q:before {
content: "";
}
q:after {
content: "";
}
kbd {
font-feature-settings: 'kern' 1, 'case' 1;
border: 1px solid rgba(0,0,0,0.18);
border-radius: 3px;
padding:0.1em 0.2em;
margin:0 0.1em;
}
dem { /* de-emphasize */
font-weight: 400;
opacity: 0.7;
}
h1, h2, h3 {
font-weight: 500;
}
h1 {
color: #333;
font-size: 38px;
letter-spacing: -1.3px;
line-height: 40px;
text-indent: -2px;
margin-bottom: 30px;
margin-top: 10px;
}
h2 {
font-size: 24px;
letter-spacing: -0.4px;
line-height: 30px;
margin-bottom: 25px;
margin-top: 10px;
}
h2.back {
color:rgba(0,0,0,0.2);
font-size: inherit;
font-weight:400;
margin:0;
margin-top:-1.9em;
}
h2.back a:hover {
color: black;
margin-left:-1.6em;
}
h2.back a:hover::before {
content: "<- ";
}
h3 {
font-size: inherit;
}
h1 > a, h2 > a, h3 > a {
color: inherit;
text-decoration: none;
text-shadow: none;
background: none !important;
}
.row {
padding: 50px;
/*background: salmon;*/
display: flex;
justify-content: center;
/*background: white;*/
}
.row > * {
width:100%;
max-width: 888px;
flex: 1 0 100%;
/*background: white;*/
}
.row-divider {
margin:0 auto;
max-width: 888px;
height: 1px;
border-bottom: 1px dashed rgba(0,0,0,0.09);
}
/* small screens */
@media only screen and (max-device-width: 736px) {
.row {
padding-left: 20px;
padding-right: 20px;
}
}
.row.white {
background: white;
}
.row.dark {
background: #2b2b2b;
color: #99999b;
}
.row.dark a:hover {
color: rgb(164, 188, 255);
}
.row.dark h2, .row.dark h2 > a {
color: #ccc;
background: none;
}
.row.color1 {
background: #C0CDE2;
color: #3B414A;
}
/*
Medium.com-style link underline for high-density displays.
Currently only enabled on Mac as the lines don't render correctly on
Windows (even in Chrome) for some reason.
*/
@media (-webkit-min-device-pixel-ratio: 1.5) {
a {
text-decoration: none;
background-image:
linear-gradient(to bottom,
rgba(0,0,0,.6) 50%,
rgba(0,0,0,0) 50%);
background-repeat: repeat-x;
background-size: 2px .1em;
background-position: 0 1.15em;
text-shadow:
/* creates "openings" for descenders in the underline */
-1px -1px 0 #f4f4f4,
1px -1px 0 #f4f4f4,
-1px 1px 0 #f4f4f4,
1px 1px 0 #f4f4f4;
}
body.mac_or_ios a {
/* line height calculated differently on mac c/t windows */
background-position: 0 1.045em;
}
a:hover {
background-image:
linear-gradient(to bottom,
rgba(48, 112, 232, 1) 50%,
rgba(48, 112, 232, 0) 50%);
}
.row.white a {
text-shadow:
-1px -1px 0 white,
1px -1px 0 white,
-1px 1px 0 white,
1px 1px 0 white;
}
.row.dark a {
background-image:
linear-gradient(to bottom,
rgba(255,255,255,.3) 50%,
rgba(255,255,255,0) 50%);
text-shadow:
-1px -1px 0 #2b2b2b,
1px -1px 0 #2b2b2b,
-1px 1px 0 #2b2b2b,
1px 1px 0 #2b2b2b;
}
.row.dark a:hover {
background-image:
linear-gradient(to bottom,
rgba(164, 188, 255, 1) 50%,
rgba(164, 188, 255, 0) 50%);
}
}
::selection {
background: rgb(48, 112, 232);
color: white;
text-shadow: none;
}
::-moz-selection {
background: rgb(48, 112, 232);
color: white;
text-shadow: none;
}
.row.dark ::selection {
background: rgb(218, 228, 255);
color: black;
}
.row.dark ::-moz-selection {
background: rgb(164, 188, 255);
color: black;
}
ul {
margin-left:1.1em;
}
a > img {
display: block;
}
#repertoire-image {
display:block;
width:100%;
height:40vw;
background-image: url(res/repertoire.png);
background-repeat: no-repeat;
background-size: cover;
background-blend-mode: multiply;
background-color: #f4f4f4;
}
/* FAQ */
ul.faq {
list-style:none;
display: flex;
flex-direction: column;
margin-left:0;
}
ul.faq > li {
padding-right: 6px;
margin-bottom: 6px;
padding-left: 1.5em;
text-indent: -1.5em;
}
ul.faq > li > a {
display: inline;
}
ul.faq > li:target {
background: #fafa88;
}
li.q {
font-weight: 500;
margin-top:1.5em;
}
ul > li.q:first-child, ul > li.q:not([id]) {
margin-top:0;
}
li.q:before {
content: "Q  "; /* contains NO-BREAK SPACE */
opacity: 0.6;
}
li.q:after {
content: "";
}
li.a:before {
content: "A  "; /* contains NO-BREAK SPACE */
opacity: 0.6;
}
tablex {
display: flex;
}
tablex > t {
display: table;
}
tablex > t > h {
display: table-row;
opacity:0.4;
}
tablex > t > h > * {
padding-bottom:1em;
}
tablex > t > h to {
visibility: hidden;
}
tablex > t > r {
text-decoration: none;
display: table-row;
}
tablex in, tablex to, tablex out {
display: table-cell;
width: 5%;
white-space: pre;
padding-bottom:0.5em;
}
/*tablex to {
width:0;
}*/
tablex to::after {
font-feature-settings: 'calt' 1, 'case' 1;
content: " → ";
color: rgba(0,0,0,0.2);
}
tablex in, tablex out {
/*background: #E3E6F1;*/
color: rgba(0,0,0,0.8);
border-radius: 1px;
}
tablex in {
font-feature-settings: 'calt' 0;
}
tablex out {
font-feature-settings: 'calt' 1;
}
tablex out.zero { font-feature-settings: 'calt' 1, 'zero' 1; }
tablex out.tnum { font-feature-settings: 'calt' 1, 'tnum' 1; }
tablex out.case { font-feature-settings: 'calt' 1, 'case' 1; }
tablex out.frac { font-feature-settings: 'calt' 1, 'frac' 1; }
tablex out.ss01 { font-feature-settings: 'calt' 1, 'ss01' 1; }
tablex em {
font-style: inherit;
background: #FBE9A3;
color: rgba(0,0,0,1);
}
boxes {
display: flex;
flex-wrap: wrap;
justify-content: stretch;
margin-right:-1em;
}
box {
display: flex;
flex-direction: column;
background: white;
padding:2em;
border-radius: 1px;
margin-right:1em;
margin-bottom:1em;
flex: 1 1 10%;
/*width:220px;*/
}
box:first-child {
margin-left:0;
}
box h3 {
margin-bottom:0.8em;
}
#glyph-repertoire-iframe {
pointer-events: none;
}
/*#glyph-repertoire-p {
cursor: pointer;
}*/
a.glyph-repertoire {
display:block;
}

View file

@ -27,267 +27,10 @@
<link rel="icon" type="image/png" href="favicon.ico" />
<link href="interface.css" rel="stylesheet">
<style type="text/css">
* { margin:0; padding:0; }
html { }
body {
background-color: #f4f4f4;
color: #414141;
font: 16px/22px Interface, sans-serif;
letter-spacing: -0.1px;
font-weight: 400;
padding-bottom: 30px;
font-kerning: normal;
-moz-font-feature-settings: "kern";
-webkit-font-feature-settings: "kern";
font-feature-settings: "kern";
}
a {
color: inherit;
text-decoration: underline;
word-break: break-word;
word-wrap: break-word;
}
a:hover {
color: rgb(48, 112, 232);
}
a.plain, a.fat {
/* !important needed for qualification over @media further down */
background: none !important;
text-shadow: none !important;
text-decoration: none;
}
a.fat {
font-weight:500;
}
p {
margin: 20px 0;
}
code, pre {
font-family: "SFMono-Regular", Menlo, Consolas, Inconsolata, monospace;
font-size:0.96em;
}
code {
display: block;
border-radius:1px;
padding: 0.5em 0;
overflow: auto;
}
pre {
display: inline;
white-space: pre-wrap;
}
dem { /* de-emphasize */
font-weight: 400;
opacity: 0.7;
}
h1, h2, h3 {
font-weight: 500;
}
h1 {
color: #333;
font-size: 38px;
letter-spacing: -1.3px;
line-height: 40px;
text-indent: -2px;
margin-bottom: 30px;
margin-top: 10px;
}
h2 {
font-size: 24px;
letter-spacing: -0.4px;
line-height: 30px;
margin-bottom: 25px;
margin-top: 10px;
}
h1 > a, h2 > a, h3 > a {
color: inherit;
text-decoration: none;
text-shadow: none;
background: none !important;
}
.row {
padding: 50px;
/*background: salmon;*/
display: flex;
justify-content: center;
/*background: white;*/
}
.row > * {
width:100%;
max-width: 888px;
flex: 1 0 100%;
/*background: white;*/
}
/* small screens */
@media only screen and (max-device-width: 736px) {
.row {
padding-left: 20px;
padding-right: 20px;
}
}
.row.white {
background: white;
}
.row.dark {
background: #2b2b2b;
color: #99999b;
}
.row.dark a:hover {
color: rgb(164, 188, 255);
}
.row.dark h2, .row.dark h2 > a {
color: #ccc;
background: none;
}
/*
Medium.com-style link underline for high-density displays.
Currently only enabled on Mac as the lines don't render correctly on
Windows (even in Chrome) for some reason.
*/
@media (-webkit-min-device-pixel-ratio: 1.5) {
a {
text-decoration: none;
background-image:
linear-gradient(to bottom,
rgba(0,0,0,.6) 50%,
rgba(0,0,0,0) 50%);
background-repeat: repeat-x;
background-size: 2px .1em;
background-position: 0 1.15em;
text-shadow:
/* creates "openings" for descenders in the underline */
-1px -1px 0 #f4f4f4,
1px -1px 0 #f4f4f4,
-1px 1px 0 #f4f4f4,
1px 1px 0 #f4f4f4;
}
body.mac_or_ios a {
/* line height calculated differently on mac c/t windows */
background-position: 0 1.045em;
}
a:hover {
background-image:
linear-gradient(to bottom,
rgba(48, 112, 232, 1) 50%,
rgba(48, 112, 232, 0) 50%);
}
.row.white a {
text-shadow:
-1px -1px 0 white,
1px -1px 0 white,
-1px 1px 0 white,
1px 1px 0 white;
}
.row.dark a {
background-image:
linear-gradient(to bottom,
rgba(255,255,255,.3) 50%,
rgba(255,255,255,0) 50%);
text-shadow:
-1px -1px 0 #2b2b2b,
1px -1px 0 #2b2b2b,
-1px 1px 0 #2b2b2b,
1px 1px 0 #2b2b2b;
}
.row.dark a:hover {
background-image:
linear-gradient(to bottom,
rgba(164, 188, 255, 1) 50%,
rgba(164, 188, 255, 0) 50%);
}
}
.row ::selection {
background: rgb(48, 112, 232);
color: white;
text-shadow: none;
}
.row ::-moz-selection {
background: rgb(48, 112, 232);
color: white;
text-shadow: none;
}
.row.dark ::selection {
background: rgb(218, 228, 255);
color: black;
}
.row.dark ::-moz-selection {
background: rgb(164, 188, 255);
color: black;
}
a > img {
display: block;
}
#repertoire-image {
display:block;
width:100%;
height:40vw;
background-image: url(res/repertoire.png);
background-repeat: no-repeat;
background-size: cover;
background-blend-mode: multiply;
background-color: #f4f4f4;
}
/* FAQ */
ul.faq {
list-style:none;
display: flex;
flex-direction: column;
}
ul.faq > li {
padding-right: 6px;
margin-bottom: 6px;
padding-left: 1.5em;
text-indent: -1.5em;
}
ul.faq > li > a {
display: inline;
}
ul.faq > li:target {
background: #fafa88;
}
li.q {
font-weight: 500;
margin-top:1.5em;
}
ul > li.q:first-child, ul > li.q:not([id]) {
margin-top:0;
}
li.q:before {
content: "Q  "; /* contains NO-BREAK SPACE */
opacity: 0.6;
}
li.a:before {
content: "A  "; /* contains NO-BREAK SPACE */
opacity: 0.6;
}
</style>
<link href="index.css" rel="stylesheet">
</head>
<body>
<script>
if (!window.MSStream &&
/mac|ipad|iphone|ipod/i.test(navigator.userAgent))
{
document.body.classList = 'mac_or_ios'
}
</script>
<script src="index.js"></script>
<div class="row"><div>
<h1>The Interface font family</h1>
@ -329,6 +72,101 @@ li.a:before {
<code>font-family: Interface, sans-serif;</code>
</div></div>
<div class="row"><div>
<p>
There are currently three <a id="weights" href="#weights">weights</a>
</p>
<img src="res/weights-and-styles.svg" style="opacity:0.76;width:100%;display:block;margin:2em 0 3em 0">
<h2><a id="features" href="#features">Features</a></h2>
<boxes>
<box>
<h3>Contextual alternates (<q title='OpenType feature ID'>calt</q>)</h3>
<tablex><t>
<h><in>Disabled</in><to></to><out>Enabled</out></h>
<r><in>12<em>:</em>34, FE<em></em>X</in><to></to><out>12:34, FE—X</out></r>
<r><in>4<em>.</em>2</in><to></to><out>4.2</out></r>
<r><in>SFO -> STO</in><to></to><out>SFO -> STO</out></r>
<r><in>M<em>@</em>N m@n</in><to></to><out>M@N m@n</out></r>
</t></tablex>
</box>
<box>
<h3>Tabular numbers (<q title='OpenType feature ID'>tnum</q>)</h3>
<tablex><t>
<h><in>Disabled</in><to></to><out>Enabled</out></h>
<r><in><em>1</em>23456<em>7</em>890</in><to></to><out class="tnum">1234567890</out></r>
<r><in>1131711<em>&nbsp;</em></in><to></to><out class="tnum">1131711<em>&nbsp;</em></out></r>
<r><in>0040900<em>&nbsp;</em></in><to></to><out class="tnum">0040900<em>&nbsp;</em></out></r>
</t></tablex>
</box>
<box>
<h3>Slashed zero (<q title='OpenType feature ID'>zero</q>)</h3>
<tablex><t>
<h><in>Disabled</in><to></to><out>Enabled</out></h>
<r><in><em>0</em>123</in><to></to><out class="zero">0123</out></r>
</t></tablex>
</box>
<box>
<h3>Fractions (<q title='OpenType feature ID'>frac</q>)</h3>
<tablex><t>
<h><in>Disabled</in><to></to><out>Enabled</out></h>
<r>
<in><em>1/3</em> <em>22/9</em> <em>3/4/5</em></in>
<to></to><out class="frac">1/3 22/9 3/4/5</out>
</r>
</t></tablex>
</box>
<box>
<h3>Stylistic set #1: Open digits (<q title='OpenType feature ID'>ss01</q>)</h3>
<tablex><t>
<h><in>Disabled</in><to></to><out>Enabled</out></h>
<r>
<in>123<em>4</em>5<em>6</em>78<em>9</em>0</in>
<to></to><out class="ss01">1234567890</out>
</r>
</t></tablex>
</box>
<box>
<h3>Case alternates (<q title='OpenType feature ID'>case</q>)</h3>
<tablex><t>
<h><in>Disabled</in><to></to><out>Enabled</out></h>
<r>
<in><em>(</em>Hello<em>)</em> <em>[</em>World<em>]</em> <em>{</em>9000<em>}</em></in>
<to></to><out class="case">(Hello) [World] {9000}</out>
</r>
<r><in>SCHOOL <em>@</em> RUN</in><to></to><out class="case">SCHOOL @ RUN</out></r>
<r><in>3 <em>+</em> 9 <em>=</em> 12*</in><to></to><out class="case">3 + 9 = 12*</out></r>
<r><in><em>*</em> <em>+</em> <em>÷</em> <em>±</em> <em>×</em> <em>=</em> <em></em> <em></em></in><to></to><out class="case">* + ÷ ± × = ≠ •</out></r>
<r><in><em></em> <em></em> <em></em> <em></em> <em></em> <em>-</em> <em></em> <em></em> <em>:</em></in><to></to><out class="case">→ ← ⟶ ⟵ - — :</out></r>
</t></tablex>
</box>
</boxes>
<p>
Also includes some
Localized Forms (<q title='OpenType feature ID'>locl</q>),
Numerators (<q title='OpenType feature ID'>numr</q>) and
Denominators (<q title='OpenType feature ID'>dnom</q>).
</p>
<p>&nbsp;</p>
<h2><a href="glyphs/">Glyph repertoire</a></h2>
<p>
<a class="plain glyph-repertoire" href="glyphs/">
<iframe id="glyph-repertoire-iframe" src="glyphs/?iframe"
style="width:100%;height:510px" frameborder="0"></iframe>
</a>
</p>
</div></div>
<div class="row-divider"></div>
<div class="row"><div>
<h2><a id="story" href="#story">The story behind Interface</a></h2>
<p>
@ -365,10 +203,7 @@ li.a:before {
</p>
<p>
<a href="lab/?sample=Repertoire&size=42" id="repertoire-image"></a>
</p>
<p>
Please refer to the <a href="lab/?sample=Repertoire&size=42">glyph repertoire</a>
Please refer to the <a href="glyphs/">glyph repertoire</a>
for an overview of currentlyavailable glyphs and their quality.
</p>
@ -396,7 +231,7 @@ li.a:before {
<a href="https://en.wikipedia.org/wiki/Eric_Erickson">Eric Ericksons</a>,
name alone somtimes does not suffice for unambiguous identity.
The best way to be clear about what font you are talking about is to
use the URL of this page (<pre>rsms.me/interface</pre>) when telling
use the URL of this page (<q>rsms.me/interface</q>) when telling
people about it.
<a href="https://figma.com/">Design tools</a> and other software uses
<a href="https://www.microsoft.com/typography/otspec/name.htm#nameIDs">a set of information embedded into every font</a> for identity, so names are only
@ -471,14 +306,5 @@ li.a:before {
<div class="row"><div>
<a href="https://twitter.com/rsms" class="plain">@rsms</a>
</div></div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-105091131-2', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>

15
docs/index.js Normal file
View file

@ -0,0 +1,15 @@
var isMac = false
if (!window.MSStream &&
/mac|ipad|iphone|ipod/i.test(navigator.userAgent))
{
isMac = true
document.body.classList = 'mac_or_ios'
}
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-105091131-2', 'auto');
ga('send', 'pageview');

View file

@ -2,43 +2,43 @@
font-family: 'Interface';
font-style: normal;
font-weight: 400;
src: url("https://rsms.me/interface/font-files/Interface-Regular.woff2?v=1.3") format("woff2"),
url("https://rsms.me/interface/font-files/Interface-Regular.woff?v=1.3") format("woff");
src: url("font-files/Interface-Regular.woff2?v=1.3") format("woff2"),
url("font-files/Interface-Regular.woff?v=1.3") format("woff");
}
@font-face {
font-family: 'Interface';
font-style: italic;
font-weight: 400;
src: url("https://rsms.me/interface/font-files/Interface-RegularItalic.woff2?v=1.3") format("woff2"),
url("https://rsms.me/interface/font-files/Interface-RegularItalic.woff?v=1.3") format("woff");
src: url("font-files/Interface-RegularItalic.woff2?v=1.3") format("woff2"),
url("font-files/Interface-RegularItalic.woff?v=1.3") format("woff");
}
@font-face {
font-family: 'Interface';
font-style: normal;
font-weight: 500;
src: url("https://rsms.me/interface/font-files/Interface-Medium.woff2?v=1.3") format("woff2"),
url("https://rsms.me/interface/font-files/Interface-Medium.woff?v=1.3") format("woff");
src: url("font-files/Interface-Medium.woff2?v=1.3") format("woff2"),
url("font-files/Interface-Medium.woff?v=1.3") format("woff");
}
@font-face {
font-family: 'Interface';
font-style: italic;
font-weight: 500;
src: url("https://rsms.me/interface/font-files/Interface-MediumItalic.woff2?v=1.3") format("woff2"),
url("https://rsms.me/interface/font-files/Interface-MediumItalic.woff?v=1.3") format("woff");
src: url("font-files/Interface-MediumItalic.woff2?v=1.3") format("woff2"),
url("font-files/Interface-MediumItalic.woff?v=1.3") format("woff");
}
@font-face {
font-family: 'Interface';
font-style: normal;
font-weight: 700;
src: url("https://rsms.me/interface/font-files/Interface-Bold.woff2?v=1.3") format("woff2"),
url("https://rsms.me/interface/font-files/Interface-Bold.woff?v=1.3") format("woff");
src: url("font-files/Interface-Bold.woff2?v=1.3") format("woff2"),
url("font-files/Interface-Bold.woff?v=1.3") format("woff");
}
@font-face {
font-family: 'Interface';
font-style: italic;
font-weight: 700;
src: url("https://rsms.me/interface/font-files/Interface-BoldItalic.woff2?v=1.3") format("woff2"),
url("https://rsms.me/interface/font-files/Interface-BoldItalic.woff?v=1.3") format("woff");
src: url("font-files/Interface-BoldItalic.woff2?v=1.3") format("woff2"),
url("font-files/Interface-BoldItalic.woff?v=1.3") format("woff");
}

View file

@ -5,38 +5,40 @@
, ["Lambda", 923, "GREEK CAPITAL LETTER LAMDA"]
, ["B", 66, "LATIN CAPITAL LETTER B", "#dbeaf7"]
, ["C", 67, "LATIN CAPITAL LETTER C", "#dbeaf7"]
, ["Chook", 391, "LATIN CAPITAL LETTER C WITH HOOK"]
, ["D", 68, "LATIN CAPITAL LETTER D", "#dbeaf7"]
, ["E", 69, "LATIN CAPITAL LETTER E", "#dbeaf7"]
, ["Dzcaron_", 453, "LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON"]
, ["F", 70, "LATIN CAPITAL LETTER F", "#dbeaf7"]
, ["G", 71, "LATIN CAPITAL LETTER G", "#dbeaf7"]
, ["H", 72, "LATIN CAPITAL LETTER H", "#dbeaf7"]
, ["Hcedilla", 7720, "LATIN CAPITAL LETTER H WITH CEDILLA"]
, ["Gbar", 484, "LATIN CAPITAL LETTER G WITH STROKE"]
, ["Hbar", 294, "LATIN CAPITAL LETTER H WITH STROKE"]
, ["Enhookcyrillic", 1223, "CYRILLIC CAPITAL LETTER EN WITH HOOK"]
, ["Endescendercyrillic", 1186, "CYRILLIC CAPITAL LETTER EN WITH DESCENDER"]
, ["uni04C9", 1225, "CYRILLIC CAPITAL LETTER EN WITH TAIL"]
, ["Enghecyrillic", 1188, "CYRILLIC CAPITAL LIGATURE EN GHE"]
, ["I", 73, "LATIN CAPITAL LETTER I", "#dbeaf7"]
, ["Idieresisacute", 7726, "LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE", "<derived>"]
, ["Itildebelow", 7724, "LATIN CAPITAL LETTER I WITH TILDE BELOW", "<derived>"]
, ["Enhookcyrillic", 1223, "CYRILLIC CAPITAL LETTER EN WITH HOOK"]
, ["J", 74, "LATIN CAPITAL LETTER J", "#dbeaf7"]
, ["Endescendercyrillic", 1186, "CYRILLIC CAPITAL LETTER EN WITH DESCENDER"]
, ["K", 75, "LATIN CAPITAL LETTER K", "#dbeaf7"]
, ["Kabashkircyrillic", 1184, "CYRILLIC CAPITAL LETTER BASHKIR KA"]
, ["Kadescendercyrillic", 1178, "CYRILLIC CAPITAL LETTER KA WITH DESCENDER"]
, ["uni04C9", 1225, "CYRILLIC CAPITAL LETTER EN WITH TAIL"]
, ["L", 76, "LATIN CAPITAL LETTER L", "#dbeaf7"]
, ["Enghecyrillic", 1188, "CYRILLIC CAPITAL LIGATURE EN GHE"]
, ["Lslash", 321, "LATIN CAPITAL LETTER L WITH STROKE"]
, ["M", 77, "LATIN CAPITAL LETTER M", "#dbeaf7"]
, ["uni04CD", 1229, "CYRILLIC CAPITAL LETTER EM WITH TAIL"]
, ["N", 78, "LATIN CAPITAL LETTER N", "#dbeaf7"]
, ["afii10026", 1048, "CYRILLIC CAPITAL LETTER I"]
, ["uni048A", 1162, "CYRILLIC CAPITAL LETTER SHORT I WITH TAIL"]
, ["O", 79, "LATIN CAPITAL LETTER O", "#dbeaf7"]
, ["Kabashkircyrillic", 1184, "CYRILLIC CAPITAL LETTER BASHKIR KA"]
, ["Oslash", 216, "LATIN CAPITAL LETTER O WITH STROKE"]
, ["Kadescendercyrillic", 1178, "CYRILLIC CAPITAL LETTER KA WITH DESCENDER"]
, ["Ohorn", 416, "LATIN CAPITAL LETTER O WITH HORN"]
, ["P", 80, "LATIN CAPITAL LETTER P", "#dbeaf7"]
, ["Q", 81, "LATIN CAPITAL LETTER Q", "#dbeaf7"]
, ["R", 82, "LATIN CAPITAL LETTER R", "#dbeaf7"]
, ["response", 8479, "RESPONSE", "#cceff2"]
, ["uni04CD", 1229, "CYRILLIC CAPITAL LETTER EM WITH TAIL"]
, ["S", 83, "LATIN CAPITAL LETTER S", "#dbeaf7"]
, ["Germandbls", 7838, "LATIN CAPITAL LETTER SHARP S"]
, ["T", 84, "LATIN CAPITAL LETTER T", "#dbeaf7"]
@ -45,11 +47,11 @@
, ["V", 86, "LATIN CAPITAL LETTER V", "#dbeaf7"]
, ["W", 87, "LATIN CAPITAL LETTER W", "#dbeaf7"]
, ["X", 88, "LATIN CAPITAL LETTER X", "#dbeaf7"]
, ["Hadescendercyrillic", 1202, "CYRILLIC CAPITAL LETTER HA WITH DESCENDER"]
, ["uni04FC", 1276, "CYRILLIC CAPITAL LETTER HA WITH HOOK"]
, ["uni048E", 1166, "CYRILLIC CAPITAL LETTER ER WITH TICK"]
, ["Y", 89, "LATIN CAPITAL LETTER Y", "#dbeaf7"]
, ["Z", 90, "LATIN CAPITAL LETTER Z", "#dbeaf7"]
, ["AE", 198, "LATIN CAPITAL LETTER AE"]
, ["response", 8479, "RESPONSE", "#cceff2"]
, ["OE", 338, "LATIN CAPITAL LIGATURE OE"]
, ["Thorn", 222, "LATIN CAPITAL LETTER THORN"]
, ["Gamma", 915, "GREEK CAPITAL LETTER GAMMA"]
@ -60,7 +62,9 @@
, ["Pi", 928, "GREEK CAPITAL LETTER PI"]
, ["Sigma", 931, "GREEK CAPITAL LETTER SIGMA"]
, ["Phi", 934, "GREEK CAPITAL LETTER PHI"]
, ["Hadescendercyrillic", 1202, "CYRILLIC CAPITAL LETTER HA WITH DESCENDER"]
, ["Psi", 936, "GREEK CAPITAL LETTER PSI"]
, ["uni04FC", 1276, "CYRILLIC CAPITAL LETTER HA WITH HOOK"]
, ["Omega", 937, "GREEK CAPITAL LETTER OMEGA"]
, ["Omega", 8486, "OHM SIGN"]
, ["afii10018", 1041, "CYRILLIC CAPITAL LETTER BE"]
@ -79,7 +83,6 @@
, ["afii10147", 1138, "CYRILLIC CAPITAL LETTER FITA"]
, ["uni0524", 1316, "CYRILLIC CAPITAL LETTER PE WITH DESCENDER"]
, ["afii10145", 1039, "CYRILLIC CAPITAL LETTER DZHE"]
, ["uni048E", 1166, "CYRILLIC CAPITAL LETTER ER WITH TICK"]
, ["afii10037", 1059, "CYRILLIC CAPITAL LETTER U"]
, ["afii10038", 1060, "CYRILLIC CAPITAL LETTER EF", "<derived>"]
, ["afii10040", 1062, "CYRILLIC CAPITAL LETTER TSE"]
@ -211,11 +214,11 @@
, ["cheverticalstrokecyrillic", 1209, "CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE"]
, ["shacyrillic", 1096, "CYRILLIC SMALL LETTER SHA"]
, ["shchacyrillic", 1097, "CYRILLIC SMALL LETTER SHCHA"]
, ["softsigncyrillic", 1100, "CYRILLIC SMALL LETTER SOFT SIGN"]
, ["hardsigncyrillic", 1098, "CYRILLIC SMALL LETTER HARD SIGN"]
, ["yericyrillic", 1099, "CYRILLIC SMALL LETTER YERU"]
, ["uni048D", 1165, "CYRILLIC SMALL LETTER SEMISOFT SIGN", "<derived>"]
, ["yatcyrillic", 1123, "CYRILLIC SMALL LETTER YAT", "<derived>"]
, ["softsigncyrillic", 1100, "CYRILLIC SMALL LETTER SOFT SIGN"]
, ["ljecyrillic", 1113, "CYRILLIC SMALL LETTER LJE"]
, ["njecyrillic", 1114, "CYRILLIC SMALL LETTER NJE"]
, ["ereversedcyrillic", 1101, "CYRILLIC SMALL LETTER E"]
@ -252,6 +255,7 @@
, ["kip", 8365, "KIP SIGN", "#cceff2"]
, ["won", 8361, "WON SIGN", "#cceff2"]
, ["lira", 8356, "LIRA SIGN", "#cceff2"]
, ["austral", 8371, "AUSTRAL SIGN", "#cceff2"]
, ["hryvnia", 8372, "HRYVNIA SIGN", "#cceff2"]
, ["naira", 8358, "NAIRA SIGN", "#cceff2"]
, ["guarani", 8370, "GUARANI SIGN", "#cceff2"]
@ -265,34 +269,49 @@
, ["rupee", 8360, "RUPEE SIGN", "#cceff2"]
, ["lari", 8382, "LARI SIGN", "#cceff2"]
, ["zero", 48, "DIGIT ZERO", "#e2f4ea"]
, ["zero.tnum", null, null, "#ebf6c8"]
, ["zero.slash", null, null, "#e2f4ea"]
, ["zero.tnum.slash", null, null, "#ebf6c8"]
, ["one", 49, "DIGIT ONE", "#e2f4ea"]
, ["one.tnum", null, null, "#ebf6c8"]
, ["two", 50, "DIGIT TWO", "#e2f4ea"]
, ["two.tnum", null, null, "#ebf6c8"]
, ["three", 51, "DIGIT THREE", "#e2f4ea"]
, ["four", 52, "DIGIT FOUR", "#e2f4ea"]
, ["three.tnum", null, null, "#ebf6c8"]
, ["four.1", null, null, "#ccf6ca"]
, ["four.tnum.1", null, null, "#ebf6c8"]
, ["five", 53, "DIGIT FIVE", "#e2f4ea"]
, ["six", 54, "DIGIT SIX", "#e2f4ea"]
, ["six.1", null, null, "#ccf6ca"]
, ["five.tnum", null, null, "#ebf6c8"]
, ["six.tnum.1", null, null, "#ebf6c8"]
, ["seven", 55, "DIGIT SEVEN", "#e2f4ea"]
, ["seven.tnum", null, null, "#ebf6c8"]
, ["six.tnum", null, null, "#ebf6c8"]
, ["eight", 56, "DIGIT EIGHT", "#e2f4ea"]
, ["nine", 57, "DIGIT NINE", "#e2f4ea"]
, ["zero.tnum", null, null, "#ebf6c8"]
, ["one.tnum", null, null, "#ebf6c8"]
, ["two.tnum", null, null, "#ebf6c8"]
, ["three.tnum", null, null, "#ebf6c8"]
, ["five.tnum", null, null, "#ebf6c8"]
, ["six.tnum", null, null, "#ebf6c8"]
, ["seven.tnum", null, null, "#ebf6c8"]
, ["nine.1", null, null, "#ccf6ca"]
, ["nine.tnum.1", null, null, "#ebf6c8"]
, ["ampersand", 38, "AMPERSAND", "#efefef"]
, ["exclam", 33, "EXCLAMATION MARK", "#efefef"]
, ["exclamdown", 161, "INVERTED EXCLAMATION MARK", "#efefef"]
, ["question", 63, "QUESTION MARK", "#efefef"]
, ["questiondown", 191, "INVERTED QUESTION MARK", "#efefef"]
, ["parenleft", 40, "LEFT PARENTHESIS", "#efefef"]
, ["parenleft.case", null, null, "#efefef"]
, ["parenright", 41, "RIGHT PARENTHESIS", "#efefef"]
, ["parenright.case", null, null, "#efefef"]
, ["bracketleft", 91, "LEFT SQUARE BRACKET", "#efefef"]
, ["bracketleft.case", null, null, "#efefef"]
, ["bracketright", 93, "RIGHT SQUARE BRACKET", "#efefef"]
, ["bracketright.case", null, null, "#efefef"]
, ["braceleft", 123, "LEFT CURLY BRACKET", "#efefef"]
, ["braceleft.case", null, null, "#efefef"]
, ["braceright", 125, "RIGHT CURLY BRACKET", "#efefef"]
, ["braceright.case", null, null, "#efefef"]
, ["at", 64, "COMMERCIAL AT", "#efefef"]
, ["at.case", null, null, "#efefef"]
, ["numbersign", 35, "NUMBER SIGN", "#efefef"]
, ["currency", 164, "CURRENCY SIGN", "#cceff2"]
, ["slash", 47, "SOLIDUS", "#efefef"]
@ -301,10 +320,15 @@
, ["backslash", 92, "REVERSE SOLIDUS", "#efefef"]
, ["hyphenbullet", 8259, "HYPHEN BULLET", "#efefef"]
, ["hyphen", 45, "HYPHEN-MINUS", "#efefef"]
, ["hyphen.case", null, null, "#efefef"]
, ["endash", 8211, "EN DASH", "#efefef"]
, ["endash.case", null, null, "#efefef"]
, ["figuredash", 8210, "FIGURE DASH", "#efefef"]
, ["figuredash.case", null, null, "#efefef"]
, ["emdash", 8212, "EM DASH", "#efefef"]
, ["emdash.case", null, null, "#efefef"]
, ["bullet", 8226, "BULLET", "#efefef"]
, ["bullet.case", null, null, "#efefef"]
, ["quoteleft", 8216, "LEFT SINGLE QUOTATION MARK", "#efefef"]
, ["quoteright", 8217, "RIGHT SINGLE QUOTATION MARK", "#efefef"]
, ["primetripl1", 8244, "TRIPLE PRIME", "#efefef"]
@ -316,8 +340,10 @@
, ["quotesinglbase", 8218, "SINGLE LOW-9 QUOTATION MARK", "#efefef"]
, ["comma", 44, "COMMA", "#efefef"]
, ["period", 46, "FULL STOP", "#efefef"]
, ["period.num", null, null, "#efefef"]
, ["ellipsis", 8230, "HORIZONTAL ELLIPSIS", "#efefef"]
, ["colon", 58, "COLON", "#efefef"]
, ["colon.case", null, null, "#efefef"]
, ["semicolon", 59, "SEMICOLON", "#efefef"]
, ["guilsinglleft", 8249, "SINGLE LEFT-POINTING ANGLE QUOTATION MARK", "#efefef"]
, ["guilsinglright", 8250, "SINGLE RIGHT-POINTING ANGLE QUOTATION MARK", "#efefef"]
@ -328,12 +354,19 @@
, ["lessequal", 8804, "LESS-THAN OR EQUAL TO", "#cceff2"]
, ["greaterequal", 8805, "GREATER-THAN OR EQUAL TO", "#cceff2"]
, ["equal", 61, "EQUALS SIGN", "#cceff2"]
, ["equal.case", null, null, "#cceff2"]
, ["notequal", 8800, "NOT EQUAL TO", "#cceff2"]
, ["notequal.case", null, null, "#cceff2"]
, ["plus", 43, "PLUS SIGN", "#cceff2"]
, ["plus.case", null, null, "#cceff2"]
, ["minus", 8722, "MINUS SIGN", "#cceff2"]
, ["minus.case", null, null, "#cceff2"]
, ["multiply", 215, "MULTIPLICATION SIGN", "#cceff2"]
, ["multiply.case", null, null, "#cceff2"]
, ["divide", 247, "DIVISION SIGN", "#cceff2"]
, ["divide.case", null, null, "#cceff2"]
, ["plusminus", 177, "PLUS-MINUS SIGN", "#cceff2"]
, ["plusminus.case", null, null, "#cceff2"]
, ["approxequal", 8776, "ALMOST EQUAL TO", "#cceff2"]
, ["asciitilde", 126, "TILDE", "#cceff2"]
, ["logicalnot", 172, "NOT SIGN", "#cceff2"]
@ -345,6 +378,7 @@
, ["daggerdbl", 8225, "DOUBLE DAGGER", "#efefef"]
, ["asciicircum", 94, "CIRCUMFLEX ACCENT", "#cceff2"]
, ["asterisk", 42, "ASTERISK", "#efefef"]
, ["asterisk.case", null, null, "#efefef"]
, ["registered", 174, "REGISTERED SIGN", "#cceff2"]
, ["trademark", 8482, "TRADE MARK SIGN", "#cceff2"]
, ["servicemark", 8480, "SERVICE MARK", "#cceff2"]
@ -453,9 +487,19 @@
, ["hairspace", 8202, "HAIR SPACE", "#ede5f9"]
, ["zerowidthspace", 8203, "ZERO WIDTH SPACE", "#efefef"]
, ["arrowleft", 8592, "LEFTWARDS ARROW", "#cceff2"]
, ["arrowleft.case", null, null, "#cceff2"]
, ["arrowleftlong", null, null, "#cceff2"]
, ["arrowleftlong.case", null, null, "#cceff2"]
, ["arrowup", 8593, "UPWARDS ARROW", "#cceff2"]
, ["arrowright", 8594, "RIGHTWARDS ARROW", "#cceff2"]
, ["arrowright.case", null, null, "#cceff2"]
, ["arrowrightlong", null, null, "#cceff2"]
, ["arrowrightlong.case", null, null, "#cceff2"]
, ["arrowdown", 8595, "DOWNWARDS ARROW", "#cceff2"]
, ["arrowNW", 8598, "NORTH WEST ARROW", "#cceff2"]
, ["arrowNE", 8599, "NORTH EAST ARROW", "#cceff2"]
, ["arrowSE", 8600, "SOUTH EAST ARROW", "#cceff2"]
, ["arrowSW", 8601, "SOUTH WEST ARROW", "#cceff2"]
, ["triagrt", 9658, "BLACK RIGHT-POINTING POINTER", "#cceff2"]
, ["triagdn", 9660, "BLACK DOWN-POINTING TRIANGLE", "#cceff2"]
, ["triagup", 9650, "BLACK UP-POINTING TRIANGLE", "#cceff2"]
@ -489,7 +533,6 @@
, ["crossbar", null, null, "#dddddd"]
, ["uniA653", 42579, "CYRILLIC SMALL LETTER IOTIFIED YAT"]
, ["uniA652", 42578, "CYRILLIC CAPITAL LETTER IOTIFIED YAT"]
, ["austral", 8371, "AUSTRAL SIGN", "#cceff2"]
, ["uniA651", 42577, "CYRILLIC SMALL LETTER YERU WITH BACK YER"]
, ["uniA650", 42576, "CYRILLIC CAPITAL LETTER YERU WITH BACK YER"]
, ["uniA657", 42583, "CYRILLIC SMALL LETTER IOTIFIED A"]
@ -538,7 +581,6 @@
, ["uniAB58", 43864, "LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING"]
, ["uniAB57", 43863, "LATIN SMALL LETTER X WITH LONG LEFT LEG"]
, ["uniAB56", 43862, "LATIN SMALL LETTER X WITH LOW RIGHT RING"]
, ["Gbar", 484, "LATIN CAPITAL LETTER G WITH STROKE"]
, ["uniAB54", 43860, "LATIN SMALL LETTER CHI WITH LOW RIGHT RING"]
, ["uniAB53", 43859, "LATIN SMALL LETTER CHI"]
, ["uniAB52", 43858, "LATIN SMALL LETTER U WITH LEFT HOOK"]
@ -574,6 +616,7 @@
, ["uni02E7_uni02E6", null, null, "#dddddd"]
, ["tildesubnosp_uni1ABD", null, null, "#dddddd"]
, ["uniA794.cn", null, null, "#c4f2c1"]
, ["romantwelve", 8555, "ROMAN NUMERAL TWELVE", "#e2f4ea"]
, ["ringacute", null, null, "#dddddd"]
, ["ubar", 649, "LATIN SMALL LETTER U BAR"]
, ["uni2C7A.cn", null, null, "#c4f2c1"]
@ -762,6 +805,7 @@
, ["uni037D", 893, "GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL"]
, ["uni03FD.cn", null, null, "#c4f2c1"]
, ["srthook.cn", null, null, "#c4f2c1"]
, ["uniA684", 42628, "CYRILLIC CAPITAL LETTER ZHWE"]
, ["interrobang", 8253, "INTERROBANG", "#efefef"]
, ["primemod", 697, "MODIFIER LETTER PRIME"]
, ["uni213B", 8507, "FACSIMILE SIGN", "#cceff2"]
@ -770,6 +814,7 @@
, ["uniA677", 42615, "COMBINING CYRILLIC LETTER U", "#f9e2e2"]
, ["uniA676", 42614, "COMBINING CYRILLIC LETTER YI", "#f9e2e2"]
, ["erev", 600, "LATIN SMALL LETTER REVERSED E"]
, ["uni27EA", 10218, "MATHEMATICAL LEFT DOUBLE ANGLE BRACKET", "#efefef"]
, ["uniA670", 42608, "COMBINING CYRILLIC TEN MILLIONS SIGN", "#f9e2e2"]
, ["uniA673", 42611, "SLAVONIC ASTERISK", "#efefef"]
, ["uniA672", 42610, "COMBINING CYRILLIC THOUSAND MILLIONS SIGN", "#f9e2e2"]
@ -893,7 +938,6 @@
, ["verticallinelowmod", 716, "MODIFIER LETTER LOW VERTICAL LINE"]
, ["secondtonechinese", 714, "MODIFIER LETTER ACUTE ACCENT"]
, ["Tonefive", 444, "LATIN CAPITAL LETTER TONE FIVE"]
, ["romantwelve", 8555, "ROMAN NUMERAL TWELVE", "#e2f4ea"]
, ["arrowheadupmod", 708, "MODIFIER LETTER UP ARROWHEAD", "#cceff2"]
, ["arrowheaddownmod", 709, "MODIFIER LETTER DOWN ARROWHEAD", "#cceff2"]
, ["arrowheadleftmod", 706, "MODIFIER LETTER LEFT ARROWHEAD", "#cceff2"]
@ -980,6 +1024,7 @@
, ["uni0504", 1284, "CYRILLIC CAPITAL LETTER KOMI ZJE"]
, ["uni27EF", 10223, "MATHEMATICAL RIGHT FLATTENED PARENTHESIS", "#efefef"]
, ["finaltsadi", 693, "MODIFIER LETTER SMALL TURNED R WITH HOOK"]
, ["rdescend", 636, "LATIN SMALL LETTER R WITH LONG LEG"]
, ["uni27EE", 10222, "MATHEMATICAL LEFT FLATTENED PARENTHESIS", "#efefef"]
, ["uni27ED", 10221, "MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET", "#efefef"]
, ["uniA769", 42857, "LATIN SMALL LETTER VEND"]
@ -993,6 +1038,7 @@
, ["lbelt", 620, "LATIN SMALL LETTER L WITH BELT"]
, ["uni0359", 857, "COMBINING ASTERISK BELOW", "#f9e2e2"]
, ["uni0358", 856, "COMBINING DOT ABOVE RIGHT", "#f9e2e2"]
, ["uni02E9_uni02E7_uni02E7", null, null, "#dddddd"]
, ["epsilon1revclosed", 606, "LATIN SMALL LETTER CLOSED REVERSED OPEN E"]
, ["uni0355", 853, "COMBINING RIGHT ARROWHEAD BELOW", "#f9e2e2"]
, ["uni0354", 852, "COMBINING LEFT ARROWHEAD BELOW", "#f9e2e2"]
@ -1059,6 +1105,7 @@
, ["uniA669", 42601, "CYRILLIC SMALL LETTER MONOCULAR O"]
, ["uni1DD6", 7638, "COMBINING LATIN SMALL LETTER AV", "#f9e2e2"]
, ["uni1DD7", 7639, "COMBINING LATIN SMALL LETTER C CEDILLA", "#f9e2e2"]
, ["uni1DCE", 7630, "COMBINING OGONEK ABOVE", "#f9e2e2"]
, ["uniAB36.cn", null, null, "#c4f2c1"]
, ["uni051F", 1311, "CYRILLIC SMALL LETTER ALEUT KA"]
, ["oneeighth", 8539, "VULGAR FRACTION ONE EIGHTH", "#e2f4ea"]
@ -1095,6 +1142,7 @@
, ["uni02E6_uni02E5_uni02E6", null, null, "#dddddd"]
, ["uniA73F.cn", null, null, "#c4f2c1"]
, ["spaceopenbox", 9251, "OPEN BOX", "#cceff2"]
, ["uni02E6_uni02E5_uni02E7", null, null, "#dddddd"]
, ["uni02E8_uni02E7_uni02E7", null, null, "#dddddd"]
, ["uni02E9_uni02E9_uni02E8", null, null, "#dddddd"]
, ["uni02E8_uni02E7_uni02E5", null, null, "#dddddd"]
@ -1142,6 +1190,7 @@
, ["six.sup", null, null, "#dddddd"]
, ["tonebarhighmod", 742, "MODIFIER LETTER HIGH TONE BAR", "#cceff2"]
, ["tonebarmidmod", 743, "MODIFIER LETTER MID TONE BAR", "#cceff2"]
, ["schwa", 601, "LATIN SMALL LETTER SCHWA"]
, ["tonebarlowmod", 744, "MODIFIER LETTER LOW TONE BAR", "#cceff2"]
, ["tonebarextralowmod", 745, "MODIFIER LETTER EXTRA-LOW TONE BAR", "#cceff2"]
, ["Fturn", 8498, "TURNED CAPITAL F"]
@ -1151,7 +1200,6 @@
, ["uni023B", 571, "LATIN CAPITAL LETTER C WITH STROKE"]
, ["uni023C", 572, "LATIN SMALL LETTER C WITH STROKE"]
, ["uni023A", 570, "LATIN CAPITAL LETTER A WITH STROKE"]
, ["uniA684", 42628, "CYRILLIC CAPITAL LETTER ZHWE"]
, ["uniA685", 42629, "CYRILLIC SMALL LETTER ZHWE"]
, ["uniA686", 42630, "CYRILLIC CAPITAL LETTER CCHE"]
, ["uniA687", 42631, "CYRILLIC SMALL LETTER CCHE"]
@ -1166,6 +1214,7 @@
, ["babygamma", 612, "LATIN SMALL LETTER RAMS HORN"]
, ["Vcursive", 434, "LATIN CAPITAL LETTER V WITH HOOK"]
, ["careof", 8453, "CARE OF", "#cceff2"]
, ["uni02E6_uni02E7", null, null, "#dddddd"]
, ["phi1", 981, "GREEK PHI SYMBOL"]
, ["uni02E5_uni02E5_uni02E8", null, null, "#dddddd"]
, ["uni02E5_uni02E5_uni02E9", null, null, "#dddddd"]
@ -1179,11 +1228,11 @@
, ["uni2C67", 11367, "LATIN CAPITAL LETTER H WITH DESCENDER"]
, ["uni0500", 1280, "CYRILLIC CAPITAL LETTER KOMI DE"]
, ["uni27EB", 10219, "MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET", "#efefef"]
, ["uni27EA", 10218, "MATHEMATICAL LEFT DOUBLE ANGLE BRACKET", "#efefef"]
, ["uni0503", 1283, "CYRILLIC SMALL LETTER KOMI DJE"]
, ["wynn", 447, "LATIN LETTER WYNN"]
, ["uni0505", 1285, "CYRILLIC SMALL LETTER KOMI ZJE"]
, ["uni0506", 1286, "CYRILLIC CAPITAL LETTER KOMI DZJE"]
, ["uni0502", 1282, "CYRILLIC CAPITAL LETTER KOMI DJE"]
, ["uni0507", 1287, "CYRILLIC SMALL LETTER KOMI DZJE"]
, ["uni0508", 1288, "CYRILLIC CAPITAL LETTER KOMI LJE"]
, ["uni0509", 1289, "CYRILLIC SMALL LETTER KOMI LJE"]
@ -1330,6 +1379,7 @@
, ["Esh", 425, "LATIN CAPITAL LETTER ESH"]
, ["uni1D2D", 7469, "MODIFIER LETTER CAPITAL AE"]
, ["uni1D2E", 7470, "MODIFIER LETTER CAPITAL B"]
, ["uni1ABC", 6844, "COMBINING DOUBLE PARENTHESES ABOVE", "#f9e2e2"]
, ["uni1D2F", 7471, "MODIFIER LETTER CAPITAL BARRED B"]
, ["uni1D2A", 7466, "GREEK LETTER SMALL CAPITAL PSI"]
, ["uni1D2B", 7467, "CYRILLIC LETTER SMALL CAPITAL EL"]
@ -1435,23 +1485,22 @@
, ["romanthree", 8546, "ROMAN NUMERAL THREE", "#e2f4ea"]
, ["uni1D36", 7478, "MODIFIER LETTER CAPITAL J"]
, ["uni1DCF", 7631, "COMBINING ZIGZAG BELOW", "#f9e2e2"]
, ["uni1DCE", 7630, "COMBINING OGONEK ABOVE", "#f9e2e2"]
, ["uni1DCD", 7629, "COMBINING DOUBLE CIRCUMFLEX ABOVE", "#f9e2e2"]
, ["uni1DCC", 7628, "COMBINING MACRON-BREVE", "#f9e2e2"]
, ["uni1DCB", 7627, "COMBINING BREVE-MACRON", "#f9e2e2"]
, ["uniE004", 57348, "[private use E004]"]
, ["uni1DCA", 7626, "COMBINING LATIN SMALL LETTER R BELOW", "#f9e2e2"]
, ["uniE001", 57345, "[private use E001]"]
, ["Nhook", 413, "LATIN CAPITAL LETTER N WITH LEFT HOOK"]
, ["tildemacroncomb.lc", null, null, "#dddddd"]
, ["iota1", 617, "LATIN SMALL LETTER IOTA"]
, ["uni02E6_uni02E8", null, null, "#dddddd"]
, ["uniE001", 57345, "[private use E001]"]
, ["uni02E6_uni02E9", null, null, "#dddddd"]
, ["uni1DC9", 7625, "COMBINING ACUTE-GRAVE-ACUTE", "#f9e2e2"]
, ["uni1DC8", 7624, "COMBINING GRAVE-ACUTE-GRAVE", "#f9e2e2"]
, ["uni1DC7", 7623, "COMBINING ACUTE-MACRON", "#f9e2e2"]
, ["uni02E6_uni02E5", null, null, "#dddddd"]
, ["uni1DC5", 7621, "COMBINING GRAVE-MACRON", "#f9e2e2"]
, ["uni02E6_uni02E7", null, null, "#dddddd"]
, ["uni1DC3", 7619, "COMBINING SUSPENSION MARK", "#f9e2e2"]
, ["uni1DC2", 7618, "COMBINING SNAKE BELOW", "#f9e2e2"]
, ["uni1DC1", 7617, "COMBINING DOTTED ACUTE ACCENT", "#f9e2e2"]
@ -1566,7 +1615,6 @@
, ["uni1ABD", 6845, "COMBINING PARENTHESES BELOW", "#f9e2e2"]
, ["uniA79A", 42906, "LATIN CAPITAL LETTER VOLAPUK AE"]
, ["uni1ABA", 6842, "COMBINING STRONG CENTRALIZATION STROKE BELOW", "#f9e2e2"]
, ["uni1ABC", 6844, "COMBINING DOUBLE PARENTHESES ABOVE", "#f9e2e2"]
, ["uni1ABB", 6843, "COMBINING PARENTHESES ABOVE", "#f9e2e2"]
, ["ascriptturn", 594, "LATIN SMALL LETTER TURNED ALPHA"]
, ["uni1DB8", 7608, "MODIFIER LETTER SMALL CAPITAL U"]
@ -1635,7 +1683,6 @@
, ["uni2E1E", 11806, "TILDE WITH DOT ABOVE", "#efefef"]
, ["uni2E1D", 11805, "RIGHT LOW PARAPHRASE BRACKET", "#efefef"]
, ["uni2E1F", 11807, "TILDE WITH DOT BELOW", "#efefef"]
, ["Chook", 391, "LATIN CAPITAL LETTER C WITH HOOK"]
, ["uni1DE9", 7657, "COMBINING LATIN SMALL LETTER BETA", "#f9e2e2"]
, ["uniAB39", 43833, "LATIN SMALL LETTER L WITH MIDDLE RING"]
, ["uniAB38", 43832, "LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE"]
@ -1663,6 +1710,7 @@
, ["uni02E5_uni02E8_uni02E7", null, null, "#dddddd"]
, ["uni02E5_uni02E8_uni02E6", null, null, "#dddddd"]
, ["d.cn", null, null, "#c4f2c1"]
, ["uni1DE4", 7652, "COMBINING LATIN SMALL LETTER S", "#f9e2e2"]
, ["uni035A", 858, "COMBINING DOUBLE RING BELOW", "#f9e2e2"]
, ["uni02E5_uni02E8_uni02E9", null, null, "#dddddd"]
, ["uni02E5_uni02E8_uni02E8", null, null, "#dddddd"]
@ -1727,7 +1775,6 @@
, ["uniA767", 42855, "LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER"]
, ["uniA765", 42853, "LATIN SMALL LETTER THORN WITH STROKE"]
, ["uniA764", 42852, "LATIN CAPITAL LETTER THORN WITH STROKE"]
, ["uni02E9_uni02E7_uni02E7", null, null, "#dddddd"]
, ["uniA762", 42850, "LATIN CAPITAL LETTER VISIGOTHIC Z"]
, ["uniA761", 42849, "LATIN SMALL LETTER VY"]
, ["uniA760", 42848, "LATIN CAPITAL LETTER VY"]
@ -1882,6 +1929,7 @@
, ["uni2C70", 11376, "LATIN CAPITAL LETTER TURNED ALPHA"]
, ["uni2C73", 11379, "LATIN SMALL LETTER W WITH HOOK"]
, ["uni2189", 8585, "VULGAR FRACTION ZERO THIRDS", "#e2f4ea"]
, ["uni1FEF", 8175, "GREEK VARIA", "#cceff2"]
, ["uni2C74", 11380, "LATIN SMALL LETTER V WITH CURL"]
, ["uni2C77", 11383, "LATIN SMALL LETTER TAILLESS PHI"]
, ["uni2C76", 11382, "LATIN SMALL LETTER HALF H"]
@ -1980,7 +2028,6 @@
, ["Sampi", 992, "GREEK LETTER SAMPI"]
, ["uni2C7E", 11390, "LATIN CAPITAL LETTER S WITH SWASH TAIL"]
, ["uni2E1A", 11802, "HYPHEN WITH DIAERESIS", "#efefef"]
, ["schwa", 601, "LATIN SMALL LETTER SCHWA"]
, ["gbar_uni1ABE", null, null, "#dddddd"]
, ["uni1DDA", 7642, "COMBINING LATIN SMALL LETTER G", "#f9e2e2"]
, ["koppacyrillic", 1153, "CYRILLIC SMALL LETTER KOPPA"]
@ -2011,7 +2058,6 @@
, ["quotereversed", 8219, "SINGLE HIGH-REVERSED-9 QUOTATION MARK", "#efefef"]
, ["romanfive", 8548, "ROMAN NUMERAL FIVE", "#e2f4ea"]
, ["tonetwo", 424, "LATIN SMALL LETTER TONE TWO"]
, ["rdescend", 636, "LATIN SMALL LETTER R WITH LONG LEG"]
, ["uni1FDD", 8157, "GREEK DASIA AND VARIA", "#cceff2"]
, ["uni1FDE", 8158, "GREEK DASIA AND OXIA", "#cceff2"]
, ["uni1FDF", 8159, "GREEK DASIA AND PERISPOMENI", "#cceff2"]
@ -2055,7 +2101,6 @@
, ["uni1DFF", 7679, "COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW", "#f9e2e2"]
, ["uniA751", 42833, "LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER"]
, ["uniA758", 42840, "LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE"]
, ["uni1FEF", 8175, "GREEK VARIA", "#cceff2"]
, ["dblprimemod", 698, "MODIFIER LETTER DOUBLE PRIME"]
, ["Ezhreversed", 440, "LATIN CAPITAL LETTER EZH REVERSED"]
, ["ezhreversed", 441, "LATIN SMALL LETTER EZH REVERSED"]
@ -2112,7 +2157,6 @@
, ["uni209C", 8348, "LATIN SUBSCRIPT SMALL LETTER T"]
, ["uni02E6_uni02E6_uni02E7", null, null, "#dddddd"]
, ["uni02E6_uni02E6_uni02E8", null, null, "#dddddd"]
, ["uni02E6_uni02E5_uni02E7", null, null, "#dddddd"]
, ["commaaccentrotate", null, null, "#dddddd"]
, ["esh", 643, "LATIN SMALL LETTER ESH"]
, ["cyrillictic", null, null, "#dddddd"]
@ -2134,7 +2178,6 @@
, ["controlHT", 9, "[Control]", "#ff4c4c"]
, ["uni1DE8", 7656, "COMBINING LATIN SMALL LETTER B", "#f9e2e2"]
, ["uni1DE5", 7653, "COMBINING LATIN SMALL LETTER LONG S", "#f9e2e2"]
, ["uni1DE4", 7652, "COMBINING LATIN SMALL LETTER S", "#f9e2e2"]
, ["uni1DE7", 7655, "COMBINING LATIN SMALL LETTER ALPHA", "#f9e2e2"]
, ["uni1DE6", 7654, "COMBINING LATIN SMALL LETTER Z", "#f9e2e2"]
, ["uni1DE1", 7649, "COMBINING LATIN LETTER SMALL CAPITAL N", "#f9e2e2"]
@ -2155,7 +2198,6 @@
, ["commaabovecmb", 787, "COMBINING COMMA ABOVE", "#f9e2e2"]
, ["uniA728", 42792, "LATIN CAPITAL LETTER TZ"]
, ["commaaboverightcmb", 789, "COMBINING COMMA ABOVE RIGHT", "#f9e2e2"]
, ["uni0502", 1282, "CYRILLIC CAPITAL LETTER KOMI DJE"]
, ["hooksubpalatnosp", 801, "COMBINING PALATALIZED HOOK BELOW", "#f9e2e2"]
, ["uni1AB8_uni1ABD", null, null, "#dddddd"]
, ["uniA758.cn", null, null, "#c4f2c1"]
@ -2174,10 +2216,11 @@
, ["leftloop.cn", null, null, "#c4f2c1"]
, ["rightloop.cn", null, null, "#c4f2c1"]
, ["uniE000", 57344, "[Private_Use]", "#f7f2d3"]
, ["uniE004", 57348, "[private use E004]"]
, ["uniE002", 57346, "[private use E002]"]
, ["uniE003", 57347, "[private use E003]"]
, [".notdef", null, null, "#dddddd"]
, ["circleblack", 9679, "BLACK CIRCLE"]
, ["circlewhite", 9675, "WHITE CIRCLE"]
, ["Eth", 208, "LATIN CAPITAL LETTER ETH", "<derived>"]
, ["hbar", 295, "LATIN SMALL LETTER H WITH STROKE", "<derived>"]
, ["Tbar", 358, "LATIN CAPITAL LETTER T WITH STROKE", "<derived>"]

View file

@ -125,7 +125,7 @@ m@n M@N
3÷5 ÷5 8÷ 3±5 ±5 8±
3=5 =5 8= 3≠5 ≠5 8≠
8*5 8 * 7 WALLPAPER*
B-O BO BO B—O M•N
B-O BO BO B—O M•N ⌘-
-Selvece
darest-Selvece
b-o bo bo b—o m•n
@ -1124,6 +1124,7 @@ document.head.appendChild(fontCSS)
<label><input type="checkbox" class="featopt" name="feat:case"> Enable case *</label>
<label><input type="checkbox" class="featopt" name="feat:calt=0"> <em>Disable</em> calt *</label>
<label><input type="checkbox" class="featopt" name="feat:zero"> Enable (slashed) zero *</label>
<label><input type="checkbox" class="featopt" name="feat:frac"> Enable frac(tions) *</label>
<!-- <label><input type="checkbox" class="featopt" name="feat:c2sc"> Enable c2sc</label> -->
<label><input type="checkbox" class="featopt" name="feat:ss01"> Enable Stylistic set 1 *</label>
<label><input type="checkbox" class="featopt" name="feat:ss02"> Enable Stylistic set 2</label>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 526 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 44 KiB