56 changed files with 1428 additions and 2242 deletions
@ -0,0 +1,10 @@ |
|||||||
|
#ifndef COMPONENTS_FIRMWARE_INCLUDE_NX_FIRMWARE_GPIOTRIGGER_H_ |
||||||
|
#define COMPONENTS_FIRMWARE_INCLUDE_NX_FIRMWARE_GPIOTRIGGER_H_ |
||||||
|
|
||||||
|
#include <stdint.h> |
||||||
|
|
||||||
|
void nxInitGpioTrigger(const uint8_t* pins, uint8_t count); |
||||||
|
void nxTriggerGpio(uint8_t outputIndex, uint32_t durationMs); |
||||||
|
void nxUpdateTriggerGpio(uint8_t outputIndex, uint8_t level); |
||||||
|
|
||||||
|
#endif /* COMPONENTS_FIRMWARE_INCLUDE_NX_FIRMWARE_GPIOTRIGGER_H_ */ |
||||||
@ -0,0 +1,66 @@ |
|||||||
|
#include "nx/firmware/GpioTrigger.h" |
||||||
|
|
||||||
|
#include <freertos/FreeRTOS.h> |
||||||
|
#include <freertos/task.h> |
||||||
|
#include <esp_log.h> |
||||||
|
#include <esp_system.h> |
||||||
|
#include <driver/gpio.h> |
||||||
|
|
||||||
|
static int MAX_TRIGGER_DURATION_MS = 20000; |
||||||
|
|
||||||
|
static const char* TAG = "NX_TRIGGER"; |
||||||
|
|
||||||
|
static const uint8_t* outputs = NULL; |
||||||
|
static size_t outputCount = 0; |
||||||
|
|
||||||
|
void nxInitGpioTrigger(const uint8_t* pins, uint8_t count) |
||||||
|
{ |
||||||
|
outputs = pins; |
||||||
|
outputCount = count; |
||||||
|
|
||||||
|
for (uint8_t i = 0; i < count; ++i) { |
||||||
|
ESP_LOGI(TAG, "Initializing GPIO %i (index %i)", outputs[i], i); |
||||||
|
gpio_reset_pin(outputs[i]); |
||||||
|
gpio_set_direction(outputs[i], GPIO_MODE_OUTPUT); |
||||||
|
gpio_set_level(outputs[i], 0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void nxTriggerGpio(uint8_t outputIndex, uint32_t durationMs) |
||||||
|
{ |
||||||
|
if (outputs == NULL) { |
||||||
|
ESP_LOGE(TAG, "Trigger outputs not set, aborting"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (outputIndex >= outputCount) { |
||||||
|
ESP_LOGE(TAG, "Trigger output index out of range, aborting"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (durationMs > MAX_TRIGGER_DURATION_MS) { |
||||||
|
durationMs = MAX_TRIGGER_DURATION_MS; |
||||||
|
} |
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Triggering output %i for %ims", outputs[outputIndex], durationMs); |
||||||
|
gpio_set_level(outputs[outputIndex], 1); |
||||||
|
vTaskDelay(durationMs / portTICK_PERIOD_MS); |
||||||
|
gpio_set_level(outputs[outputIndex], 0); |
||||||
|
} |
||||||
|
|
||||||
|
void nxUpdateTriggerGpio(uint8_t outputIndex, uint8_t level) |
||||||
|
{ |
||||||
|
if (outputs == NULL) { |
||||||
|
ESP_LOGE(TAG, "Trigger outputs not set, aborting"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (outputIndex >= outputCount) { |
||||||
|
ESP_LOGE(TAG, "Trigger output index out of range, aborting"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Updating output %i to level %i", outputs[outputIndex], level); |
||||||
|
gpio_set_level(outputs[outputIndex], level); |
||||||
|
} |
||||||
|
|
||||||
@ -0,0 +1,10 @@ |
|||||||
|
#ifndef COMPONENTS_SOFTWARE_INCLUDE_NX_SOFTWARE_COMMANDPARSER_H_ |
||||||
|
#define COMPONENTS_SOFTWARE_INCLUDE_NX_SOFTWARE_COMMANDPARSER_H_ |
||||||
|
|
||||||
|
#include <stdint.h> |
||||||
|
|
||||||
|
typedef void (*CommandHandler)(const char* cmd, const char** args, uint8_t argc); |
||||||
|
|
||||||
|
void nxParseCommandString(const char* commandString, CommandHandler handler); |
||||||
|
|
||||||
|
#endif /* COMPONENTS_SOFTWARE_INCLUDE_NX_SOFTWARE_COMMANDPARSER_H_ */ |
||||||
@ -0,0 +1,40 @@ |
|||||||
|
#include "nx/software/CommandParser.h" |
||||||
|
|
||||||
|
#include <string.h> |
||||||
|
#include <stdlib.h> |
||||||
|
#include <stddef.h> |
||||||
|
#include <stdint.h> |
||||||
|
|
||||||
|
static const char CMD_SEPARATOR = ' '; |
||||||
|
|
||||||
|
void nxParseCommandString(const char* commandString, CommandHandler handler) |
||||||
|
{ |
||||||
|
char* cmd = malloc(strlen(commandString)+1); |
||||||
|
if (!cmd) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
strcpy(cmd, commandString); |
||||||
|
uint8_t argc = 0; |
||||||
|
const char** args = NULL; |
||||||
|
char* arg = cmd; |
||||||
|
while ( (arg = strchr(arg, CMD_SEPARATOR)) ) { |
||||||
|
arg[0] = '\0'; |
||||||
|
++arg; |
||||||
|
argc += 1; |
||||||
|
|
||||||
|
const char** nArgs = calloc(argc, sizeof(char*)); |
||||||
|
for (int i = 0; i < argc-1; ++i) { |
||||||
|
nArgs[i] = args[i]; |
||||||
|
} |
||||||
|
nArgs[argc-1] = arg; |
||||||
|
if (args) { |
||||||
|
free(args); |
||||||
|
} |
||||||
|
args = nArgs; |
||||||
|
} |
||||||
|
|
||||||
|
handler(cmd, args, argc); |
||||||
|
free(args); |
||||||
|
free(cmd); |
||||||
|
} |
||||||
File diff suppressed because one or more lines are too long
@ -1,2 +1 @@ |
|||||||
<meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon type=image/png href=data:image/png,%89PNG%0D%0A%1A%0A><link rel=stylesheet href=index.css><script src=index.js></script><header class="sticky row"><div class="col-sm col-md-10 col-md-offset-1"><a id=app-btn href=# role=button class=nav-btn data-dst=/app/form>App</a> |
<meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon type=image/png href=data:image/png,%89PNG%0D%0A%1A%0A><link rel=stylesheet href=index.css><script src=index.js></script><div class=.float-left>MqTrigger v1.1</div><header class="sticky row"><div class="container nav-bar"><ul><li><a id=app-btn href=# role=button class=nav-btn data-dst=/app/form>Application</a><li><a href=# role=button class=nav-btn data-dst=/sys/form>System</a></ul></div></header><div class=container><div class=col-md-offset-1 id=content><h1>Loading</h1><p>Loading content... Please make sure that JavaScript is enabled.</div></div><hr><footer><div class=container><p>Copyright© nixlab.in 2022</div></footer><script>initNavButtons();document.getElementById('app-btn').click();</script> |
||||||
<a href=# role=button class=nav-btn data-dst=/sys/form>System</a></div></header><div class=container><div class="row cols-sm-12 cols-md-10"><div class=col-md-offset-1 id=content><h1>Loading</h1><p>Loading content... Please make sure that JavaScript is enabled.</div><div class=col-md-offset-1><hr></div></div></div><footer><div class="col-sm col-md-10 col-md-offset-1"><p>MqTrigger v1.1 2022</div></footer><script>initNavButtons();document.getElementById('app-btn').click();</script> |
|
||||||
@ -0,0 +1,21 @@ |
|||||||
|
The MIT License (MIT) |
||||||
|
|
||||||
|
Copyright (c) CJ Patoilo <cjpatoilo@gmail.com> |
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||||
|
of this software and associated documentation files (the "Software"), to deal |
||||||
|
in the Software without restriction, including without limitation the rights |
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||||
|
copies of the Software, and to permit persons to whom the Software is |
||||||
|
furnished to do so, subject to the following conditions: |
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all |
||||||
|
copies or substantial portions of the Software. |
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||||
|
SOFTWARE. |
||||||
@ -0,0 +1,42 @@ |
|||||||
|
|
||||||
|
// Base |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
// Set box-sizing globally to handle padding and border widths |
||||||
|
*, |
||||||
|
*:after, |
||||||
|
*:before |
||||||
|
box-sizing: inherit |
||||||
|
|
||||||
|
// The base font-size is set at 62.5% for having the convenience |
||||||
|
// of sizing rems in a way that is similar to using px: 1.6rem = 16px |
||||||
|
html |
||||||
|
box-sizing: border-box |
||||||
|
font-size: 62.5% |
||||||
|
|
||||||
|
// Default body styles |
||||||
|
body |
||||||
|
color: $color-secondary |
||||||
|
background-color: $color-background |
||||||
|
font-family: 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif |
||||||
|
font-size: 1.6em // Currently ems cause chrome bug misinterpreting rems on body element |
||||||
|
font-weight: 300 |
||||||
|
letter-spacing: .01em |
||||||
|
line-height: 1.6 |
||||||
|
|
||||||
|
.nav-bar |
||||||
|
background-color: $color-initial |
||||||
|
top: 0 |
||||||
|
left: 0 |
||||||
|
right: 0 |
||||||
|
border-bottom: 1px solid $color-tertiary; |
||||||
|
height: 3rem |
||||||
|
display: flex |
||||||
|
text-transform: uppercase |
||||||
|
margin-bottom: 2rem !important |
||||||
|
* |
||||||
|
display: inline |
||||||
|
li |
||||||
|
margin: 1rem |
||||||
|
a |
||||||
|
font-weight: bold |
||||||
@ -0,0 +1,12 @@ |
|||||||
|
|
||||||
|
// Blockquote |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
blockquote |
||||||
|
border-left: .3rem solid $color-quaternary |
||||||
|
margin-left: 0 |
||||||
|
margin-right: 0 |
||||||
|
padding: 1rem 1.5rem |
||||||
|
|
||||||
|
*:last-child |
||||||
|
margin-bottom: 0 |
||||||
@ -0,0 +1,76 @@ |
|||||||
|
|
||||||
|
// Button |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
.button, |
||||||
|
button, |
||||||
|
input[type='button'], |
||||||
|
input[type='reset'], |
||||||
|
input[type='submit'] |
||||||
|
background-color: $color-primary |
||||||
|
border: .1rem solid $color-primary |
||||||
|
border-radius: .4rem |
||||||
|
color: $color-initial |
||||||
|
cursor: pointer |
||||||
|
display: inline-block |
||||||
|
font-size: 1.1rem |
||||||
|
font-weight: 700 |
||||||
|
height: 3.8rem |
||||||
|
letter-spacing: .1rem |
||||||
|
line-height: 3.8rem |
||||||
|
padding: 0 3.0rem |
||||||
|
text-align: center |
||||||
|
text-decoration: none |
||||||
|
text-transform: uppercase |
||||||
|
white-space: nowrap |
||||||
|
|
||||||
|
&:focus, |
||||||
|
&:hover |
||||||
|
background-color: $color-secondary |
||||||
|
border-color: $color-secondary |
||||||
|
color: $color-initial |
||||||
|
outline: 0 |
||||||
|
|
||||||
|
&[disabled] |
||||||
|
cursor: default |
||||||
|
opacity: .5 |
||||||
|
|
||||||
|
&:focus, |
||||||
|
&:hover |
||||||
|
background-color: $color-primary |
||||||
|
border-color: $color-primary |
||||||
|
|
||||||
|
&.button-outline |
||||||
|
background-color: transparent |
||||||
|
color: $color-primary |
||||||
|
|
||||||
|
&:focus, |
||||||
|
&:hover |
||||||
|
background-color: transparent |
||||||
|
border-color: $color-secondary |
||||||
|
color: $color-secondary |
||||||
|
|
||||||
|
&[disabled] |
||||||
|
|
||||||
|
&:focus, |
||||||
|
&:hover |
||||||
|
border-color: inherit |
||||||
|
color: $color-primary |
||||||
|
|
||||||
|
&.button-clear |
||||||
|
background-color: transparent |
||||||
|
border-color: transparent |
||||||
|
color: $color-primary |
||||||
|
|
||||||
|
&:focus, |
||||||
|
&:hover |
||||||
|
background-color: transparent |
||||||
|
border-color: transparent |
||||||
|
color: $color-secondary |
||||||
|
|
||||||
|
&[disabled] |
||||||
|
|
||||||
|
&:focus, |
||||||
|
&:hover |
||||||
|
color: $color-primary |
||||||
|
|
||||||
@ -0,0 +1,22 @@ |
|||||||
|
|
||||||
|
// Code |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
code |
||||||
|
background: $color-tertiary |
||||||
|
border-radius: .4rem |
||||||
|
font-size: 86% |
||||||
|
margin: 0 .2rem |
||||||
|
padding: .2rem .5rem |
||||||
|
white-space: nowrap |
||||||
|
|
||||||
|
pre |
||||||
|
background: $color-tertiary |
||||||
|
border-left: .3rem solid $color-primary |
||||||
|
overflow-y: hidden |
||||||
|
|
||||||
|
& > code |
||||||
|
border-radius: 0 |
||||||
|
display: block |
||||||
|
padding: 1rem 1.5rem |
||||||
|
white-space: pre |
||||||
@ -0,0 +1,12 @@ |
|||||||
|
|
||||||
|
// Color |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
$color-initial: #fafafa !default |
||||||
|
$color-primary: #FF7E5F!default |
||||||
|
$color-secondary: #351C4D !default |
||||||
|
$color-tertiary: #b0b0b0 !default |
||||||
|
$color-quaternary: #d1d1d1 !default |
||||||
|
$color-quinary: #e1e1e1 !default |
||||||
|
$color-background: #fafafa !default |
||||||
|
|
||||||
@ -0,0 +1,8 @@ |
|||||||
|
|
||||||
|
// Divider |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
hr |
||||||
|
border: 0 |
||||||
|
border-top: .1rem solid $color-tertiary |
||||||
|
margin: 3.0rem 0 |
||||||
@ -0,0 +1,67 @@ |
|||||||
|
|
||||||
|
// Form |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
input[type='color'], |
||||||
|
input[type='date'], |
||||||
|
input[type='datetime'], |
||||||
|
input[type='datetime-local'], |
||||||
|
input[type='email'], |
||||||
|
input[type='month'], |
||||||
|
input[type='number'], |
||||||
|
input[type='password'], |
||||||
|
input[type='search'], |
||||||
|
input[type='tel'], |
||||||
|
input[type='text'], |
||||||
|
input[type='url'], |
||||||
|
input[type='week'], |
||||||
|
input:not([type]), |
||||||
|
textarea, |
||||||
|
select |
||||||
|
-webkit-appearance: none // sass-lint:disable-line no-vendor-prefixes |
||||||
|
background-color: transparent |
||||||
|
border: .1rem solid $color-quaternary |
||||||
|
border-radius: .4rem |
||||||
|
box-shadow: none |
||||||
|
box-sizing: inherit // Forced to replace inherit values of the normalize.css |
||||||
|
height: 3.8rem |
||||||
|
padding: .6rem 1.0rem .7rem // This vertically centers text on FF, ignored by Webkit |
||||||
|
width: 100% |
||||||
|
|
||||||
|
&:focus |
||||||
|
border-color: $color-primary |
||||||
|
outline: 0 |
||||||
|
|
||||||
|
select |
||||||
|
background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 8" width="30"><path fill="%23' + str-slice(inspect($color-quaternary), 2) + '" d="M0,0l6,8l6-8"/></svg>') center right no-repeat |
||||||
|
padding-right: 3.0rem |
||||||
|
|
||||||
|
&:focus |
||||||
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 8" width="30"><path fill="%23' + str-slice(inspect($color-primary), 2) + '" d="M0,0l6,8l6-8"/></svg>') |
||||||
|
|
||||||
|
&[multiple] |
||||||
|
background: none |
||||||
|
height: auto |
||||||
|
|
||||||
|
textarea |
||||||
|
min-height: 6.5rem |
||||||
|
|
||||||
|
label, |
||||||
|
legend |
||||||
|
display: block |
||||||
|
font-size: 1.6rem |
||||||
|
font-weight: 700 |
||||||
|
margin-bottom: .5rem |
||||||
|
|
||||||
|
fieldset |
||||||
|
border-width: 0 |
||||||
|
padding: 0 |
||||||
|
|
||||||
|
input[type='checkbox'], |
||||||
|
input[type='radio'] |
||||||
|
display: inline |
||||||
|
|
||||||
|
.label-inline |
||||||
|
display: inline-block |
||||||
|
font-weight: normal |
||||||
|
margin-left: .5rem |
||||||
@ -0,0 +1,164 @@ |
|||||||
|
|
||||||
|
// Grid |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
// .container is main centered wrapper with a max width of 112.0rem (1120px) |
||||||
|
.container |
||||||
|
margin: 0 auto |
||||||
|
max-width: 112.0rem |
||||||
|
padding: 0 2.0rem |
||||||
|
position: relative |
||||||
|
width: 100% |
||||||
|
|
||||||
|
// Using flexbox for the grid, inspired by Philip Walton: |
||||||
|
// http://philipwalton.github.io/solved-by-flexbox/demos/grids/ |
||||||
|
// By default each .column within a .row will evenly take up |
||||||
|
// available width, and the height of each .column with take |
||||||
|
// up the height of the tallest .column in the same .row |
||||||
|
.row |
||||||
|
display: flex |
||||||
|
flex-direction: column |
||||||
|
padding: 0 |
||||||
|
width: 100% |
||||||
|
|
||||||
|
&.row-no-padding |
||||||
|
padding: 0 |
||||||
|
|
||||||
|
&> .column |
||||||
|
padding: 0 |
||||||
|
|
||||||
|
&.row-wrap |
||||||
|
flex-wrap: wrap |
||||||
|
|
||||||
|
// Vertically Align Columns |
||||||
|
// .row-* vertically aligns every .col in the .row |
||||||
|
&.row-top |
||||||
|
align-items: flex-start |
||||||
|
|
||||||
|
&.row-bottom |
||||||
|
align-items: flex-end |
||||||
|
|
||||||
|
&.row-center |
||||||
|
align-items: center |
||||||
|
|
||||||
|
&.row-stretch |
||||||
|
align-items: stretch |
||||||
|
|
||||||
|
&.row-baseline |
||||||
|
align-items: baseline |
||||||
|
|
||||||
|
.column |
||||||
|
display: block |
||||||
|
// IE 11 required specifying the flex-basis otherwise it breaks mobile |
||||||
|
flex: 1 1 auto |
||||||
|
margin-left: 0 |
||||||
|
max-width: 100% |
||||||
|
width: 100% |
||||||
|
|
||||||
|
// Column Offsets |
||||||
|
&.column-offset-10 |
||||||
|
margin-left: 10% |
||||||
|
|
||||||
|
&.column-offset-20 |
||||||
|
margin-left: 20% |
||||||
|
|
||||||
|
&.column-offset-25 |
||||||
|
margin-left: 25% |
||||||
|
|
||||||
|
&.column-offset-33, |
||||||
|
&.column-offset-34 |
||||||
|
margin-left: 33.3333% |
||||||
|
|
||||||
|
&.column-offset-40 |
||||||
|
margin-left: 40% |
||||||
|
|
||||||
|
&.column-offset-50 |
||||||
|
margin-left: 50% |
||||||
|
|
||||||
|
&.column-offset-60 |
||||||
|
margin-left: 60% |
||||||
|
|
||||||
|
&.column-offset-66, |
||||||
|
&.column-offset-67 |
||||||
|
margin-left: 66.6666% |
||||||
|
|
||||||
|
&.column-offset-75 |
||||||
|
margin-left: 75% |
||||||
|
|
||||||
|
&.column-offset-80 |
||||||
|
margin-left: 80% |
||||||
|
|
||||||
|
&.column-offset-90 |
||||||
|
margin-left: 90% |
||||||
|
|
||||||
|
// Explicit Column Percent Sizes |
||||||
|
// By default each grid column will evenly distribute |
||||||
|
// across the grid. However, you can specify individual |
||||||
|
// columns to take up a certain size of the available area |
||||||
|
&.column-10 |
||||||
|
flex: 0 0 10% |
||||||
|
max-width: 10% |
||||||
|
|
||||||
|
&.column-20 |
||||||
|
flex: 0 0 20% |
||||||
|
max-width: 20% |
||||||
|
|
||||||
|
&.column-25 |
||||||
|
flex: 0 0 25% |
||||||
|
max-width: 25% |
||||||
|
|
||||||
|
&.column-33, |
||||||
|
&.column-34 |
||||||
|
flex: 0 0 33.3333% |
||||||
|
max-width: 33.3333% |
||||||
|
|
||||||
|
&.column-40 |
||||||
|
flex: 0 0 40% |
||||||
|
max-width: 40% |
||||||
|
|
||||||
|
&.column-50 |
||||||
|
flex: 0 0 50% |
||||||
|
max-width: 50% |
||||||
|
|
||||||
|
&.column-60 |
||||||
|
flex: 0 0 60% |
||||||
|
max-width: 60% |
||||||
|
|
||||||
|
&.column-66, |
||||||
|
&.column-67 |
||||||
|
flex: 0 0 66.6666% |
||||||
|
max-width: 66.6666% |
||||||
|
|
||||||
|
&.column-75 |
||||||
|
flex: 0 0 75% |
||||||
|
max-width: 75% |
||||||
|
|
||||||
|
&.column-80 |
||||||
|
flex: 0 0 80% |
||||||
|
max-width: 80% |
||||||
|
|
||||||
|
&.column-90 |
||||||
|
flex: 0 0 90% |
||||||
|
max-width: 90% |
||||||
|
|
||||||
|
// .column-* vertically aligns an individual .column |
||||||
|
.column-top |
||||||
|
align-self: flex-start |
||||||
|
|
||||||
|
.column-bottom |
||||||
|
align-self: flex-end |
||||||
|
|
||||||
|
.column-center |
||||||
|
align-self: center |
||||||
|
|
||||||
|
// Larger than mobile screen |
||||||
|
@media (min-width: 40.0rem) // Safari desktop has a bug using `rem`, but Safari mobile works |
||||||
|
|
||||||
|
.row |
||||||
|
flex-direction: row |
||||||
|
margin-left: -1.0rem |
||||||
|
width: calc(100% + 2.0rem) |
||||||
|
|
||||||
|
.column |
||||||
|
margin-bottom: inherit |
||||||
|
padding: 0 1.0rem |
||||||
@ -0,0 +1,6 @@ |
|||||||
|
|
||||||
|
// Image |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
img |
||||||
|
max-width: 100% |
||||||
@ -0,0 +1,11 @@ |
|||||||
|
|
||||||
|
// Link |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
a |
||||||
|
color: $color-primary |
||||||
|
text-decoration: none |
||||||
|
|
||||||
|
&:focus, |
||||||
|
&:hover |
||||||
|
color: $color-secondary |
||||||
@ -0,0 +1,22 @@ |
|||||||
|
|
||||||
|
// List |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
dl, |
||||||
|
ol, |
||||||
|
ul |
||||||
|
list-style: none |
||||||
|
margin-top: 0 |
||||||
|
padding-left: 0 |
||||||
|
|
||||||
|
dl, |
||||||
|
ol, |
||||||
|
ul |
||||||
|
font-size: 90% |
||||||
|
margin: 1.5rem 0 1.5rem 3.0rem |
||||||
|
|
||||||
|
ol |
||||||
|
list-style: decimal inside |
||||||
|
|
||||||
|
ul |
||||||
|
list-style: circle inside |
||||||
@ -0,0 +1,27 @@ |
|||||||
|
|
||||||
|
// Spacing |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
.button, |
||||||
|
button, |
||||||
|
dd, |
||||||
|
dt, |
||||||
|
li |
||||||
|
margin-bottom: 1.0rem |
||||||
|
|
||||||
|
fieldset, |
||||||
|
input, |
||||||
|
select, |
||||||
|
textarea |
||||||
|
margin-bottom: 1.5rem |
||||||
|
|
||||||
|
blockquote, |
||||||
|
dl, |
||||||
|
figure, |
||||||
|
form, |
||||||
|
ol, |
||||||
|
p, |
||||||
|
pre, |
||||||
|
table, |
||||||
|
ul |
||||||
|
margin-bottom: 2.5rem |
||||||
@ -0,0 +1,27 @@ |
|||||||
|
|
||||||
|
// Table |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
table |
||||||
|
border-spacing: 0 |
||||||
|
display: block |
||||||
|
overflow-x: auto |
||||||
|
text-align: left |
||||||
|
width: 100% |
||||||
|
|
||||||
|
td, |
||||||
|
th |
||||||
|
border-bottom: .1rem solid $color-quinary |
||||||
|
padding: 1.2rem 1.5rem |
||||||
|
|
||||||
|
&:first-child |
||||||
|
padding-left: 0 |
||||||
|
|
||||||
|
&:last-child |
||||||
|
padding-right: 0 |
||||||
|
|
||||||
|
@media (min-width: 40.0rem) |
||||||
|
|
||||||
|
table |
||||||
|
display: table |
||||||
|
overflow-x: initial |
||||||
@ -0,0 +1,48 @@ |
|||||||
|
|
||||||
|
// Typography |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
b, |
||||||
|
strong |
||||||
|
font-weight: bold |
||||||
|
|
||||||
|
p |
||||||
|
margin-top: 0 |
||||||
|
|
||||||
|
h1, |
||||||
|
h2, |
||||||
|
h3, |
||||||
|
h4, |
||||||
|
h5, |
||||||
|
h6 |
||||||
|
font-weight: 300 |
||||||
|
letter-spacing: -.1rem |
||||||
|
margin-bottom: 2.0rem |
||||||
|
margin-top: 0 |
||||||
|
|
||||||
|
h1 |
||||||
|
font-size: 4.6rem |
||||||
|
line-height: 1.2 |
||||||
|
|
||||||
|
h2 |
||||||
|
font-size: 3.6rem |
||||||
|
line-height: 1.25 |
||||||
|
|
||||||
|
h3 |
||||||
|
font-size: 2.8rem |
||||||
|
line-height: 1.3 |
||||||
|
|
||||||
|
h4 |
||||||
|
font-size: 2.2rem |
||||||
|
letter-spacing: -.08rem |
||||||
|
line-height: 1.35 |
||||||
|
|
||||||
|
h5 |
||||||
|
font-size: 1.8rem |
||||||
|
letter-spacing: -.05rem |
||||||
|
line-height: 1.5 |
||||||
|
|
||||||
|
h6 |
||||||
|
font-size: 1.6rem |
||||||
|
letter-spacing: 0 |
||||||
|
line-height: 1.4 |
||||||
@ -0,0 +1,18 @@ |
|||||||
|
|
||||||
|
// Utility |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
// Clear a float with .clearfix |
||||||
|
.clearfix |
||||||
|
|
||||||
|
&:after |
||||||
|
clear: both |
||||||
|
content: ' ' // The space content is one way to avoid an Opera bug. |
||||||
|
display: table |
||||||
|
|
||||||
|
// Float either direction |
||||||
|
.float-left |
||||||
|
float: left |
||||||
|
|
||||||
|
.float-right |
||||||
|
float: right |
||||||
@ -0,0 +1,19 @@ |
|||||||
|
|
||||||
|
// Modules |
||||||
|
// –––––––––––––––––––––––––––––––––––––––––––––––––– |
||||||
|
|
||||||
|
@import _Color |
||||||
|
@import _Base |
||||||
|
@import _Blockquote |
||||||
|
@import _Button |
||||||
|
@import _Code |
||||||
|
@import _Divider |
||||||
|
@import _Form |
||||||
|
@import _Grid |
||||||
|
@import _Link |
||||||
|
@import _List |
||||||
|
@import _Spacing |
||||||
|
@import _Table |
||||||
|
@import _Typography |
||||||
|
@import _Image |
||||||
|
@import _Utility |
||||||
Loading…
Reference in new issue