diff options
author | sadbeast <sadbeast@sadbeast.com> | 2024-01-31 17:47:56 -0800 |
---|---|---|
committer | sadbeast <sadbeast@sadbeast.com> | 2024-01-31 17:47:56 -0800 |
commit | 332ec93366315fa1ed7b4acd7a3407c96e8ddfa7 (patch) | |
tree | 6ae553317f12a7a6a29c849c8805ffab96436dc2 /app/assets/stylesheets/content | |
download | td-main.tar.gz td-main.tar.bz2 |
Diffstat (limited to 'app/assets/stylesheets/content')
-rw-r--r-- | app/assets/stylesheets/content/_button.scss | 183 | ||||
-rw-r--r-- | app/assets/stylesheets/content/_code.scss | 91 | ||||
-rw-r--r-- | app/assets/stylesheets/content/_embedded.scss | 48 | ||||
-rw-r--r-- | app/assets/stylesheets/content/_form-alt-input-types.scss | 286 | ||||
-rw-r--r-- | app/assets/stylesheets/content/_form-checkbox-radio.scss | 138 | ||||
-rw-r--r-- | app/assets/stylesheets/content/_form.scss | 352 | ||||
-rw-r--r-- | app/assets/stylesheets/content/_miscs.scss | 33 | ||||
-rw-r--r-- | app/assets/stylesheets/content/_table.scss | 50 | ||||
-rw-r--r-- | app/assets/stylesheets/content/_typography.scss | 264 |
9 files changed, 1445 insertions, 0 deletions
diff --git a/app/assets/stylesheets/content/_button.scss b/app/assets/stylesheets/content/_button.scss new file mode 100644 index 0000000..075a166 --- /dev/null +++ b/app/assets/stylesheets/content/_button.scss @@ -0,0 +1,183 @@ +/** + * Button + */ + +// Reboot based on : +// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css +// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css +// –––––––––––––––––––– + +// 1. Change the font styles in all browsers +// 2. Remove the margin on controls in Safari +// 3. Show the overflow in Edge +button { + margin: 0; // 2 + overflow: visible; // 3 + font-family: inherit; // 1 + text-transform: none; // 1 +} + +// Correct the inability to style buttons in iOS and Safari +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +// Pico +// –––––––––––––––––––– + +button { + display: block; + width: 100%; + margin-bottom: var(--spacing); +} + +[role="button"] { + display: inline-block; + text-decoration: none; +} + +button, +input[type="submit"], +input[type="button"], +input[type="reset"], +[role="button"] { + --background-color: var(--primary); + --border-color: var(--primary); + --color: var(--primary-inverse); + --box-shadow: var(--button-box-shadow, 0 0 0 rgba(0, 0, 0, 0)); + padding: var(--form-element-spacing-vertical) + var(--form-element-spacing-horizontal); + border: var(--border-width) solid var(--border-color); + border-radius: var(--border-radius); + outline: none; + background-color: var(--background-color); + box-shadow: var(--box-shadow); + color: var(--color); + font-weight: var(--font-weight); + font-size: 1rem; + line-height: var(--line-height); + text-align: center; + cursor: pointer; + + @if $enable-transitions { + transition: background-color var(--transition), + border-color var(--transition), color var(--transition), + box-shadow var(--transition); + } + + &:is([aria-current], :hover, :active, :focus) { + --background-color: var(--primary-hover); + --border-color: var(--primary-hover); + --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)); + --color: var(--primary-inverse); + } + + &:focus { + --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)), + 0 0 0 var(--outline-width) var(--primary-focus); + } +} + +// .secondary, .contrast & .outline +@if $enable-classes { + + // Secondary + :is(button, input[type="submit"], input[type="button"], [role="button"]).secondary, + input[type="reset"] { + --background-color: var(--secondary); + --border-color: var(--secondary); + --color: var(--secondary-inverse); + cursor: pointer; + + &:is([aria-current], :hover, :active, :focus) { + --background-color: var(--secondary-hover); + --border-color: var(--secondary-hover); + --color: var(--secondary-inverse); + } + + &:focus { + --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)), + 0 0 0 var(--outline-width) var(--secondary-focus); + } + } + + // Contrast + :is(button, input[type="submit"], input[type="button"], [role="button"]).contrast { + --background-color: var(--contrast); + --border-color: var(--contrast); + --color: var(--contrast-inverse); + + &:is([aria-current], :hover, :active, :focus) { + --background-color: var(--contrast-hover); + --border-color: var(--contrast-hover); + --color: var(--contrast-inverse); + } + + &:focus { + --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)), + 0 0 0 var(--outline-width) var(--contrast-focus); + } + } + + // Outline (primary) + :is(button, input[type="submit"], input[type="button"], [role="button"]).outline, + input[type="reset"].outline { + --background-color: transparent; + --color: var(--primary); + + &:is([aria-current], :hover, :active, :focus) { + --background-color: transparent; + --color: var(--primary-hover); + } + } + + // Outline (secondary) + :is(button, input[type="submit"], input[type="button"], [role="button"]).outline.secondary, + input[type="reset"].outline { + --color: var(--secondary); + + &:is([aria-current], :hover, :active, :focus) { + --color: var(--secondary-hover); + } + } + + // Outline (contrast) + :is(button, input[type="submit"], input[type="button"], [role="button"]).outline.contrast { + --color: var(--contrast); + + &:is([aria-current], :hover, :active, :focus) { + --color: var(--contrast-hover); + } + } +} +@else { + // Secondary button without .class + input[type="reset"] { + --background-color: var(--secondary); + --border-color: var(--secondary); + --color: var(--secondary-inverse); + cursor: pointer; + + &:is([aria-current], :hover, :active, :focus) { + --background-color: var(--secondary-hover); + --border-color: var(--secondary-hover); + } + + &:focus { + --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)), + 0 0 0 var(--outline-width) var(--secondary-focus); + } + } +} + +// Button [disabled] +// Links without href are disabled by default +:where(button, [type="submit"], [type="button"], [type="reset"], [role="button"])[disabled], +:where(fieldset[disabled]) :is(button, [type="submit"], [type="button"], [type="reset"], [role="button"]), +a[role="button"]:not([href]) { + opacity: 0.5; + pointer-events: none; +} diff --git a/app/assets/stylesheets/content/_code.scss b/app/assets/stylesheets/content/_code.scss new file mode 100644 index 0000000..e03b191 --- /dev/null +++ b/app/assets/stylesheets/content/_code.scss @@ -0,0 +1,91 @@ +/** + * Code + */ + +// Reboot based on : +// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css +// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css +// –––––––––––––––––––– + +// 1. Correct the inheritance and scaling of font size in all browsers +// 2. Correct the odd `em` font sizing in all browsers +pre, +code, +kbd, +samp { + font-size: 0.875em; // 2 + font-family: var(--font-family); // 1 +} + +// Prevent overflow of the container in all browsers (opinionated) +pre { + -ms-overflow-style: scrollbar; + overflow: auto; +} + +// Pico +// –––––––––––––––––––– + +pre, +code, +kbd { + border-radius: var(--border-radius); + background: var(--code-background-color); + color: var(--code-color); + font-weight: var(--font-weight); + line-height: initial; +} + +code, +kbd { + display: inline-block; + padding: 0.375rem 0.5rem; +} + +pre { + display: block; + margin-bottom: var(--spacing); + overflow-x: auto; + + > code { + display: block; + padding: var(--spacing); + background: none; + font-size: 14px; + line-height: var(--line-height); + } +} + +// Code Syntax +code { + // Tags + b { + color: var(--code-tag-color); + font-weight: var(--font-weight); + } + + // Properties + i { + color: var(--code-property-color); + font-style: normal; + } + + // Values + u { + color: var(--code-value-color); + text-decoration: none; + } + + // Comments + em { + color: var(--code-comment-color); + font-style: normal; + } +} + +// kbd +kbd { + background-color: var(--code-kbd-background-color); + color: var(--code-kbd-color); + vertical-align: baseline; +} diff --git a/app/assets/stylesheets/content/_embedded.scss b/app/assets/stylesheets/content/_embedded.scss new file mode 100644 index 0000000..d48293b --- /dev/null +++ b/app/assets/stylesheets/content/_embedded.scss @@ -0,0 +1,48 @@ +/** + * Embedded content + */ + +// Reboot based on : +// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css +// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css +// –––––––––––––––––––– + +// Change the alignment on media elements in all browsers (opinionated) +:where(audio, canvas, iframe, img, svg, video) { + vertical-align: middle; +} + +// Add the correct display in IE 9- +audio, +video { + display: inline-block; +} + +// Add the correct display in iOS 4-7 +audio:not([controls]) { + display: none; + height: 0; +} + +// Remove the border on iframes in all browsers (opinionated) +:where(iframe) { + border-style: none; +} + +// 1. Remove the border on images inside links in IE 10. +// 2. Responsive by default +img { + max-width: 100%; // 2 + height: auto; // 2 + border-style: none; // 1 +} + +// Change the fill color to match the text color in all browsers (opinionated) +:where(svg:not([fill])) { + fill: currentColor; +} + +// Hide the overflow in IE +svg:not(:root) { + overflow: hidden; +} diff --git a/app/assets/stylesheets/content/_form-alt-input-types.scss b/app/assets/stylesheets/content/_form-alt-input-types.scss new file mode 100644 index 0000000..f22151e --- /dev/null +++ b/app/assets/stylesheets/content/_form-alt-input-types.scss @@ -0,0 +1,286 @@ +/** + * Form elements + * Alternatives input types (Not Checkboxes & Radios) + */ + +// Color +[type="color"] { + // Wrapper + @mixin color-wrapper { + padding: 0; + } + + &::-webkit-color-swatch-wrapper { + @include color-wrapper; + } + + &::-moz-focus-inner { + @include color-wrapper; + } + + // Swatch + @mixin color-swatch { + border: 0; + border-radius: calc(var(--border-radius) * 0.5); + } + + &::-webkit-color-swatch { + @include color-swatch; + } + + &::-moz-color-swatch { + @include color-swatch; + } +} + +// Date & Time +// :not() are needed to add Specificity and avoid !important on padding +input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]) { + &:is([type="date"], [type="datetime-local"], [type="month"], [type="time"], [type="week"]) { + --icon-position: 0.75rem; + --icon-width: 1rem; + padding-right: calc(var(--icon-width) + var(--icon-position)); + background-image: var(--icon-date); + background-position: center right var(--icon-position); + background-size: var(--icon-width) auto; + background-repeat: no-repeat; + } + + // Time + &[type="time"] { + background-image: var(--icon-time); + } +} + +// Calendar picker +[type="date"], +[type="datetime-local"], +[type="month"], +[type="time"], +[type="week"] { + &::-webkit-calendar-picker-indicator { + width: var(--icon-width); + margin-right: calc(var(--icon-width) * -1); + margin-left: var(--icon-position); + opacity: 0; + } +} + +[dir="rtl"] + :is([type="date"], [type="datetime-local"], [type="month"], [type="time"], [type="week"]) { + text-align: right; +} + +// Calendar icons are hidden in Firefox +@if $enable-important { + @-moz-document url-prefix() { + [type="date"], + [type="datetime-local"], + [type="month"], + [type="time"], + [type="week"] { + padding-right: var(--form-element-spacing-horizontal) !important; + background-image: none !important; + } + } +} + +// File +[type="file"] { + --color: var(--muted-color); + padding: calc(var(--form-element-spacing-vertical) * 0.5) 0; + border: 0; + border-radius: 0; + background: none; + + @mixin file-selector-button { + --background-color: var(--secondary); + --border-color: var(--secondary); + --color: var(--secondary-inverse); + margin-right: calc(var(--spacing) / 2); + margin-left: 0; + margin-inline-start: 0; + margin-inline-end: calc(var(--spacing) / 2); + padding: calc(var(--form-element-spacing-vertical) * 0.5) + calc(var(--form-element-spacing-horizontal) * 0.5); + border: var(--border-width) solid var(--border-color); + border-radius: var(--border-radius); + outline: none; + background-color: var(--background-color); + box-shadow: var(--box-shadow); + color: var(--color); + font-weight: var(--font-weight); + font-size: 1rem; + line-height: var(--line-height); + text-align: center; + cursor: pointer; + + @if $enable-transitions { + transition: background-color var(--transition), + border-color var(--transition), color var(--transition), + box-shadow var(--transition); + } + + &:is(:hover, :active, :focus) { + --background-color: var(--secondary-hover); + --border-color: var(--secondary-hover); + } + } + + &::file-selector-button { + @include file-selector-button; + } + + &::-webkit-file-upload-button { + @include file-selector-button; + } + + &::-ms-browse { + @include file-selector-button; + } +} + +// Range +[type="range"] { + // Config + $height-track: 0.25rem; + $height-thumb: 1.25rem; + $border-thumb: 2px; + + // Styles + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + width: 100%; + height: $height-thumb; + background: none; + + // Slider Track + @mixin slider-track { + width: 100%; + height: $height-track; + border-radius: var(--border-radius); + background-color: var(--range-border-color); + + @if $enable-transitions { + transition: background-color var(--transition), + box-shadow var(--transition); + } + } + + &::-webkit-slider-runnable-track { + @include slider-track; + } + + &::-moz-range-track { + @include slider-track; + } + + &::-ms-track { + @include slider-track; + } + + // Slider Thumb + @mixin slider-thumb { + -webkit-appearance: none; + width: $height-thumb; + height: $height-thumb; + margin-top: #{(-($height-thumb * 0.5) + ($height-track * 0.5))}; + border: $border-thumb solid var(--range-thumb-border-color); + border-radius: 50%; + background-color: var(--range-thumb-color); + cursor: pointer; + + @if $enable-transitions { + transition: background-color var(--transition), + transform var(--transition); + } + } + &::-webkit-slider-thumb { + @include slider-thumb; + } + + &::-moz-range-thumb { + @include slider-thumb; + } + + &::-ms-thumb { + @include slider-thumb; + } + + &:hover, + &:focus { + --range-border-color: var(--range-active-border-color); + --range-thumb-color: var(--range-thumb-hover-color); + } + + &:active { + --range-thumb-color: var(--range-thumb-active-color); + + // Slider Thumb + &::-webkit-slider-thumb { + transform: scale(1.25); + } + + &::-moz-range-thumb { + transform: scale(1.25); + } + + &::-ms-thumb { + transform: scale(1.25); + } + } +} + +// Search +// :not() are needed to add Specificity and avoid !important on padding +input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]) { + &[type="search"] { + padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem); + border-radius: 5rem; + background-image: var(--icon-search); + background-position: center left 1.125rem; + background-size: 1rem auto; + background-repeat: no-repeat; + + &[aria-invalid] { + @if $enable-important { + padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem) !important; + } + @else { + padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem); + } + background-position: center left 1.125rem, center right 0.75rem; + } + + &[aria-invalid="false"] { + background-image: var(--icon-search), var(--icon-valid); + } + + &[aria-invalid="true"] { + background-image: var(--icon-search), var(--icon-invalid); + } + } +} + +// Cancel button +[type="search"] { + &::-webkit-search-cancel-button { + -webkit-appearance: none; + display: none; + } +} + +[dir="rtl"] { + :where(input) { + &:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]) { + &[type="search"] { + background-position: center right 1.125rem; + + &[aria-invalid] { + background-position: center right 1.125rem, center left 0.75rem; + } + } + } + } +} diff --git a/app/assets/stylesheets/content/_form-checkbox-radio.scss b/app/assets/stylesheets/content/_form-checkbox-radio.scss new file mode 100644 index 0000000..c83d35e --- /dev/null +++ b/app/assets/stylesheets/content/_form-checkbox-radio.scss @@ -0,0 +1,138 @@ +/** + * Form elements + * Checkboxes & Radios + */ + +[type="checkbox"], +[type="radio"] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + width: 1.25em; + height: 1.25em; + margin-top: -0.125em; + margin-right: 0.375em; + margin-left: 0; + margin-inline-start: 0; + margin-inline-end: 0.375em; + border-width: var(--border-width); + font-size: inherit; + vertical-align: middle; + cursor: pointer; + + &::-ms-check { + display: none; // unstyle IE checkboxes + } + + &:checked, + &:checked:active, + &:checked:focus { + --background-color: var(--primary); + --border-color: var(--primary); + background-image: var(--icon-checkbox); + background-position: center; + background-size: 0.75em auto; + background-repeat: no-repeat; + } + + & ~ label { + display: inline-block; + margin-right: 0.375em; + margin-bottom: 0; + cursor: pointer; + } +} + +// Checkboxes +[type="checkbox"] { + &:indeterminate { + --background-color: var(--primary); + --border-color: var(--primary); + background-image: var(--icon-minus); + background-position: center; + background-size: 0.75em auto; + background-repeat: no-repeat; + } +} + +// Radios +[type="radio"] { + border-radius: 50%; + + &:checked, + &:checked:active, + &:checked:focus { + --background-color: var(--primary-inverse); + border-width: 0.35em; + background-image: none; + } +} + +// Switchs +[type="checkbox"][role="switch"] { + --background-color: var(--switch-background-color); + --border-color: var(--switch-background-color); + --color: var(--switch-color); + + // Config + $switch-height: 1.25em; + $switch-width: 2.25em; + $switch-transition: 0.1s ease-in-out; + + // Styles + width: $switch-width; + height: $switch-height; + border: var(--border-width) solid var(--border-color); + border-radius: $switch-height; + background-color: var(--background-color); + line-height: $switch-height; + + &:focus { + --background-color: var(--switch-background-color); + --border-color: var(--switch-background-color); + } + + &:checked { + --background-color: var(--switch-checked-background-color); + --border-color: var(--switch-checked-background-color); + } + + &:before { + display: block; + width: calc(#{$switch-height} - (var(--border-width) * 2)); + height: 100%; + border-radius: 50%; + background-color: var(--color); + content: ""; + + @if $enable-transitions { + transition: margin $switch-transition; + } + } + + &:checked { + background-image: none; + + &::before { + margin-left: calc(#{$switch-width * 0.5} - var(--border-width)); + margin-inline-start: calc(#{$switch-width * 0.5} - var(--border-width)); + } + } +} + +// Aria-invalid +[type="checkbox"], +[type="checkbox"]:checked, +[type="radio"], +[type="radio"]:checked, +[type="checkbox"][role="switch"], +[type="checkbox"][role="switch"]:checked { + + &[aria-invalid="false"] { + --border-color: var(--form-element-valid-border-color); + } + + &[aria-invalid="true"] { + --border-color: var(--form-element-invalid-border-color); + } +}
\ No newline at end of file diff --git a/app/assets/stylesheets/content/_form.scss b/app/assets/stylesheets/content/_form.scss new file mode 100644 index 0000000..1dda8f3 --- /dev/null +++ b/app/assets/stylesheets/content/_form.scss @@ -0,0 +1,352 @@ +/** + * Form elements + */ + +// Reboot based on : +// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css +// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css +// –––––––––––––––––––– + +// 1. Change the font styles in all browsers +// 2. Remove the margin in Firefox and Safari +input, +optgroup, +select, +textarea { + margin: 0; // 2 + font-size: 1rem; // 1 + line-height: var(--line-height); // 1 + font-family: inherit; // 1 + letter-spacing: inherit; // 2 +} + +// Show the overflow in IE. +input { + overflow: visible; +} + +// Remove the inheritance of text transform in Edge, Firefox, and IE +select { + text-transform: none; +} + +// 1. Correct the text wrapping in Edge and IE +// 2. Correct the color inheritance from `fieldset` elements in IE +// 3. Remove the padding so developers are not caught out when they zero out +// `fieldset` elements in all browsers +legend { + max-width: 100%; // 1 + padding: 0; // 3 + color: inherit; // 2 + white-space: normal; // 1 +} + +// 1. Remove the default vertical scrollbar in IE +textarea { + overflow: auto; // 1 +} + +// Remove the padding in IE 10 +[type="checkbox"], +[type="radio"] { + padding: 0; +} + +// Correct the cursor style of increment and decrement buttons in Safari +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +// 1. Correct the odd appearance in Chrome and Safari +// 2. Correct the outline style in Safari +[type="search"] { + -webkit-appearance: textfield; // 1 + outline-offset: -2px; // 2 +} + +// Remove the inner padding in Chrome and Safari on macOS +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +// 1. Correct the inability to style clickable types in iOS and Safari +// 2. Change font properties to `inherit` in Safari +::-webkit-file-upload-button { + -webkit-appearance: button; // 1 + font: inherit; // 2 +} + +// Remove the inner border and padding of focus outlines in Firefox +::-moz-focus-inner { + padding: 0; + border-style: none; +} + +// Remove the focus outline in Firefox +:-moz-focusring { + outline: none; +} + +// Remove the additional :invalid styles in Firefox +:-moz-ui-invalid { + box-shadow: none; +} + +// Change the inconsistent appearance in IE (opinionated) +::-ms-expand { + display: none; +} + +// Remove the border and padding in all browsers (opinionated) +[type="file"], +[type="range"] { + padding: 0; + border-width: 0; +} + +// Pico +// –––––––––––––––––––– + +// Force height for alternatives input types +input:not([type="checkbox"], [type="radio"], [type="range"]) { + height: calc( + (1rem * var(--line-height)) + (var(--form-element-spacing-vertical) * 2) + + (var(--border-width) * 2) + ); +} + +// Fieldset +fieldset { + margin: 0; + margin-bottom: var(--spacing); + padding: 0; + border: 0; +} + +// Label & legend +label, +fieldset legend { + display: block; + margin-bottom: calc(var(--spacing) * 0.25); + font-weight: var(--form-label-font-weight, var(--font-weight)); +} + +// Blocks, 100% +input:not([type="checkbox"], [type="radio"]), +select, +textarea { + width: 100%; +} + +// Reset appearance (Not Checkboxes, Radios, Range and File) +input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]), +select, +textarea { + appearance: none; + padding: var(--form-element-spacing-vertical) + var(--form-element-spacing-horizontal); +} + +// Commons styles +input, +select, +textarea { + --background-color: var(--form-element-background-color); + --border-color: var(--form-element-border-color); + --color: var(--form-element-color); + --box-shadow: none; + border: var(--border-width) solid var(--border-color); + border-radius: var(--border-radius); + outline: none; + background-color: var(--background-color); + box-shadow: var(--box-shadow); + color: var(--color); + font-weight: var(--font-weight); + + @if $enable-transitions { + transition: background-color var(--transition), + border-color var(--transition), color var(--transition), + box-shadow var(--transition); + } +} + +// Active & Focus +input:not([type="submit"], [type="button"], [type="reset"], [type="checkbox"], [type="radio"], [readonly]), +:where(select, textarea) { + &:is(:active, :focus) { + --background-color: var(--form-element-active-background-color); + } +} + +// Active & Focus +input:not([type="submit"], [type="button"], [type="reset"], [role="switch"], [readonly]), +:where(select, textarea) { + &:is(:active, :focus) { + --border-color: var(--form-element-active-border-color); + } +} + +// Focus +input:not([type="submit"], [type="button"], [type="reset"], [type="range"], [type="file"], [readonly]), +select, +textarea { + &:focus { + --box-shadow: 0 0 0 var(--outline-width) var(--form-element-focus-color); + } +} + +// Disabled +input:not([type="submit"], [type="button"], [type="reset"])[disabled], +select[disabled], +textarea[disabled], +:where(fieldset[disabled]) :is(input:not([type="submit"], [type="button"], [type="reset"]), select, textarea) { + --background-color: var(--form-element-disabled-background-color); + --border-color: var(--form-element-disabled-border-color); + opacity: var(--form-element-disabled-opacity); + pointer-events: none; +} + +// Aria-invalid +:where(input, select, textarea) { + &:not([type="checkbox"], [type="radio"], [type="date"], [type="datetime-local"], [type="month"], [type="time"], [type="week"]) { + &[aria-invalid] { + @if $enable-important { + padding-right: calc( + var(--form-element-spacing-horizontal) + 1.5rem + ) !important; + padding-left: var(--form-element-spacing-horizontal); + padding-inline-start: var(--form-element-spacing-horizontal) !important; + padding-inline-end: calc( + var(--form-element-spacing-horizontal) + 1.5rem + ) !important; + } + @else { + padding-right: calc(var(--form-element-spacing-horizontal) + 1.5rem); + padding-left: var(--form-element-spacing-horizontal); + padding-inline-start: var(--form-element-spacing-horizontal); + padding-inline-end: calc(var(--form-element-spacing-horizontal) + 1.5rem); + } + background-position: center right 0.75rem; + background-size: 1rem auto; + background-repeat: no-repeat; + } + + &[aria-invalid="false"] { + background-image: var(--icon-valid); + } + + &[aria-invalid="true"] { + background-image: var(--icon-invalid); + } + } + + &[aria-invalid="false"] { + --border-color: var(--form-element-valid-border-color); + + &:is(:active, :focus) { + @if $enable-important { + --border-color: var(--form-element-valid-active-border-color) !important; + --box-shadow: 0 0 0 var(--outline-width) var(--form-element-valid-focus-color) !important; + } + @else { + --border-color: var(--form-element-valid-active-border-color); + --box-shadow: 0 0 0 var(--outline-width) var(--form-element-valid-focus-color); + } + } + } + + &[aria-invalid="true"] { + --border-color: var(--form-element-invalid-border-color); + + &:is(:active, :focus) { + @if $enable-important { + --border-color: var(--form-element-invalid-active-border-color) !important; + --box-shadow: 0 0 0 var(--outline-width) var(--form-element-invalid-focus-color) !important; + } + @else { + --border-color: var(--form-element-invalid-active-border-color); + --box-shadow: 0 0 0 var(--outline-width) var(--form-element-invalid-focus-color); + } + } + } +} + +[dir="rtl"] { + :where(input, select, textarea) { + &:not([type="checkbox"], [type="radio"]) { + &:is([aria-invalid], [aria-invalid="true"], [aria-invalid="false"] ){ + background-position: center left 0.75rem; + } + } + } +} + +// Placeholder +input::placeholder, +input::-webkit-input-placeholder, +textarea::placeholder, +textarea::-webkit-input-placeholder, +select:invalid { + color: var(--form-element-placeholder-color); + opacity: 1; +} + +// Margin bottom (Not Checkboxes and Radios) +input:not([type="checkbox"], [type="radio"]), +select, +textarea { + margin-bottom: var(--spacing); +} + +// Select +select { + // Unstyle the caret on `<select>`s in IE10+. + &::-ms-expand { + border: 0; + background-color: transparent; + } + + &:not([multiple], [size]) { + padding-right: calc(var(--form-element-spacing-horizontal) + 1.5rem); + padding-left: var(--form-element-spacing-horizontal); + padding-inline-start: var(--form-element-spacing-horizontal); + padding-inline-end: calc(var(--form-element-spacing-horizontal) + 1.5rem); + background-image: var(--icon-chevron); + background-position: center right 0.75rem; + background-size: 1rem auto; + background-repeat: no-repeat; + } +} + +[dir="rtl"] { + select { + &:not([multiple], [size]) { + background-position: center left 0.75rem; + } + } +} + +// Helper +$inputs: "input, select, textarea"; + +@if ($enable-classes and $enable-grid) { + $inputs: $inputs + ", .grid"; +} + +:where(#{$inputs}) { + + small { + display: block; + width: 100%; + margin-top: calc(var(--spacing) * -0.75); + margin-bottom: var(--spacing); + color: var(--muted-color); + } +} + +// Styles for Input inside a label +label { + > :where(input, select, textarea) { + margin-top: calc(var(--spacing) * 0.25); + } +} diff --git a/app/assets/stylesheets/content/_miscs.scss b/app/assets/stylesheets/content/_miscs.scss new file mode 100644 index 0000000..526baba --- /dev/null +++ b/app/assets/stylesheets/content/_miscs.scss @@ -0,0 +1,33 @@ +/** + * Miscs + */ + +// Reboot based on : +// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css +// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css +// –––––––––––––––––––– + +// 1. Correct the inheritance of border color in Firefox +// 2. Add the correct box sizing in Firefox +hr { + height: 0; // 2 + border: 0; + border-top: 1px solid var(--muted-border-color); + color: inherit; // 1 +} + +// Add the correct display in IE 10+ +[hidden], +template { + @if $enable-important { + display: none !important; + } + @else { + display: none; + } +} + +// Add the correct display in IE 9- +canvas { + display: inline-block; +} diff --git a/app/assets/stylesheets/content/_table.scss b/app/assets/stylesheets/content/_table.scss new file mode 100644 index 0000000..d70cfd7 --- /dev/null +++ b/app/assets/stylesheets/content/_table.scss @@ -0,0 +1,50 @@ +/** + * Table + */ + +// Reboot based on : +// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css +// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css +// –––––––––––––––––––– + +// 1. Collapse border spacing in all browsers (opinionated) +// 2. Remove text indentation from table contents in Chrome, Edge, and Safari +:where(table) { + width: 100%; + border-collapse: collapse; // 1 + border-spacing: 0; + text-indent: 0; // 2 +} + +// Pico +// –––––––––––––––––––– + +// Cells +th, +td { + padding: calc(var(--spacing) / 2) var(--spacing); + border-bottom: var(--border-width) solid var(--table-border-color); + color: var(--color); + font-weight: var(--font-weight); + font-size: var(--font-size); + text-align: left; + text-align: start; +} + +// Footer +tfoot { + th, + td { + border-top: var(--border-width) solid var(--table-border-color); + border-bottom: 0; + } +} + +// Striped +table { + &[role="grid"] { + tbody tr:nth-child(odd) { + background-color: var(--table-row-stripped-background-color); + } + } +} diff --git a/app/assets/stylesheets/content/_typography.scss b/app/assets/stylesheets/content/_typography.scss new file mode 100644 index 0000000..a9ed71b --- /dev/null +++ b/app/assets/stylesheets/content/_typography.scss @@ -0,0 +1,264 @@ +/** + * Typography + */ + +// Reboot based on : +// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css +// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css +// –––––––––––––––––––– + +// Add the correct font weight in Chrome, Edge, and Safari +b, +strong { + font-weight: bolder; +} + +// Prevent `sub` and `sup` elements from affecting the line height in all browsers +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} + +// Pico +// –––––––––––––––––––– + +address, +blockquote, +dl, +figure, +form, +ol, +p, +pre, +table, +ul { + margin-top: 0; + margin-bottom: var(--typography-spacing-vertical); + color: var(--color); + font-style: normal; + font-weight: var(--font-weight); + font-size: var(--font-size); +} + +// Links +// 1. Remove the gray background on active links in IE 10 +a, +[role="link"] { + --color: var(--primary); + --background-color: transparent; + outline: none; + background-color: var(--background-color); // 1 + color: var(--color); + text-decoration: var(--text-decoration); + + @if $enable-transitions { + transition: background-color var(--transition), color var(--transition), + text-decoration var(--transition), box-shadow var(--transition); + } + + &:is([aria-current], :hover, :active, :focus) { + --color: var(--primary-hover); + --text-decoration: underline; + } + + &:focus { + --background-color: var(--primary-focus); + } + + @if $enable-classes { + // Secondary + &.secondary { + --color: var(--secondary); + + &:is([aria-current], :hover, :active, :focus) { + --color: var(--secondary-hover); + } + + &:focus { + --background-color: var(--secondary-focus); + } + } + + // Contrast + &.contrast { + --color: var(--contrast); + + &:is([aria-current], :hover, :active, :focus) { + --color: var(--contrast-hover); + } + + &:focus { + --background-color: var(--contrast-focus); + } + } + } +} + +// Headings +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: var(--typography-spacing-vertical); + color: var(--color); + font-weight: var(--font-weight); + font-size: var(--font-size); + font-family: var(--font-family); +} + +h1 { + --color: var(--h1-color); +} +h2 { + --color: var(--h2-color); +} +h3 { + --color: var(--h3-color); +} +h4 { + --color: var(--h4-color); +} +h5 { + --color: var(--h5-color); +} +h6 { + --color: var(--h6-color); +} + +// Margin-top for headings after a typography block +:where(address, blockquote, dl, figure, form, ol, p, pre, table, ul) { + ~ :is(h1, h2, h3, h4, h5, h6) { + margin-top: var(--typography-spacing-vertical); + } +} + +// Heading group +@if $enable-classes == false { + hgroup { + margin-bottom: var(--typography-spacing-vertical); + + > * { + margin-bottom: 0; + } + + > *:last-child { + --color: var(--muted-color); + --font-weight: unset; + font-size: 1rem; + font-family: unset; + } + } +} + +@if $enable-classes { + hgroup, + .headings { + margin-bottom: var(--typography-spacing-vertical); + + > * { + margin-bottom: 0; + } + + > *:last-child { + --color: var(--muted-color); + --font-weight: unset; + font-size: 1rem; + font-family: unset; + } + } +} + +// Paragraphs +p { + margin-bottom: var(--typography-spacing-vertical); +} + +// Small +small { + font-size: var(--font-size); +} + +// Lists +:where(dl, ol, ul) { + padding-right: 0; + padding-left: var(--spacing); + padding-inline-start: var(--spacing); + padding-inline-end: 0; + + li { + margin-bottom: calc(var(--typography-spacing-vertical) * 0.25); + } +} + +// Margin-top for nested lists +// 1. Remove the margin on nested lists in Chrome, Edge, IE, and Safari +:where(dl, ol, ul) { + :is(dl, ol, ul) { + margin: 0; // 1 + margin-top: calc(var(--typography-spacing-vertical) * 0.25); + } +} + +ul li { + list-style: square; +} + +// Highlighted text +mark { + padding: 0.125rem 0.25rem; + background-color: var(--mark-background-color); + color: var(--mark-color); + vertical-align: baseline; +} + +// Blockquote +blockquote { + display: block; + margin: var(--typography-spacing-vertical) 0; + padding: var(--spacing); + border-right: none; + border-left: 0.25rem solid var(--blockquote-border-color); + border-inline-start: 0.25rem solid var(--blockquote-border-color); + border-inline-end: none; + + footer { + margin-top: calc(var(--typography-spacing-vertical) * 0.5); + color: var(--blockquote-footer-color); + } +} + +// Abbreviations +// 1. Remove underline decoration in Chrome, Edge, IE, Opera, and Safari +abbr[title] { + border-bottom: 1px dotted; + text-decoration: none; // 1 + cursor: help; +} + +// Ins +ins { + color: var(--ins-color); + text-decoration: none; +} + +// del +del { + color: var(--del-color); +} + +// selection +::selection { + background-color: var(--primary-focus); +} |