Reorganize top-level directories with clearer naming convention
app -> app-desktop-macos, presets -> app-presets, server -> remote-server, daw-config-reaper -> osc-config-daw, plugin-reaper-realearn -> plugin-reaper-relearn. Updated run.py and presets.py path references accordingly. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1 @@
|
||||
node_modules
|
||||
@@ -0,0 +1,94 @@
|
||||
digraph components {
|
||||
node [shape = "box"];
|
||||
compound = true;
|
||||
// newrank = true;
|
||||
rankdir = "TB";
|
||||
|
||||
MidiInputDevice;
|
||||
MidiOutputDevice;
|
||||
FxChain;
|
||||
Reaper;
|
||||
|
||||
subgraph cluster_realearn {
|
||||
App [class = "layer-infrastructure"];
|
||||
Server [class = "layer-infrastructure"];
|
||||
Backbone [class = "layer-processing"];
|
||||
RealearnControlSurfaceMiddleware [class = "layer-processing"];
|
||||
RealearnAudioHook [class = "layer-processing"];
|
||||
OscOutputDevice [class = "layer-processing"];
|
||||
|
||||
subgraph cluster_instance {
|
||||
infrastructure_layer [shape = point style = invis];
|
||||
application_layer [shape = point style = invis];
|
||||
processing_layer [shape = point style = invis];
|
||||
RealearnPlugin [class = "layer-infrastructure"];
|
||||
RealearnUi [class = "layer-infrastructure"];
|
||||
Session [class = "layer-management"];
|
||||
InstanceState [class = "layer-processing"];
|
||||
RealTimeProcessor [width = 2, height = 3, class = "layer-processing"];
|
||||
MainProcessor [width = 2, height = 3, class = "layer-processing"];
|
||||
|
||||
{
|
||||
rank = same;
|
||||
infrastructure_layer;
|
||||
RealearnUi;
|
||||
}
|
||||
{
|
||||
rank = same;
|
||||
application_layer;
|
||||
Session;
|
||||
}
|
||||
{
|
||||
rank = same;
|
||||
processing_layer;
|
||||
RealTimeProcessor;
|
||||
MainProcessor;
|
||||
InstanceState;
|
||||
}
|
||||
|
||||
label = "Instance";
|
||||
class = "level-2";
|
||||
infrastructure_layer -> application_layer -> processing_layer [style = invis];
|
||||
}
|
||||
|
||||
label = "ReaLearn";
|
||||
class = "level-1";
|
||||
}
|
||||
|
||||
|
||||
// General
|
||||
Session -> MainProcessor [label = "Sync data", class = "com-async role-sync-data"]
|
||||
MainProcessor -> RealTimeProcessor [label = "Sync data", class = "com-async role-sync-data"]
|
||||
MainProcessor -> Session [label = "Events", class = "com-sync role-notify"]
|
||||
Session -> RealearnUi [label = "Events", class = "com-sync role-notify"]
|
||||
|
||||
// Feedback direction
|
||||
Reaper -> RealearnControlSurfaceMiddleware [label = "REAPER change events", class = "com-sync dir-feedback type-general role-realtime-general"]
|
||||
InstanceState -> RealearnControlSurfaceMiddleware [label = "Instance change events", class = "com-async dir-feedback type-general role-realtime-general"]
|
||||
RealearnControlSurfaceMiddleware -> MainProcessor [label = "REAPER and instance change events", class = "com-sync dir-feedback type-general role-realtime-general"]
|
||||
|
||||
// Control direction (OSC)
|
||||
RealearnControlSurfaceMiddleware -> MainProcessor [label = "OSC control events", class = "com-sync dir-control type-osc role-realtime-osc"]
|
||||
|
||||
// Feedback direction (OSC)
|
||||
MainProcessor -> OscOutputDevice [label = "OSC feedback events", class = "com-async dir-feedback type-osc role-realtime-osc"]
|
||||
|
||||
// Control direction (MIDI)
|
||||
RealTimeProcessor -> MainProcessor [label = "Control values (from MIDI events)", class = "com-async dir-control type-midi-general role-realtime-midi-general"]
|
||||
|
||||
// Control direction (MIDI, FX input)
|
||||
FxChain -> RealearnPlugin [label = "MIDI control events (FX input)", class = "com-sync dir-control type-midi-fx role-realtime-midi-fx"]
|
||||
RealearnPlugin -> RealTimeProcessor [label = "MIDI control events (FX input)", class = "com-sync dir-control type-midi-fx role-realtime-midi-fx"]
|
||||
|
||||
// Feedback direction (MIDI, FX output)
|
||||
MainProcessor -> RealTimeProcessor [label = "MIDI feedback events (FX output)", class = "com-async dir-feedback type-midi-fx role-realtime-midi-fx"]
|
||||
RealTimeProcessor -> FxChain [label = "MIDI feedback events (FX output)", constraint = false, class = "com-sync dir-feedback type-midi-fx role-realtime-midi-fx"]
|
||||
|
||||
// Control direction (MIDI, device input)
|
||||
MidiInputDevice -> RealearnAudioHook [label = "MIDI control events (device input)", class = "com-sync dir-control type-midi-device role-realtime-midi-device"]
|
||||
RealearnAudioHook -> RealTimeProcessor [label = "MIDI control events (device input)", class = "com-sync dir-control type-midi-device role-realtime-midi-device"]
|
||||
|
||||
// Feedback direction (MIDI, device output)
|
||||
MainProcessor -> RealearnAudioHook [label = "MIDI feedback events (device output)", class = "com-async dir-feedback type-midi-device role-realtime-midi-device"]
|
||||
RealearnAudioHook -> MidiOutputDevice [label = "MIDI feedback events (device output)", class = "com-sync dir-feedback type-midi-device role-realtime-midi-device"]
|
||||
}
|
||||
@@ -0,0 +1,236 @@
|
||||
import {createSVGWindow} from "svgdom";
|
||||
import svgjs from "@svgdotjs/svg.js";
|
||||
|
||||
const {SVG, registerWindow} = svgjs;
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
import pako from "pako";
|
||||
import got from "got";
|
||||
import '@svgdotjs/svg.topath.js';
|
||||
|
||||
const script_dir = path.resolve('doc/svg-gen');
|
||||
|
||||
// We need to embed the CSS into the SVG, otherwise the browser won't load it, tried it.
|
||||
// (see https://stackoverflow.com/questions/18434094/how-to-style-svg-with-external-css).
|
||||
const stylesheet = fs.readFileSync(path.resolve(script_dir, 'styles.css'));
|
||||
|
||||
generate()
|
||||
|
||||
async function generate() {
|
||||
fs.writeFileSync('doc/architecture/images/modules.svg', await generateModulesDiagram())
|
||||
fs.writeFileSync('doc/architecture/images/onion-layers.svg', generateOnionLayersDiagram())
|
||||
fs.writeFileSync('doc/architecture/images/components.svg', await generateComponentDiagram())
|
||||
fs.writeFileSync('doc/architecture/images/components-midi-fx.svg', await generateComponentDiagram([
|
||||
'role-realtime-general',
|
||||
'role-realtime-midi-general',
|
||||
'role-realtime-midi-fx'
|
||||
]))
|
||||
fs.writeFileSync('doc/architecture/images/components-midi-device.svg', await generateComponentDiagram([
|
||||
'role-realtime-general',
|
||||
'role-realtime-midi-general',
|
||||
'role-realtime-midi-device'
|
||||
]))
|
||||
fs.writeFileSync('doc/architecture/images/components-osc.svg', await generateComponentDiagram([
|
||||
'role-realtime-general',
|
||||
'role-realtime-osc',
|
||||
]))
|
||||
fs.writeFileSync('doc/architecture/images/components-management.svg', await generateComponentDiagram([
|
||||
'role-sync-data',
|
||||
'role-notify',
|
||||
]))
|
||||
}
|
||||
|
||||
async function generateModulesDiagram() {
|
||||
const draw = await loadDotToSvgCanvas('modules.dot');
|
||||
return draw.svg();
|
||||
}
|
||||
|
||||
async function generateComponentDiagram(shownEdgeClasses = undefined) {
|
||||
const draw = await loadDotToSvgCanvas('components.dot');
|
||||
if (shownEdgeClasses) {
|
||||
draw.style('.edge', {visibility: 'hidden'})
|
||||
for (let edgeClass of shownEdgeClasses) {
|
||||
draw.style(`.edge.${edgeClass}`, {visibility: 'visible'})
|
||||
}
|
||||
}
|
||||
return draw.svg();
|
||||
}
|
||||
|
||||
function generateOnionLayersDiagram() {
|
||||
const draw = initSvgCanvas();
|
||||
const width = 410;
|
||||
const height = 410;
|
||||
draw.size(width, height);
|
||||
embedStylesheet(draw);
|
||||
|
||||
// Default attributes
|
||||
const defaultFontSize = 15;
|
||||
const defaultArrowColor = 'black';
|
||||
const defaultArrowWidth = 2;
|
||||
const baseFont = {
|
||||
size: defaultFontSize,
|
||||
}
|
||||
const arrowPattern = createArrowPattern('rule-arrow');
|
||||
const defaultArrowHead = arrowHead();
|
||||
|
||||
// Layers
|
||||
const infrastructureLayer = layer(4, 'layer-infrastructure', 'infrastructure', [
|
||||
'GUI',
|
||||
'API',
|
||||
'Persistence',
|
||||
'Server',
|
||||
]);
|
||||
layer(3, 'layer-management', 'management');
|
||||
layer(2, 'layer-processing', 'processing');
|
||||
const baseLayer = layer(1, 'layer-base', 'base');
|
||||
|
||||
// Arrows
|
||||
drawArrow(infrastructureLayer.x(), infrastructureLayer.cy(), baseLayer.cx(), baseLayer.cy(), {
|
||||
text: 'may use code in',
|
||||
patternOrColor: arrowPattern,
|
||||
width: 10,
|
||||
drawHead: false,
|
||||
cssClass: 'rule-arrow',
|
||||
useClipping: true,
|
||||
});
|
||||
|
||||
function arrowHead() {
|
||||
return draw.marker(10, 7, (add) => {
|
||||
add.polygon('0,0 10,3.5 0,7').addClass('arrow-head');
|
||||
});
|
||||
}
|
||||
|
||||
function arcPath(radius, cx, cy, sweep) {
|
||||
return [
|
||||
// Start at 9
|
||||
['M', cx - radius, cy],
|
||||
// Go to 3
|
||||
['A', -radius, -radius, 0, 0, sweep, cx + radius, cy],
|
||||
];
|
||||
}
|
||||
|
||||
function layer(index, cssClass, label, components = []) {
|
||||
const g = draw.group().addClass(cssClass);
|
||||
const spacing = 50;
|
||||
const radius = index * spacing;
|
||||
const circle = g
|
||||
.circle(radius * 2)
|
||||
.center(width / 2, height / 2)
|
||||
.fill('none')
|
||||
.stroke({color: 'black'})
|
||||
.addClass('layerpart-circle')
|
||||
const pathRadius = radius - spacing / 2;
|
||||
const radiusFix = defaultFontSize / 3;
|
||||
const upperArc = arcPath(
|
||||
pathRadius - radiusFix,
|
||||
circle.cx(),
|
||||
circle.cy(),
|
||||
1
|
||||
);
|
||||
g.textPath(label, upperArc)
|
||||
.attr('text-anchor', 'middle')
|
||||
.attr('startOffset', '50%')
|
||||
.font(baseFont)
|
||||
.addClass('layerpart-label')
|
||||
const lowerArc = arcPath(
|
||||
pathRadius + radiusFix,
|
||||
circle.cx(),
|
||||
circle.cy(),
|
||||
0
|
||||
);
|
||||
for (let i = 0; i < components.length; i++) {
|
||||
const segmentLength = (1 / components.length) * 100;
|
||||
const offset = i * segmentLength + segmentLength / 2;
|
||||
g.textPath(components[i], lowerArc)
|
||||
.attr('text-anchor', 'middle')
|
||||
.attr('startOffset', `${offset}%`)
|
||||
.font(baseFont)
|
||||
.addClass('layerpart-secondary-label');
|
||||
}
|
||||
return circle;
|
||||
}
|
||||
|
||||
function createArrowPattern(cssClass = undefined) {
|
||||
return draw.pattern(30, 20, (add) => {
|
||||
const g = add.group().addClass(cssClass);
|
||||
g.line(0, 3.5, 10, 3.5)
|
||||
.stroke({color: defaultArrowColor, width: 1})
|
||||
.addClass('arrow-pattern-path');
|
||||
g.polygon('10,0 20,3.5 10,7').addClass('arrow-pattern-head');
|
||||
});
|
||||
}
|
||||
|
||||
function drawArrow(x1, y1, x2, y2, {
|
||||
patternOrColor = defaultArrowColor,
|
||||
width = defaultArrowWidth,
|
||||
head = defaultArrowHead,
|
||||
text,
|
||||
drawHead = true,
|
||||
cssClass = undefined,
|
||||
useClipping = false,
|
||||
}) {
|
||||
// Group for clipping
|
||||
const outer_group = draw.group().addClass(cssClass);
|
||||
const inner_group = outer_group.group();
|
||||
// Arrow itself
|
||||
const line = useClipping ? inner_group.line(x1 - 100, y1, x2 + 100, y2) : inner_group.line(x1, y1, x2, y2);
|
||||
const path = line.toPath().addClass('arrow-path');
|
||||
path.stroke({color: patternOrColor, width});
|
||||
// Head
|
||||
if (drawHead) {
|
||||
path.marker('end', head.size(8, 8))
|
||||
}
|
||||
// Text
|
||||
outer_group.textPath()
|
||||
.plot(path.array())
|
||||
.text(add => {
|
||||
add.tspan(text).dy(-10)
|
||||
})
|
||||
.addClass('arrowpart-label')
|
||||
.font({...baseFont, anchor: 'middle', startOffset: '50%'});
|
||||
// Clip (useful for keeping CSS transform animation within bounds)
|
||||
if (useClipping) {
|
||||
const clip = inner_group.clip()
|
||||
.add(inner_group.polygon().plot([[x1, y1 - width], [x2, y2 - width], [x2, y1 + width], [12, y2 + width]]));
|
||||
inner_group.clipWith(clip);
|
||||
}
|
||||
return outer_group;
|
||||
}
|
||||
|
||||
return draw.svg();
|
||||
}
|
||||
|
||||
async function loadDotToSvgCanvas(dotFileName) {
|
||||
const dot = fs.readFileSync(path.resolve(script_dir, dotFileName));
|
||||
const svg = await convertDotToSvg(dot);
|
||||
const qualifiedSvg = svg.replace(/<(!DOCTYPE[^>\[]+(\[[^\]]+)?)+[^>]+>/g, '');
|
||||
const window = createSVGWindow()
|
||||
const document = window.document
|
||||
registerWindow(window, document)
|
||||
const originalDraw = SVG(document.documentElement);
|
||||
originalDraw.svg(qualifiedSvg, true);
|
||||
const draw = SVG(document.documentElement);
|
||||
embedStylesheet(draw);
|
||||
return draw;
|
||||
}
|
||||
|
||||
async function convertDotToSvg(dot) {
|
||||
const data = Buffer.from(dot, 'utf8')
|
||||
const compressed = pako.deflate(data, {level: 9})
|
||||
const body = Buffer.from(compressed)
|
||||
.toString('base64')
|
||||
.replace(/\+/g, '-').replace(/\//g, '_')
|
||||
const response = await got(`https://kroki.io/graphviz/svg/${body}`);
|
||||
return response.body
|
||||
}
|
||||
|
||||
function initSvgCanvas() {
|
||||
const window = createSVGWindow()
|
||||
const document = window.document
|
||||
registerWindow(window, document)
|
||||
return SVG(document.documentElement);
|
||||
}
|
||||
|
||||
function embedStylesheet(draw) {
|
||||
draw.element('style').words(stylesheet)
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
digraph modules {
|
||||
node [shape = "box"];
|
||||
|
||||
reaper_rs [label = "reaper-rs"]
|
||||
helgoboss_learn [label = "helgoboss-learn"]
|
||||
helgoboss_midi [label = "helgoboss-midi"]
|
||||
|
||||
subgraph cluster_realearn {
|
||||
label = "ReaLearn";
|
||||
main;
|
||||
swell_ui [label = "swell-ui"];
|
||||
api;
|
||||
}
|
||||
|
||||
main -> api;
|
||||
main -> swell_ui;
|
||||
main -> reaper_rs;
|
||||
main -> helgoboss_learn;
|
||||
main -> helgoboss_midi;
|
||||
reaper_rs -> helgoboss_midi;
|
||||
helgoboss_learn -> helgoboss_midi;
|
||||
}
|
||||
+1088
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "svg-gen",
|
||||
"type": "module",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@svgdotjs/svg.js": "^3.1.1",
|
||||
"@svgdotjs/svg.topath.js": "^2.0.3",
|
||||
"got": "^12.0.0",
|
||||
"pako": "^2.0.4",
|
||||
"svgdom": "^0.1.10"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,452 @@
|
||||
/* Animations */
|
||||
|
||||
@keyframes go-right {
|
||||
from {
|
||||
transform: translate(0px, 0px);
|
||||
}
|
||||
to {
|
||||
transform: translate(30px, 0px);
|
||||
}
|
||||
}
|
||||
|
||||
/* Global appearance */
|
||||
|
||||
text {
|
||||
font-family: sans-serif;
|
||||
fill: var(--md-grey-900);
|
||||
}
|
||||
|
||||
/* Graphviz diagrams */
|
||||
|
||||
.graph text {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
/* ReaLearn component diagram */
|
||||
|
||||
.cluster.level-1 > polygon {
|
||||
fill: var(--md-grey-50);
|
||||
}
|
||||
|
||||
.cluster.level-2 > polygon {
|
||||
fill: var(--md-grey-100);
|
||||
}
|
||||
|
||||
.node polygon {
|
||||
fill: var(--md-grey-200);
|
||||
}
|
||||
|
||||
.node.layer-infrastructure polygon {
|
||||
fill: var(--layer-infrastructure-color);
|
||||
}
|
||||
|
||||
.node.layer-management polygon {
|
||||
fill: var(--layer-management-color);
|
||||
}
|
||||
|
||||
.node.layer-processing polygon {
|
||||
fill: var(--layer-processing-color);
|
||||
}
|
||||
|
||||
.node.layer-base polygon {
|
||||
fill: var(--layer-base-color);
|
||||
}
|
||||
|
||||
.edge.com-async path {
|
||||
stroke-dasharray: 5, 2;
|
||||
}
|
||||
|
||||
.edge.dir-control text, .edge.dir-control polygon {
|
||||
fill: var(--dir-control-color);
|
||||
}
|
||||
|
||||
.edge.dir-feedback text, .edge.dir-feedback polygon {
|
||||
fill: var(--dir-feedback-color);
|
||||
}
|
||||
|
||||
.edge.dir-control path, .edge.dir-control polygon {
|
||||
stroke: var(--dir-control-color);
|
||||
}
|
||||
|
||||
.edge.dir-feedback path, .edge.dir-feedback polygon {
|
||||
stroke: var(--dir-feedback-color);
|
||||
}
|
||||
|
||||
.edge.type-general, .edge.type-midi-general {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.edge {
|
||||
stroke-width: 2;
|
||||
}
|
||||
|
||||
.edge.type-general path, .edge.type-midi-general path {
|
||||
stroke-width: 1;
|
||||
}
|
||||
|
||||
/* Onion diagrams */
|
||||
|
||||
.layerpart-circle {
|
||||
fill-opacity: 1.0;
|
||||
stroke-width: 2;
|
||||
stroke: var(--md-grey-400);
|
||||
}
|
||||
|
||||
.layerpart-label, .layerpart-secondary-label {
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
.layerpart-secondary-label tspan {
|
||||
fill: var(--md-grey-500);
|
||||
}
|
||||
|
||||
.arrowpart-label {
|
||||
filter: drop-shadow( 3px 3px 2px rgba(0, 0, 0, .2));
|
||||
font-weight: bold;
|
||||
fill: var(--md-grey-700);
|
||||
}
|
||||
|
||||
.rule-arrow .arrow-pattern-path {
|
||||
stroke: var(--md-green-900);
|
||||
}
|
||||
|
||||
.rule-arrow .arrow-path {
|
||||
animation: go-right 2s linear infinite;
|
||||
stroke-width: 10;
|
||||
}
|
||||
|
||||
.rule-arrow .arrow-head, .rule-arrow .arrow-pattern-head {
|
||||
fill: var(--md-green-900);
|
||||
}
|
||||
|
||||
/* ReaLearn onion diagram */
|
||||
|
||||
.layer-infrastructure .layerpart-circle {
|
||||
fill: var(--layer-infrastructure-color);
|
||||
}
|
||||
|
||||
.layer-management .layerpart-circle {
|
||||
fill: var(--layer-management-color);
|
||||
}
|
||||
|
||||
.layer-processing .layerpart-circle {
|
||||
fill: var(--layer-processing-color);
|
||||
}
|
||||
|
||||
.layer-base .layerpart-circle {
|
||||
fill: var(--layer-base-color);
|
||||
}
|
||||
|
||||
/* Custom color palette */
|
||||
|
||||
:root {
|
||||
/* Layer colors */
|
||||
--layer-infrastructure-color: var(--md-yellow-100);
|
||||
--layer-management-color: var(--md-light-green-100);
|
||||
--layer-processing-color: var(--md-light-blue-50);
|
||||
--layer-base-color: var(--md-blue-grey-100);
|
||||
|
||||
/* Direction colors */
|
||||
--dir-control-color: var(--md-amber-900);
|
||||
--dir-feedback-color: var(--md-cyan-900);
|
||||
}
|
||||
|
||||
|
||||
/* Material Design color palette */
|
||||
|
||||
:root {
|
||||
--md-red-50: #ffebee;
|
||||
--md-red-100: #ffcdd2;
|
||||
--md-red-200: #ef9a9a;
|
||||
--md-red-300: #e57373;
|
||||
--md-red-400: #ef5350;
|
||||
--md-red-500: #f44336;
|
||||
--md-red-600: #e53935;
|
||||
--md-red-700: #d32f2f;
|
||||
--md-red-800: #c62828;
|
||||
--md-red-900: #b71c1c;
|
||||
--md-red-a100: #ff8a80;
|
||||
--md-red-a200: #ff5252;
|
||||
--md-red-a400: #ff1744;
|
||||
--md-red-a700: #d50000;
|
||||
|
||||
--md-pink-50: #fce4ec;
|
||||
--md-pink-100: #f8bbd0;
|
||||
--md-pink-200: #f48fb1;
|
||||
--md-pink-300: #f06292;
|
||||
--md-pink-400: #ec407a;
|
||||
--md-pink-500: #e91e63;
|
||||
--md-pink-600: #d81b60;
|
||||
--md-pink-700: #c2185b;
|
||||
--md-pink-800: #ad1457;
|
||||
--md-pink-900: #880e4f;
|
||||
--md-pink-a100: #ff80ab;
|
||||
--md-pink-a200: #ff4081;
|
||||
--md-pink-a400: #f50057;
|
||||
--md-pink-a700: #c51162;
|
||||
|
||||
--md-purple-50: #f3e5f5;
|
||||
--md-purple-100: #e1bee7;
|
||||
--md-purple-200: #ce93d8;
|
||||
--md-purple-300: #ba68c8;
|
||||
--md-purple-400: #ab47bc;
|
||||
--md-purple-500: #9c27b0;
|
||||
--md-purple-600: #8e24aa;
|
||||
--md-purple-700: #7b1fa2;
|
||||
--md-purple-800: #6a1b9a;
|
||||
--md-purple-900: #4a148c;
|
||||
--md-purple-a100: #ea80fc;
|
||||
--md-purple-a200: #e040fb;
|
||||
--md-purple-a400: #d500f9;
|
||||
--md-purple-a700: #aa00ff;
|
||||
|
||||
--md-deep-purple-50: #ede7f6;
|
||||
--md-deep-purple-100: #d1c4e9;
|
||||
--md-deep-purple-200: #b39ddb;
|
||||
--md-deep-purple-300: #9575cd;
|
||||
--md-deep-purple-400: #7e57c2;
|
||||
--md-deep-purple-500: #673ab7;
|
||||
--md-deep-purple-600: #5e35b1;
|
||||
--md-deep-purple-700: #512da8;
|
||||
--md-deep-purple-800: #4527a0;
|
||||
--md-deep-purple-900: #311b92;
|
||||
--md-deep-purple-a100: #b388ff;
|
||||
--md-deep-purple-a200: #7c4dff;
|
||||
--md-deep-purple-a400: #651fff;
|
||||
--md-deep-purple-a700: #6200ea;
|
||||
|
||||
--md-indigo-50: #e8eaf6;
|
||||
--md-indigo-100: #c5cae9;
|
||||
--md-indigo-200: #9fa8da;
|
||||
--md-indigo-300: #7986cb;
|
||||
--md-indigo-400: #5c6bc0;
|
||||
--md-indigo-500: #3f51b5;
|
||||
--md-indigo-600: #3949ab;
|
||||
--md-indigo-700: #303f9f;
|
||||
--md-indigo-800: #283593;
|
||||
--md-indigo-900: #1a237e;
|
||||
--md-indigo-a100: #8c9eff;
|
||||
--md-indigo-a200: #536dfe;
|
||||
--md-indigo-a400: #3d5afe;
|
||||
--md-indigo-a700: #304ffe;
|
||||
|
||||
--md-blue-50: #e3f2fd;
|
||||
--md-blue-100: #bbdefb;
|
||||
--md-blue-200: #90caf9;
|
||||
--md-blue-300: #64b5f6;
|
||||
--md-blue-400: #42a5f5;
|
||||
--md-blue-500: #2196f3;
|
||||
--md-blue-600: #1e88e5;
|
||||
--md-blue-700: #1976d2;
|
||||
--md-blue-800: #1565c0;
|
||||
--md-blue-900: #0d47a1;
|
||||
--md-blue-a100: #82b1ff;
|
||||
--md-blue-a200: #448aff;
|
||||
--md-blue-a400: #2979ff;
|
||||
--md-blue-a700: #2962ff;
|
||||
|
||||
--md-light-blue-50: #e1f5fe;
|
||||
--md-light-blue-100: #466b86;
|
||||
--md-light-blue-200: #81d4fa;
|
||||
--md-light-blue-300: #4fc3f7;
|
||||
--md-light-blue-400: #29b6f6;
|
||||
--md-light-blue-500: #03a9f4;
|
||||
--md-light-blue-600: #039be5;
|
||||
--md-light-blue-700: #0288d1;
|
||||
--md-light-blue-800: #0277bd;
|
||||
--md-light-blue-900: #01579b;
|
||||
--md-light-blue-a100: #80d8ff;
|
||||
--md-light-blue-a200: #40c4ff;
|
||||
--md-light-blue-a400: #00b0ff;
|
||||
--md-light-blue-a700: #0091ea;
|
||||
|
||||
--md-cyan-50: #e0f7fa;
|
||||
--md-cyan-100: #b2ebf2;
|
||||
--md-cyan-200: #80deea;
|
||||
--md-cyan-300: #4dd0e1;
|
||||
--md-cyan-400: #26c6da;
|
||||
--md-cyan-500: #00bcd4;
|
||||
--md-cyan-600: #00acc1;
|
||||
--md-cyan-700: #0097a7;
|
||||
--md-cyan-800: #00838f;
|
||||
--md-cyan-900: #006064;
|
||||
--md-cyan-a100: #84ffff;
|
||||
--md-cyan-a200: #18ffff;
|
||||
--md-cyan-a400: #00e5ff;
|
||||
--md-cyan-a700: #00b8d4;
|
||||
|
||||
--md-teal-50: #e0f2f1;
|
||||
--md-teal-100: #b2dfdb;
|
||||
--md-teal-200: #80cbc4;
|
||||
--md-teal-300: #4db6ac;
|
||||
--md-teal-400: #26a69a;
|
||||
--md-teal-500: #009688;
|
||||
--md-teal-600: #00897b;
|
||||
--md-teal-700: #00796b;
|
||||
--md-teal-800: #00695c;
|
||||
--md-teal-900: #004d40;
|
||||
--md-teal-a100: #a7ffeb;
|
||||
--md-teal-a200: #64ffda;
|
||||
--md-teal-a400: #1de9b6;
|
||||
--md-teal-a700: #00bfa5;
|
||||
|
||||
--md-green-50: #e8f5e9;
|
||||
--md-green-100: #c8e6c9;
|
||||
--md-green-200: #a5d6a7;
|
||||
--md-green-300: #81c784;
|
||||
--md-green-400: #66bb6a;
|
||||
--md-green-500: #4caf50;
|
||||
--md-green-600: #43a047;
|
||||
--md-green-700: #388e3c;
|
||||
--md-green-800: #2e7d32;
|
||||
--md-green-900: #1b5e20;
|
||||
--md-green-a100: #b9f6ca;
|
||||
--md-green-a200: #69f0ae;
|
||||
--md-green-a400: #00e676;
|
||||
--md-green-a700: #00c853;
|
||||
|
||||
--md-light-green-50: #f1f8e9;
|
||||
--md-light-green-100: #dcedc8;
|
||||
--md-light-green-200: #c5e1a5;
|
||||
--md-light-green-300: #aed581;
|
||||
--md-light-green-400: #9ccc65;
|
||||
--md-light-green-500: #8bc34a;
|
||||
--md-light-green-600: #7cb342;
|
||||
--md-light-green-700: #689f38;
|
||||
--md-light-green-800: #558b2f;
|
||||
--md-light-green-900: #33691e;
|
||||
--md-light-green-a100: #ccff90;
|
||||
--md-light-green-a200: #b2ff59;
|
||||
--md-light-green-a400: #76ff03;
|
||||
--md-light-green-a700: #64dd17;
|
||||
|
||||
--md-lime-50: #f9fbe7;
|
||||
--md-lime-100: #f0f4c3;
|
||||
--md-lime-200: #e6ee9c;
|
||||
--md-lime-300: #dce775;
|
||||
--md-lime-400: #d4e157;
|
||||
--md-lime-500: #cddc39;
|
||||
--md-lime-600: #c0ca33;
|
||||
--md-lime-700: #afb42b;
|
||||
--md-lime-800: #9e9d24;
|
||||
--md-lime-900: #827717;
|
||||
--md-lime-a100: #f4ff81;
|
||||
--md-lime-a200: #eeff41;
|
||||
--md-lime-a400: #c6ff00;
|
||||
--md-lime-a700: #aeea00;
|
||||
|
||||
--md-yellow-50: #fffde7;
|
||||
--md-yellow-100: #fff9c4;
|
||||
--md-yellow-200: #fff59d;
|
||||
--md-yellow-300: #fff176;
|
||||
--md-yellow-400: #ffee58;
|
||||
--md-yellow-500: #ffeb3b;
|
||||
--md-yellow-600: #fdd835;
|
||||
--md-yellow-700: #fbc02d;
|
||||
--md-yellow-800: #f9a825;
|
||||
--md-yellow-900: #f57f17;
|
||||
--md-yellow-a100: #ffff8d;
|
||||
--md-yellow-a200: #ffff00;
|
||||
--md-yellow-a400: #ffea00;
|
||||
--md-yellow-a700: #ffd600;
|
||||
|
||||
--md-amber-50: #fff8e1;
|
||||
--md-amber-100: #ffecb3;
|
||||
--md-amber-200: #ffe082;
|
||||
--md-amber-300: #ffd54f;
|
||||
--md-amber-400: #ffca28;
|
||||
--md-amber-500: #ffc107;
|
||||
--md-amber-600: #ffb300;
|
||||
--md-amber-700: #ffa000;
|
||||
--md-amber-800: #ff8f00;
|
||||
--md-amber-900: #ff6f00;
|
||||
--md-amber-a100: #ffe57f;
|
||||
--md-amber-a200: #ffd740;
|
||||
--md-amber-a400: #ffc400;
|
||||
--md-amber-a700: #ffab00;
|
||||
|
||||
--md-orange-50: #fff3e0;
|
||||
--md-orange-100: #ffe0b2;
|
||||
--md-orange-200: #ffcc80;
|
||||
--md-orange-300: #ffb74d;
|
||||
--md-orange-400: #ffa726;
|
||||
--md-orange-500: #ff9800;
|
||||
--md-orange-600: #fb8c00;
|
||||
--md-orange-700: #f57c00;
|
||||
--md-orange-800: #ef6c00;
|
||||
--md-orange-900: #e65100;
|
||||
--md-orange-a100: #ffd180;
|
||||
--md-orange-a200: #ffab40;
|
||||
--md-orange-a400: #ff9100;
|
||||
--md-orange-a700: #ff6d00;
|
||||
|
||||
--md-deep-orange-50: #fbe9e7;
|
||||
--md-deep-orange-100: #ffccbc;
|
||||
--md-deep-orange-200: #ffab91;
|
||||
--md-deep-orange-300: #ff8a65;
|
||||
--md-deep-orange-400: #ff7043;
|
||||
--md-deep-orange-500: #ff5722;
|
||||
--md-deep-orange-600: #f4511e;
|
||||
--md-deep-orange-700: #e64a19;
|
||||
--md-deep-orange-800: #d84315;
|
||||
--md-deep-orange-900: #bf360c;
|
||||
--md-deep-orange-a100: #ff9e80;
|
||||
--md-deep-orange-a200: #ff6e40;
|
||||
--md-deep-orange-a400: #ff3d00;
|
||||
--md-deep-orange-a700: #dd2c00;
|
||||
|
||||
--md-brown-50: #efebe9;
|
||||
--md-brown-100: #d7ccc8;
|
||||
--md-brown-200: #bcaaa4;
|
||||
--md-brown-300: #a1887f;
|
||||
--md-brown-400: #8d6e63;
|
||||
--md-brown-500: #795548;
|
||||
--md-brown-600: #6d4c41;
|
||||
--md-brown-700: #5d4037;
|
||||
--md-brown-800: #4e342e;
|
||||
--md-brown-900: #3e2723;
|
||||
|
||||
--md-grey-50: #fafafa;
|
||||
--md-grey-100: #f5f5f5;
|
||||
--md-grey-200: #eeeeee;
|
||||
--md-grey-300: #e0e0e0;
|
||||
--md-grey-400: #bdbdbd;
|
||||
--md-grey-500: #9e9e9e;
|
||||
--md-grey-600: #757575;
|
||||
--md-grey-700: #616161;
|
||||
--md-grey-800: #424242;
|
||||
--md-grey-900: #212121;
|
||||
|
||||
--md-blue-grey-50: #eceff1;
|
||||
--md-blue-grey-100: #cfd8dc;
|
||||
--md-blue-grey-200: #b0bec5;
|
||||
--md-blue-grey-300: #90a4ae;
|
||||
--md-blue-grey-400: #78909c;
|
||||
--md-blue-grey-500: #607d8b;
|
||||
--md-blue-grey-600: #546e7a;
|
||||
--md-blue-grey-700: #455a64;
|
||||
--md-blue-grey-800: #37474f;
|
||||
--md-blue-grey-900: #263238;
|
||||
|
||||
--md-black: #000000;
|
||||
|
||||
--md-white: #ffffff;
|
||||
|
||||
--md-dark-text-primary: rgba(0, 0, 0, 0.87);
|
||||
--md-dark-text-secondary: rgba(0, 0, 0, 0.54);
|
||||
--md-dark-text-disabled: rgba(0, 0, 0, 0.38);
|
||||
--md-dark-text-dividers: rgba(0, 0, 0, 0.12);
|
||||
|
||||
--md-light-text-primary: rgba(255, 255, 255, 1);
|
||||
--md-light-text-secondary: rgba(255, 255, 255, 0.7);
|
||||
--md-light-text-disabled: rgba(255, 255, 255, 0.5);
|
||||
--md-light-text-dividers: rgba(255, 255, 255, 0.12);
|
||||
|
||||
--md-dark-icons-active: rgba(0, 0, 0, 0.54);
|
||||
--md-dark-icons-inactive: rgba(0, 0, 0, 0.38);
|
||||
|
||||
--md-light-icons-active: rgba(255, 255, 255, 1);
|
||||
--md-light-icons-inactive: rgba(255, 255, 255, 0.5);
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user