oui-kit
Version:
🎯 *UI toolkit with a French touch* 🇫🇷
437 lines (372 loc) • 9.7 kB
text/stylus
@require "../mixins";
oui-input-reset() {
appearance: none;
-webkit-appearance: none;
margin: 0;
padding: 0;
font: inherit;
line-height: 1;
font-size: 16;
font-family: inherit;
outline: none;
border: none;
width: auto;
min-width: 0;
color: inherit;
text-transform: none;
vertical-align: baseline;
&::-moz-focus-inner {
border-style: none;
padding: 0;
}
&:disabled {
cursor: not-allowed;
}
}
// A simple button template
oui-button() {
oui-input-reset();
stack-x(8);
stack-item-center(); /*
// https://ishadeed.com/article/button-label-alignment/
// &:before {
// content: "";
// display: inline-block;
// height: 20;
// vertical-align: middle;
// }
*/
display: inline-flex;
height: var(--input-height, px(32));
min-width: var(--input-height, px(32));
// padding: calc(((var(--button-height, var(--input-height, px(32))) - 16) / 2));
max-width: 100%;
pointer-events: initial;
vertical-align: middle;
user-select: none;
-webkit-user-select: none;
// // Fixes alignment issues
> * {
display: inline-flex;
flex: none;
}
&:focus-visible {
box-shadow: var(--input-shadow-focus); /* Workaround for :focus that otherwise stays after mouse click */
}
&[disabled] {
background-color: var(--t3-bg);
color: var(--s2-fg);
// opacity: 0.6;
cursor: not-allowed;
}
// icon
svg, img {
size: 1em;
}
border-radius: var(--button-radius, var(--input-radius));
&:hover:not([disabled]) {
background: var(--button-bg-hover);
}
&:active:not([disabled]) {
background: var(--button-bg-active);
}
svg {
size: 1em;
}
// Add space if multiple buttons
& + & {
margin-left: 8;
}
&._button_mode_danger {
--button-bg: -red-700;
--button-bg-hover: -red-800;
--button-bg-active: -red-900;
.dark & {
--button-bg: -red-700;
--button-bg-hover: -red-800;
--button-bg-active: -red-900;
}
}
&._button_mode_success {
--button-bg: -green-700;
--button-bg-hover: -green-800;
--button-bg-active: -green-900;
.dark & {
--button-bg: -green-700;
--button-bg-hover: -green-800;
--button-bg-active: -green-900;
}
}
&._button_mode_neutral {
--button-bg: var(--n0-700);
--button-bg-hover: var(--n0-900);
--button-bg-active: var(--fg);
.dark & {
--button-bg: var(--n0-700);
--button-bg-hover: var(--n0-800);
--button-bg-active: var(--n0-900);
}
}
&._button_mode_ghost {
--button-fg: var(--fg);
--button-bg: transparent;
--button-bg-hover: var(--s2-bg);
--button-bg-active: var(--t3-bg);
font-weight: inherit;
&, &:hover, &:active {
font-weight: inherit;
}
}
&._button_mode_outline {
--button-border: var(--input-border);
--button-fg: var(--fg);
--button-bg: transparent;
--button-bg-hover: var(--s2-bg);
--button-bg-active: var(--t3-bg);
font-weight: inherit;
&, &:hover, &:active {
font-weight: inherit;
}
}
// Colors
&, &:hover, &:active {
color: var(--button-fg);
text-decoration: none;
font-weight: 600;
}
background: var(--button-bg);
border: 1px solid var(--button-border, transparent);
padding: 7px;
&._button_size_small {
padding: 4;
font-size: 13; // height=20px
--input-height: px(20);
}
&._button_size_large {
padding: 12;
font-size: 20; // height=44px
--input-height: px(44);
}
&._button_dropdown::after {
display: inline-block;
margin-left: 0; // 0.255em;
vertical-align: 0.255em;
content: "";
border-top: 0.3em solid;
border-right: 0.3em solid transparent;
border-bottom: 0;
border-left: 0.3em solid transparent;
}
}
oui-input-default() {
oui-input-reset();
padding-x: 8;
// min-height: var(--button-height, var(--input-height, px(32)));
min-height: var(--input-height, px(32));
border-radius: var(--input-radius);
border: 1px solid var(--input-border);
color: var(--input-fg);
background: var(--input-bg, var(--input-bg-default, var(--t3-bg)));
max-width: 100%;
&:hover {
border-color: var(--input-border-hover);
}
&:focus, &:focus-within {
box-shadow: var(--input-shadow-focus);
border-color: var(--input-border-focus) !important; /* Workaround for :focus that otherwise stays after mouse click */
}
&[disabled] {
background-color: var(--t3-bg);
color: var(--s2-fg);
cursor: not-allowed;
}
}
oui-input-text() {
oui-input-default();
display: inline-flex;
}
oui-input-textarea() {
oui-input-default();
padding-y: 6;
line-height: 1.2;
}
oui-input-textarea-grow() {
overflow: hidden !important;
height: var(--input-height, px(32));
resize: none;
}
oui-input-number() {
oui-input-default();
width: 12ch;
}
oui-select-icon() {
padding-right: px(20 + 8);
background: right no-repeat;
background-color: var(--input-bg);
background-position: right px(4) top 50%;
background-size: px(20) px(20);
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='rgba(0,0,0,0.5)' stroke-width='1' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
.dark & {
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='rgba(255,255,255,0.5)' stroke-width='1' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}
}
oui-select() {
oui-input-default();
oui-select-icon();
padding-y: 0;
line-height: px(30);
}
control-boolean-height = px(16);
control-boolean-width = px(32);
control-boolean-margin = px(1);
oui-boolean-default() {
oui-input-reset();
--active: var(--button-bg);
--active-inner: var(--button-fg);
--border: var(--input-border);
--border-hover: var(--button-bg-hover);
--background: var(--input-bg);
--disabled: -gray-100;
--disabled-inner: -gray-100;
height: control-boolean-height;
width: control-boolean-height;
outline: none;
display: inline-block;
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
position: relative;
margin: 0;
margin-bottom: px(-2); // Align better
// cursor: pointer;
border: 1px solid var(--bc, var(--border));
background: var(--b, var(--background));
transition: background 0.3s, border-color 0.3s, box-shadow 0.2s;
&:after {
content: "";
display: block;
left: 0;
top: 0;
position: absolute;
transition: transform var(--d-t, 0.3s) var(--d-t-e, ease), opacity var(--d-o, 0.2s);
}
&:checked {
--b: var(--active);
--bc: var(--active);
--d-o: 0.3s;
--d-t: 0.6s;
--d-t-e: cubic-bezier(0.2, 0.85, 0.32, 1.2);
}
&._checkbox_intermediate {
--b: var(--active);
--bc: var(--active);
--d-o: 0.3s;
--d-t: 0.6s;
--d-t-e: cubic-bezier(0.2, 0.85, 0.32, 1.2);
}
&:disabled {
--b: var(--disabled);
cursor: not-allowed;
opacity: 0.9;
&:checked {
--b: var(--disabled-inner);
--bc: var(--border);
}
& + label {
cursor: not-allowed;
}
}
&:hover {
&:not(:checked) {
&:not(:disabled) {
border-color: var(--input-border-hover); /* --bc: var(--border-hover); */
}
}
}
& + label {
line-height: control-boolean-height;
display: inline-block;
vertical-align: top;
// cursor: pointer;
}
&:focus-visible {
box-shadow: var(--input-shadow-focus);
border-color: var(--input-border-focus); /* Workaround for :focus that otherwise stays after mouse click */
}
}
oui-checkbox() {
oui-boolean-default();
border-radius: 4px;
width: control-boolean-height;
&:after {
opacity: var(--_checkbox-opacity, 0);
width: rex(5);
height: rex(9);
border: rex(2) solid var(--active-inner);
border-top: 0;
border-left: 0;
left: rex(5);
top: rex(2);
transform: rotate(var(--_checkbox-rotation, 20deg));
}
&:checked {
--_checkbox-opacity: 1;
--_checkbox-rotation: 43deg;
}
&._checkbox_intermediate {
--_checkbox-opacity: 1;
--_checkbox-rotation: 90deg;
&:after {
top: 1;
left: 4;
width: 6;
border-bottom: 0;
}
}
}
oui-switch() {
oui-boolean-default();
height: control-boolean-height; // + px(2)
width: control-boolean-width;
border-radius: 999px;
&:after { // knob
left: control-boolean-margin;
top: control-boolean-margin;
border-radius: 50%;
width: control-boolean-height - control-boolean-margin * 2 - px(2);
height: control-boolean-height - control-boolean-margin * 2 - px(2); // height -margin - border
background: var(--_checkbox-switch-active-bg, var(--border));
transform: translateX(var(--_checkbox-switch-x, 0));
}
&:checked {
--_checkbox-switch-active-bg: var(--active-inner);
--_checkbox-switch-x: control-boolean-width - control-boolean-height - control-boolean-margin;
}
&:disabled {
cursor: not-allowed;
&:not(:checked) {
&:after {
opacity: 0.6;
}
}
}
&:focus-visible {
box-shadow: var(--input-shadow-focus);
border-color: var(--input-border-focus); /* Workaround for :focus that otherwise stays after mouse click */
}
}
oui-radio() {
oui-boolean-default();
border-radius: 50%;
&:after {
width: 19px;
height: 19px;
border-radius: 50%;
background: var(--active-inner);
opacity: 0;
transform: scale(var(--s, 0.7));
}
&:checked {
--s: 0.5;
}
}