(fn: (arg: T, callback: (...args: P[]) => unknown) => unknown) {
+ return (arg: T) =>
+ new Observable((subscriber) => {
+ try {
+ fn(arg, (...args: P[]) => subscriber.next(args))
+ } catch (e) {
+ subscriber.error(e)
+ }
+ })
+}
+
+export function mapSpread(
+ fn: (...args: [T]) => P,
+ concurrent?: number
+): (obs: Observable<[T]>) => Observable
+export function mapSpread(
+ fn: (...args: [T1, T2]) => P | Promise,
+ concurrent?: number
+): (obs: Observable<[T1, T2]>) => Observable
+export function mapSpread(
+ fn: (...args: [T1, T2, T3]) => P | Promise,
+ concurrent?: number
+): (obs: Observable<[T1, T2, T3]>) => Observable
+export function mapSpread(
+ fn: (...args: [T1, T2, T3, T4]) => P | Promise,
+ concurrent?: number
+): (obs: Observable<[T1, T2, T3, T4]>) => Observable
+export function mapSpread(
+ fn: (...args: [T1, T2, T3, T4, T5]) => P | Promise,
+ concurrent?: number
+): (obs: Observable<[T1, T2, T3, T4, T5]>) => Observable
+export function mapSpread(fn: (...args: T[]) => P | Promise, concurrent?: number) {
+ return (obs: Observable) => mergeMap(async (arr: T[]) => fn(...arr), concurrent)(obs)
+}
+
+export const readFile = (file: string) => from(fs.promises.readFile(file, 'utf-8'))
+
+export const observeFile = (file: string) =>
+ fromCallback(fs.watchFile)(file).pipe(
+ startWith(true),
+ mergeMap(() => readFile(file))
+ )
+
+export const readDir = (
+ dir: string,
+ loadFn: (names: string[]) => T[] | Promise,
+ fileFilter: (file: string) => boolean = () => true
+) =>
+ from(fs.promises.readdir(dir)).pipe(
+ mergeMap(async (arr) => {
+ log('info', `Loading files...`)
+ try {
+ const filtered = arr.filter(fileFilter)
+ const content = await loadFn(filtered)
+ return filtered
+ .map((file, i) => ({ [file]: content[i] }))
+ .reduce((acc, curr) => ({ ...acc, ...curr })) as DirContent
+ } catch (e) {
+ enqueue('error', e.stack ? e.stack : e)
+ return {}
+ }
+ })
+ )
+
+export const watchDir = (
+ dir: string,
+ loadFn: (names: string[]) => T[] | Promise,
+ fileFilter: (file: string) => boolean = () => true
+) =>
+ fromCallback(fs.watch)(dir).pipe(
+ filter(([, filename]) => fileFilter(filename)),
+ auditTime(500),
+ mapSpread(async (eventType: string, filename: string) => {
+ log('info', `Loading file ${filename}`)
+ return {
+ filename,
+ content: eventType === 'rename' ? null : (await loadFn([filename]))[0]
+ }
+ }),
+ scan(
+ (acc, { filename, content }) =>
+ content === null
+ ? Object.entries(acc)
+ .filter(([key]) => key !== filename)
+ .reduce((acc, [key, val]) => ({ ...acc, [key]: val }), {})
+ : { ...acc, [filename]: content },
+ {} as DirContent
+ )
+ )
+
+export const observeDir = (
+ dir: string,
+ loadFn: (names: string[]) => T[] | Promise,
+ fileFilter: (file: string) => boolean = () => true
+) =>
+ merge(readDir(dir, loadFn, fileFilter), watchDir(dir, loadFn, fileFilter)).pipe(
+ scan((acc, curr) => ({ ...acc, ...curr }))
+ )
diff --git a/scripts/parse.ts b/scripts/parse.ts
new file mode 100644
index 00000000..4ea8768d
--- /dev/null
+++ b/scripts/parse.ts
@@ -0,0 +1,48 @@
+import os from 'os'
+
+import { normalizeColor } from './svg'
+import { ColorVars, Mappings } from './types'
+
+const interpolate = (regExp: RegExp, values: { [key: string]: string[] | undefined }) =>
+ new RegExp(
+ Object.entries(values).reduce(
+ (acc, [key, values]) => acc.replace(`{${key}}`, `(${values?.join('|')})`),
+ regExp.source
+ ),
+ regExp.flags
+ )
+
+export const parseColorVars = (content: string) =>
+ content
+ .split(os.EOL)
+ .map((line) => line.match(/@(?\w+): (?#[0-9a-f]{6}|[0-9a-f]{3})/i)?.groups)
+ .filter((match): match is { [key: string]: string } => match !== undefined)
+ .map(({ color, code }) => ({ [color]: normalizeColor(code) }))
+ .reduce((acc, curr) => ({ ...acc, ...curr }))
+
+const getMappingRegexp = (colorVars: ColorVars) =>
+ interpolate(
+ /\.icon-(?ext|name|default)\(("(?[^"]*)", )?"(?[^"]*)"(, "(?{colors})")?\)/,
+ { colors: Object.keys(colorVars) }
+ )
+
+export const parseMappings = (content: string, colorVars: ColorVars) =>
+ content
+ .split(os.EOL)
+ .map((line) => line.match(getMappingRegexp(colorVars))?.groups)
+ .filter((match): match is { [key: string]: string } => match !== undefined)
+
+export const getMappings = (content: string, colorVars: ColorVars) =>
+ parseMappings(content, colorVars)
+ .map(({ icon, color = '' }) => ({ icon: `${icon}.svg`, color }))
+ .reduce(
+ (acc, { icon, color }) => ({
+ ...acc,
+ [icon]: !acc[icon]
+ ? [color]
+ : acc[icon]?.includes(color)
+ ? acc[icon]
+ : [...(acc[icon] ?? []), color]
+ }),
+ {} as Mappings
+ )
diff --git a/scripts/svg.ts b/scripts/svg.ts
new file mode 100644
index 00000000..1b4ade7d
--- /dev/null
+++ b/scripts/svg.ts
@@ -0,0 +1,249 @@
+import fs from 'fs'
+import Color from 'color'
+import { JSDOM } from 'jsdom'
+import SVGO from 'svgo'
+import autocrop from 'svg-autocrop'
+
+import { ColorVars, ColorMap, Serializable, RGBColor, RGBIndex } from './types'
+
+const {
+ window: { document }
+} = new JSDOM()
+
+const COLOR_ATTRS = ['fill', 'stroke']
+const MASK_ELEM_SELECTOR = 'mask, mask *'
+
+export const normalizeColor = (color: string | Color) => Color(color).rgb().alpha(1).hex()
+
+const modifyNodes = (selector: string, fn: (el: Element, container: Element) => void) => (
+ content: string
+) => {
+ const div = document.createElement('div')
+ div.innerHTML = content
+ div.querySelectorAll(selector).forEach((el) => fn(el, div))
+ const result = div.innerHTML
+ div.remove()
+ return result
+}
+
+const normalizeAttr = (
+ el: Element,
+ attr: string,
+ fn: (val: string | null) => Serializable | null
+) => {
+ const updated = fn(el.getAttribute(attr))
+
+ if (updated !== null) {
+ el.setAttribute(attr, updated.toString())
+ } else {
+ el.removeAttribute(attr)
+ }
+}
+
+const getClosest = (color: string | Color, colorVars: RGBColor[]) => {
+ const rgb = Color(color).rgb().object()
+ const keys: RGBIndex[] = ['r', 'g', 'b']
+ const distances = colorVars.map((rgbVar) =>
+ keys
+ .map((key) => rgbVar[key] - rgb[key])
+ .map(Math.abs)
+ .reduce((acc, curr) => acc + curr)
+ )
+ const minIndex = distances.indexOf(Math.min(...distances))
+ return normalizeColor(Color(colorVars[minIndex]))
+}
+
+const maskColors = ['black', 'white'].map((color) => Color(color).rgb().object()) as RGBColor[]
+const omittedColors = ['none', 'null', null]
+
+export const getColors = (content: string, selector = '*') => {
+ const div = document.createElement('div')
+ div.innerHTML = content
+ const result = [
+ ...new Set(
+ Array.from(div.querySelectorAll(selector))
+ .flatMap((node) => COLOR_ATTRS.map((attr) => node.getAttribute(attr)))
+ .filter((color): color is string => !omittedColors.includes(color))
+ )
+ ]
+ div.remove()
+ return result
+}
+
+export const getReplaceable = (colors: string[], colorVars: ColorVars): string[] =>
+ colors.length <= 1
+ ? colors
+ : colors.find((color) => color === colorVars.white)
+ ? getReplaceable(
+ colors.filter((color) => color !== colorVars.white),
+ colorVars
+ )
+ : colors.filter((color) => color !== colorVars.black)
+
+const getColorsMap = (content: string, vars: RGBColor[], selector = '*') => {
+ return getColors(content, selector)
+ .map((color) => ({
+ [color]: getClosest(color, vars)
+ }))
+ .reduce((acc, curr) => ({ ...acc, ...curr }), {})
+}
+
+export const replaceColors = (content: string, colorsMap: ColorMap, selector = '*') =>
+ modifyNodes(selector, (node) => {
+ COLOR_ATTRS.forEach((attr) =>
+ normalizeAttr(node, attr, (color) => {
+ if (!colorsMap[color ?? 'null']) {
+ return color
+ }
+ return colorsMap[color ?? 'null']
+ })
+ )
+ })(content)
+
+const getColorAt = (el: Element, offset: number) => {
+ const stops = Array.from(el.querySelectorAll('stop'))
+ if (stops.length === 0) {
+ return null
+ }
+ const before = stops.filter((stop) => Number(stop.getAttribute('offset')) < offset)
+ if (before.length === 0) {
+ return stops[0].getAttribute('stop-color')
+ } else if (before.length === stops.length) {
+ return stops[stops.length - 1].getAttribute('stop-color')
+ } else {
+ const elements = [-1, 0].map((n) => n + before.length).map((n) => stops[n])
+ const [c1, c2] = elements.map((el) => el.getAttribute('stop-color') ?? '')
+ const [o1, o2] = elements.map((el, i) => Number(el.getAttribute('offset') ?? i))
+ return Color(c1).mix(Color(c2), (offset - o1) / (o2 - o1))
+ }
+}
+
+const URL_REGEXP = /url\((?[#\.]?[\w-]+)\)/
+
+export const processMasks = (content: string) => {
+ const map = getColorsMap(content, maskColors, MASK_ELEM_SELECTOR)
+ return replaceColors(content, map, MASK_ELEM_SELECTOR)
+}
+
+export const fillMasks = (content: string) =>
+ modifyNodes(MASK_ELEM_SELECTOR, (node) => {
+ COLOR_ATTRS.forEach((attr) =>
+ normalizeAttr(node, attr, (color) => {
+ if (color === null) {
+ return attr === 'fill' ? normalizeColor('black') : null
+ } else {
+ return color
+ }
+ })
+ )
+ })(content)
+
+export const processIcon = (content: string, colorVars: ColorVars) => {
+ const processedVars = Object.values(colorVars).map((color) =>
+ Color(color).rgb().object()
+ ) as RGBColor[]
+ const colorsMap = getColorsMap(content, processedVars)
+ const normalized = replaceColors(content, colorsMap)
+ const maskMap = {
+ [colorVars.black]: normalizeColor('#000'),
+ [colorVars.white]: normalizeColor('#FFF')
+ }
+ const masksFixed = replaceColors(normalized, maskMap, MASK_ELEM_SELECTOR)
+ const masksFilled = fillMasks(masksFixed)
+ return masksFilled
+}
+
+const getGradientColor = (selector: string, container: Element): string | null => {
+ const el = container.querySelector(selector)
+ if (!el || (el.tagName !== 'linearGradient' && el.tagName !== 'radialGradient')) {
+ return null
+ }
+ if (el.hasAttribute('xlink:href')) {
+ return getGradientColor(el.getAttribute('xlink:href')!, container)
+ }
+ return normalizeColor(getColorAt(el, 0.5) ?? 'black')
+}
+
+export const resolveColors = modifyNodes(':not(mask)', (node, container) => {
+ node.removeAttribute('opacity')
+ node.removeAttribute('fill-opacity')
+ node.removeAttribute('stroke-opacity')
+ COLOR_ATTRS.forEach((attr) =>
+ normalizeAttr(node, attr, (color) => {
+ if (color === null) {
+ return null
+ }
+ if (!URL_REGEXP.test(color)) {
+ if (!['none', 'null'].includes(color)) {
+ return normalizeColor(color)
+ } else {
+ return color
+ }
+ }
+ const { selector } = color.match(URL_REGEXP)?.groups ?? { selector: ':not(*)' }
+ return getGradientColor(selector, container)
+ })
+ )
+})
+
+const squareViewBox = (content: string) => {
+ const div = document.createElement('div')
+ div.innerHTML = content
+ const svg = div.querySelector('svg')!
+ const [x, y, width, height] = svg.getAttribute('viewBox')!.split(' ').map(Number)
+
+ if (width < height) {
+ const newWidth = height
+ const newX = x - (newWidth - width) / 2
+ svg.setAttribute(
+ 'viewBox',
+ `${Number(newX.toPrecision(5))} ${y} ${Number(newWidth.toPrecision(5))} ${height}`
+ )
+ }
+
+ if (height < width) {
+ const newHeight = width
+ const newY = y - (newHeight - height) / 2
+ svg.setAttribute(
+ 'viewBox',
+ `${x} ${Number(newY.toPrecision(5))} ${width} ${Number(newHeight.toPrecision(5))}`
+ )
+ }
+
+ const result = div.innerHTML
+ div.remove()
+ return result
+}
+
+const readIcon = async (icon: string) => {
+ const content = await fs.promises.readFile(`src/icons/${icon}`, 'utf-8')
+ const { data } = await new SVGO({
+ full: true,
+ plugins: [{ inlineStyles: { onlyMatchedOnce: false } }, { convertStyleToAttrs: true }]
+ }).optimize(content)
+ const resolved = resolveColors(data)
+ return processMasks(resolved)
+}
+
+export const readIcons = async (icons: string[]) => {
+ const loaded = await Promise.all(icons.map(readIcon))
+ const cropped = await autocrop(loaded, { scale: 1.3 })
+ const svgo = new SVGO({ plugins: [{ removeViewBox: false }, { removeDimensions: true }] })
+ return Promise.all(
+ cropped.map(squareViewBox).map(async (content) => (await svgo.optimize(content)).data)
+ )
+}
+
+export const prepareIconVersion = (content: string, colorVars: ColorVars, base: string) => {
+ const varCodes = Object.values(colorVars)
+ const colors = getColors(content).filter((color) => varCodes.includes(color))
+ const inverse = base === colorVars.black ? colorVars.white : colorVars.black
+ const transFn =
+ base === colorVars.black
+ ? (c: string) => c
+ : (c: string) => normalizeColor(Color(c).darken(0.1))
+ const colorsMap = varCodes.reduce((acc, color) => ({ [color]: transFn(color), ...acc }), {
+ [base]: colors.length === 1 ? inverse : base
+ })
+ return replaceColors(content, colorsMap)
+}
diff --git a/scripts/transform.ts b/scripts/transform.ts
new file mode 100644
index 00000000..a85ea8dc
--- /dev/null
+++ b/scripts/transform.ts
@@ -0,0 +1,132 @@
+import fs from 'fs'
+import path from 'path'
+import { combineLatest, Subject, of, zip } from 'rxjs'
+import { map, pairwise, startWith, catchError } from 'rxjs/operators'
+
+import { mapSpread, observeFile, observeDir, readFile, readDir } from './observable'
+import { log, enqueue, flush } from './logger'
+import { readIcons, processIcon, getColors, getReplaceable, replaceColors } from './svg'
+import { parseColorVars, getMappings } from './parse'
+import { filterKeys, mapValues, stripExt } from './utils'
+import { IconsObj, IconsDiff, Mappings, ColorVars } from './types'
+
+process.setMaxListeners(100)
+
+const basedir = process.cwd()
+const resolve = (dir: string) => path.join(basedir, dir)
+const variablesFile = resolve('styles/ui-variables.less')
+const mappingsFile = resolve('styles/components/icons/mapping.less')
+const iconsDir = resolve('src/icons')
+const resultDir = resolve('icons')
+
+const getOutput = (colorVars: ColorVars, mappings: Mappings, iconContents: IconsObj) => {
+ const iconFiles = mapValues(iconContents, (content) => processIcon(content, colorVars))
+
+ const varCodes = Object.values(colorVars)
+
+ const iconColors = mapValues(iconFiles, (content) =>
+ getReplaceable(
+ getColors(content).filter((color) => varCodes.includes(color)),
+ colorVars
+ )
+ )
+
+ return Object.entries(mappings)
+ .flatMap(([icon, colors = []]) => {
+ const content = iconFiles[icon]
+ const replaceable = iconColors[icon]
+ if (!content || !replaceable) {
+ return []
+ }
+ return colors.map((color) => {
+ const map =
+ replaceable.length > 0
+ ? replaceable.reduce((acc, curr) => ({ ...acc, [curr]: colorVars[color] }), {})
+ : { null: colorVars[color] }
+ const out = color.length > 0 ? replaceColors(content, map) : content
+ const filename = color.length > 0 ? `${stripExt(icon)}_${color}.svg` : icon
+ return { [filename]: out }
+ })
+ })
+ .reduce((acc, file) => ({ ...acc, ...file }), {})
+}
+
+const getChanges = ([prev, curr]: IconsDiff) => {
+ const prevKeys = Object.keys(prev)
+ return Object.entries(curr).filter(([key]) => !prevKeys.includes(key) || prev[key] !== curr[key])
+}
+
+const getDeletions = ([prev, curr]: IconsDiff) => {
+ const currKeys = Object.keys(curr)
+ return Object.keys(prev).filter((key) => !currKeys.includes(key))
+}
+
+const run = async () => {
+ try {
+ await fs.promises.access(resultDir)
+ } catch (e) {
+ await fs.promises.mkdir(resultDir)
+ }
+
+ if (!process.env.ICONS_WATCH) {
+ const icons = await fs.promises.readdir(resultDir)
+ await Promise.all(
+ icons
+ .filter((file) => /\.svg$/.test(file))
+ .map((file) => fs.promises.unlink(path.join(resultDir, file)))
+ )
+ }
+
+ const fileObs = process.env.ICONS_WATCH ? observeFile : readFile
+ const dirObs = process.env.ICONS_WATCH ? observeDir : readDir
+
+ const colorVars = fileObs(variablesFile).pipe(map(parseColorVars))
+ const mappings = combineLatest(fileObs(mappingsFile), colorVars).pipe(mapSpread(getMappings))
+ const iconContents = dirObs(iconsDir, readIcons, (file) => /\.svg$/.test(file))
+
+ const filteredIcons = combineLatest(
+ iconContents,
+ mappings.pipe(map((obj) => Object.keys(obj)))
+ ).pipe(
+ mapSpread((icons: IconsObj, keys: string[]) => filterKeys(icons, (icon) => keys.includes(icon)))
+ )
+
+ const output = combineLatest(colorVars, mappings, filteredIcons).pipe(
+ mapSpread(getOutput),
+ startWith({} as IconsObj),
+ catchError((err, caught) => {
+ enqueue('error', err.stack ? err.stack : err)
+ return process.env.ICONS_WATCH ? caught : of({} as IconsObj)
+ }),
+ pairwise()
+ )
+
+ const subject = new Subject()
+
+ output.subscribe(subject)
+
+ const changes = subject.pipe(map(getChanges))
+ const deletions = subject.pipe(map(getDeletions))
+
+ changes.subscribe((arr) =>
+ arr.forEach(async ([name, content]) => {
+ await fs.promises.writeFile(path.join(resultDir, name), content)
+ log('success', `Saved icon '${name}'`)
+ })
+ )
+
+ deletions.subscribe((arr) =>
+ arr.forEach(async (name) => {
+ await fs.promises.unlink(path.join(resultDir, name))
+ log('success', `Deleted icon '${name}'`)
+ })
+ )
+
+ zip(changes, deletions).subscribe(() => flush())
+
+ if (process.env.ICONS_WATCH) {
+ log('info', 'Watching for changes in SVG config/data')
+ }
+}
+
+run()
diff --git a/scripts/types.ts b/scripts/types.ts
new file mode 100644
index 00000000..d22db1ad
--- /dev/null
+++ b/scripts/types.ts
@@ -0,0 +1,43 @@
+export interface ColorVars {
+ [x: string]: string
+}
+
+export interface ColorMap {
+ [x: string]: string
+}
+
+export interface Mappings {
+ [x: string]: string[]
+}
+
+export interface IconsObj {
+ [x: string]: string
+}
+
+export interface Serializable {
+ toString: () => string
+}
+
+export type RGBIndex = 'r' | 'g' | 'b'
+
+export type RGBColor = {
+ [I in RGBIndex]: number
+}
+
+export type IconsDiff = [IconsObj, IconsObj]
+
+export interface LanguageDef {
+ id: string
+ extensions?: string[]
+ fileNames?: string[]
+}
+
+export interface PackageJson {
+ contributes?: {
+ languages?: LanguageDef[]
+ }
+}
+
+export interface DirContent {
+ [x: string]: T
+}
diff --git a/scripts/utils.ts b/scripts/utils.ts
new file mode 100644
index 00000000..2b1a5bea
--- /dev/null
+++ b/scripts/utils.ts
@@ -0,0 +1,12 @@
+export const filterKeys = (contents: { [key: string]: T }, fn: (key: string) => boolean) =>
+ Object.entries(contents)
+ .filter(([key]) => fn(key))
+ .reduce((acc, [key, val]) => ({ ...acc, [key]: val }), {} as { [key: string]: T })
+
+export const mapValues = (obj: { [key: string]: T }, fn: (el: T) => P) =>
+ Object.entries(obj).reduce(
+ (acc, [key, val]) => ({ ...acc, [key]: fn(val) }),
+ {} as { [key: string]: P }
+ )
+
+export const stripExt = (str: string) => str.replace(/\.[^/.]+$/, '')
diff --git a/scripts/vs-theme.ts b/scripts/vs-theme.ts
new file mode 100644
index 00000000..0d66c5bb
--- /dev/null
+++ b/scripts/vs-theme.ts
@@ -0,0 +1,218 @@
+import fs from 'fs'
+import path from 'path'
+import fetch from 'node-fetch'
+
+import { log } from './logger'
+import { prepareIconVersion } from './svg'
+import { parseColorVars, parseMappings, getMappings } from './parse'
+import { PackageJson, LanguageDef } from './types'
+import { stripExt, mapValues, filterKeys } from './utils'
+
+// eslint-disable-next-line @typescript-eslint/camelcase
+const information_for_contributors = [
+ 'This file has been generated from data in https://github.com/jesseweed/seti-ui',
+ '- icon definitions: https://github.com/jesseweed/seti-ui/blob/master/styles/_fonts/seti.less',
+ '- icon colors: https://github.com/jesseweed/seti-ui/blob/master/styles/ui-variables.less',
+ '- file associations: https://github.com/jesseweed/seti-ui/blob/master/styles/components/icons/mapping.less',
+ 'If you want to provide a fix or improvement, please create a pull request against the jesseweed/seti-ui repository.',
+ 'Once accepted there, we are happy to receive an update request.'
+]
+
+const nonBuiltInLanguages: { [x: string]: Omit } = {
+ r: { extensions: ['r', 'rhistory', 'rprofile', 'rt'] },
+ argdown: { extensions: ['ad', 'adown', 'argdown', 'argdn'] },
+ elm: { extensions: ['elm'] },
+ ocaml: { extensions: ['ml', 'mli'] },
+ nunjucks: { extensions: ['nunjucks', 'nunjs', 'nunj', 'nj', 'njk', 'tmpl', 'tpl'] },
+ mustache: { extensions: ['mustache', 'mst', 'mu', 'stache'] },
+ erb: { extensions: ['erb', 'rhtml', 'html.erb'] },
+ terraform: { extensions: ['tf', 'tfvars', 'hcl'] },
+ vue: { extensions: ['vue'] },
+ sass: { extensions: ['sass'] },
+ puppet: { extensions: ['puppet'] },
+ kotlin: { extensions: ['kt'] },
+ jinja: { extensions: ['jinja'] },
+ haxe: { extensions: ['hx'] },
+ haskell: { extensions: ['hs'] },
+ gradle: { extensions: ['gradle'] },
+ elixir: { extensions: ['ex'] },
+ haml: { extensions: ['haml'] },
+ stylus: { extensions: ['styl'] },
+ vala: { extensions: ['vala'] },
+ todo: { fileNames: ['todo'] },
+ jsonc: { extensions: ['json'] }
+}
+
+const basedir = process.cwd()
+const resolve = (dir: string) => path.join(basedir, dir)
+
+const outputDir = resolve(process.env.THEME_ICONS_DIR || '../vscode/extensions/theme-seti/icons')
+
+const extensionsDir = path.join(outputDir, '../../')
+
+const readFile = (file: string) => fs.promises.readFile(resolve(file), 'utf-8')
+
+const run = async () => {
+ const extensions = await fs.promises.readdir(extensionsDir)
+
+ const packageFiles = await Promise.all(
+ extensions
+ .map((extension) => path.join(extensionsDir, extension, 'package.json'))
+ .map(async (file) => {
+ try {
+ await fs.promises.access(file)
+ return fs.promises.readFile(file, 'utf-8')
+ } catch (e) {
+ return null
+ }
+ })
+ )
+
+ const languages = packageFiles
+ .filter((content): content is string => content !== null)
+ .map((content) => JSON.parse(content))
+ .flatMap((pkg: PackageJson) => pkg.contributes?.languages ?? [])
+ .filter((lang): lang is LanguageDef & { id: string } => lang.id !== undefined)
+ .map(({ id, extensions, fileNames }) => ({
+ [id]: { extensions: extensions?.map((ext) => ext.substr(1)), fileNames }
+ }))
+ .reduce((acc, curr) => ({ ...acc, ...curr }), nonBuiltInLanguages)
+
+ const variablesFile = await readFile('styles/ui-variables.less')
+ const colorVars = parseColorVars(variablesFile)
+
+ const mappingsFile = await readFile('styles/components/icons/mapping.less')
+ const definitions = parseMappings(mappingsFile, colorVars)
+ const mappings = getMappings(mappingsFile, colorVars)
+
+ const getIconId = (icon: string, color = '') =>
+ `_${stripExt(icon)}${color.length > 0 ? `_${color}` : ''}`
+
+ const iconDefinitions = Object.entries(mappings)
+ .flatMap(([icon, colors = []]) =>
+ colors
+ .map((color) => getIconId(icon, color))
+ .map((id) => ({
+ [id]: { iconPath: `./${id.substr(1)}.svg` },
+ [`${id}_light`]: { iconPath: `./${id.substr(1)}_light.svg` }
+ }))
+ )
+ .reduce((acc, curr) => ({ ...acc, ...curr }))
+
+ const file = definitions
+ .filter(({ type }) => type === 'default')
+ .map(({ icon, color }) => getIconId(icon, color))[0]
+
+ const fileExtensionDefs = definitions
+ .filter(({ type }) => type === 'ext')
+ .map(({ name, icon, color }) => ({
+ [name.toLowerCase().replace(/^\./, '')]: getIconId(icon, color)
+ }))
+ .reduce((acc, curr) => ({ ...acc, ...curr }))
+
+ const fileNameDefs = definitions
+ .filter(({ type }) => type === 'name')
+ .map(({ name, icon, color }) => ({
+ [name.toLowerCase()]: getIconId(icon, color)
+ }))
+ .reduce((acc, curr) => ({ ...acc, ...curr }))
+
+ const languageDefs = Object.entries(languages)
+ .map(([id, { extensions, fileNames }]) => ({
+ id,
+ extensions,
+ fileNames,
+ extension: extensions?.find((ext) => fileExtensionDefs[ext]),
+ fileName: fileNames?.find((name) => fileNameDefs[name])
+ }))
+ .map(({ extension = '', fileName = '', ...rest }) => ({
+ icon: fileExtensionDefs[extension] ?? fileNameDefs[fileName],
+ ...rest
+ }))
+ .filter(({ icon }) => icon)
+ .map(({ id, icon, extensions, fileNames }) => ({
+ id,
+ icon,
+ extensions: extensions?.filter((ext) => fileExtensionDefs[ext] === icon),
+ fileNames: fileNames?.filter((name) => fileNameDefs[name] === icon)
+ }))
+
+ const languageExts = languageDefs
+ .filter(({ id }) => !nonBuiltInLanguages[id])
+ .flatMap(({ extensions }) => extensions)
+ const fileExtensions = filterKeys(fileExtensionDefs, (ext) => !languageExts.includes(ext))
+
+ const languageNames = languageDefs
+ .filter(({ id }) => !nonBuiltInLanguages[id])
+ .flatMap(({ fileNames }) => fileNames)
+ const fileNames = filterKeys(fileNameDefs, (name) => !languageNames.includes(name))
+
+ const languageIds = languageDefs
+ .map(({ id, icon }) => ({
+ [id]: icon
+ }))
+ .reduce((acc, curr) => ({
+ ...acc,
+ ...curr
+ }))
+
+ const lightAssoc = (assoc: { [key: string]: string }) => mapValues(assoc, (id) => `${id}_light`)
+
+ const req = await fetch('https://api.github.com/repos/jesseweed/seti-ui/commits/master')
+ const master = await req.json()
+
+ const theme = {
+ // eslint-disable-next-line @typescript-eslint/camelcase
+ information_for_contributors,
+ iconDefinitions,
+ file,
+ fileExtensions,
+ fileNames,
+ languageIds,
+ light: {
+ file: `${file}_light`,
+ fileExtensions: lightAssoc(fileExtensions),
+ fileNames: lightAssoc(fileNames),
+ languageIds: lightAssoc(languageIds)
+ },
+ version: master.html_url
+ }
+
+ log('info', `Saving output to ${outputDir}`)
+ const current = await fs.promises.readdir(outputDir)
+ await Promise.all(
+ current
+ .filter((file) => /\.svg$/.test(file))
+ .map((file) => fs.promises.unlink(path.join(outputDir, file)))
+ )
+
+ await fs.promises.writeFile(
+ path.join(outputDir, 'vs-seti-icon-theme.json'),
+ JSON.stringify(theme, null, '\t')
+ )
+
+ const icons = await fs.promises.readdir(resolve('icons'))
+
+ const iconContents = await Promise.all(
+ icons
+ .filter((icon) => /\.svg$/.test(icon))
+ .map(async (icon) => ({
+ icon,
+ content: await fs.promises.readFile(resolve(`icons/${icon}`), 'utf-8')
+ }))
+ )
+
+ await Promise.all(
+ iconContents.flatMap(({ icon, content }) =>
+ ['black', 'white'].map((base) =>
+ fs.promises.writeFile(
+ path.join(outputDir, base === 'white' ? `${stripExt(icon)}_light.svg` : icon),
+ prepareIconVersion(content, colorVars, colorVars[base])
+ )
+ )
+ )
+ )
+ log('success', 'Successfully saved all files')
+}
+
+run()
diff --git a/src/dom.ts b/src/dom.ts
new file mode 100644
index 00000000..b8215b21
--- /dev/null
+++ b/src/dom.ts
@@ -0,0 +1,8 @@
+export const query = (el: string) => document.querySelector(el)
+export const queryAll = (el: string) => document.querySelectorAll(el)
+export const toggleClass = (action: 'add' | 'remove', el: NodeListOf, className: string) =>
+ el.forEach((el) => el.classList[action](className))
+export const addClass = (el: NodeListOf, className: string) =>
+ toggleClass('add', el, className)
+export const removeClass = (el: NodeListOf, className: string) =>
+ toggleClass('remove', el, className)
diff --git a/src/font-icons/checkbox.svg b/src/font-icons/checkbox.svg
new file mode 100644
index 00000000..dbe3af82
--- /dev/null
+++ b/src/font-icons/checkbox.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/font-icons/default.svg b/src/font-icons/default.svg
new file mode 100644
index 00000000..a4569893
--- /dev/null
+++ b/src/font-icons/default.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/font-icons/deprecation-cop.svg b/src/font-icons/deprecation-cop.svg
new file mode 100644
index 00000000..cb92c36b
--- /dev/null
+++ b/src/font-icons/deprecation-cop.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/font-icons/git.svg b/src/font-icons/git.svg
new file mode 100644
index 00000000..37f0b5aa
--- /dev/null
+++ b/src/font-icons/git.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/font-icons/github.svg b/src/font-icons/github.svg
new file mode 100644
index 00000000..42d10f8a
--- /dev/null
+++ b/src/font-icons/github.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/font-icons/ignored.svg b/src/font-icons/ignored.svg
new file mode 100644
index 00000000..629bbf36
--- /dev/null
+++ b/src/font-icons/ignored.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/font-icons/info.svg b/src/font-icons/info.svg
new file mode 100644
index 00000000..0a51e9e2
--- /dev/null
+++ b/src/font-icons/info.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/font-icons/markdown.svg b/src/font-icons/markdown.svg
new file mode 100644
index 00000000..5c431820
--- /dev/null
+++ b/src/font-icons/markdown.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/font-icons/new-file.svg b/src/font-icons/new-file.svg
new file mode 100644
index 00000000..02b0b7eb
--- /dev/null
+++ b/src/font-icons/new-file.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/font-icons/search.svg b/src/font-icons/search.svg
new file mode 100644
index 00000000..32400727
--- /dev/null
+++ b/src/font-icons/search.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/font-icons/settings.svg b/src/font-icons/settings.svg
new file mode 100644
index 00000000..6313deba
--- /dev/null
+++ b/src/font-icons/settings.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/font-icons/time-cop.svg b/src/font-icons/time-cop.svg
new file mode 100644
index 00000000..e0d49915
--- /dev/null
+++ b/src/font-icons/time-cop.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/headers.ts b/src/headers.ts
new file mode 100644
index 00000000..f2e7b82c
--- /dev/null
+++ b/src/headers.ts
@@ -0,0 +1,38 @@
+atom.packages.activatePackage('tree-view').then(({ mainModule: { treeView } }) => {
+ const IS_ANCHORED_CLASSNAME = 'is--anchored'
+ let projectRoots = treeView.roots
+
+ const updateTreeViewHeaderPosition = () => {
+ const position = { scrollTop: 0, ...treeView.scroller }
+ const yScrollPosition = position.scrollTop
+ projectRoots.forEach((project) => {
+ const projectHeaderHeight = project.header.offsetHeight
+ const projectClassList = project.classList
+ const projectOffsetY = project.offsetTop
+ const projectHeight = project.offsetHeight
+ if (yScrollPosition > projectOffsetY) {
+ if (yScrollPosition > projectOffsetY + projectHeight - projectHeaderHeight) {
+ project.header.style.top = 'auto'
+ projectClassList.add(IS_ANCHORED_CLASSNAME)
+ } else {
+ project.header.style.top = yScrollPosition - projectOffsetY + 'px'
+ projectClassList.remove(IS_ANCHORED_CLASSNAME)
+ }
+ } else {
+ project.header.style.top = '0'
+ projectClassList.remove(IS_ANCHORED_CLASSNAME)
+ }
+ })
+ }
+
+ atom.project.onDidChangePaths(() => {
+ projectRoots = treeView.roots
+ updateTreeViewHeaderPosition()
+ })
+ // TODO something other than setTimeout? it's a hack to trigger the update
+ // after the CSS changes have occurred. a gamble, probably inaccurate
+ atom.config.onDidChange('seti-ui', () => setTimeout(updateTreeViewHeaderPosition))
+
+ treeView.scroller.addEventListener('scroll', updateTreeViewHeaderPosition)
+ setTimeout(updateTreeViewHeaderPosition) // TODO something other than setTimeout?
+})
diff --git a/src/icons/R.svg b/src/icons/R.svg
new file mode 100644
index 00000000..3a56ab5c
--- /dev/null
+++ b/src/icons/R.svg
@@ -0,0 +1,16 @@
+
diff --git a/src/icons/apple.svg b/src/icons/apple.svg
new file mode 100644
index 00000000..25eedb82
--- /dev/null
+++ b/src/icons/apple.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/argdown.svg b/src/icons/argdown.svg
new file mode 100644
index 00000000..8fc1369f
--- /dev/null
+++ b/src/icons/argdown.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/asm.svg b/src/icons/asm.svg
new file mode 100644
index 00000000..208e51ca
--- /dev/null
+++ b/src/icons/asm.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/audio.svg b/src/icons/audio.svg
new file mode 100644
index 00000000..9aed3164
--- /dev/null
+++ b/src/icons/audio.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/icons/ava.svg b/src/icons/ava.svg
new file mode 100644
index 00000000..cdb4443d
--- /dev/null
+++ b/src/icons/ava.svg
@@ -0,0 +1,58 @@
+
+
diff --git a/src/icons/babel.svg b/src/icons/babel.svg
new file mode 100644
index 00000000..4960dca6
--- /dev/null
+++ b/src/icons/babel.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/bower.svg b/src/icons/bower.svg
new file mode 100644
index 00000000..453c7bf9
--- /dev/null
+++ b/src/icons/bower.svg
@@ -0,0 +1,49 @@
+
+
+
+
diff --git a/src/icons/browserslist.svg b/src/icons/browserslist.svg
new file mode 100644
index 00000000..bef64d1f
--- /dev/null
+++ b/src/icons/browserslist.svg
@@ -0,0 +1,22 @@
+
diff --git a/src/icons/bsl.svg b/src/icons/bsl.svg
new file mode 100644
index 00000000..937781c4
--- /dev/null
+++ b/src/icons/bsl.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/c-sharp.svg b/src/icons/c-sharp.svg
new file mode 100644
index 00000000..b5378d59
--- /dev/null
+++ b/src/icons/c-sharp.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/icons/c.svg b/src/icons/c.svg
new file mode 100644
index 00000000..dd04fc38
--- /dev/null
+++ b/src/icons/c.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/cake.svg b/src/icons/cake.svg
new file mode 100644
index 00000000..19c9f0c3
--- /dev/null
+++ b/src/icons/cake.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/icons/cake_php.svg b/src/icons/cake_php.svg
new file mode 100644
index 00000000..27723447
--- /dev/null
+++ b/src/icons/cake_php.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/checkbox-unchecked.svg b/src/icons/checkbox-unchecked.svg
new file mode 100644
index 00000000..c0f3220d
--- /dev/null
+++ b/src/icons/checkbox-unchecked.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/checkbox.svg b/src/icons/checkbox.svg
new file mode 100644
index 00000000..dbe3af82
--- /dev/null
+++ b/src/icons/checkbox.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/cjsx.svg b/src/icons/cjsx.svg
new file mode 100644
index 00000000..dbabab1a
--- /dev/null
+++ b/src/icons/cjsx.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/clock.svg b/src/icons/clock.svg
new file mode 100644
index 00000000..45e8545c
--- /dev/null
+++ b/src/icons/clock.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/clojure.svg b/src/icons/clojure.svg
new file mode 100644
index 00000000..544a704f
--- /dev/null
+++ b/src/icons/clojure.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/icons/code-climate.svg b/src/icons/code-climate.svg
new file mode 100644
index 00000000..894369cf
--- /dev/null
+++ b/src/icons/code-climate.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/code-search.svg b/src/icons/code-search.svg
new file mode 100644
index 00000000..bbf4ea30
--- /dev/null
+++ b/src/icons/code-search.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/icons/coffee.svg b/src/icons/coffee.svg
new file mode 100644
index 00000000..d1bac0f4
--- /dev/null
+++ b/src/icons/coffee.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/coffee_erb.svg b/src/icons/coffee_erb.svg
new file mode 100644
index 00000000..a3a3ff92
--- /dev/null
+++ b/src/icons/coffee_erb.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/coldfusion.svg b/src/icons/coldfusion.svg
new file mode 100644
index 00000000..4af4226d
--- /dev/null
+++ b/src/icons/coldfusion.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/config.svg b/src/icons/config.svg
new file mode 100644
index 00000000..cb42a7be
--- /dev/null
+++ b/src/icons/config.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/cpp.svg b/src/icons/cpp.svg
new file mode 100644
index 00000000..fd74116f
--- /dev/null
+++ b/src/icons/cpp.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/crystal.svg b/src/icons/crystal.svg
new file mode 100644
index 00000000..36b9b28a
--- /dev/null
+++ b/src/icons/crystal.svg
@@ -0,0 +1,16 @@
+
+
+
diff --git a/src/icons/crystal_embedded.svg b/src/icons/crystal_embedded.svg
new file mode 100644
index 00000000..600b0286
--- /dev/null
+++ b/src/icons/crystal_embedded.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/icons/css.svg b/src/icons/css.svg
new file mode 100644
index 00000000..f91827ac
--- /dev/null
+++ b/src/icons/css.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/csv.svg b/src/icons/csv.svg
new file mode 100644
index 00000000..44f39684
--- /dev/null
+++ b/src/icons/csv.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/d.svg b/src/icons/d.svg
new file mode 100644
index 00000000..eef621c3
--- /dev/null
+++ b/src/icons/d.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/dart.svg b/src/icons/dart.svg
new file mode 100644
index 00000000..ffb6ebf2
--- /dev/null
+++ b/src/icons/dart.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/icons/db.svg b/src/icons/db.svg
new file mode 100644
index 00000000..124d486f
--- /dev/null
+++ b/src/icons/db.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/default.svg b/src/icons/default.svg
new file mode 100644
index 00000000..8190543a
--- /dev/null
+++ b/src/icons/default.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/deprecation-cop.svg b/src/icons/deprecation-cop.svg
new file mode 100644
index 00000000..cb92c36b
--- /dev/null
+++ b/src/icons/deprecation-cop.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/docker.svg b/src/icons/docker.svg
new file mode 100644
index 00000000..ed286796
--- /dev/null
+++ b/src/icons/docker.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/icons/editorconfig.svg b/src/icons/editorconfig.svg
new file mode 100644
index 00000000..781155cd
--- /dev/null
+++ b/src/icons/editorconfig.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/ejs.svg b/src/icons/ejs.svg
new file mode 100644
index 00000000..304f7032
--- /dev/null
+++ b/src/icons/ejs.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/elixir.svg b/src/icons/elixir.svg
new file mode 100644
index 00000000..d36cdb35
--- /dev/null
+++ b/src/icons/elixir.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/elixir_script.svg b/src/icons/elixir_script.svg
new file mode 100644
index 00000000..b75ef3c7
--- /dev/null
+++ b/src/icons/elixir_script.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/elm.svg b/src/icons/elm.svg
new file mode 100644
index 00000000..4940f9a1
--- /dev/null
+++ b/src/icons/elm.svg
@@ -0,0 +1,39 @@
+
+
+
+
diff --git a/src/icons/error.svg b/src/icons/error.svg
new file mode 100644
index 00000000..731945aa
--- /dev/null
+++ b/src/icons/error.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/eslint.svg b/src/icons/eslint.svg
new file mode 100644
index 00000000..78c7fe1a
--- /dev/null
+++ b/src/icons/eslint.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/icons/ethereum.svg b/src/icons/ethereum.svg
new file mode 100644
index 00000000..5159af64
--- /dev/null
+++ b/src/icons/ethereum.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/icons/f-sharp.svg b/src/icons/f-sharp.svg
new file mode 100644
index 00000000..65ea256b
--- /dev/null
+++ b/src/icons/f-sharp.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/icons/favicon.svg b/src/icons/favicon.svg
new file mode 100644
index 00000000..5f1a6b42
--- /dev/null
+++ b/src/icons/favicon.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/firebase.svg b/src/icons/firebase.svg
new file mode 100644
index 00000000..37c9f749
--- /dev/null
+++ b/src/icons/firebase.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/icons/firefox.svg b/src/icons/firefox.svg
new file mode 100644
index 00000000..88750895
--- /dev/null
+++ b/src/icons/firefox.svg
@@ -0,0 +1,62 @@
+
diff --git a/src/icons/folder.svg b/src/icons/folder.svg
new file mode 100644
index 00000000..ea41d73a
--- /dev/null
+++ b/src/icons/folder.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/font.svg b/src/icons/font.svg
new file mode 100644
index 00000000..bebaa6ab
--- /dev/null
+++ b/src/icons/font.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/git.svg b/src/icons/git.svg
new file mode 100644
index 00000000..b70266f9
--- /dev/null
+++ b/src/icons/git.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/go.svg b/src/icons/go.svg
new file mode 100644
index 00000000..acf25763
--- /dev/null
+++ b/src/icons/go.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/icons/go2.svg b/src/icons/go2.svg
new file mode 100644
index 00000000..627b1379
--- /dev/null
+++ b/src/icons/go2.svg
@@ -0,0 +1,8 @@
+
diff --git a/src/icons/gradle.svg b/src/icons/gradle.svg
new file mode 100644
index 00000000..e6195a2e
--- /dev/null
+++ b/src/icons/gradle.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/icons/grails.svg b/src/icons/grails.svg
new file mode 100644
index 00000000..1ae20227
--- /dev/null
+++ b/src/icons/grails.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/graphql.svg b/src/icons/graphql.svg
new file mode 100644
index 00000000..477a8b58
--- /dev/null
+++ b/src/icons/graphql.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/grunt.svg b/src/icons/grunt.svg
new file mode 100644
index 00000000..66897de5
--- /dev/null
+++ b/src/icons/grunt.svg
@@ -0,0 +1,49 @@
+
diff --git a/src/icons/gulp.svg b/src/icons/gulp.svg
new file mode 100644
index 00000000..66f87b8f
--- /dev/null
+++ b/src/icons/gulp.svg
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/src/icons/hacklang.svg b/src/icons/hacklang.svg
new file mode 100644
index 00000000..75e8d9c2
--- /dev/null
+++ b/src/icons/hacklang.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/haml.svg b/src/icons/haml.svg
new file mode 100644
index 00000000..44b5f0ca
--- /dev/null
+++ b/src/icons/haml.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/happenings.svg b/src/icons/happenings.svg
new file mode 100644
index 00000000..68b28763
--- /dev/null
+++ b/src/icons/happenings.svg
@@ -0,0 +1,16 @@
+
diff --git a/src/icons/haskell.svg b/src/icons/haskell.svg
new file mode 100644
index 00000000..ffbae0d2
--- /dev/null
+++ b/src/icons/haskell.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/haxe.svg b/src/icons/haxe.svg
new file mode 100644
index 00000000..e6ff85fb
--- /dev/null
+++ b/src/icons/haxe.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/heroku.svg b/src/icons/heroku.svg
new file mode 100644
index 00000000..976d64ec
--- /dev/null
+++ b/src/icons/heroku.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/hex.svg b/src/icons/hex.svg
new file mode 100644
index 00000000..b3c568b7
--- /dev/null
+++ b/src/icons/hex.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/html.svg b/src/icons/html.svg
new file mode 100644
index 00000000..344a1fa0
--- /dev/null
+++ b/src/icons/html.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/html_erb.svg b/src/icons/html_erb.svg
new file mode 100644
index 00000000..355ab6bd
--- /dev/null
+++ b/src/icons/html_erb.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/ignored.svg b/src/icons/ignored.svg
new file mode 100644
index 00000000..629bbf36
--- /dev/null
+++ b/src/icons/ignored.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/illustrator.svg b/src/icons/illustrator.svg
new file mode 100644
index 00000000..a3fc4d68
--- /dev/null
+++ b/src/icons/illustrator.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/image.svg b/src/icons/image.svg
new file mode 100644
index 00000000..3cb66932
--- /dev/null
+++ b/src/icons/image.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/info.svg b/src/icons/info.svg
new file mode 100644
index 00000000..f312402d
--- /dev/null
+++ b/src/icons/info.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/icons/ionic.svg b/src/icons/ionic.svg
new file mode 100644
index 00000000..cca99531
--- /dev/null
+++ b/src/icons/ionic.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/jade.svg b/src/icons/jade.svg
new file mode 100644
index 00000000..41c50c0b
--- /dev/null
+++ b/src/icons/jade.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/java.svg b/src/icons/java.svg
new file mode 100644
index 00000000..c1e64ecc
--- /dev/null
+++ b/src/icons/java.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/javascript.svg b/src/icons/javascript.svg
new file mode 100644
index 00000000..a61310e8
--- /dev/null
+++ b/src/icons/javascript.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/jenkins.svg b/src/icons/jenkins.svg
new file mode 100644
index 00000000..f4823c75
--- /dev/null
+++ b/src/icons/jenkins.svg
@@ -0,0 +1,282 @@
+
+
+
+
diff --git a/src/icons/jest.svg b/src/icons/jest.svg
new file mode 100644
index 00000000..a6d1c4af
--- /dev/null
+++ b/src/icons/jest.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/jinja.svg b/src/icons/jinja.svg
new file mode 100644
index 00000000..4ac54021
--- /dev/null
+++ b/src/icons/jinja.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/js_erb.svg b/src/icons/js_erb.svg
new file mode 100644
index 00000000..59eb8ae1
--- /dev/null
+++ b/src/icons/js_erb.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/json.svg b/src/icons/json.svg
new file mode 100644
index 00000000..da3767c9
--- /dev/null
+++ b/src/icons/json.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/julia.svg b/src/icons/julia.svg
new file mode 100644
index 00000000..f7383ff6
--- /dev/null
+++ b/src/icons/julia.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/icons/karma.svg b/src/icons/karma.svg
new file mode 100644
index 00000000..1699339f
--- /dev/null
+++ b/src/icons/karma.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/kotlin.svg b/src/icons/kotlin.svg
new file mode 100644
index 00000000..59acbb51
--- /dev/null
+++ b/src/icons/kotlin.svg
@@ -0,0 +1,26 @@
+
diff --git a/src/icons/less.svg b/src/icons/less.svg
new file mode 100644
index 00000000..2c9275f7
--- /dev/null
+++ b/src/icons/less.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/license.svg b/src/icons/license.svg
new file mode 100644
index 00000000..25a1e8d4
--- /dev/null
+++ b/src/icons/license.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/liquid.svg b/src/icons/liquid.svg
new file mode 100644
index 00000000..c0b73060
--- /dev/null
+++ b/src/icons/liquid.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/livescript.svg b/src/icons/livescript.svg
new file mode 100644
index 00000000..14f852c9
--- /dev/null
+++ b/src/icons/livescript.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/lock.svg b/src/icons/lock.svg
new file mode 100644
index 00000000..72afa088
--- /dev/null
+++ b/src/icons/lock.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/lua.svg b/src/icons/lua.svg
new file mode 100644
index 00000000..be10cfb2
--- /dev/null
+++ b/src/icons/lua.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/makefile.svg b/src/icons/makefile.svg
new file mode 100644
index 00000000..57177a74
--- /dev/null
+++ b/src/icons/makefile.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/markdown.svg b/src/icons/markdown.svg
new file mode 100644
index 00000000..5c431820
--- /dev/null
+++ b/src/icons/markdown.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/maven.svg b/src/icons/maven.svg
new file mode 100644
index 00000000..0b909be5
--- /dev/null
+++ b/src/icons/maven.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/mdo.svg b/src/icons/mdo.svg
new file mode 100644
index 00000000..94681963
--- /dev/null
+++ b/src/icons/mdo.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/mocha.svg b/src/icons/mocha.svg
new file mode 100644
index 00000000..9c1826b7
--- /dev/null
+++ b/src/icons/mocha.svg
@@ -0,0 +1,40 @@
+
+
diff --git a/src/icons/mustache.svg b/src/icons/mustache.svg
new file mode 100644
index 00000000..c709ad58
--- /dev/null
+++ b/src/icons/mustache.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/new-file.svg b/src/icons/new-file.svg
new file mode 100644
index 00000000..02b0b7eb
--- /dev/null
+++ b/src/icons/new-file.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/icons/npm.svg b/src/icons/npm.svg
new file mode 100644
index 00000000..354f4e0a
--- /dev/null
+++ b/src/icons/npm.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/npm_ignored.svg b/src/icons/npm_ignored.svg
new file mode 100644
index 00000000..84c2c7f8
--- /dev/null
+++ b/src/icons/npm_ignored.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/nunjucks.svg b/src/icons/nunjucks.svg
new file mode 100644
index 00000000..ab382dac
--- /dev/null
+++ b/src/icons/nunjucks.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/ocaml.svg b/src/icons/ocaml.svg
new file mode 100644
index 00000000..09b2e089
--- /dev/null
+++ b/src/icons/ocaml.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/odata.svg b/src/icons/odata.svg
new file mode 100644
index 00000000..3ebdf752
--- /dev/null
+++ b/src/icons/odata.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/pddl.svg b/src/icons/pddl.svg
new file mode 100644
index 00000000..dd8e87c1
--- /dev/null
+++ b/src/icons/pddl.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/icons/pdf.svg b/src/icons/pdf.svg
new file mode 100644
index 00000000..b074001a
--- /dev/null
+++ b/src/icons/pdf.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/perl.svg b/src/icons/perl.svg
new file mode 100644
index 00000000..29c90c59
--- /dev/null
+++ b/src/icons/perl.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/photoshop.svg b/src/icons/photoshop.svg
new file mode 100644
index 00000000..f3cfee77
--- /dev/null
+++ b/src/icons/photoshop.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/php.svg b/src/icons/php.svg
new file mode 100644
index 00000000..362845b7
--- /dev/null
+++ b/src/icons/php.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/plan.svg b/src/icons/plan.svg
new file mode 100644
index 00000000..3a4c733c
--- /dev/null
+++ b/src/icons/plan.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/platformio.svg b/src/icons/platformio.svg
new file mode 100644
index 00000000..aa31af5f
--- /dev/null
+++ b/src/icons/platformio.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/icons/postcss.svg b/src/icons/postcss.svg
new file mode 100644
index 00000000..4892bce3
--- /dev/null
+++ b/src/icons/postcss.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/icons/powershell.svg b/src/icons/powershell.svg
new file mode 100644
index 00000000..4b96fd28
--- /dev/null
+++ b/src/icons/powershell.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/prettier.svg b/src/icons/prettier.svg
new file mode 100644
index 00000000..f8ff0e36
--- /dev/null
+++ b/src/icons/prettier.svg
@@ -0,0 +1,28 @@
+
+
diff --git a/src/icons/project.svg b/src/icons/project.svg
new file mode 100644
index 00000000..57c02de0
--- /dev/null
+++ b/src/icons/project.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/icons/prolog.svg b/src/icons/prolog.svg
new file mode 100644
index 00000000..071e30e0
--- /dev/null
+++ b/src/icons/prolog.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/src/icons/pug.svg b/src/icons/pug.svg
new file mode 100644
index 00000000..d2f90042
--- /dev/null
+++ b/src/icons/pug.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/puppet.svg b/src/icons/puppet.svg
new file mode 100644
index 00000000..483a35f3
--- /dev/null
+++ b/src/icons/puppet.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/python.svg b/src/icons/python.svg
new file mode 100644
index 00000000..e6905546
--- /dev/null
+++ b/src/icons/python.svg
@@ -0,0 +1,112 @@
+
+
+
diff --git a/src/icons/rails.svg b/src/icons/rails.svg
new file mode 100644
index 00000000..290a2d88
--- /dev/null
+++ b/src/icons/rails.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/react.svg b/src/icons/react.svg
new file mode 100644
index 00000000..5592ebec
--- /dev/null
+++ b/src/icons/react.svg
@@ -0,0 +1,35 @@
+
+
+
+
diff --git a/src/icons/reasonml.svg b/src/icons/reasonml.svg
new file mode 100644
index 00000000..7a248402
--- /dev/null
+++ b/src/icons/reasonml.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/rollup.svg b/src/icons/rollup.svg
new file mode 100644
index 00000000..d57d421d
--- /dev/null
+++ b/src/icons/rollup.svg
@@ -0,0 +1,46 @@
+
+
diff --git a/src/icons/ruby.svg b/src/icons/ruby.svg
new file mode 100644
index 00000000..c43bcd53
--- /dev/null
+++ b/src/icons/ruby.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/rust.svg b/src/icons/rust.svg
new file mode 100644
index 00000000..9f3b19cc
--- /dev/null
+++ b/src/icons/rust.svg
@@ -0,0 +1 @@
+
diff --git a/src/icons/salesforce.svg b/src/icons/salesforce.svg
new file mode 100644
index 00000000..b49307c9
--- /dev/null
+++ b/src/icons/salesforce.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/sass.svg b/src/icons/sass.svg
new file mode 100644
index 00000000..2dece9ae
--- /dev/null
+++ b/src/icons/sass.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/sbt.svg b/src/icons/sbt.svg
new file mode 100644
index 00000000..df1cceb5
--- /dev/null
+++ b/src/icons/sbt.svg
@@ -0,0 +1 @@
+
diff --git a/src/icons/scala.svg b/src/icons/scala.svg
new file mode 100644
index 00000000..73ba2464
--- /dev/null
+++ b/src/icons/scala.svg
@@ -0,0 +1 @@
+
diff --git a/icons/search.svg b/src/icons/search.svg
similarity index 100%
rename from icons/search.svg
rename to src/icons/search.svg
diff --git a/icons/settings.svg b/src/icons/settings.svg
similarity index 100%
rename from icons/settings.svg
rename to src/icons/settings.svg
diff --git a/src/icons/shell.svg b/src/icons/shell.svg
new file mode 100644
index 00000000..9e404f35
--- /dev/null
+++ b/src/icons/shell.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/slim.svg b/src/icons/slim.svg
new file mode 100644
index 00000000..3980b0c1
--- /dev/null
+++ b/src/icons/slim.svg
@@ -0,0 +1 @@
+
diff --git a/src/icons/smarty.svg b/src/icons/smarty.svg
new file mode 100644
index 00000000..833e24f9
--- /dev/null
+++ b/src/icons/smarty.svg
@@ -0,0 +1 @@
+
diff --git a/src/icons/spring.svg b/src/icons/spring.svg
new file mode 100644
index 00000000..acf0f4f8
--- /dev/null
+++ b/src/icons/spring.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/stylelint.svg b/src/icons/stylelint.svg
new file mode 100644
index 00000000..38d3d9e3
--- /dev/null
+++ b/src/icons/stylelint.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/stylus.svg b/src/icons/stylus.svg
new file mode 100644
index 00000000..7a911bd8
--- /dev/null
+++ b/src/icons/stylus.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/sublime.svg b/src/icons/sublime.svg
new file mode 100644
index 00000000..2478ec8f
--- /dev/null
+++ b/src/icons/sublime.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/svelte.svg b/src/icons/svelte.svg
new file mode 100644
index 00000000..4d66ff63
--- /dev/null
+++ b/src/icons/svelte.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/svg.svg b/src/icons/svg.svg
new file mode 100644
index 00000000..8a87dec1
--- /dev/null
+++ b/src/icons/svg.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/swift.svg b/src/icons/swift.svg
new file mode 100644
index 00000000..5decf94f
--- /dev/null
+++ b/src/icons/swift.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/tailwind.svg b/src/icons/tailwind.svg
new file mode 100644
index 00000000..ecbac965
--- /dev/null
+++ b/src/icons/tailwind.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/icons/terraform.svg b/src/icons/terraform.svg
new file mode 100644
index 00000000..4091496d
--- /dev/null
+++ b/src/icons/terraform.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/tex.svg b/src/icons/tex.svg
new file mode 100644
index 00000000..ab86e919
--- /dev/null
+++ b/src/icons/tex.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/icons/time-cop.svg b/src/icons/time-cop.svg
new file mode 100644
index 00000000..e0d49915
--- /dev/null
+++ b/src/icons/time-cop.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/todo.svg b/src/icons/todo.svg
new file mode 100644
index 00000000..f35692ec
--- /dev/null
+++ b/src/icons/todo.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/tsconfig.svg b/src/icons/tsconfig.svg
new file mode 100644
index 00000000..3db81ce3
--- /dev/null
+++ b/src/icons/tsconfig.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/icons/twig.svg b/src/icons/twig.svg
new file mode 100644
index 00000000..e0fd58e4
--- /dev/null
+++ b/src/icons/twig.svg
@@ -0,0 +1,88 @@
+
diff --git a/src/icons/typescript.svg b/src/icons/typescript.svg
new file mode 100644
index 00000000..83037b81
--- /dev/null
+++ b/src/icons/typescript.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/vala.svg b/src/icons/vala.svg
new file mode 100644
index 00000000..4d8b0221
--- /dev/null
+++ b/src/icons/vala.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/video.svg b/src/icons/video.svg
new file mode 100644
index 00000000..c4610559
--- /dev/null
+++ b/src/icons/video.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/vue.svg b/src/icons/vue.svg
new file mode 100644
index 00000000..b3b5f055
--- /dev/null
+++ b/src/icons/vue.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/wasm.svg b/src/icons/wasm.svg
new file mode 100644
index 00000000..6135610e
--- /dev/null
+++ b/src/icons/wasm.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/wat.svg b/src/icons/wat.svg
new file mode 100644
index 00000000..dd7d86c0
--- /dev/null
+++ b/src/icons/wat.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/webpack.svg b/src/icons/webpack.svg
new file mode 100644
index 00000000..04763d0f
--- /dev/null
+++ b/src/icons/webpack.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/wgt.svg b/src/icons/wgt.svg
new file mode 100644
index 00000000..eb19e168
--- /dev/null
+++ b/src/icons/wgt.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/windows.svg b/src/icons/windows.svg
new file mode 100644
index 00000000..23adc9e1
--- /dev/null
+++ b/src/icons/windows.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/word.svg b/src/icons/word.svg
new file mode 100644
index 00000000..1e503c31
--- /dev/null
+++ b/src/icons/word.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/xls.svg b/src/icons/xls.svg
new file mode 100644
index 00000000..39958f57
--- /dev/null
+++ b/src/icons/xls.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/xml.svg b/src/icons/xml.svg
new file mode 100644
index 00000000..ef081337
--- /dev/null
+++ b/src/icons/xml.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/yarn.svg b/src/icons/yarn.svg
new file mode 100644
index 00000000..8cbce618
--- /dev/null
+++ b/src/icons/yarn.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/yml.svg b/src/icons/yml.svg
new file mode 100644
index 00000000..fb2e5c78
--- /dev/null
+++ b/src/icons/yml.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/zip.svg b/src/icons/zip.svg
new file mode 100644
index 00000000..952d523e
--- /dev/null
+++ b/src/icons/zip.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 00000000..cc7d357a
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1 @@
+export { init as activate } from './settings'
diff --git a/src/settings.ts b/src/settings.ts
new file mode 100644
index 00000000..d41a4104
--- /dev/null
+++ b/src/settings.ts
@@ -0,0 +1,122 @@
+import { EOL } from 'os'
+import * as fs from 'fs'
+import { query, queryAll, addClass, removeClass } from './dom'
+// import from './headers'
+
+import { Action, Config } from './types'
+
+const applySetting = ({ config, action, selectors, className }: Config) => {
+ const cb = (val: boolean) => action({ selectors, className, bool: val })
+
+ cb(atom.config.get(config))
+ atom.config.onDidChange(config, ({ oldValue, newValue }) => {
+ if (oldValue !== newValue) {
+ cb(newValue)
+ }
+ })
+}
+
+const wrapArr = (val: T[] | T): T[] => (Array.isArray(val) ? val : [val])
+
+const getMethod = (bool: boolean) => (bool ? addClass : removeClass)
+
+// ADD CLASS WHEN CONDITIONAL IS TRUE
+const addWhenTrue: Action = ({ selectors, bool, className }) =>
+ wrapArr(selectors).forEach((selector) => getMethod(bool)(queryAll(selector), className))
+
+// ADD CLASS WHEN CONDITIONAL IS FALSE
+const addWhenFalse: Action = ({ bool, ...props }) => addWhenTrue({ bool: !bool, ...props })
+
+const configs = [
+ {
+ config: 'seti-ui.hideProjectTab',
+ action: addWhenTrue,
+ selectors: ['atom-workspace'],
+ className: 'hide-project-tab'
+ },
+ {
+ config: 'seti-ui.compactView',
+ action: addWhenTrue,
+ selectors: ['atom-workspace'],
+ className: 'seti-compact'
+ },
+ {
+ config: 'seti-ui.hideTitleBar',
+ action: addWhenTrue,
+ selectors: ['atom-workspace'],
+ className: 'hide-title-bar'
+ },
+ {
+ config: 'seti-ui.hideDocumentTitle',
+ action: addWhenTrue,
+ selectors: ['atom-workspace'],
+ className: 'hide-document-title'
+ },
+ {
+ config: 'seti-ui.hideProjectTab',
+ action: addWhenTrue,
+ selectors: ['atom-workspace'],
+ className: 'hide-project-tab'
+ },
+ {
+ config: 'seti-ui.hideTabs',
+ action: addWhenTrue,
+ selectors: ['atom-workspace'],
+ className: 'seti-hide-tabs'
+ },
+ {
+ config: 'seti-ui.fileIcons',
+ action: addWhenTrue,
+ selectors: ['atom-workspace'],
+ className: 'seti-icons'
+ },
+ {
+ config: 'seti-ui.displayIgnored',
+ action: addWhenFalse,
+ selectors: [
+ '.file.entry.list-item.status-ignored',
+ '.directory.entry.list-nested-item.status-ignored'
+ ],
+ className: 'seti-hide'
+ }
+]
+
+const pkg = atom.packages.getLoadedPackage('seti-ui')
+
+const refresh = () => {
+ pkg?.deactivate?.()
+ setImmediate(() => pkg?.activate?.())
+}
+
+// SET THEME COLOR
+const setTheme = async (theme: string, previous?: string, reload?: boolean) => {
+ const el = query('atom-workspace')
+ // GET OUR PACKAGE INFO
+ const pkg = atom.packages.getLoadedPackage('seti-ui')
+ // THEME DATA
+ const themeData = ['', '-text', '-highlight']
+ .map((suffix) => `@seti-primary${suffix}: @${theme.toLowerCase()}${suffix};`)
+ .join(EOL)
+
+ // SAVE TO ATOM CONFIG
+ atom.config.set('seti-ui.themeColor', theme)
+ // SAVE USER THEME FILE
+ try {
+ await fs.promises.writeFile(`${pkg?.path}/styles/user-theme.less`, themeData)
+ if (previous) {
+ el?.classList.remove('seti-theme-' + previous.toLowerCase())
+ el?.classList.add('seti-theme-' + theme.toLowerCase())
+ }
+ if (reload) {
+ refresh()
+ }
+ } catch (e) {}
+}
+
+export const init = () => {
+ configs.forEach(applySetting)
+ setTheme(atom.config.get('seti-ui.themeColor'))
+ atom.config.onDidChange('seti-ui.themeColor', ({ newValue, oldValue }) =>
+ setTheme(newValue, oldValue, true)
+ )
+}
diff --git a/src/types.ts b/src/types.ts
new file mode 100644
index 00000000..2acbef1e
--- /dev/null
+++ b/src/types.ts
@@ -0,0 +1,23 @@
+declare module 'atom' {
+ type ProjectElement = HTMLElement & { header: HTMLElement }
+
+ interface TreeView {
+ roots: ProjectElement[]
+ scroller: HTMLElement
+ }
+
+ interface Package {
+ activate?: () => void
+ deactivate?: () => void
+ mainModule: { treeView: TreeView }
+ }
+}
+
+interface Dispatch {
+ selectors: string[] | string
+ className: string
+}
+
+export type Action = (args: Dispatch & { bool: boolean }) => void
+
+export type Config = Dispatch & { config: string; action: Action }
diff --git a/styles/_fonts/_template.less b/styles/_fonts/_template.less
index a03f086d..3ee4885d 100644
--- a/styles/_fonts/_template.less
+++ b/styles/_fonts/_template.less
@@ -1,11 +1,11 @@
@font-face {
font-family: '<%= fontName %>';
- src: url('atom://seti-ui/styles/_fonts/seti/<%= fontName %>.eot');
- src: url('atom://seti-ui/styles/_fonts/seti/<%= fontName %>.eot?#iefix') format('eot'),
- // url('atom://seti-ui/styles/_fonts/seti/<%= fontName %>.woff2') format('woff2'),
- url('atom://seti-ui/styles/_fonts/seti/<%= fontName %>.woff') format('woff'),
- url('atom://seti-ui/styles/_fonts/seti/<%= fontName %>.ttf') format('truetype'),
- url('atom://seti-ui/styles/_fonts/seti/<%= fontName %>.svg#<%= fontName %>') format('svg');
+ src: url('http://localhost:5000/styles/_fonts/seti/<%= fontName %>.eot');
+ src: url('http://localhost:5000/styles/_fonts/seti/<%= fontName %>.eot?#iefix') format('eot'),
+ // url('http://localhost:5000/styles/_fonts/seti/<%= fontName %>.woff2') format('woff2'),
+ url('http://localhost:5000/styles/_fonts/seti/<%= fontName %>.woff') format('woff'),
+ url('http://localhost:5000/styles/_fonts/seti/<%= fontName %>.ttf') format('truetype'),
+ url('http://localhost:5000/styles/_fonts/seti/<%= fontName %>.svg#<%= fontName %>') format('svg');
font-weight: normal;
font-style: normal;
}
diff --git a/styles/_fonts/roboto.less b/styles/_fonts/roboto.less
index 6b20a7a1..230d0026 100644
--- a/styles/_fonts/roboto.less
+++ b/styles/_fonts/roboto.less
@@ -1,78 +1,78 @@
// Thin
@font-face {
font-family: 'Roboto';
- src: url('atom://seti-ui/styles/_fonts/roboto/Roboto-Thin.ttf') format('ttf');
+ src: url('http://localhost:5000/styles/_fonts/roboto/Roboto-Thin.ttf') format('ttf');
font-weight: 100;
font-style: normal;
}
@font-face {
font-family: 'Roboto-Thin-Italic';
- src: url('atom://seti-ui/styles/_fonts/roboto/Roboto-ThinItalic.ttf') format('ttf');
+ src: url('http://localhost:5000/styles/_fonts/roboto/Roboto-ThinItalic.ttf') format('ttf');
font-weight: 100;
font-style: italic;
}
// Light
@font-face {
font-family: 'Roboto';
- src: url('atom://seti-ui/styles/_fonts/roboto/Roboto-Light.ttf') format('ttf');
+ src: url('http://localhost:5000/styles/_fonts/roboto/Roboto-Light.ttf') format('ttf');
font-weight: 300;
font-style: normal;
}
@font-face {
font-family: 'Roboto';
- src: url('atom://seti-ui/styles/_fonts/roboto/Roboto-LightItalic.ttf') format('ttf');
+ src: url('http://localhost:5000/styles/_fonts/roboto/Roboto-LightItalic.ttf') format('ttf');
font-weight: 300;
font-style: italic;
}
// Regular
@font-face {
font-family: 'Roboto';
- src: url('atom://seti-ui/styles/_fonts/roboto/Roboto-Regular.ttf') format('ttf');
+ src: url('http://localhost:5000/styles/_fonts/roboto/Roboto-Regular.ttf') format('ttf');
font-weight: 500;
font-style: normal;
}
@font-face {
font-family: 'Roboto';
- src: url('atom://seti-ui/styles/_fonts/roboto/Roboto-Italic.ttf') format('ttf');
+ src: url('http://localhost:5000/styles/_fonts/roboto/Roboto-Italic.ttf') format('ttf');
font-weight: 500;
font-style: italic;
}
// Medium
@font-face {
font-family: 'Roboto';
- src: url('atom://seti-ui/styles/_fonts/roboto/Roboto-Medium.ttf') format('ttf');
+ src: url('http://localhost:5000/styles/_fonts/roboto/Roboto-Medium.ttf') format('ttf');
font-weight: 600;
font-style: normal;
}
@font-face {
font-family: 'Roboto';
- src: url('atom://seti-ui/styles/_fonts/roboto/Roboto-MediumItalic.ttf') format('ttf');
+ src: url('http://localhost:5000/styles/_fonts/roboto/Roboto-MediumItalic.ttf') format('ttf');
font-weight: 600;
font-style: italic;
}
// Bold
@font-face {
font-family: 'Roboto';
- src: url('atom://seti-ui/styles/_fonts/roboto/Roboto-Bold.ttf') format('ttf');
+ src: url('http://localhost:5000/styles/_fonts/roboto/Roboto-Bold.ttf') format('ttf');
font-weight: 700;
font-style: normal;
}
@font-face {
font-family: 'Roboto';
- src: url('atom://seti-ui/styles/_fonts/roboto/Roboto-BoldItalic.ttf') format('ttf');
+ src: url('http://localhost:5000/styles/_fonts/roboto/Roboto-BoldItalic.ttf') format('ttf');
font-weight: 700;
font-style: italic;
}
// Black
@font-face {
font-family: 'Roboto';
- src: url('atom://seti-ui/styles/_fonts/roboto/Roboto-Black.ttf') format('ttf');
+ src: url('http://localhost:5000/styles/_fonts/roboto/Roboto-Black.ttf') format('ttf');
font-weight: 900;
font-style: normal;
}
@font-face {
font-family: 'Roboto';
- src: url('atom://seti-ui/styles/_fonts/roboto/Roboto-BlackItalic.ttf') format('ttf');
+ src: url('http://localhost:5000/styles/_fonts/roboto/Roboto-BlackItalic.ttf') format('ttf');
font-weight: 900;
font-style: italic;
}
diff --git a/styles/_fonts/seti.less b/styles/_fonts/seti.less
index 4f8d2120..09f70caa 100644
--- a/styles/_fonts/seti.less
+++ b/styles/_fonts/seti.less
@@ -1,11 +1,11 @@
@font-face {
font-family: 'seti';
- src: url('atom://seti-ui/styles/_fonts/seti/seti.eot');
- src: url('atom://seti-ui/styles/_fonts/seti/seti.eot?#iefix') format('eot'),
- // url('atom://seti-ui/styles/_fonts/seti/seti.woff2') format('woff2'),
- url('atom://seti-ui/styles/_fonts/seti/seti.woff') format('woff'),
- url('atom://seti-ui/styles/_fonts/seti/seti.ttf') format('truetype'),
- url('atom://seti-ui/styles/_fonts/seti/seti.svg#seti') format('svg');
+ src: url('http://localhost:5000/styles/_fonts/seti/seti.eot');
+ src: url('http://localhost:5000/styles/_fonts/seti/seti.eot?#iefix') format('eot'),
+ // url('http://localhost:5000/styles/_fonts/seti/seti.woff2') format('woff2'),
+ url('http://localhost:5000/styles/_fonts/seti/seti.woff') format('woff'),
+ url('http://localhost:5000/styles/_fonts/seti/seti.ttf') format('truetype'),
+ url('http://localhost:5000/styles/_fonts/seti/seti.svg#seti') format('svg');
font-weight: normal;
font-style: normal;
}
@@ -22,162 +22,19 @@
}
.icon-char(@filename) {
- @R: '\E001';
- @apple: '\E002';
- @argdown: '\E003';
- @asm: '\E004';
- @audio: '\E005';
- @babel: '\E006';
- @bower: '\E007';
- @bsl: '\E008';
- @c-sharp: '\E009';
- @c: '\E00A';
- @cake: '\E00B';
- @cake_php: '\E00C';
- @checkbox-unchecked: '\E00D';
- @checkbox: '\E00E';
- @cjsx: '\E00F';
- @clock: '\E010';
- @clojure: '\E011';
- @code-climate: '\E012';
- @code-search: '\E013';
- @coffee: '\E014';
- @coffee_erb: '\E015';
- @coldfusion: '\E016';
- @config: '\E017';
- @cpp: '\E018';
- @crystal: '\E019';
- @crystal_embedded: '\E01A';
- @css: '\E01B';
- @csv: '\E01C';
- @d: '\E01D';
- @dart: '\E01E';
- @db: '\E01F';
- @default: '\E020';
- @deprecation-cop: '\E021';
- @docker: '\E022';
- @editorconfig: '\E023';
- @ejs: '\E024';
- @elixir: '\E025';
- @elixir_script: '\E026';
- @elm: '\E027';
- @error: '\E028';
- @eslint: '\E029';
- @ethereum: '\E02A';
- @f-sharp: '\E02B';
- @favicon: '\E02C';
- @firebase: '\E02D';
- @firefox: '\E02E';
- @folder: '\E02F';
- @font: '\E030';
- @git: '\E031';
- @git_folder: '\E032';
- @git_ignore: '\E033';
- @github: '\E034';
- @go: '\E035';
- @go2: '\E036';
- @gradle: '\E037';
- @grails: '\E038';
- @graphql: '\E039';
- @grunt: '\E03A';
- @gulp: '\E03B';
- @hacklang: '\E03C';
- @haml: '\E03D';
- @happenings: '\E03E';
- @haskell: '\E03F';
- @haxe: '\E040';
- @heroku: '\E041';
- @hex: '\E042';
- @html: '\E043';
- @html_erb: '\E044';
- @ignored: '\E045';
- @illustrator: '\E046';
- @image: '\E047';
- @info: '\E048';
- @ionic: '\E049';
- @jade: '\E04A';
- @java: '\E04B';
- @javascript: '\E04C';
- @jenkins: '\E04D';
- @jinja: '\E04E';
- @js_erb: '\E04F';
- @json: '\E050';
- @julia: '\E051';
- @karma: '\E052';
- @kotlin: '\E053';
- @less: '\E054';
- @license: '\E055';
- @liquid: '\E056';
- @livescript: '\E057';
- @lock: '\E058';
- @lua: '\E059';
- @makefile: '\E05A';
- @markdown: '\E05B';
- @maven: '\E05C';
- @mdo: '\E05D';
- @mustache: '\E05E';
- @new-file: '\E05F';
- @npm: '\E060';
- @npm_ignored: '\E061';
- @nunjucks: '\E062';
- @ocaml: '\E063';
- @odata: '\E064';
- @pddl: '\E065';
- @pdf: '\E066';
- @perl: '\E067';
- @photoshop: '\E068';
- @php: '\E069';
- @plan: '\E06A';
- @platformio: '\E06B';
- @powershell: '\E06C';
- @project: '\E06D';
- @prolog: '\E06E';
- @pug: '\E06F';
- @puppet: '\E070';
- @python: '\E071';
- @rails: '\E072';
- @react: '\E073';
- @reasonml: '\E074';
- @rollup: '\E075';
- @ruby: '\E076';
- @rust: '\E077';
- @salesforce: '\E078';
- @sass: '\E079';
- @sbt: '\E07A';
- @scala: '\E07B';
- @search: '\E07C';
- @settings: '\E07D';
- @shell: '\E07E';
- @slim: '\E07F';
- @smarty: '\E080';
- @spring: '\E081';
- @stylelint: '\E082';
- @stylus: '\E083';
- @sublime: '\E084';
- @svg: '\E085';
- @swift: '\E086';
- @terraform: '\E087';
- @tex: '\E088';
- @time-cop: '\E089';
- @todo: '\E08A';
- @tsconfig: '\E08B';
- @twig: '\E08C';
- @typescript: '\E08D';
- @vala: '\E08E';
- @video: '\E08F';
- @vue: '\E090';
- @wasm: '\E091';
- @wat: '\E092';
- @webpack: '\E093';
- @wgt: '\E094';
- @windows: '\E095';
- @word: '\E096';
- @xls: '\E097';
- @xml: '\E098';
- @yarn: '\E099';
- @yml: '\E09A';
- @zip: '\E09B';
-
+ @checkbox: '\E001';
+ @default: '\E002';
+ @deprecation-cop: '\E003';
+ @git: '\E004';
+ @github: '\E005';
+ @ignored: '\E006';
+ @info: '\E007';
+ @markdown: '\E008';
+ @new-file: '\E009';
+ @search: '\E00A';
+ @settings: '\E00B';
+ @time-cop: '\E00C';
+
content: @@filename;
}
@@ -191,468 +48,39 @@
}
}
-.icon-R {
- .icon(R);
-}
-.icon-apple {
- .icon(apple);
-}
-.icon-argdown {
- .icon(argdown);
-}
-.icon-asm {
- .icon(asm);
-}
-.icon-audio {
- .icon(audio);
-}
-.icon-babel {
- .icon(babel);
-}
-.icon-bower {
- .icon(bower);
-}
-.icon-bsl {
- .icon(bsl);
-}
-.icon-c-sharp {
- .icon(c-sharp);
-}
-.icon-c {
- .icon(c);
-}
-.icon-cake {
- .icon(cake);
-}
-.icon-cake_php {
- .icon(cake_php);
-}
-.icon-checkbox-unchecked {
- .icon(checkbox-unchecked);
-}
.icon-checkbox {
.icon(checkbox);
}
-.icon-cjsx {
- .icon(cjsx);
-}
-.icon-clock {
- .icon(clock);
-}
-.icon-clojure {
- .icon(clojure);
-}
-.icon-code-climate {
- .icon(code-climate);
-}
-.icon-code-search {
- .icon(code-search);
-}
-.icon-coffee {
- .icon(coffee);
-}
-.icon-coffee_erb {
- .icon(coffee_erb);
-}
-.icon-coldfusion {
- .icon(coldfusion);
-}
-.icon-config {
- .icon(config);
-}
-.icon-cpp {
- .icon(cpp);
-}
-.icon-crystal {
- .icon(crystal);
-}
-.icon-crystal_embedded {
- .icon(crystal_embedded);
-}
-.icon-css {
- .icon(css);
-}
-.icon-csv {
- .icon(csv);
-}
-.icon-d {
- .icon(d);
-}
-.icon-dart {
- .icon(dart);
-}
-.icon-db {
- .icon(db);
-}
.icon-default {
.icon(default);
}
.icon-deprecation-cop {
.icon(deprecation-cop);
}
-.icon-docker {
- .icon(docker);
-}
-.icon-editorconfig {
- .icon(editorconfig);
-}
-.icon-ejs {
- .icon(ejs);
-}
-.icon-elixir {
- .icon(elixir);
-}
-.icon-elixir_script {
- .icon(elixir_script);
-}
-.icon-elm {
- .icon(elm);
-}
-.icon-error {
- .icon(error);
-}
-.icon-eslint {
- .icon(eslint);
-}
-.icon-ethereum {
- .icon(ethereum);
-}
-.icon-f-sharp {
- .icon(f-sharp);
-}
-.icon-favicon {
- .icon(favicon);
-}
-.icon-firebase {
- .icon(firebase);
-}
-.icon-firefox {
- .icon(firefox);
-}
-.icon-folder {
- .icon(folder);
-}
-.icon-font {
- .icon(font);
-}
.icon-git {
.icon(git);
}
-.icon-git_folder {
- .icon(git_folder);
-}
-.icon-git_ignore {
- .icon(git_ignore);
-}
.icon-github {
.icon(github);
}
-.icon-go {
- .icon(go);
-}
-.icon-go2 {
- .icon(go2);
-}
-.icon-gradle {
- .icon(gradle);
-}
-.icon-grails {
- .icon(grails);
-}
-.icon-graphql {
- .icon(graphql);
-}
-.icon-grunt {
- .icon(grunt);
-}
-.icon-gulp {
- .icon(gulp);
-}
-.icon-hacklang {
- .icon(hacklang);
-}
-.icon-haml {
- .icon(haml);
-}
-.icon-happenings {
- .icon(happenings);
-}
-.icon-haskell {
- .icon(haskell);
-}
-.icon-haxe {
- .icon(haxe);
-}
-.icon-heroku {
- .icon(heroku);
-}
-.icon-hex {
- .icon(hex);
-}
-.icon-html {
- .icon(html);
-}
-.icon-html_erb {
- .icon(html_erb);
-}
.icon-ignored {
.icon(ignored);
}
-.icon-illustrator {
- .icon(illustrator);
-}
-.icon-image {
- .icon(image);
-}
.icon-info {
.icon(info);
}
-.icon-ionic {
- .icon(ionic);
-}
-.icon-jade {
- .icon(jade);
-}
-.icon-java {
- .icon(java);
-}
-.icon-javascript {
- .icon(javascript);
-}
-.icon-jenkins {
- .icon(jenkins);
-}
-.icon-jinja {
- .icon(jinja);
-}
-.icon-js_erb {
- .icon(js_erb);
-}
-.icon-json {
- .icon(json);
-}
-.icon-julia {
- .icon(julia);
-}
-.icon-karma {
- .icon(karma);
-}
-.icon-kotlin {
- .icon(kotlin);
-}
-.icon-less {
- .icon(less);
-}
-.icon-license {
- .icon(license);
-}
-.icon-liquid {
- .icon(liquid);
-}
-.icon-livescript {
- .icon(livescript);
-}
-.icon-lock {
- .icon(lock);
-}
-.icon-lua {
- .icon(lua);
-}
-.icon-makefile {
- .icon(makefile);
-}
.icon-markdown {
.icon(markdown);
}
-.icon-maven {
- .icon(maven);
-}
-.icon-mdo {
- .icon(mdo);
-}
-.icon-mustache {
- .icon(mustache);
-}
.icon-new-file {
.icon(new-file);
}
-.icon-npm {
- .icon(npm);
-}
-.icon-npm_ignored {
- .icon(npm_ignored);
-}
-.icon-nunjucks {
- .icon(nunjucks);
-}
-.icon-ocaml {
- .icon(ocaml);
-}
-.icon-odata {
- .icon(odata);
-}
-.icon-pddl {
- .icon(pddl);
-}
-.icon-pdf {
- .icon(pdf);
-}
-.icon-perl {
- .icon(perl);
-}
-.icon-photoshop {
- .icon(photoshop);
-}
-.icon-php {
- .icon(php);
-}
-.icon-plan {
- .icon(plan);
-}
-.icon-platformio {
- .icon(platformio);
-}
-.icon-powershell {
- .icon(powershell);
-}
-.icon-project {
- .icon(project);
-}
-.icon-prolog {
- .icon(prolog);
-}
-.icon-pug {
- .icon(pug);
-}
-.icon-puppet {
- .icon(puppet);
-}
-.icon-python {
- .icon(python);
-}
-.icon-rails {
- .icon(rails);
-}
-.icon-react {
- .icon(react);
-}
-.icon-reasonml {
- .icon(reasonml);
-}
-.icon-rollup {
- .icon(rollup);
-}
-.icon-ruby {
- .icon(ruby);
-}
-.icon-rust {
- .icon(rust);
-}
-.icon-salesforce {
- .icon(salesforce);
-}
-.icon-sass {
- .icon(sass);
-}
-.icon-sbt {
- .icon(sbt);
-}
-.icon-scala {
- .icon(scala);
-}
.icon-search {
.icon(search);
}
.icon-settings {
.icon(settings);
}
-.icon-shell {
- .icon(shell);
-}
-.icon-slim {
- .icon(slim);
-}
-.icon-smarty {
- .icon(smarty);
-}
-.icon-spring {
- .icon(spring);
-}
-.icon-stylelint {
- .icon(stylelint);
-}
-.icon-stylus {
- .icon(stylus);
-}
-.icon-sublime {
- .icon(sublime);
-}
-.icon-svg {
- .icon(svg);
-}
-.icon-swift {
- .icon(swift);
-}
-.icon-terraform {
- .icon(terraform);
-}
-.icon-tex {
- .icon(tex);
-}
.icon-time-cop {
.icon(time-cop);
}
-.icon-todo {
- .icon(todo);
-}
-.icon-tsconfig {
- .icon(tsconfig);
-}
-.icon-twig {
- .icon(twig);
-}
-.icon-typescript {
- .icon(typescript);
-}
-.icon-vala {
- .icon(vala);
-}
-.icon-video {
- .icon(video);
-}
-.icon-vue {
- .icon(vue);
-}
-.icon-wasm {
- .icon(wasm);
-}
-.icon-wat {
- .icon(wat);
-}
-.icon-webpack {
- .icon(webpack);
-}
-.icon-wgt {
- .icon(wgt);
-}
-.icon-windows {
- .icon(windows);
-}
-.icon-word {
- .icon(word);
-}
-.icon-xls {
- .icon(xls);
-}
-.icon-xml {
- .icon(xml);
-}
-.icon-yarn {
- .icon(yarn);
-}
-.icon-yml {
- .icon(yml);
-}
-.icon-zip {
- .icon(zip);
-}
diff --git a/styles/_fonts/seti/seti.eot b/styles/_fonts/seti/seti.eot
index 501f891c..507ccea9 100644
Binary files a/styles/_fonts/seti/seti.eot and b/styles/_fonts/seti/seti.eot differ
diff --git a/styles/_fonts/seti/seti.svg b/styles/_fonts/seti/seti.svg
index eddc4d8b..73f03ded 100644
--- a/styles/_fonts/seti/seti.svg
+++ b/styles/_fonts/seti/seti.svg
@@ -1,4 +1,4 @@
-
+
diff --git a/styles/_fonts/seti/seti.ttf b/styles/_fonts/seti/seti.ttf
index 6e8e2e9a..1f3a5760 100644
Binary files a/styles/_fonts/seti/seti.ttf and b/styles/_fonts/seti/seti.ttf differ
diff --git a/styles/_fonts/seti/seti.woff b/styles/_fonts/seti/seti.woff
index 3a77c429..e234e562 100644
Binary files a/styles/_fonts/seti/seti.woff and b/styles/_fonts/seti/seti.woff differ
diff --git a/styles/_fonts/seti/seti.woff2 b/styles/_fonts/seti/seti.woff2
index e99543e2..4b652027 100644
Binary files a/styles/_fonts/seti/seti.woff2 and b/styles/_fonts/seti/seti.woff2 differ
diff --git a/styles/components/dock.less b/styles/components/dock.less
index c945565b..8cc12563 100644
--- a/styles/components/dock.less
+++ b/styles/components/dock.less
@@ -122,7 +122,7 @@ atom-dock {
}
&.icon-git-commit {
- .icon('git_folder', @tab-text-color);
+ .icon('git', @tab-text-color);
&::before {
margin-right: 10px;
}
@@ -133,7 +133,7 @@ atom-dock {
border: 0;
max-width: none;
.title::before {
- background: url('atom://seti-ui/icons/project.svg') no-repeat;
+ background: url('http://localhost:5000/icons/project.svg') no-repeat;
background-position: center;
background-size: 80%;
height: @tab-height;
diff --git a/styles/components/icons/mapping.less b/styles/components/icons/mapping.less
index 98b1ce2c..c029528b 100644
--- a/styles/components/icons/mapping.less
+++ b/styles/components/icons/mapping.less
@@ -1,613 +1,653 @@
+// DEFAULT ICON
+.icon-default("default");
+
// - - - - - - - - - - - - - -
// LANGUAGES - EXTENSION BASED
// - - - - - - - - - - - - - -
-// DEFAULT ICON
-.icon-file-binary,
-.icon-file-pdf,
-.icon-file-text,
-.icon-book,
-.icon-file-media,
-.icon-markdown,
-.title {
- .icon("default", @white);
-}
-
// 1C:Enterprise
-.icon-set(".bsl", "bsl", @red);
-.icon-set(".mdo", "mdo", @red);
+.icon-ext(".bsl", "bsl");
+.icon-ext(".mdo", "mdo");
// Assembly
-.icon-set(".asm", "asm", @red);
-.icon-set(".s", "asm", @red);
+.icon-ext(".asm", "asm");
+.icon-ext(".s", "asm");
// C
-.icon-set(".c", "c", @blue);
-.icon-set(".h", "c", @purple);
-.icon-set(".m", "c", @yellow);
+.icon-ext(".c", "c", "blue");
+.icon-ext(".h", "c", "purple");
+.icon-ext(".m", "c", "yellow");
// C♯
-.icon-set(".cs", "c-sharp", @blue);
-.icon-set(".cshtml", "html", @blue);
-.icon-set(".aspx", "html", @blue);
-.icon-set(".ascx", "html", @green);
-.icon-set(".asax", "html", @yellow);
-.icon-set(".master", "html", @yellow);
+.icon-ext(".cs", "c-sharp");
+.icon-ext(".cshtml", "html", "blue");
+.icon-ext(".aspx", "html", "blue");
+.icon-ext(".ascx", "html", "green");
+.icon-ext(".asax", "html", "yellow");
+.icon-ext(".master", "html", "yellow");
// C++
-.icon-set(".cc", "cpp", @blue);
-.icon-set(".cpp", "cpp", @blue);
-.icon-set(".cxx", "cpp", @blue);
-.icon-set(".c++", "cpp", @blue);
-.icon-set(".hh", "cpp", @purple);
-.icon-set(".hpp", "cpp", @purple);
-.icon-set(".hxx", "cpp", @purple);
-.icon-set(".h++", "cpp", @purple);
-.icon-set(".mm", "cpp", @yellow);
+.icon-ext(".cc", "cpp");
+.icon-ext(".cpp", "cpp");
+.icon-ext(".cxx", "cpp");
+.icon-ext(".c++", "cpp");
+.icon-ext(".hh", "cpp", "purple");
+.icon-ext(".hpp", "cpp", "purple");
+.icon-ext(".hxx", "cpp", "purple");
+.icon-ext(".h++", "cpp", "purple");
+.icon-ext(".mm", "cpp", "yellow");
// Clojure
-.icon-set(".clj", "clojure", @green);
-.icon-set(".cljs", "clojure", @green);
-.icon-set(".cljc", "clojure", @green);
-.icon-set(".edn", "clojure", @blue);
+.icon-ext(".clj", "clojure");
+.icon-ext(".cljs", "clojure");
+.icon-ext(".cljc", "clojure");
+.icon-ext(".edn", "clojure", "blue");
// COLDFUSION
-.icon-set(".cfc", "coldfusion", @blue);
-.icon-set(".cfm", "coldfusion", @blue);
+.icon-ext(".cfc", "coldfusion");
+.icon-ext(".cfm", "coldfusion");
// COFFEESCRIPT
-.icon-set(".coffee", "coffee", @yellow);
-.icon-set(".litcoffee", "coffee", @yellow);
+.icon-ext(".coffee", "coffee");
+.icon-ext(".litcoffee", "coffee");
// CONFIG
-.icon-set(".config", "config", @grey-light);
-.icon-set(".cfg", "config", @grey-light);
-.icon-set(".conf", "config", @grey-light);
+.icon-ext(".config", "config");
+.icon-ext(".cfg", "config");
+.icon-ext(".conf", "config");
// CRYSTAL
-.icon-set(".cr", "crystal", @white);
-.icon-set(".ecr", "crystal_embedded", @white);
-.icon-set(".slang", "crystal_embedded", @white);
+.icon-ext(".cr", "crystal");
+.icon-ext(".ecr", "crystal_embedded");
+.icon-ext(".slang", "crystal_embedded");
// CSON
-.icon-set(".cson", "json", @yellow);
+.icon-ext(".cson", "json", "yellow");
// CSS
-.icon-set(".css", "css", @blue);
-.icon-set(".css.map", "css", @blue);
-.icon-set(".sss", "css", @blue);
+.icon-ext(".css", "css");
+.icon-ext(".css.map", "css");
+.icon-ext(".sss", "css");
// CSV
-.icon-set(".csv", "csv", @green);
-.icon-set(".xls", "xls", @green);
-.icon-set(".xlsx", "xls", @green);
+.icon-ext(".csv", "csv");
+.icon-ext(".xls", "xls");
+.icon-ext(".xlsx", "xls");
// CAKE
-.icon-set(".cake", "cake", @red);
-.icon-set(".ctp", "cake_php", @red);
+.icon-ext(".cake", "cake");
+.icon-ext(".ctp", "cake_php");
// D
-.icon-set(".d", "d", @red);
+.icon-ext(".d", "d");
// DOC
-.icon-set(".doc", "word", @blue);
-.icon-set(".docx", "word", @blue);
+.icon-ext(".doc", "word");
+.icon-ext(".docx", "word");
// EJS
-.icon-set(".ejs", "ejs", @yellow);
+.icon-ext(".ejs", "ejs");
// ELIXIR
-.icon-set(".ex", "elixir", @purple);
-.icon-set(".exs", "elixir_script", @purple);
-.icon-partial("mix", "hex", @red);
+.icon-ext(".ex", "elixir");
+.icon-ext(".exs", "elixir_script");
+.icon-name("mix.exs", "hex");
// ELM
-.icon-set(".elm", "elm", @blue);
+.icon-ext(".elm", "elm");
// FAVICON
-.icon-set(".ico", "favicon", @yellow);
+.icon-ext(".ico", "favicon");
// F#
-.icon-set(".fs", "f-sharp", @blue);
-.icon-set(".fsx", "f-sharp", @blue);
+.icon-ext(".fs", "f-sharp");
+.icon-ext(".fsx", "f-sharp");
// GITIGNORE
-.icon-set(".gitignore", "git", @ignore);
-.icon-set(".gitconfig", "git", @ignore);
-.icon-set(".gitkeep", "git", @ignore);
-.icon-set(".gitattributes", "git", @ignore);
-.icon-set(".gitmodules", "git", @ignore);
+.icon-name(".gitignore", "git");
+.icon-name(".gitconfig", "git");
+.icon-name(".gitkeep", "git");
+.icon-name(".gitattributes", "git");
+.icon-name(".gitmodules", "git");
// GO
-.icon-set(".go", "go2", @blue);
-.icon-set(".slide", "go", @blue);
-.icon-set(".article", "go", @blue);
+.icon-ext(".go", "go2");
+.icon-ext(".slide", "go");
+.icon-ext(".article", "go");
// GRADLE
-.icon-set(".gradle", "gradle", @green);
+.icon-ext(".gradle", "gradle");
// GRAILS
-.icon-set(".groovy", "grails", @green);
-.icon-set(".gsp", "grails", @green);
+.icon-ext(".groovy", "grails");
+.icon-ext(".gsp", "grails");
// GRAPHQL
-.icon-set(".gql", "graphql", @pink);
-.icon-set(".graphql", "graphql", @pink);
+.icon-ext(".gql", "graphql");
+.icon-ext(".graphql", "graphql");
// HAML
-.icon-set(".haml", "haml", @red);
+.icon-ext(".haml", "haml");
// HANDLEBARS
-.icon-set(".handlebars", "mustache", @orange);
-.icon-set(".hbs", "mustache", @orange);
-.icon-set(".hjs", "mustache", @orange);
+.icon-ext(".handlebars", "mustache");
+.icon-ext(".hbs", "mustache");
+.icon-ext(".hjs", "mustache");
// HASKELL
-.icon-set(".hs", "haskell", @purple);
-.icon-set(".lhs", "haskell", @purple);
+.icon-ext(".hs", "haskell");
+.icon-ext(".lhs", "haskell");
// HAXE
-.icon-set(".hx", "haxe", @orange);
-.icon-set(".hxs", "haxe", @yellow);
-.icon-set(".hxp", "haxe", @blue);
-.icon-set(".hxml", "haxe", @purple);
+.icon-ext(".hx", "haxe");
+.icon-ext(".hxs", "haxe", "yellow");
+.icon-ext(".hxp", "haxe", "blue");
+.icon-ext(".hxml", "haxe", "purple");
// HTML
-.icon-set(".html", "html", @orange);
+.icon-ext(".html", "html");
// JADE
-.icon-set(".jade", "jade", @red);
+.icon-ext(".jade", "jade");
// JAVA
-.icon-set(".java", "java", @red);
-.icon-set(".class", "java", @red);
-.icon-set(".classpath", "java", @red);
-.icon-set(".properties", "java", @red);
+.icon-ext(".java", "java");
+.icon-ext(".class", "java");
+.icon-ext(".classpath", "java");
+.icon-ext(".properties", "java");
// JAVASCRIPT
-.icon-set(".js", "javascript", @yellow);
-.icon-set(".js.map", "javascript", @yellow);
-.icon-set(".spec.js", "javascript", @orange);
-.icon-set(".test.js", "javascript", @orange);
-.icon-set(".es", "javascript", @yellow);
-.icon-set(".es5", "javascript", @yellow);
-.icon-set(".es6", "javascript", @yellow);
-.icon-set(".es7", "javascript", @yellow);
+.icon-ext(".js", "javascript");
+.icon-ext(".js.map", "javascript", "grey");
+.icon-ext(".mjs", "javascript");
+.icon-ext(".mjs.map", "javascript", "grey");
+.icon-ext(".spec.js", "javascript", "orange");
+.icon-ext(".test.js", "javascript", "orange");
+.icon-ext(".es", "javascript");
+.icon-ext(".es5", "javascript");
+.icon-ext(".es6", "javascript");
+.icon-ext(".es7", "javascript");
// JINJA
-.icon-set(".jinja", "jinja", @red);
-.icon-set(".jinja2", "jinja", @red);
+.icon-ext(".jinja", "jinja");
+.icon-ext(".jinja2", "jinja");
// JSON
-.icon-set(".json", "json", @yellow);
+.icon-ext(".json", "json", "yellow");
// JULIA
-.icon-set(".jl", "julia", @purple);
+.icon-ext(".jl", "julia");
// KARMA
-.icon-set("karma.conf.js", "karma", @green);
-.icon-set("karma.conf.coffee", "karma", @green);
+.icon-name("karma.conf.js", "karma");
+.icon-name("karma.conf.coffee", "karma");
// KOTLIN
-.icon-set('.kt', 'kotlin', @orange);
-.icon-set('.kts', 'kotlin', @orange);
+.icon-ext(".kt", "kotlin");
+.icon-ext(".kts", "kotlin");
// DART
-.icon-set(".dart", "dart", @blue);
+.icon-ext(".dart", "dart",);
// LESS
-.icon-set(".less", "less", @blue);
+.icon-ext(".less", "less");
// LIQUID
-.icon-set(".liquid", "liquid", @green);
+.icon-ext(".liquid", "liquid");
// LIVESCRIPT
-.icon-set(".ls", "livescript", @blue);
+.icon-ext(".ls", "livescript");
// LUA
-.icon-set(".lua", "lua", @blue);
+.icon-ext(".lua", "lua");
// MARKDOWN
-.icon-set(".markdown", "markdown", @blue);
-.icon-set(".md", "markdown", @blue);
+.icon-ext(".markdown", "markdown");
+.icon-ext(".md", "markdown");
// ARGDOWN
-.icon-set(".argdown", "argdown", @blue);
-.icon-set(".ad", "argdown", @blue);
+.icon-ext(".argdown", "argdown");
+.icon-ext(".ad", "argdown");
// README
-.icon-set("README.md", "info", @blue);
+.icon-name("README.md", "info");
// CHANGELOG
-.icon-set('CHANGELOG.md', 'clock', @blue);
-.icon-set('CHANGELOG', 'clock', @blue);
-.icon-set('CHANGES.md', 'clock', @blue);
-.icon-set('VERSION.md', 'clock', @blue);
-.icon-set('VERSION', 'clock', @blue);
+.icon-name("CHANGELOG.md", "clock");
+.icon-name("CHANGELOG", "clock");
+.icon-name("CHANGES.md", "clock");
+.icon-name("VERSION.md", "clock");
+.icon-name("VERSION", "clock");
// MAVEN
-.icon-set("mvnw", "maven", @red);
+.icon-name("mvnw", "maven");
// MUSTACHE
-.icon-set(".mustache", "mustache", @orange);
-.icon-set(".stache", "mustache", @orange);
+.icon-ext(".mustache", "mustache");
+.icon-ext(".stache", "mustache");
// NPM
-.icon-set(".njk", "nunjucks", @green);
-.icon-set(".nunjucks", "nunjucks", @green);
-.icon-set(".nunjs", "nunjucks", @green);
-.icon-set(".nunj", "nunjucks", @green);
-.icon-set(".njs", "nunjucks", @green);
-.icon-set(".nj", "nunjucks", @green);
-
-// NPM
-.icon-set(".npm-debug.log", "npm", @ignore);
-.icon-set(".npmignore", "npm", @red);
-.icon-set(".npmrc", "npm", @red);
+.icon-name(".npm-debug.log", "npm", "grey");
+.icon-name(".npmignore", "npm");
+.icon-name(".npmrc", "npm");
+
+// NUNJUCKS
+.icon-ext(".njk", "nunjucks");
+.icon-ext(".nunjucks", "nunjucks");
+.icon-ext(".nunjs", "nunjucks");
+.icon-ext(".nunj", "nunjucks");
+.icon-ext(".njs", "nunjucks");
+.icon-ext(".nj", "nunjucks");
// OCAML
-.icon-set(".ml", "ocaml", @orange);
-.icon-set(".mli", "ocaml", @orange);
-.icon-set(".cmx", "ocaml", @orange);
-.icon-set(".cmxa", "ocaml", @orange);
+.icon-ext(".ml", "ocaml");
+.icon-ext(".mli", "ocaml");
+.icon-ext(".cmx", "ocaml");
+.icon-ext(".cmxa", "ocaml");
// ODATA
-.icon-set(".odata", "odata", @orange);
+.icon-ext(".odata", "odata");
// PERL
-.icon-set(".pl", "perl", @blue);
+.icon-ext(".pl", "perl");
// PHP
-.icon-set(".php", "php", @purple);
-.icon-set(".php.inc", "php", @purple);
+.icon-ext(".php", "php");
+.icon-ext(".php.inc", "php");
// PLANNING
-.icon-set('.pddl', 'pddl', @purple);
-.icon-set('.plan', 'plan', @green);
-.icon-set('.happenings', 'happenings', @blue);
+.icon-ext(".pddl", "pddl");
+.icon-ext(".plan", "plan");
+.icon-ext(".happenings", "happenings");
// POWERSHELL
-.icon-set(".ps1", "powershell", @blue);
-.icon-set(".psd1", "powershell", @blue);
-.icon-set(".psm1", "powershell", @blue);
+.icon-ext(".ps1", "powershell");
+.icon-ext(".psd1", "powershell");
+.icon-ext(".psm1", "powershell");
// PUG
-.icon-set(".pug", "pug", @red);
+.icon-ext(".pug", "pug");
// PUPPET .pp
-.icon-set(".pp", "puppet", @yellow);
-.icon-set(".epp", "puppet", @yellow);
+.icon-ext(".pp", "puppet");
+.icon-ext(".epp", "puppet");
// PYTHON
-.icon-set(".py", "python", @blue);
+.icon-ext(".py", "python");
// REACT
-.icon-set(".jsx", "react", @blue);
-.icon-set(".spec.jsx", "react", @orange);
-.icon-set(".test.jsx", "react", @orange);
-.icon-set(".cjsx", "react", @blue);
-.icon-set(".tsx", "react", @blue);
-.icon-set(".spec.tsx", "react", @yellow);
-.icon-set(".test.tsx", "react", @yellow);
+.icon-ext(".jsx", "react");
+.icon-ext(".spec.jsx", "react", "orange");
+.icon-ext(".test.jsx", "react", "orange");
+.icon-ext(".cjsx", "react");
+.icon-ext(".tsx", "react");
+.icon-ext(".spec.tsx", "react", "yellow");
+.icon-ext(".test.tsx", "react", "yellow");
// REASONML
-.icon-set(".re", "reasonml", @red);
+.icon-ext(".re", "reasonml");
// R
-.icon-set('.R', 'R', @blue);
+.icon-ext(".R", "R");
// RUBY
-.icon-set(".rb", "ruby", @red);
-.icon-set(".erb", "html_erb", @red);
-.icon-set(".erb.html", "html_erb", @red);
-.icon-set(".html.erb", "html_erb", @red);
+.icon-ext(".rb", "ruby");
+.icon-ext(".erb", "html_erb");
+.icon-ext(".erb.html", "html_erb");
+.icon-ext(".html.erb", "html_erb");
// RUST
-.icon-set(".rs", "rust", @grey-light);
+.icon-ext(".rs", "rust");
// SASS
-.icon-set(".sass", "sass", @pink);
-.icon-set(".scss", "sass", @pink);
+.icon-ext(".sass", "sass");
+.icon-ext(".scss", "sass");
// SPRING
-.icon-set(".springBeans", "spring", @green);
+.icon-ext(".springBeans", "spring");
// SLIM
-.icon-set(".slim", "slim", @orange);
+.icon-ext(".slim", "slim");
// SMARTY
-.icon-set(".smarty.tpl", "smarty", @yellow);
+.icon-ext(".smarty.tpl", "smarty");
// SBT
-.icon-set(".sbt", "sbt", @blue);
+.icon-ext(".sbt", "sbt");
// SCALA
-.icon-set(".scala", "scala", @red);
+.icon-ext(".scala", "scala");
-// SCALA
-.icon-set(".sol", "ethereum", @blue);
+// SOLIDITY
+.icon-ext(".sol", "ethereum");
// STYLUS
-.icon-set(".styl", "stylus", @green);
+.icon-ext(".styl", "stylus");
+
+// SVELTE
+.icon-ext(".svelte", "svelte");
+.icon-name("svelte.config.js", "svelte");
// SWIFT
-.icon-set(".swift", "swift", @orange);
+.icon-ext(".swift", "swift");
// SQL
-.icon-set(".sql", "db", @pink);
+.icon-ext(".sql", "db");
// TERRAFORM
-.icon-set(".tf", "terraform", @purple);
-.icon-set(".tf.json", "terraform", @purple);
-.icon-set(".tfvars", "terraform", @purple);
+.icon-ext(".tf", "terraform");
+.icon-ext(".tf.json", "terraform");
+.icon-ext(".tfvars", "terraform");
// TEX
-.icon-set(".tex", "tex", @blue);
-.icon-set(".sty", "tex", @yellow);
-.icon-set(".dtx", "tex", @orange);
-.icon-set(".ins", "tex", @white);
+.icon-ext(".tex", "tex", "blue");
+.icon-ext(".sty", "tex", "yellow");
+.icon-ext(".dtx", "tex", "orange");
+.icon-ext(".ins", "tex", "white");
// TEXT
-.icon-set(".txt", "default", @white);
+.icon-ext(".txt", "default");
// TOML
-.icon-set(".toml", "config", @grey-light);
+.icon-ext(".toml", "config");
// TWIG
-.icon-set(".twig", "twig", @green);
+.icon-ext(".twig", "twig", "green");
// TYPESCRIPT
-.icon-set(".ts", "typescript", @blue);
-.icon-set(".spec.ts", "typescript", @yellow);
-.icon-set(".test.ts", "typescript", @yellow);
+.icon-ext(".ts", "typescript");
+.icon-ext(".ts.map", "typescript", "grey");
+.icon-ext(".spec.ts", "typescript", "yellow");
+.icon-ext(".test.ts", "typescript", "yellow");
// TSCONFIG
-.icon-set("tsconfig.json", "tsconfig", @blue);
+.icon-name("tsconfig.json", "tsconfig");
// VALA
-.icon-set(".vala", "vala", @grey-light);
-.icon-set(".vapi", "vala", @grey-light);
+.icon-ext(".vala", "vala");
+.icon-ext(".vapi", "vala");
// VUE
-.icon-set(".vue", "vue", @green);
+.icon-ext(".vue", "vue");
// WEBASSEMBLY
-.icon-set('.wasm', 'wasm', @purple);
-.icon-set('.wat', 'wat', @purple);
+.icon-ext(".wasm", "wasm");
+.icon-ext(".wat", "wat");
// XML
-.icon-set(".xml", "xml", @orange);
+.icon-ext(".xml", "xml");
// YML
-.icon-set('.yml', 'yml', @purple);
-.icon-set('.yaml', 'yml', @purple);
+.icon-ext(".yml", "yml");
+.icon-ext(".yaml", "yml");
// SWAGGER
-.icon-set('swagger.json', 'json', @green);
-.icon-set('swagger.yml', 'json', @green);
-.icon-set('swagger.yaml', 'json', @green);
+.icon-name("swagger.json", "json", "green");
+.icon-name("swagger.yml", "json", "green");
+.icon-name("swagger.yaml", "json", "green");
// PROLOG
-.icon-set('.pro', 'prolog', @orange);
+.icon-ext(".pro", "prolog");
// - - - - - - - - - - - - - - - - - - -
// GENERIC FILE TYPES - EXTENSION BASED
// - - - - - - - - - - - - - - - - - - -
// ARCHIVES
-.icon-set(".jar", "zip", @red);
-.icon-set(".zip", "zip", @grey-light);
-.icon-set(".wgt", "wgt", @blue);
+.icon-ext(".jar", "zip", "red");
+.icon-ext(".zip", "zip", "grey");
+.icon-ext(".wgt", "wgt");
// ADOBE FILE
-.icon-set(".ai", "illustrator", @yellow);
-.icon-set(".psd", "photoshop", @blue);
-.icon-set(".pdf", "pdf", @red);
+.icon-ext(".ai", "illustrator");
+.icon-ext(".psd", "photoshop");
+.icon-ext(".pdf", "pdf");
// FONT FILES
-.icon-set(".eot", "font", @red);
-.icon-set(".ttf", "font", @red);
-.icon-set(".woff", "font", @red);
-.icon-set(".woff2", "font", @red);
+.icon-ext(".eot", "font");
+.icon-ext(".ttf", "font");
+.icon-ext(".woff", "font");
+.icon-ext(".woff2", "font");
// IMAGE FILES
-.icon-set(".gif", "image", @purple);
-.icon-set(".jpg", "image", @purple);
-.icon-set(".jpeg", "image", @purple);
-.icon-set(".png", "image", @purple);
-.icon-set(".pxm", "image", @purple);
-.icon-set(".svg", "svg", @purple);
-.icon-set(".svgx", "image", @purple);
+.icon-ext(".gif", "image");
+.icon-ext(".jpg", "image");
+.icon-ext(".jpeg", "image");
+.icon-ext(".png", "image");
+.icon-ext(".pxm", "image");
+.icon-ext(".svg", "svg", "purple");
+.icon-ext(".svgx", "image");
// SUBLIME
-.icon-set(".sublime-project", "sublime", @orange);
-.icon-set(".sublime-workspace", "sublime", @orange);
+.icon-name(".sublime-project", "sublime");
+.icon-name(".sublime-workspace", "sublime");
// VS CODE
-.icon-set(".code-search", "code-search", @purple);
+.icon-ext(".code-search", "code-search");
// SALESFORCE
-.icon-set(".component", "salesforce", @blue);
-.icon-set(".cls", "salesforce", @blue);
+.icon-ext(".component", "salesforce");
+.icon-ext(".cls", "salesforce");
// SHELL
-.icon-set(".sh", "shell", @grey);
-.icon-set(".zsh", "shell", @grey);
-.icon-set(".fish", "shell", @grey);
-.icon-set(".zshrc", "shell", @grey);
-.icon-set(".bashrc", "shell", @grey);
+.icon-ext(".sh", "shell");
+.icon-ext(".zsh", "shell");
+.icon-ext(".fish", "shell");
+.icon-ext(".zshrc", "shell");
+.icon-ext(".bashrc", "shell");
// VIDEO FILES
-.icon-set(".mov", "video", @pink);
-.icon-set(".ogv", "video", @pink);
-.icon-set(".webm", "video", @pink);
-.icon-set(".avi", "video", @pink);
-.icon-set(".mpg", "video", @pink);
-.icon-set(".mp4", "video", @pink);
+.icon-ext(".mov", "video");
+.icon-ext(".ogv", "video");
+.icon-ext(".webm", "video");
+.icon-ext(".avi", "video");
+.icon-ext(".mpg", "video");
+.icon-ext(".mp4", "video");
// AUDIO FILES
-.icon-set('.mp3', 'audio', @purple);
-.icon-set('.ogg', 'audio', @purple);
-.icon-set('.wav', 'audio', @purple);
-.icon-set('.flac', 'audio', @purple);
+.icon-ext(".mp3", "audio");
+.icon-ext(".ogg", "audio");
+.icon-ext(".wav", "audio");
+.icon-ext(".flac", "audio");
// 3D files
-.icon-set('.3ds', 'svg', @blue);
-.icon-set('.3dm', 'svg', @blue);
-.icon-set('.stl', 'svg', @blue);
-.icon-set('.obj', 'svg', @blue);
-.icon-set('.dae', 'svg', @blue);
+.icon-ext(".3ds", "svg", "blue");
+.icon-ext(".3dm", "svg", "blue");
+.icon-ext(".stl", "svg", "blue");
+.icon-ext(".obj", "svg", "blue");
+.icon-ext(".dae", "svg", "blue");
// WINDOWS
-.icon-set(".bat", "windows", @blue);
-.icon-set(".cmd", "windows", @blue);
+.icon-ext(".bat", "windows");
+.icon-ext(".cmd", "windows");
// - - - - - - - - -
// NAME BASED ICONS
// - - - - - - - - -
// APACHE
-.icon-set("mime.types", "config", @grey-light);
+.icon-name("mime.types", "config");
-// CI
-.icon-set("Jenkinsfile", "jenkins", @red);
+// AVA
+.icon-name("ava.config.js", "ava");
+.icon-name("ava.config.cjs", "ava");
// BABEL
-.icon-set(".babelrc", "babel", @yellow);
-.icon-set(".babelrc.js", "babel", @yellow);
-.icon-set(".babelrc.cjs", "babel", @yellow);
-.icon-set("babel.config.js", "babel", @yellow);
-.icon-set("babel.config.json", "babel", @yellow);
-.icon-set("babel.config.cjs", "babel", @yellow);
+.icon-name(".babelrc", "babel");
+.icon-name(".babelrc.js", "babel");
+.icon-name(".babelrc.cjs", "babel");
+.icon-name("babel.config.js", "babel");
+.icon-name("babel.config.json", "babel");
+.icon-name("babel.config.cjs", "babel");
// BOWER
-.icon-set("bower.json", "bower", @orange);
-.icon-set("Bower.json", "bower", @orange);
-.icon-set(".bowerrc", "bower", @orange);
-
-// BOWER
-.icon-partial("dockerfile", "docker", @blue);
-.icon-partial("Dockerfile", "docker", @blue);
-.icon-partial("DOCKERFILE", "docker", @blue);
-.icon-partial(".dockerignore", "docker", @grey);
-.icon-partial("docker-healthcheck", "docker", @green);
-.icon-partial("docker-compose.yml", "docker", @pink);
-.icon-partial("docker-compose.yaml", "docker", @pink);
-.icon-partial("docker-compose.override.yml", "docker", @pink);
-.icon-partial("docker-compose.override.yaml", "docker", @pink);
-
-// BABEL
-.icon-set(".codeclimate.yml", "code-climate", @green);
+.icon-name("bower.json", "bower");
+.icon-name("Bower.json", "bower");
+.icon-name(".bowerrc", "bower");
+
+// BROWSERSLIST
+.icon-name(".browserslistrc", "browserslist");
+
+// CODE CLIMATE
+.icon-ext(".codeclimate.yml", "code-climate");
+
+// DOCKER
+.icon-name("dockerfile", "docker");
+.icon-name("Dockerfile", "docker");
+.icon-name("DOCKERFILE", "docker");
+.icon-name(".dockerignore", "docker", "grey");
+.icon-name("docker-healthcheck", "docker", "green");
+.icon-name("docker-compose.yml", "docker", "pink");
+.icon-name("docker-compose.yaml", "docker", "pink");
+.icon-name("docker-compose.override.yml", "docker", "pink");
+.icon-name("docker-compose.override.yaml", "docker", "pink");
// ESLINT
-.icon-set(".eslintrc", "eslint", @purple);
-.icon-set(".eslintrc.js", "eslint", @purple);
-.icon-set(".eslintrc.yaml", "eslint", @purple);
-.icon-set(".eslintrc.yml", "eslint", @purple);
-.icon-set(".eslintrc.json", "eslint", @purple);
-.icon-set(".eslintignore", "eslint", @grey);
+.icon-name(".eslintrc", "eslint");
+.icon-name(".eslintrc.js", "eslint");
+.icon-name(".eslintrc.yaml", "eslint");
+.icon-name(".eslintrc.yml", "eslint");
+.icon-name(".eslintrc.json", "eslint");
+.icon-name(".eslintignore", "eslint", "grey");
// FIREBASE
-.icon-set(".firebaserc", "firebase", @orange);
-.icon-set("firebase.json", "firebase", @orange);
+.icon-name(".firebaserc", "firebase");
+.icon-name("firebase.json", "firebase");
// GECKODRIVER
-.icon-set("geckodriver", "firefox", @orange);
+.icon-name("geckodriver", "firefox");
+
+// GRAPHQL
+.icon-name("graphql.config.js", "graphql");
+.icon-name("graphql.config.json", "graphql");
+.icon-name("graphql.config.yml", "graphql");
+.icon-name("graphql.config.yaml", "graphql");
+.icon-name(".graphqlrc", "graphql");
+.icon-name(".graphqlrc.js", "graphql");
+.icon-name(".graphqlrc.json", "graphql");
+.icon-name(".graphqlrc.yml", "graphql");
+.icon-name(".graphqlrc.yaml", "graphql");
// GRUNT
-.icon-set("Gruntfile.js", "grunt", @orange);
-.icon-set("gruntfile.babel.js", "grunt", @orange);
-.icon-set("Gruntfile.babel.js", "grunt", @orange);
-.icon-set("gruntfile.js", "grunt", @orange);
-.icon-set("Gruntfile.coffee", "grunt", @orange);
-.icon-set("gruntfile.coffee", "grunt", @orange);
+.icon-name("Gruntfile.js", "grunt");
+.icon-name("gruntfile.js", "grunt");
+.icon-name("gruntfile.babel.js", "grunt");
+.icon-name("Gruntfile.babel.js", "grunt");
+.icon-name("Gruntfile.coffee", "grunt");
+.icon-name("gruntfile.coffee", "grunt");
// GULP
-.icon-partial("GULPFILE", "gulp", @red);
-.icon-partial("Gulpfile", "gulp", @red);
-.icon-partial("gulpfile", "gulp", @red);
-.icon-partial("gulpfile.js", "gulp", @red);
+.icon-name("GULPFILE", "gulp");
+.icon-name("Gulpfile", "gulp");
+.icon-name("gulpfile", "gulp");
+.icon-name("gulpfile.js", "gulp");
+.icon-name("gulpfile.babel.js", "gulp");
// IONIC
-.icon-set("ionic.config.json", "ionic", @blue);
-.icon-set("Ionic.config.json", "ionic", @blue);
-.icon-set("ionic.project", "ionic", @blue);
-.icon-set("Ionic.project", "ionic", @blue);
+.icon-name("ionic.config.json", "ionic");
+.icon-name("Ionic.config.json", "ionic");
+.icon-name("ionic.project", "ionic");
+.icon-name("Ionic.project", "ionic");
+
+// JENKINS
+.icon-name("Jenkinsfile", "jenkins");
+
+// JEST
+.icon-name("jest.config.js", "jest");
+.icon-name("jest.config.mjs", "jest");
+.icon-name("jest.config.cjs", "jest");
+.icon-name("jest.config.json", "jest");
// JSHINT
-.icon-set(".jshintrc", "javascript", @blue);
-.icon-set(".jscsrc", "javascript", @blue);
+.icon-name(".jshintrc", "javascript", "blue");
+.icon-name(".jscsrc", "javascript", "blue");
-.icon-set('platformio.ini', 'platformio', @orange);
+// MAKEFILES
+.icon-name("MAKEFILE", "makefile");
+.icon-name("Makefile", "makefile");
+.icon-name("makefile", "makefile");
+.icon-name("QMAKEFILE", "makefile", "purple");
+.icon-name("QMakefile", "makefile", "purple");
+.icon-name("qmakefile", "makefile", "purple");
+.icon-name("OMAKEFILE", "makefile", "grey");
+.icon-name("OMakefile", "makefile", "grey");
+.icon-name("omakefile", "makefile", "grey");
+.icon-name("CMAKELISTS.TXT", "makefile", "blue");
+.icon-name("CMAKELISTS.txt", "makefile", "blue");
+.icon-name("CMakeLists.txt", "makefile", "blue");
+.icon-name("cmakelists.txt", "makefile", "blue");
+
+// MOCHA
+.icon-name(".mocharc.js", "mocha");
+.icon-name(".mocharc.cjs", "mocha");
+.icon-name(".mocharc.yaml", "mocha");
+.icon-name(".mocharc.yml", "mocha");
+.icon-name(".mocharc.json", "mocha");
+.icon-name(".mocharc.jsonc", "mocha");
+
+// PLATFORMIO
+.icon-name("platformio.ini", "platformio");
+
+// POSTCSS
+.icon-name("postcss.config.js", "postcss");
+
+// PRETTIER
+.icon-name(".prettierrc", "prettier");
+.icon-name(".prettierignore", "prettier", "grey");
+
+// PROCFILE
+.icon-name("Procfile", "heroku");
// ROLLUP
-.icon-set("rollup.config.js", "rollup", @red);
+.icon-name("rollup.config.js", "rollup");
// SASS LINT
-.icon-set("sass-lint.yml", "sass", @pink);
+.icon-name("sass-lint.yml", "sass");
// STYLELINT
-.icon-set('.stylelintrc', 'stylelint', @white);
-.icon-set('.stylelintrc.json', 'stylelint', @white);
-.icon-set('.stylelintrc.yaml', 'stylelint', @white);
-.icon-set('.stylelintrc.yml', 'stylelint', @white);
-.icon-set('.stylelintrc.js', 'stylelint', @white);
-.icon-set('.stylelintignore', 'stylelint', @grey);
-.icon-set('stylelint.config.js', 'stylelint', @white);
+.icon-name(".stylelintrc", "stylelint");
+.icon-name(".stylelintrc.json", "stylelint");
+.icon-name(".stylelintrc.yaml", "stylelint");
+.icon-name(".stylelintrc.yml", "stylelint");
+.icon-name(".stylelintrc.js", "stylelint");
+.icon-name(".stylelintignore", "stylelint", "grey");
+.icon-name("stylelint.config.js", "stylelint");
-// YARN
-.icon-set("yarn.clean", "yarn", @blue);
-.icon-set("yarn.lock", "yarn", @blue);
+// TAILWIND
+.icon-name("tailwind.config.js", "tailwind");
+
+// TODO
+.icon-name("TODO", "todo");
// WEBPACK
-.icon-set("webpack.config.js", "webpack", @blue);
-.icon-set("webpack.config.build.js", "webpack", @blue);
-.icon-set("webpack.common.js", "webpack", @blue);
-.icon-set("webpack.dev.js", "webpack", @blue);
-.icon-set("webpack.prod.js", "webpack", @blue);
+.icon-name("webpack.config.js", "webpack");
+.icon-name("webpack.config.build.js", "webpack");
+.icon-name("webpack.common.js", "webpack");
+.icon-name("webpack.dev.js", "webpack");
+.icon-name("webpack.prod.js", "webpack");
+
+// YARN
+.icon-name("yarn.clean", "yarn");
+.icon-name("yarn.lock", "yarn");
+.icon-name("yarn-error.log", "yarn", "grey");
// MISC SETTING
-.icon-set(".direnv", "config", @grey-light);
-.icon-set(".env", "config", @grey-light);
-.icon-set(".static", "config", @grey-light);
-.icon-set(".editorconfig", "config", @grey-light);
-.icon-set(".slugignore", "config", @grey-light);
-.icon-set(".tmp", "clock", @grey-light);
-.icon-set(".htaccess", "config", @grey-light);
-.icon-set(".key", "lock", @green);
-.icon-set(".cert", "lock", @green);
+.icon-name(".direnv", "config");
+.icon-name(".env", "config");
+.icon-name(".static", "config");
+.icon-name(".editorconfig", "config");
+.icon-name(".slugignore", "config");
+.icon-ext(".tmp", "clock", "grey");
+.icon-name(".htaccess", "config");
+.icon-ext(".key", "lock");
+.icon-ext(".cert", "lock");
+.icon-ext(".cer", "lock");
+.icon-ext(".crt", "lock");
+.icon-name(".DS_Store", "ignored");
// LICENSE FILES
-.icon-partial("LICENSE", "license", @yellow);
-.icon-partial("LICENCE", "license", @yellow);
-.icon-partial("COPYING", "license", @yellow);
-.icon-partial("COMPILING", "license", @orange);
-.icon-partial("CONTRIBUTING", "license", @red);
-
-// MAKEFILES
-.icon-partial("MAKEFILE", "makefile", @orange);
-.icon-partial("Makefile", "makefile", @orange);
-.icon-partial("makefile", "makefile", @orange);
-.icon-partial("QMAKEFILE", "makefile", @purple);
-.icon-partial("QMakefile", "makefile", @purple);
-.icon-partial("qmakefile", "makefile", @purple);
-.icon-partial("OMAKEFILE", "makefile", @grey-light);
-.icon-partial("OMakefile", "makefile", @grey-light);
-.icon-partial("omakefile", "makefile", @grey-light);
-.icon-partial("CMAKELISTS.TXT", "makefile", @blue);
-.icon-partial("CMAKELISTS.txt", "makefile", @blue);
-.icon-partial("CMakeLists.txt", "makefile", @blue);
-.icon-partial("cmakelists.txt", "makefile", @blue);
-
-// PROCFILE
-.icon-partial("Procfile", "heroku", @purple);
-
-// TODO
-.icon-partial("TODO", "todo", @seti-primary);
-
-// - - - - - - -
-// IGNORED FILES
-// - - - - - - -
-
-.icon-set("npm-debug.log", "npm_ignored", @ignore);
-.icon-set(".DS_Store", "ignored", @ignore);
+.icon-name("LICENSE", "license");
+.icon-name("LICENCE", "license");
+.icon-name("COPYING", "license");
+.icon-name("COMPILING", "license", "orange");
+.icon-name("CONTRIBUTING", "license", "red");
diff --git a/styles/components/icons/tabs.less b/styles/components/icons/tabs.less
index 31d51cd4..ce596625 100644
--- a/styles/components/icons/tabs.less
+++ b/styles/components/icons/tabs.less
@@ -1,11 +1,17 @@
.tab-bar .tab {
-
// SET ICON SIZE
- .title::before {
- float: left;
- font-size: 22px;
- margin-right: 1px;
- line-height: @tab-height;
+ .title {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+
+ &::before {
+ float: left;
+ font-size: 22px;
+ margin-right: 1px;
+ height: 16px;
+ width: 16px;
+ }
}
// IGNORED FILES
@@ -30,6 +36,4 @@
&[data-type='TextEditor'] .title:not([data-name]) {
.icon('new-file', @green);
}
-
-
}
diff --git a/styles/components/sidebar/header.less b/styles/components/sidebar/header.less
index 2880e687..6ee9ec6d 100644
--- a/styles/components/sidebar/header.less
+++ b/styles/components/sidebar/header.less
@@ -58,7 +58,7 @@ atom-panel-container {
.icon-repo, .icon-file-directory {
margin-top: 5px;
&::before {
- background: url('atom://seti-ui/icons/project.svg') no-repeat;
+ background: url('http://localhost:5000/icons/project.svg') no-repeat;
content: '';
height: 24px;
margin-bottom: -7px;
diff --git a/styles/ui-mixins.less b/styles/ui-mixins.less
index 2bc6ac1c..5b82ffeb 100644
--- a/styles/ui-mixins.less
+++ b/styles/ui-mixins.less
@@ -9,28 +9,45 @@
}
}
-// SET ICON FILE BASED ON DATA NAME
-.icon-set( @extension, @file, @color) {
-
- .icon:not(.icon-file-directory),
- .title {
- &[data-name$="@{extension}"] {
- .icon(@file, @color)
+.svg-icon(@filename, @attr: ~'', @insert: before) {
+ @pseudo-selector: ~'::@{insert}';
+
+ .icon-file-text, .icon-file-zip, .icon-file-media, .icon-book, .icon-file-pdf {
+ &@{attr}@{pseudo-selector} {
+ content: ' ';
+ background-image: url("http://localhost:5000/icons/@{filename}.svg");
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: contain;
+ height: 16px;
+ width: 16px;
}
}
-
}
// SET ICON FILE BASED ON DATA NAME
-.icon-partial( @extension, @file, @color) {
+.icon-default(@file) {
+ .svg-icon(@file);
+}
- .icon:not(.icon-file-directory),
- .title {
- &[data-name*="@{extension}"] {
- .icon(@file, @color)
- }
- }
+.icon-default(@file, @color) {
+ .svg-icon("@{file}_@{color}");
+}
+
+.icon-ext(@extension, @file) {
+ .svg-icon(@file, ~'[data-name$="@{extension}"]');
+}
+
+.icon-ext(@extension, @file, @color) {
+ .svg-icon("@{file}_@{color}", ~'[data-name$="@{extension}"]');
+}
+
+.icon-name(@name, @file) {
+ .svg-icon(@file, ~'[data-name*="@{name}"]');
+}
+.icon-name(@name, @file, @color) {
+ .svg-icon("@{file}_@{color}", ~'[data-name*="@{name}"]');
}
// SET ICON FOR TAB BASED ON DATA TYPE
diff --git a/styles/ui-variables.less b/styles/ui-variables.less
index 3aa6bdc7..7edc8092 100644
--- a/styles/ui-variables.less
+++ b/styles/ui-variables.less
@@ -11,9 +11,9 @@
@black: #0e1112;
@black-dark: #090b0d;
@white: #d4d7d6;
-@grey: #4d5a5e;
-@grey-dark: #1f2326;
-@grey-light: #6d8086;
+@grey: #6d8086;
+@grey-dark: #2f3438;
+@grey-light: #96a6ab;
// THEME COLORS
@blue: #519aba;
@@ -80,7 +80,7 @@
@bad: @red;
@warn: @yellow;
@hidden: @grey-dark;
-@ignore: #41535b;
+@ignore: @grey-dark;
// - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 00000000..b06afd8e
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,66 @@
+{
+ "compilerOptions": {
+ /* Basic Options */
+ // "incremental": true, /* Enable incremental compilation */
+ "target": "ES2015", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
+ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
+ "lib": ["dom", "ESNext"], /* Specify library files to be included in the compilation. */
+ // "allowJs": true, /* Allow javascript files to be compiled. */
+ // "checkJs": true, /* Report errors in .js files. */
+ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
+ // "declaration": true, /* Generates corresponding '.d.ts' file. */
+ // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
+ "sourceMap": true, /* Generates corresponding '.map' file. */
+ // "outFile": "./", /* Concatenate and emit output to single file. */
+ "outDir": "lib", /* Redirect output structure to the directory. */
+ "rootDir": "src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
+ // "composite": true, /* Enable project compilation */
+ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
+ // "removeComments": true, /* Do not emit comments to output. */
+ // "noEmit": true, /* Do not emit outputs. */
+ // "importHelpers": true, /* Import emit helpers from 'tslib'. */
+ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
+ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
+
+ /* Strict Type-Checking Options */
+ "strict": true, /* Enable all strict type-checking options. */
+ // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
+ // "strictNullChecks": true, /* Enable strict null checks. */
+ // "strictFunctionTypes": true, /* Enable strict checking of function types. */
+ // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
+ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
+ // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
+ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
+
+ /* Additional Checks */
+ // "noUnusedLocals": true, /* Report errors on unused locals. */
+ // "noUnusedParameters": true, /* Report errors on unused parameters. */
+ // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
+ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
+
+ /* Module Resolution Options */
+ // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
+ // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
+ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
+ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
+ // "typeRoots": [], /* List of folders to include type definitions from. */
+ // "types": [], /* Type declaration files to be included in compilation. */
+ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
+ "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
+ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
+ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
+
+ /* Source Map Options */
+ // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
+ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
+ // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
+ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
+
+ /* Experimental Options */
+ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
+ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
+
+ /* Advanced Options */
+ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
+ }
+}
diff --git a/tsconfig.project.json b/tsconfig.project.json
new file mode 100644
index 00000000..bc022736
--- /dev/null
+++ b/tsconfig.project.json
@@ -0,0 +1,4 @@
+{
+ "extends": "./tsconfig.json",
+ "include": ["src/main.ts"]
+}