This commit is contained in:
Cory LaViska
2020-04-29 21:03:13 -04:00
parent 7a8b0e5b83
commit f5a287e1b2
5 changed files with 282 additions and 0 deletions

View File

@@ -16,6 +16,7 @@
- [Alert](/components/alert.md)
- [Button](/components/button.md)
- [Checkbox](/components/checkbox.md)
- [Color Picker](/components/color-picker.md)
- [Dialog](/components/dialog.md)
- [Dropdown](/components/dropdown.md)
- [Dropdown Item](/components/dropdown-item.md)

13
src/components.d.ts vendored
View File

@@ -96,6 +96,8 @@ export namespace Components {
*/
"value": string;
}
interface SlColorPicker {
}
interface SlDialog {
/**
* Hides the dialog
@@ -586,6 +588,12 @@ declare global {
prototype: HTMLSlCheckboxElement;
new (): HTMLSlCheckboxElement;
};
interface HTMLSlColorPickerElement extends Components.SlColorPicker, HTMLStencilElement {
}
var HTMLSlColorPickerElement: {
prototype: HTMLSlColorPickerElement;
new (): HTMLSlColorPickerElement;
};
interface HTMLSlDialogElement extends Components.SlDialog, HTMLStencilElement {
}
var HTMLSlDialogElement: {
@@ -692,6 +700,7 @@ declare global {
"sl-alert": HTMLSlAlertElement;
"sl-button": HTMLSlButtonElement;
"sl-checkbox": HTMLSlCheckboxElement;
"sl-color-picker": HTMLSlColorPickerElement;
"sl-dialog": HTMLSlDialogElement;
"sl-dropdown": HTMLSlDropdownElement;
"sl-dropdown-divider": HTMLSlDropdownDividerElement;
@@ -814,6 +823,8 @@ declare namespace LocalJSX {
*/
"value"?: string;
}
interface SlColorPicker {
}
interface SlDialog {
/**
* When true, the dialog will not be dismissed when the user clicks on the overlay.
@@ -1340,6 +1351,7 @@ declare namespace LocalJSX {
"sl-alert": SlAlert;
"sl-button": SlButton;
"sl-checkbox": SlCheckbox;
"sl-color-picker": SlColorPicker;
"sl-dialog": SlDialog;
"sl-dropdown": SlDropdown;
"sl-dropdown-divider": SlDropdownDivider;
@@ -1366,6 +1378,7 @@ declare module "@stencil/core" {
"sl-alert": LocalJSX.SlAlert & JSXBase.HTMLAttributes<HTMLSlAlertElement>;
"sl-button": LocalJSX.SlButton & JSXBase.HTMLAttributes<HTMLSlButtonElement>;
"sl-checkbox": LocalJSX.SlCheckbox & JSXBase.HTMLAttributes<HTMLSlCheckboxElement>;
"sl-color-picker": LocalJSX.SlColorPicker & JSXBase.HTMLAttributes<HTMLSlColorPickerElement>;
"sl-dialog": LocalJSX.SlDialog & JSXBase.HTMLAttributes<HTMLSlDialogElement>;
"sl-dropdown": LocalJSX.SlDropdown & JSXBase.HTMLAttributes<HTMLSlDropdownElement>;
"sl-dropdown-divider": LocalJSX.SlDropdownDivider & JSXBase.HTMLAttributes<HTMLSlDropdownDividerElement>;

View File

@@ -0,0 +1,137 @@
@import 'component';
:host {
display: inline-block;
--grid-width: 260px;
--grid-height: 200px;
--sight-size: 14px;
--slider-size: 14px;
}
.sl-color-picker__menu {
// position: absolute;
max-height: 50vh;
font-family: var(--sl-font-sans);
font-size: var(--sl-font-size-medium);
font-weight: var(--sl-font-weight-normal);
color: var(--color);
background-color: var(--sl-color-white);
border: solid 1px var(--sl-color-gray-90);
border-radius: 4px;
box-shadow: var(--sl-shadow-large);
padding-top: var(--sl-spacing-x-small);
padding-bottom: var(--sl-spacing-x-small);
// opacity: 0;
transition: var(--sl-transition-fast) opacity;
// &[hidden] {
// display: none;
// }
}
.sl-color-picker--open .sl-color-picker__menu {
opacity: 1;
}
.sl-color-picker__grid {
position: relative;
width: var(--grid-width);
height: var(--grid-height);
margin-bottom: 8px;
cursor: crosshair;
}
.sl-color-picker__grid-gradient {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image: linear-gradient(to right, rgb(255, 255, 255), rgba(255, 255, 255, 0));
&::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image: linear-gradient(to top, rgb(0, 0, 0), rgba(0, 0, 0, 0));
}
}
.sl-color-picker__sight {
position: absolute;
width: var(--sight-size);
height: var(--sight-size);
border-radius: 50%;
border: solid 1px rgba(0, 0, 0, 0.125);
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.125), inset 0 0 0 1px rgba(0, 0, 0, 0.125);
border: solid 2px white;
margin-top: calc(var(--sight-size) / -2);
margin-left: calc(var(--sight-size) / -2);
cursor: pointer;
}
.sl-color-picker__hue {
position: relative;
height: 12px;
background-image: linear-gradient(
to right,
rgb(255, 0, 0) 0%,
rgb(255, 255, 0) 17%,
rgb(0, 255, 0) 33%,
rgb(0, 255, 255) 50%,
rgb(0, 0, 255) 67%,
rgb(255, 0, 255) 83%,
rgb(255, 0, 0) 100%
);
margin-bottom: 8px;
border-radius: 2px;
}
.sl-color-picker__alpha {
position: relative;
height: 12px;
border-radius: 2px;
background-image: linear-gradient(45deg, #eee 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #eee 75%),
linear-gradient(45deg, transparent 75%, #eee 75%), linear-gradient(45deg, #eee 25%, transparent 25%);
background-size: 12px 12px;
background-position: 0 0, 0 0, -6px -6px, 6px 6px;
.sl-color-picker__alpha-gradient {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 2px;
}
}
.sl-color-picker__slider {
position: absolute;
top: calc(50% - var(--slider-size) / 2);
width: var(--slider-size);
height: var(--slider-size);
background-color: white;
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
border-radius: 50%;
margin-left: calc(var(--slider-size) / -2);
cursor: pointer;
}
.sl-color-picker__swatches {
display: grid;
grid-template-columns: repeat(8, 1fr);
grid-gap: 6px;
}
.sl-color-picker__swatch {
flex: 0 0 auto;
width: 16px;
height: 16px;
border-radius: 2px;
border: solid 1px rgba(0, 0, 0, 0.125);
}

View File

@@ -0,0 +1,118 @@
import { Component, h } from '@stencil/core';
@Component({
tag: 'sl-color-picker',
styleUrl: 'color-picker.scss',
shadow: true
})
export class ColorPicker {
menu: HTMLElement;
trigger: HTMLElement;
render() {
return (
<div ref={el => (this.trigger = el)} class="sl-color-picker">
<div class="sl-color-picker__trigger">Trigger</div>
<div ref={el => (this.menu = el)} class="sl-color-picker__menu">
<div class="sl-color-picker__grid" style={{ backgroundColor: 'red' }}>
<div class="sl-color-picker__grid-gradient" />
<span
class="sl-color-picker__sight"
style={{
transform: `translate(100px, 100px)`
}}
/>
</div>
<div class="sl-color-picker__hue">
<span
class="sl-color-picker__slider"
style={{
transform: 'translateX(20px)'
}}
/>
</div>
<div class="sl-color-picker__alpha">
<div
class="sl-color-picker__alpha-gradient"
style={{
backgroundImage: `linear-gradient(to right, rgba(255, 0, 0, 0) 0%, rgb(255, 0, 0) 100%)`
}}
/>
<span
class="sl-color-picker__slider"
style={{
transform: 'translateX(60px)'
}}
/>
</div>
<div class="sl-color-picker__preview"></div>
<div class="sl-color-picker__inputs">
<div class="sl-color-picker__input sl-color-picker__input--hex">
<label>Hex</label>
<input type="text" pattern="[a-fA-F\d]+" />
</div>
<div class="sl-color-picker__input sl-color-picker__input--rgba">
<label>R</label>
<input type="number" min="0" max="255" />
</div>
<div class="sl-color-picker__input sl-color-picker__input--rgba">
<label>G</label>
<input type="number" min="0" max="255" />
</div>
<div class="sl-color-picker__input sl-color-picker__input--rgba">
<label>B</label>
<input type="number" min="0" max="255" />
</div>
<div class="sl-color-picker__input sl-color-picker__input--hsl">
<label>H</label>
<input type="number" min="0" max="255" />
</div>
<div class="sl-color-picker__input sl-color-picker__input--hsl">
<label>S</label>
<input type="number" min="0" max="255" />
</div>
<div class="sl-color-picker__input sl-color-picker__input--hsl">
<label>L</label>
<input type="number" min="0" max="255" />
</div>
<div class="sl-color-picker__input sl-color-picker__input--rgba">
<label>A</label>
<input type="number" min="0" max="100" />
</div>
</div>
<div class="sl-color-picker__swatches">
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#d0021b' }}></div>
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#f5a623' }}></div>
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#f8e71c' }}></div>
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#8b572a' }}></div>
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#7ed321' }}></div>
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#417505' }}></div>
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#bd10e0' }}></div>
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#9013fe' }}></div>
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#4a90e2' }}></div>
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#50e3c2' }}></div>
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#b8e986' }}></div>
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#000' }}></div>
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#444' }}></div>
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#888' }}></div>
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#ccc' }}></div>
<div class="sl-color-picker__swatch" style={{ backgroundColor: '#fff' }}></div>
</div>
</div>
</div>
);
}
}

View File

@@ -0,0 +1,13 @@
# Color Picker
```html preview
<sl-color-picker></sl-color-picker>
```
<!-- Auto Generated Below -->
----------------------------------------------