From a38f296d7ae0966dbeaf906f2a6c4bfcda3ed790 Mon Sep 17 00:00:00 2001 From: Caleb Ho Date: Tue, 24 Dec 2019 21:24:32 -0500 Subject: [PATCH 1/2] Initial sidebar + annotation window --- .gitignore | 3 + app/.eslintrc.yml | 55 ++++++++++ app/.prettierrc | 6 ++ app/package.json | 68 +++++++++++++ app/src/img/img_grid_square.jpg | Bin 0 -> 35754 bytes app/src/main/main.ts | 17 ++++ app/src/renderer/components/App.tsx | 25 +++++ .../renderer/components/PlaybackControls.tsx | 26 +++++ app/src/renderer/components/Point.tsx | 53 ++++++++++ .../renderer/components/SeekableSelector.tsx | 29 ++++++ app/src/renderer/components/Sidebar.tsx | 62 ++++++++++++ app/src/renderer/components/TraceSelector.tsx | 45 +++++++++ .../renderer/components/TraceSelectorRow.tsx | 78 +++++++++++++++ app/src/renderer/components/Window.tsx | 92 +++++++++++++++++ app/src/renderer/index.html | 12 +++ app/src/renderer/index.tsx | 9 ++ app/src/renderer/types.d.ts | 94 ++++++++++++++++++ app/tsconfig.json | 11 ++ app/webpack.config.js | 67 +++++++++++++ 19 files changed, 752 insertions(+) create mode 100644 app/.eslintrc.yml create mode 100644 app/.prettierrc create mode 100644 app/package.json create mode 100644 app/src/img/img_grid_square.jpg create mode 100644 app/src/main/main.ts create mode 100644 app/src/renderer/components/App.tsx create mode 100644 app/src/renderer/components/PlaybackControls.tsx create mode 100644 app/src/renderer/components/Point.tsx create mode 100644 app/src/renderer/components/SeekableSelector.tsx create mode 100644 app/src/renderer/components/Sidebar.tsx create mode 100644 app/src/renderer/components/TraceSelector.tsx create mode 100644 app/src/renderer/components/TraceSelectorRow.tsx create mode 100644 app/src/renderer/components/Window.tsx create mode 100644 app/src/renderer/index.html create mode 100644 app/src/renderer/index.tsx create mode 100644 app/src/renderer/types.d.ts create mode 100644 app/tsconfig.json create mode 100644 app/webpack.config.js diff --git a/.gitignore b/.gitignore index daf1ea3..7d44c3c 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ __pycache__ .mypy_cache .nox .coverage + +# NPM build artifacts +app/dist/ diff --git a/app/.eslintrc.yml b/app/.eslintrc.yml new file mode 100644 index 0000000..f05f8d5 --- /dev/null +++ b/app/.eslintrc.yml @@ -0,0 +1,55 @@ +env: + browser: true + es6: true + node: true +extends: + - 'plugin:react/recommended' + - 'plugin:@typescript-eslint/recommended' + - airbnb + - 'plugin:prettier/recommended' +globals: + Atomics: readonly + SharedArrayBuffer: readonly +parser: '@typescript-eslint/parser' +parserOptions: + ecmaFeatures: + jsx: true + ecmaVersion: 2018 + sourceType: module +plugins: + - react + - '@typescript-eslint' +rules: + sort-imports: off + react/jsx-filename-extension: + - error + - extensions: + - ".jsx" + - ".tsx" + import/extensions: + - error + - ignorePackages + - tsx: never + ts: never + js: never + jsx: never + no-unused-vars: off + '@typescript-eslint/no-unused-vars': + - error + - argsIgnorePattern: "^_" + '@typescript-eslint/no-empty-interface': off + '@typescript-eslint/explicit-function-return-type': + - error + - allowExpressions: true + '@typescript-eslint/camelcase': off +settings: + import/resolver: + node: + paths: + - src + extensions: + - .js + - .jsx + - .ts + - .tsx + - .jpg diff --git a/app/.prettierrc b/app/.prettierrc new file mode 100644 index 0000000..edd0f6c --- /dev/null +++ b/app/.prettierrc @@ -0,0 +1,6 @@ +{ + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "trailingComma": "all" +} diff --git a/app/package.json b/app/package.json new file mode 100644 index 0000000..921eee4 --- /dev/null +++ b/app/package.json @@ -0,0 +1,68 @@ +{ + "name": "ultratrace", + "version": "1.0.0", + "description": "A tool for manually annotating ultrasound tongue imaging data", + "main": "index.js", + "scripts": { + "build": "webpack --config ./webpack.config.js", + "start": "npm run build && electron ./dist/main.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/SwatPhonLab/UltraTrace.git" + }, + "author": "Jonathan Washington", + "license": "GPL-3.0", + "bugs": { + "url": "https://github.com/SwatPhonLab/UltraTrace/issues" + }, + "homepage": "https://github.com/SwatPhonLab/UltraTrace#readme", + "devDependencies": { + "@interactjs/types": "^1.8.0-rc.1", + "@types/node": "^12.12.21", + "@types/ramda": "^0.26.38", + "@types/react": "^16.9.17", + "@types/react-calendar-timeline": "^0.26.0", + "@types/react-dom": "^16.9.4", + "@types/styled-components": "^4.4.1", + "@typescript-eslint/eslint-plugin": "^2.12.0", + "@typescript-eslint/parser": "^2.12.0", + "css-loader": "^3.4.0", + "eslint": "^6.8.0", + "eslint-config-airbnb": "^18.0.1", + "eslint-config-prettier": "^6.7.0", + "eslint-plugin-import": "^2.19.1", + "eslint-plugin-jsx-a11y": "^6.2.3", + "eslint-plugin-prettier": "^3.1.2", + "eslint-plugin-react": "^7.17.0", + "eslint-plugin-react-hooks": "^1.7.0", + "eslint-plugin-sort-imports-es6-autofix": "^0.5.0", + "file-loader": "^5.0.2", + "html-webpack-plugin": "^3.2.0", + "prettier": "^1.19.1", + "source-map-loader": "^0.2.4", + "style-loader": "^1.1.1", + "ts-loader": "^6.2.1", + "typescript": "^3.7.4", + "url-loader": "^3.0.0", + "webpack": "^4.41.4", + "webpack-cli": "^3.3.10" + }, + "dependencies": { + "electron": "^7.1.7", + "immutable": "^4.0.0-rc.12", + "interactjs": "^1.7.3", + "moment": "^2.24.0", + "ramda": "^0.26.1", + "react": "^16.12.0", + "react-calendar-timeline": "^0.26.7", + "react-dom": "^16.12.0", + "react-image-annotation": "^0.9.10", + "react-pinch-and-zoom": "^1.2.4", + "semantic-ui-css": "^2.4.1", + "semantic-ui-react": "^0.88.2", + "styled-components": "^4.4.1", + "uuidv4": "^6.0.0" + } +} diff --git a/app/src/img/img_grid_square.jpg b/app/src/img/img_grid_square.jpg new file mode 100644 index 0000000000000000000000000000000000000000..93892e0b93ef803794d07f33fadde114854b59b0 GIT binary patch literal 35754 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 OMl3gJ6fQwErT-s|xISk9 literal 0 HcmV?d00001 diff --git a/app/src/main/main.ts b/app/src/main/main.ts new file mode 100644 index 0000000..df861a9 --- /dev/null +++ b/app/src/main/main.ts @@ -0,0 +1,17 @@ +import { BrowserWindow, app } from 'electron'; + +function createWindow(): void { + // Create the browser window. + const win = new BrowserWindow({ + width: 800, + height: 600, + webPreferences: { + nodeIntegration: true, + }, + }); + + // and load the index.html of the app. + win.loadFile('index.html'); +} + +app.on('ready', createWindow); diff --git a/app/src/renderer/components/App.tsx b/app/src/renderer/components/App.tsx new file mode 100644 index 0000000..9463567 --- /dev/null +++ b/app/src/renderer/components/App.tsx @@ -0,0 +1,25 @@ +import * as React from 'react'; + +import { Responsive, Segment } from 'semantic-ui-react'; + +import { TraceItem } from './TraceSelectorRow'; +import Sidebar from './Sidebar'; +import Window from './Window'; + +interface Props {} + +export default function App(_: Props): React.ReactElement { + const [currentTrace, setCurrentTrace] = React.useState( + null, + ); + return ( + + + + + ); +} diff --git a/app/src/renderer/components/PlaybackControls.tsx b/app/src/renderer/components/PlaybackControls.tsx new file mode 100644 index 0000000..e92ab11 --- /dev/null +++ b/app/src/renderer/components/PlaybackControls.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; +import { Button, Icon } from 'semantic-ui-react'; + +interface Props {} + +export default function PlaybackControls(_: Props): React.ReactElement { + const [isPlaying, setIsPlaying] = React.useState(false); + + const toggleIsPlaying = React.useCallback(() => setIsPlaying(!isPlaying), [ + isPlaying + ]); + + return ( + + + + + + ); +} diff --git a/app/src/renderer/components/Point.tsx b/app/src/renderer/components/Point.tsx new file mode 100644 index 0000000..9e6bc79 --- /dev/null +++ b/app/src/renderer/components/Point.tsx @@ -0,0 +1,53 @@ +import * as React from 'react'; + +import { AnnotationData } from 'react-image-annotation'; +import { SemanticCOLORS } from 'semantic-ui-react'; +import styled from 'styled-components'; + +interface Props { + annotation: AnnotationData<{}, HasXY, HasColor>; + active: boolean; +} + +interface HasColor { + color: SemanticCOLORS; +} + +interface HasXY { + x: number; + y: number; +} + +// prettier-ignore +const Container = styled.div` + border: solid 3px white; + border-radius: 50%; + box-sizing: border-box; + box-shadow: + 0 0 0 1px rgba(0,0,0,0.3), + 0 0 0 2px rgba(0,0,0,0.2), + 0 5px 4px rgba(0,0,0,0.4); + height: 16px; + position: absolute; + transform: translate3d(-50%, -50%, 0); + width: 16px; +` + +export default function Point({ + annotation, +}: Props): React.ReactElement | null { + const { geometry } = annotation; + if (geometry == null) { + return null; + } + + return ( + + ); +} diff --git a/app/src/renderer/components/SeekableSelector.tsx b/app/src/renderer/components/SeekableSelector.tsx new file mode 100644 index 0000000..34ea24c --- /dev/null +++ b/app/src/renderer/components/SeekableSelector.tsx @@ -0,0 +1,29 @@ +import * as React from 'react'; + +import { Button, Icon, Input } from 'semantic-ui-react'; + +interface Props { + placeholder: string; +} + +export default function SeekableSelector({ + placeholder, +}: Props): React.ReactElement { + return ( +
+ + + + + +
+ ); +} diff --git a/app/src/renderer/components/Sidebar.tsx b/app/src/renderer/components/Sidebar.tsx new file mode 100644 index 0000000..3189123 --- /dev/null +++ b/app/src/renderer/components/Sidebar.tsx @@ -0,0 +1,62 @@ +import * as React from 'react'; + +import { OrderedMap } from 'immutable'; +import { CheckboxProps, Segment } from 'semantic-ui-react'; + +import TraceSelectorRow, { TraceItem } from './TraceSelectorRow'; + +import PlaybackControls from './PlaybackControls'; +import SeekableSelector from './SeekableSelector'; +import TraceSelector from './TraceSelector'; + +interface Props { + currentTrace: TraceItem | null; + setCurrentTrace: (item: TraceItem | null) => void; +} + +/** + * The application sidebar. Provides an interface to select frames, modify + * traces, and control playback. + */ +export default function Sidebar({ + currentTrace, + setCurrentTrace, +}: Props): React.ReactElement { + const [traces, setTraces] = React.useState>( + OrderedMap(), + ); + const upsertTrace = React.useCallback( + (item: TraceItem) => setTraces(traces.set(item.id, item)), + [traces], + ); + const lookupTraceByKeyAndSetCurrent = React.useCallback( + (data: CheckboxProps) => { + const { value } = data; + if (value == null || typeof value === 'number') { + throw new Error(`Expected a string but got '${value}'`); + } + setCurrentTrace(traces.get(value, null)); + }, + [traces], + ); + + const traceElements = traces + .map((item: TraceItem) => ( + + )) + .valueSeq(); + return ( + + + + + + + ); +} diff --git a/app/src/renderer/components/TraceSelector.tsx b/app/src/renderer/components/TraceSelector.tsx new file mode 100644 index 0000000..7908672 --- /dev/null +++ b/app/src/renderer/components/TraceSelector.tsx @@ -0,0 +1,45 @@ +import * as React from 'react'; + +import { Button, Icon, Table } from 'semantic-ui-react'; +import { Seq } from 'immutable'; +import { uuid } from 'uuidv4'; +import TraceSelectorRow, { TraceItem } from './TraceSelectorRow'; + +type Props = { + traces: Seq.Indexed< + React.ReactElement< + React.ComponentProps, + typeof TraceSelectorRow + > + >; + onAddTrace: (item: TraceItem) => void; +}; + +/** + * The list of traces. Provides an interface to modify the trace list. + */ +export default function TraceSelector({ + traces, + onAddTrace, +}: Props): React.ReactElement { + const addTrace = React.useCallback(() => { + onAddTrace({ id: uuid(), name: '', color: 'blue' }); + }, [onAddTrace]); + return ( + + {traces} + + + + + + + + +
+ ); +} diff --git a/app/src/renderer/components/TraceSelectorRow.tsx b/app/src/renderer/components/TraceSelectorRow.tsx new file mode 100644 index 0000000..bfa1fe1 --- /dev/null +++ b/app/src/renderer/components/TraceSelectorRow.tsx @@ -0,0 +1,78 @@ +import * as React from 'react'; + +import { + Button, + CheckboxProps, + Input, + InputOnChangeData, + Radio, + SemanticCOLORS, + Table, +} from 'semantic-ui-react'; + +type Props = { + key: string; + item: TraceItem; + onEditItem: (nextItem: TraceItem) => void; + isSelected: boolean; + onSelect: (data: CheckboxProps) => void; +}; + +export interface TraceItem { + id: string; + name: string; + color: SemanticCOLORS; +} + +/** + * A single trace. Provides an interface to edit the trace's metadata. + */ +export default function TraceSelectorRow({ + item, + onEditItem, + isSelected, + onSelect, +}: Props): React.ReactElement { + // State of the name input while the user has it focused + const [inflightName, setInflightName] = React.useState(item.name); + + const commitNameChange = React.useCallback( + () => onEditItem({ ...item, name: inflightName }), + [item, inflightName], + ); + const updateInflightName = React.useCallback( + (_: React.ChangeEvent, data: InputOnChangeData) => + setInflightName(data.value), + [], + ); + + const onRadioChange = React.useCallback( + (_: React.FormEvent, data: CheckboxProps) => onSelect(data), + [], + ); + + return ( + + + + + + + + + - - - - diff --git a/app/src/renderer/components/Sidebar.tsx b/app/src/renderer/components/Sidebar.tsx index 3189123..0d6750a 100644 --- a/app/src/renderer/components/Sidebar.tsx +++ b/app/src/renderer/components/Sidebar.tsx @@ -9,10 +9,10 @@ import PlaybackControls from './PlaybackControls'; import SeekableSelector from './SeekableSelector'; import TraceSelector from './TraceSelector'; -interface Props { +type Props = { currentTrace: TraceItem | null; setCurrentTrace: (item: TraceItem | null) => void; -} +}; /** * The application sidebar. Provides an interface to select frames, modify @@ -52,9 +52,13 @@ export default function Sidebar({ )) .valueSeq(); return ( - - - + +
+ +
+
+ +
diff --git a/app/src/renderer/components/TraceSelector.tsx b/app/src/renderer/components/TraceSelector.tsx index 7908672..ecf6f12 100644 --- a/app/src/renderer/components/TraceSelector.tsx +++ b/app/src/renderer/components/TraceSelector.tsx @@ -29,16 +29,18 @@ export default function TraceSelector({ {traces} - - - - - - + + + + + + + +
); diff --git a/app/src/renderer/components/Window.tsx b/app/src/renderer/components/Window.tsx index 3896945..fd161a2 100644 --- a/app/src/renderer/components/Window.tsx +++ b/app/src/renderer/components/Window.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { List } from 'immutable'; -import { Segment, SemanticCOLORS } from 'semantic-ui-react'; +import { SemanticCOLORS } from 'semantic-ui-react'; import Annotation, { AnnotationData, HighlightData, @@ -9,6 +9,7 @@ import Annotation, { } from 'react-image-annotation'; import { PointSelector } from 'react-image-annotation/lib/selectors'; import { identity } from 'ramda'; +import { uuid } from 'uuidv4'; import image from '../../img/img_grid_square.jpg'; import { TraceItem } from './TraceSelectorRow'; import Point from './Point'; @@ -24,6 +25,7 @@ interface TGeometry { } interface TMetadata { + id: string; color: SemanticCOLORS; } @@ -39,16 +41,14 @@ export default function Window({ currentTrace }: Props): React.ReactElement { const commitAnnotation = React.useCallback( (annotation: MyAnnotationData): void => { + // Do nothing if the user doesn't currently have a trace selected if (currentTrace == null) { return; } - // Add the key `data` with an empty object because we're immediately - // committing the annotation as they're being added instead of having - // an intermediate submission step setAnnotations( annotations.push({ ...annotation, - data: { color: currentTrace.color }, + data: { id: uuid(), color: currentTrace.color }, }), ); }, @@ -73,20 +73,18 @@ export default function Window({ currentTrace }: Props): React.ReactElement { } return ( - - - + ); } diff --git a/app/src/renderer/index.html b/app/src/renderer/index.html index c046281..bc26aa9 100644 --- a/app/src/renderer/index.html +++ b/app/src/renderer/index.html @@ -1,12 +1,9 @@ - - Hello World! + -
-

Hello World!

-
+
diff --git a/app/src/renderer/index.tsx b/app/src/renderer/index.tsx index a90f30e..663d0f8 100644 --- a/app/src/renderer/index.tsx +++ b/app/src/renderer/index.tsx @@ -1,5 +1,5 @@ -import 'semantic-ui-css/semantic.min.css'; -import 'react-calendar-timeline/lib/Timeline.css'; +import 'tachyons'; +import 'semantic-ui-less/semantic.less'; import * as React from 'react'; import * as ReactDOM from 'react-dom'; diff --git a/app/src/renderer/semantic-ui/site/collections/breadcrumb.overrides b/app/src/renderer/semantic-ui/site/collections/breadcrumb.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/collections/breadcrumb.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/collections/breadcrumb.variables b/app/src/renderer/semantic-ui/site/collections/breadcrumb.variables new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/collections/breadcrumb.variables @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/collections/form.overrides b/app/src/renderer/semantic-ui/site/collections/form.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/collections/form.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/collections/form.variables b/app/src/renderer/semantic-ui/site/collections/form.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/collections/form.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/collections/grid.overrides b/app/src/renderer/semantic-ui/site/collections/grid.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/collections/grid.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/collections/grid.variables b/app/src/renderer/semantic-ui/site/collections/grid.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/collections/grid.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/collections/menu.overrides b/app/src/renderer/semantic-ui/site/collections/menu.overrides new file mode 100644 index 0000000..c172e5f --- /dev/null +++ b/app/src/renderer/semantic-ui/site/collections/menu.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ \ No newline at end of file diff --git a/app/src/renderer/semantic-ui/site/collections/menu.variables b/app/src/renderer/semantic-ui/site/collections/menu.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/collections/menu.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/collections/message.overrides b/app/src/renderer/semantic-ui/site/collections/message.overrides new file mode 100644 index 0000000..96091c3 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/collections/message.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/collections/message.variables b/app/src/renderer/semantic-ui/site/collections/message.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/collections/message.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/collections/table.overrides b/app/src/renderer/semantic-ui/site/collections/table.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/collections/table.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/collections/table.variables b/app/src/renderer/semantic-ui/site/collections/table.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/collections/table.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/button.overrides b/app/src/renderer/semantic-ui/site/elements/button.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/button.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/button.variables b/app/src/renderer/semantic-ui/site/elements/button.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/button.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/container.overrides b/app/src/renderer/semantic-ui/site/elements/container.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/container.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/container.variables b/app/src/renderer/semantic-ui/site/elements/container.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/container.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/divider.overrides b/app/src/renderer/semantic-ui/site/elements/divider.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/divider.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/divider.variables b/app/src/renderer/semantic-ui/site/elements/divider.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/divider.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/flag.overrides b/app/src/renderer/semantic-ui/site/elements/flag.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/flag.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/flag.variables b/app/src/renderer/semantic-ui/site/elements/flag.variables new file mode 100644 index 0000000..e3e125d --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/flag.variables @@ -0,0 +1,3 @@ +/*------------------- + Flag Variables +--------------------*/ diff --git a/app/src/renderer/semantic-ui/site/elements/header.overrides b/app/src/renderer/semantic-ui/site/elements/header.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/header.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/header.variables b/app/src/renderer/semantic-ui/site/elements/header.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/header.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/icon.overrides b/app/src/renderer/semantic-ui/site/elements/icon.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/icon.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/icon.variables b/app/src/renderer/semantic-ui/site/elements/icon.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/icon.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/image.overrides b/app/src/renderer/semantic-ui/site/elements/image.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/image.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/image.variables b/app/src/renderer/semantic-ui/site/elements/image.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/image.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/input.overrides b/app/src/renderer/semantic-ui/site/elements/input.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/input.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/input.variables b/app/src/renderer/semantic-ui/site/elements/input.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/input.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/label.overrides b/app/src/renderer/semantic-ui/site/elements/label.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/label.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/label.variables b/app/src/renderer/semantic-ui/site/elements/label.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/label.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/list.overrides b/app/src/renderer/semantic-ui/site/elements/list.overrides new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/list.overrides @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/list.variables b/app/src/renderer/semantic-ui/site/elements/list.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/list.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/loader.overrides b/app/src/renderer/semantic-ui/site/elements/loader.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/loader.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/loader.variables b/app/src/renderer/semantic-ui/site/elements/loader.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/loader.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/rail.overrides b/app/src/renderer/semantic-ui/site/elements/rail.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/rail.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/rail.variables b/app/src/renderer/semantic-ui/site/elements/rail.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/rail.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/reveal.overrides b/app/src/renderer/semantic-ui/site/elements/reveal.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/reveal.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/reveal.variables b/app/src/renderer/semantic-ui/site/elements/reveal.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/reveal.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/segment.overrides b/app/src/renderer/semantic-ui/site/elements/segment.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/segment.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/segment.variables b/app/src/renderer/semantic-ui/site/elements/segment.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/segment.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/step.overrides b/app/src/renderer/semantic-ui/site/elements/step.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/step.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/elements/step.variables b/app/src/renderer/semantic-ui/site/elements/step.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/elements/step.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/globals/reset.overrides b/app/src/renderer/semantic-ui/site/globals/reset.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/globals/reset.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/globals/reset.variables b/app/src/renderer/semantic-ui/site/globals/reset.variables new file mode 100644 index 0000000..cd95544 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/globals/reset.variables @@ -0,0 +1,3 @@ +/******************************* + User Global Variables +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/globals/site.overrides b/app/src/renderer/semantic-ui/site/globals/site.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/globals/site.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/globals/site.variables b/app/src/renderer/semantic-ui/site/globals/site.variables new file mode 100644 index 0000000..de7a4ce --- /dev/null +++ b/app/src/renderer/semantic-ui/site/globals/site.variables @@ -0,0 +1,14 @@ +/******************************* + User Global Variables +*******************************/ + +// These overrides correspond to the Tachyons color palette +@red : #FF4136; +@orange : #FF6300; +@yellow : #FFD700; +@green : #19A974; +@blue : #357EDD; +@purple : #5E2CA5; +@pink : #FF80CC; +@grey : #777777; +@black : #000000; diff --git a/app/src/renderer/semantic-ui/site/modules/accordion.overrides b/app/src/renderer/semantic-ui/site/modules/accordion.overrides new file mode 100644 index 0000000..660e664 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/accordion.overrides @@ -0,0 +1,3 @@ +/******************************* + User Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/accordion.variables b/app/src/renderer/semantic-ui/site/modules/accordion.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/accordion.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/chatroom.overrides b/app/src/renderer/semantic-ui/site/modules/chatroom.overrides new file mode 100644 index 0000000..660e664 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/chatroom.overrides @@ -0,0 +1,3 @@ +/******************************* + User Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/chatroom.variables b/app/src/renderer/semantic-ui/site/modules/chatroom.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/chatroom.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/checkbox.overrides b/app/src/renderer/semantic-ui/site/modules/checkbox.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/checkbox.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/checkbox.variables b/app/src/renderer/semantic-ui/site/modules/checkbox.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/checkbox.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/dimmer.overrides b/app/src/renderer/semantic-ui/site/modules/dimmer.overrides new file mode 100644 index 0000000..660e664 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/dimmer.overrides @@ -0,0 +1,3 @@ +/******************************* + User Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/dimmer.variables b/app/src/renderer/semantic-ui/site/modules/dimmer.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/dimmer.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/dropdown.overrides b/app/src/renderer/semantic-ui/site/modules/dropdown.overrides new file mode 100644 index 0000000..660e664 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/dropdown.overrides @@ -0,0 +1,3 @@ +/******************************* + User Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/dropdown.variables b/app/src/renderer/semantic-ui/site/modules/dropdown.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/dropdown.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/embed.overrides b/app/src/renderer/semantic-ui/site/modules/embed.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/embed.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/embed.variables b/app/src/renderer/semantic-ui/site/modules/embed.variables new file mode 100644 index 0000000..e69de29 diff --git a/app/src/renderer/semantic-ui/site/modules/modal.overrides b/app/src/renderer/semantic-ui/site/modules/modal.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/modal.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/modal.variables b/app/src/renderer/semantic-ui/site/modules/modal.variables new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/modal.variables @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/nag.overrides b/app/src/renderer/semantic-ui/site/modules/nag.overrides new file mode 100644 index 0000000..660e664 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/nag.overrides @@ -0,0 +1,3 @@ +/******************************* + User Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/nag.variables b/app/src/renderer/semantic-ui/site/modules/nag.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/nag.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/popup.overrides b/app/src/renderer/semantic-ui/site/modules/popup.overrides new file mode 100644 index 0000000..660e664 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/popup.overrides @@ -0,0 +1,3 @@ +/******************************* + User Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/popup.variables b/app/src/renderer/semantic-ui/site/modules/popup.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/popup.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/progress.overrides b/app/src/renderer/semantic-ui/site/modules/progress.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/progress.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/progress.variables b/app/src/renderer/semantic-ui/site/modules/progress.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/progress.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/rating.overrides b/app/src/renderer/semantic-ui/site/modules/rating.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/rating.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/rating.variables b/app/src/renderer/semantic-ui/site/modules/rating.variables new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/rating.variables @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/search.overrides b/app/src/renderer/semantic-ui/site/modules/search.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/search.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/search.variables b/app/src/renderer/semantic-ui/site/modules/search.variables new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/search.variables @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/shape.overrides b/app/src/renderer/semantic-ui/site/modules/shape.overrides new file mode 100644 index 0000000..660e664 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/shape.overrides @@ -0,0 +1,3 @@ +/******************************* + User Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/shape.variables b/app/src/renderer/semantic-ui/site/modules/shape.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/shape.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/sidebar.overrides b/app/src/renderer/semantic-ui/site/modules/sidebar.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/sidebar.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/sidebar.variables b/app/src/renderer/semantic-ui/site/modules/sidebar.variables new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/sidebar.variables @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/sticky.overrides b/app/src/renderer/semantic-ui/site/modules/sticky.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/sticky.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/sticky.variables b/app/src/renderer/semantic-ui/site/modules/sticky.variables new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/sticky.variables @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/tab.overrides b/app/src/renderer/semantic-ui/site/modules/tab.overrides new file mode 100644 index 0000000..660e664 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/tab.overrides @@ -0,0 +1,3 @@ +/******************************* + User Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/tab.variables b/app/src/renderer/semantic-ui/site/modules/tab.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/tab.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/transition.overrides b/app/src/renderer/semantic-ui/site/modules/transition.overrides new file mode 100644 index 0000000..cba59ef --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/transition.overrides @@ -0,0 +1,3 @@ +/******************************* + Site Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/modules/transition.variables b/app/src/renderer/semantic-ui/site/modules/transition.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/modules/transition.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/views/ad.overrides b/app/src/renderer/semantic-ui/site/views/ad.overrides new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/views/ad.overrides @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/views/ad.variables b/app/src/renderer/semantic-ui/site/views/ad.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/views/ad.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/views/card.overrides b/app/src/renderer/semantic-ui/site/views/card.overrides new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/views/card.overrides @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/views/card.variables b/app/src/renderer/semantic-ui/site/views/card.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/views/card.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/views/comment.overrides b/app/src/renderer/semantic-ui/site/views/comment.overrides new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/views/comment.overrides @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/views/comment.variables b/app/src/renderer/semantic-ui/site/views/comment.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/views/comment.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/views/feed.overrides b/app/src/renderer/semantic-ui/site/views/feed.overrides new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/views/feed.overrides @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/views/feed.variables b/app/src/renderer/semantic-ui/site/views/feed.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/views/feed.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/views/item.overrides b/app/src/renderer/semantic-ui/site/views/item.overrides new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/views/item.overrides @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/views/item.variables b/app/src/renderer/semantic-ui/site/views/item.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/views/item.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/views/statistic.overrides b/app/src/renderer/semantic-ui/site/views/statistic.overrides new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/views/statistic.overrides @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/site/views/statistic.variables b/app/src/renderer/semantic-ui/site/views/statistic.variables new file mode 100644 index 0000000..6f085f9 --- /dev/null +++ b/app/src/renderer/semantic-ui/site/views/statistic.variables @@ -0,0 +1,3 @@ +/******************************* + User Variable Overrides +*******************************/ diff --git a/app/src/renderer/semantic-ui/theme.config b/app/src/renderer/semantic-ui/theme.config new file mode 100644 index 0000000..dc74842 --- /dev/null +++ b/app/src/renderer/semantic-ui/theme.config @@ -0,0 +1,94 @@ +/* + +████████╗██╗ ██╗███████╗███╗ ███╗███████╗███████╗ +╚══██╔══╝██║ ██║██╔════╝████╗ ████║██╔════╝██╔════╝ + ██║ ███████║█████╗ ██╔████╔██║█████╗ ███████╗ + ██║ ██╔══██║██╔══╝ ██║╚██╔╝██║██╔══╝ ╚════██║ + ██║ ██║ ██║███████╗██║ ╚═╝ ██║███████╗███████║ + ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚══════╝╚══════╝ + +*/ + +/******************************* + Theme Selection +*******************************/ + +/* To override a theme for an individual element + specify theme name below +*/ + +/* Global */ +@site : 'default'; +@reset : 'default'; + +/* Elements */ +@button : 'default'; +@container : 'default'; +@divider : 'default'; +@flag : 'default'; +@header : 'default'; +@icon : 'default'; +@image : 'default'; +@input : 'default'; +@label : 'default'; +@list : 'default'; +@loader : 'default'; +@placeholder : 'default'; +@rail : 'default'; +@reveal : 'default'; +@segment : 'default'; +@step : 'default'; + +/* Collections */ +@breadcrumb : 'default'; +@form : 'default'; +@grid : 'default'; +@menu : 'default'; +@message : 'default'; +@table : 'default'; + +/* Modules */ +@accordion : 'default'; +@checkbox : 'default'; +@dimmer : 'default'; +@dropdown : 'default'; +@embed : 'default'; +@modal : 'default'; +@nag : 'default'; +@popup : 'default'; +@progress : 'default'; +@rating : 'default'; +@search : 'default'; +@shape : 'default'; +@sidebar : 'default'; +@sticky : 'default'; +@tab : 'default'; +@transition : 'default'; + +/* Views */ +@ad : 'default'; +@card : 'default'; +@comment : 'default'; +@feed : 'default'; +@item : 'default'; +@statistic : 'default'; + +/******************************* + Folders +*******************************/ + +/* Path to theme packages */ +@themesFolder : 'themes'; + +/* Path to site override folder */ +@siteFolder : '../../src/renderer/semantic-ui/site'; + + +/******************************* + Import Theme +*******************************/ + +@import (multiple) "~semantic-ui-less/theme.less"; +@fontPath : '../../../themes/@{theme}/assets/fonts'; + +/* End Config */ diff --git a/app/webpack.config.js b/app/webpack.config.js index 4f2402c..285269d 100644 --- a/app/webpack.config.js +++ b/app/webpack.config.js @@ -1,23 +1,27 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); +/* eslint-enable @typescript-eslint/no-var-requires */ module.exports = [ { mode: 'development', entry: './src/main/main.ts', target: 'electron-main', + devtool: 'source-map', module: { rules: [ { test: /\.ts$/, include: /src/, - use: [{ loader: 'ts-loader' }] - } - ] + use: [{ loader: 'ts-loader' }], + }, + ], }, output: { - path: __dirname + '/dist', - filename: 'main.js' - } + path: path.join(__dirname, 'dist'), + filename: 'main.js', + }, }, { mode: 'development', @@ -26,42 +30,52 @@ module.exports = [ devtool: 'source-map', resolve: { // Add '.ts' and '.tsx' as resolvable extensions. - extensions: ['.ts', '.tsx', '.js'] + extensions: ['.ts', '.tsx', '.js'], + alias: { + '../../theme.config$': path.join( + __dirname, + '/src/renderer/semantic-ui/theme.config', + ), + '../semantic-ui/site': path.join( + __dirname, + '/src/renderer/semantic-ui/site', + ), + }, }, module: { rules: [ { test: /\.ts(x?)$/, include: /src/, - use: [{ loader: 'ts-loader' }] + use: [{ loader: 'ts-loader' }], }, { - test: /\.css$/i, - use: ['style-loader', 'css-loader'] + test: /\.(c|le)ss$/i, + use: ['style-loader', 'css-loader', 'less-loader'], }, { test: /\.(png|jpe?g|gif|svg|eot|ttf|woff|woff2)$/i, loader: 'url-loader', options: { - limit: 8192 - } + limit: 8192, + }, }, { enforce: 'pre', test: /\.js$/, loader: 'source-map-loader', - exclude: [/node_modules/, /build/, /__test__/] - } - ] + exclude: [/node_modules/, /build/, /__test__/], + }, + ], }, output: { - path: __dirname + '/dist', - filename: 'index.js' + path: path.join(__dirname, '/dist'), + filename: 'index.js', }, plugins: [ new HtmlWebpackPlugin({ - template: './src/renderer/index.html' - }) - ] - } + template: './src/renderer/index.html', + }), + ], + }, ];