artistic-elements
Version:
artistic web components
817 lines (607 loc) • 22.1 kB
Markdown
# Artistic Elements

[](https://www.jsdelivr.com/package/npm/artistic-elements)



Artistic Elements is a collection of very simple [Web Components](https://developer.mozilla.org/en-US/docs/Web/Web_Components) to create art.
This project was born out of wanting to learn about:
1. the [Web Components API](https://developer.mozilla.org/en-US/docs/Web/Web_Components)
2. the differences between that and using [Lit.dev](https://lit.dev/)
3. modern tooling, namely:
1. [rollup.js](https://rollupjs.org/guide/en/)
2. [@web/dev-server](https://modern-web.dev/docs/dev-server/overview/)
These artistic components were a result of, years ago, creating [swi{css}ted](https://swissted.koch.dev) with Styled Components in React and then using that work as the base for these ([Lit](https://lit.dev/)) Web Components.
## Development
To view examples:
```bash
npm i
npm start
```
Open [localhost:8000](http://localhost:8000/examples) to view available components.
### Contributing
Feel the need to add a new component? Awesome. Follow these basic steps:
1. Create a new branch from `develop`
2. Create a new Lit component in `src/artistic`
1. `src/artistic/my-component`
3. Update `src/index.ts` to export your new component
1. `export { ArtisticMyComponent } from './artistic/my-component';`
4. Update `examples/index.html` to include your component following the pattern found in the file
5. Create a new example file with some examples using attributes
6. Update the README to include the necessary details
7. Open a pull request to `develop`
1. Be sure to include a screenshot of your new component in the pull request.
## In Use
Using it and want to show your art? Open up a pull request to update this section by adding to the list.
1. [swissted](https://swissted.koch.dev/)
2. [art.koch.dev](https://art.koch.dev/artistic-elements/)
## Import
Importing via the CDN is as simple as including the index as a module in your HTML. This includes all the components.
_Note: Remove '.min' from the path to use the unminified version from jsDeliver._
```html
<script
type="module"
src="https://cdn.jsdelivr.net/npm/artistic-elements/dist/index.min.js"
></script>
```
Cherry picking is also possible by targeting the specific component. See examples below.
Importing for JavaScript where the `*` is one of the available component names: `Circular`, `Rectangle`, etc.
```javascript
import { Artistic* } from 'artistic-elements';
```
Importing for React where the `*` is one of the available component names: `Circular`, `Rectangle`, etc.
```jsx
import { Artistic* } from 'artistic-elements/dist/react';
```
## Components
### Circular
A simple circular object with a single color.
To create a circle, use the same values for `width` and `height`.
#### Attributes
| Attribute | Description | Type | Default |
| --------- | ------------- | -------- | ------- |
| width | object width | `string` | '10rem' |
| height | object height | `string` | '10rem' |
| color | object color | `string` | '#f0f' |
#### Import
```html
<script
type="module"
src="https://cdn.jsdelivr.net/npm/artistic-elements/dist/artistic/circular.min.js"
></script>
```
#### HTML
```html
<artistic-circular></artistic-circular>
<artistic-circular
width="20rem"
height="20rem"
color="#fff"
></artistic-circular>
```
#### Javascript API
```javascript
import { ArtisticCirular } from 'artistic-elements';
const circle = new ArtisticCirular();
circle.width = '20rem';
circle.height = '20rem';
circle.color = '#fff';
document.querySelector('main').append(circle);
```
#### React API
```jsx
import { ArtisticCircular } from 'artistic-elements/dist/react';
<ArtisticCircular />
<ArtisticCircular width="20rem" height="20rem" color="#fff" />
```
### Circular Gradient
A simple circular object with two colors, each color using 50% of the object.
Supply an angle in degrees to rotate.
To create a circle, use the same values for `width` and `height`.
#### Attributes
| Attribute | Description | Type | Default |
| --------- | ------------------- | -------- | ------- |
| width | object width | `string` | '10rem' |
| height | object height | `string` | '10rem' |
| angle | object rotation | `string` | '0deg' |
| color | object first color | `string` | '#f0f' |
| color2 | object second color | `string` | '#0f0' |
#### Import
```html
<script
type="module"
src="https://cdn.jsdelivr.net/npm/artistic-elements/dist/artistic/circular-gradient.min.js"
></script>
```
#### HTML
```html
<artistic-circular-gradient></artistic-circular-gradient>
<artistic-circular-gradient
width="20rem"
height="20rem"
color="#439dc8"
color2="#377e49"
angle="90deg"
></artistic-circular-gradient>
```
#### Javascript API
```javascript
import { ArtisticCircleGradient } from 'artistic-elements';
const circleGradient = new ArtisticCircleGradient();
circleGradient.width = '20rem';
circleGradient.height = '20rem';
circleGradient.color = '#fff';
circleGradient.color2 = '#000';
circleGradient.angle = '90deg';
document.querySelector('main').append(circleGradient);
```
#### React API
```jsx
import { ArtisticCircularGradient } from 'artistic-elements/dist/react';
<ArtisticCircularGradient />
<ArtisticCircularGradient
width="20rem"
height="20rem"
color="#fff"
color2="#000"
angle="90deg"
/>
```
### Doughnut
A circle with a hole and a single color.
The `diameter` and `lineWidth` are used to calculate the overall `size` (width/height) in `rem`. TODO: choose `px` or `rem`?
```javascript
const size = diameter - lineWidth * 2;
```
Ability to position absolutely if either a top or left value is supplied.
#### Attributes
| Attribute | Description | Type | Default |
| --------- | -------------------- | -------- | ------- |
| diameter | object diameter | `number` | 10 |
| lineWidth | object border width | `number` | 1 |
| color | object color | `string` | '#f0f' |
| top | object top position | `string` | '0' |
| left | object left position | `string` | '0' |
#### Import
```html
<script
type="module"
src="https://cdn.jsdelivr.net/npm/artistic-elements/dist/artistic/doughnut.min.js"
></script>
```
#### HTML
```html
<artistic-doughnut></artistic-doughnut>
<artistic-doughnut diameter="25" lineWidth="5" color="#000"></artistic-doughnut>
```
#### Javascript API
```javascript
import { ArtisticDoughnut } from 'artistic-elements';
const doughnut = new ArtisticDoughnut();
doughnut.diameter = 25;
doughnut.height = 5;
doughnut.color = '#fff';
document.querySelector('main').append(doughnut);
```
#### React API
```jsx
import { ArtisticDoughnut } from 'artistic-elements/dist/react';
<ArtisticDoughnut />
<ArtisticDoughnut diameter={25} height={5} color="#fff" />
```
### Rectangle
A simple rectangle with a single color.
Ability to position absolutely if either a top or left value is supplied.
Ability to `align` which maps to `align-self` for flexbox.
#### Attributes
| Attribute | Description | Type | default |
| ------------- | -------------------- | -------- | --------- |
| width | object width | `string` | '10rem' |
| height | object height | `string` | '10rem' |
| color | object color | `string` | '#f0f' |
| top | object top position | `string` | '0' |
| left | object left position | `string` | '0' |
| align | object alignment | `string` | 'initial' |
| border-radius | object border radius | `string` | '0' |
#### Import
```html
<script
type="module"
src="https://cdn.jsdelivr.net/npm/artistic-elements/dist/artistic/rectangle.min.js"
></script>
```
#### HTML
```html
<artistic-rectangle></artistic-rectangle>
<artistic-rectangle
width="60rem"
height="5rem"
color="#000"
align="end"
></artistic-rectangle>
```
#### Javascript API
```javascript
import { ArtisticRectangle } from 'artistic-elements';
const rectangle = new ArtisticRectangle();
rectangle.width = '60rem';
rectangle.height = '5rem';
rectangle.color = '#000';
rectangle.align = 'end';
document.querySelector('main').append(rectangle);
```
#### React API
```jsx
import { ArtisticRectangular } from 'artistic-elements/dist/react';
<ArtisticRectangular />
<ArtisticRectangular
width="60rem"
height="5rem"
color="#000"
align="end"
/>
```
### Rectangle Gradient
A simple rectangular object with two colors, each color using 50% of the object.
Ability to position absolutely if either a top or left value is supplied.
Ability to `align` which maps to `align-self` for flexbox.
#### Attributes
| Attribute | Description | Type | default |
| ------------- | -------------------- | -------- | --------- |
| width | object width | `string` | '10rem' |
| height | object height | `string` | '10rem' |
| angle | object rotation | `string` | '0deg' |
| color | object first color | `string` | '#f0f' |
| color2 | object second color | `string` | '#0f0' |
| top | object top position | `string` | '0' |
| left | object left position | `string` | '0' |
| align | object alignment | `string` | 'initial' |
| border-radius | object border radius | `string` | '0' |
#### Import
```html
<script
type="module"
src="https://cdn.jsdelivr.net/npm/artistic-elements/dist/artistic/rectangle-gradient.min.js"
></script>
```
#### HTML
```html
<artistic-rectangle-gradient></artistic-rectangle-gradient>
<artistic-rectangle-gradient
width="60rem"
height="5rem"
color="#000"
color2="#fff"
></artistic-rectangle-gradient>
```
#### Javascript API
```javascript
import { ArtisticRectangleGradient } from 'artistic-elements';
const rectangleGradient = new ArtisticRectangleGradient();
rectangleGradient.width = '60rem';
rectangleGradient.height = '5rem';
rectangleGradient.color = '#000';
rectangleGradient.color2 = '#fff';
document.querySelector('main').append(rectangleGradient);
```
#### React API
```jsx
import { ArtisticRectangleGradient } from 'artistic-elements/dist/react';
<ArtisticRectangleGradient />
<ArtisticRectangleGradient
width="60rem"
height="5rem"
color="#000"
color2="fff"
/>
```
### Triangle Rectangle
Uses the [css border trick](https://css-tricks.com/snippets/css/css-triangle/) to create a rectangular object made up of 4 triangles.
To create a square, use the same values for `width` and `height`.
The `borderStyle` defaults to `solid`. Any valid value for `border-style` is acceptable.
The colors map to each of the borders (top, right, bottom, left).
#### Attributes
| Attribute | Description | Type | Default |
| ----------- | --------------------- | -------- | ------- |
| width | object width | `number` | 10 |
| height | object height | `number` | 10 |
| borderStyle | object border-style | `string` | 'solid' |
| topColor | top triangle color | `string` | '#f0f' |
| rightColor | right triangle color | `string` | '#0f0' |
| bottomColor | bottom triangle color | `string` | '#ff0' |
| leftColor | left triangle color | `string` | '#00f' |
#### Import
```html
<script
type="module"
src="https://cdn.jsdelivr.net/npm/artistic-elements/dist/artistic/triangle-rectangle.min.js"
></script>
```
#### HTML
```html
<artistic-triangle-rectangle></artistic-triangle-rectangle>
<artistic-triangle-rectangle
width="20"
height="20"
topColor="#63fd86"
rightColor="#8601ff"
bottomColor="#35e8c2"
leftColor="#63fd86"
></artistic-triangle-rectangle>
```
#### Javascript API
```javascript
import { ArtisticTriangleRectangle } from 'artistic-elements';
const square = new ArtisticTriangleRectangle();
square.width = '20';
square.height = '20';
square.topColor = '#63fd86';
square.rightColor = '#8601ff';
square.bottomColor = '#35e8c2';
square.leftColor = '#63fd86';
document.querySelector('main').append(square);
```
#### React API
```jsx
import { ArtisticTriangleRectangular } from 'artistic-elements/dist/react';
<ArtisticTriangleRectangular />
<ArtisticTriangleRectangular
width={20}
height={20}
topColor="#63fd86"
rightColor="#8601ff"
bottomColor="#35e8c2"
leftColor="#63fd86"
/>
```
### Triangle Up
[CSS border trick](https://css-tricks.com/snippets/css/css-triangle/) to create a triangle object that points up with a single color.
`height` determines overall height of the triangle.
`widthLeft` and `widthRight` determine the left and right width (50% each), respectively.
If the `height` is 2x the value of `widthLeft` and `widthRight` (and both `widthLeft` and `widthRight` are the same value), the triangle will fit in a square with the top point at the midway point of the top side of the square. This is the default behavior.
#### Attributes
| Attribute | Description | Type | Default |
| ---------- | ----------------------- | -------- | ------- |
| widthLeft | object left side width | `string` | '5rem' |
| widthRight | object right side width | `string` | '5rem' |
| height | object height | `string` | '10rem' |
| color | object color | `string` | '#0f0' |
#### Import
```html
<script
type="module"
src="https://cdn.jsdelivr.net/npm/artistic-elements/dist/artistic/triangle-up.min.js"
></script>
```
#### HTML
```html
<artistic-triangle-up></artistic-triangle-up>
<artistic-triangle-up
widthLeft="10rem"
widthRight="10rem"
height="20rem"
color="#fff"
></artistic-triangle-up>
```
#### Javascript API
```javascript
import { ArtisticTriangleUp } from 'artistic-elements';
const triangleUp = new ArtisticTriangleUp();
triangleUp.widthLeft = '10rem';
triangleUp.widthRight = '10rem';
triangleUp.height = '20rem';
triangleUp.color = '#fff';
document.querySelector('main').append(triangleUp);
```
#### React API
```jsx
import { ArtisticTriangleUp } from 'artistic-elements/dist/react';
<ArtisticTriangleUp />
<ArtisticTriangleUp
widthLeft="10rem"
widthRight="10rem"
height="20rem"
color="#fff"
/>
```
### Triangle Down
[CSS border trick](https://css-tricks.com/snippets/css/css-triangle/) to create a triangle object that points down with a single color.
`height` determines overall height of the triangle.
`widthLeft` and `widthRight` determine the left and right width (50% each), respectively.
If the `height` is 2x the value of `widthLeft` and `widthRight` (and both `widthLeft` and `widthRight` are the same value), the triangle will fit in a square with the bottom point at the midway point of the bottom side of the square. This is the default behavior.
#### Attributes
| Attribute | Description | Type | Default |
| ---------- | ----------------------- | -------- | ------- |
| widthLeft | object left side width | `string` | '5rem' |
| widthRight | object right side width | `string` | '5rem' |
| height | object height | `string` | '10rem' |
| color | object color | `string` | '#0f0' |
#### Import
```html
<script
type="module"
src="https://cdn.jsdelivr.net/npm/artistic-elements/dist/artistic/triangle-down.min.js"
></script>
```
#### HTML
```html
<artistic-triangle-down></artistic-triangle-down>
<artistic-triangle-down
widthLeft="10rem"
widthRight="10rem"
height="20rem"
color="#fff"
></artistic-triangle-down>
```
#### Javascript API
```javascript
import { ArtisticTriangleDown } from 'artistic-elements';
const triangleDown = new ArtisticTriangleDown();
triangleDown.widthLeft = '10rem';
triangleDown.widthRight = '10rem';
triangleDown.height = '20rem';
triangleDown.color = '#fff';
document.querySelector('main').append(triangleDown);
```
#### React API
```jsx
import { ArtisticTriangleDown } from 'artistic-elements/dist/react';
<ArtisticTriangleDown />
<ArtisticTriangleDown
widthLeft="10rem"
widthRight="10rem"
height="20rem"
color="#fff"
/>
```
### Triangle Left
[CSS border trick](https://css-tricks.com/snippets/css/css-triangle/) to create a triangle object that points to the left with a single color.
`width` determines overall width of the triangle.
`heightTop` and `heightBottom` determine the top and bottom height (50% each), respectively.
If the `width` is 2x the value of `heightTop` and `heightBottom` (and both `heightTop` and `heightBottom` are the same value), the triangle will fit in a square with the left point at the midway point of the left side of the square. This is the default behavior.
#### Attributes
| Attribute | Description | Type | Default |
| ------------ | ----------------------- | -------- | ------- |
| heightTop | object left side width | `string` | '5rem' |
| heightBottom | object right side width | `string` | '5rem' |
| width | object height | `string` | '10rem' |
| color | object color | `string` | '#0f0' |
#### Import
```html
<script
type="module"
src="https://cdn.jsdelivr.net/npm/artistic-elements/dist/artistic/triangle-left.min.js"
></script>
```
#### HTML
```html
<artistic-triangle-left></artistic-triangle-left>
<artistic-triangle-left
heightTop="10rem"
heightBottom="10rem"
width="20rem"
color="#fff"
></artistic-triangle-left>
```
#### Javascript API
```javascript
import { ArtisticTriangleLeft } from 'artistic-elements';
const triangleLeft = new ArtisticTriangleLeft();
triangleDown.heightTop = '10rem';
triangleDown.heightBottom = '10rem';
triangleDown.width = '20rem';
triangleDown.color = '#fff';
document.querySelector('main').append(triangleDown);
```
#### React API
```jsx
import { ArtisticTriangleLeft } from 'artistic-elements/dist/react';
<ArtisticTriangleLeft />
<ArtisticTriangleLeft
heightTop="10rem"
heightBottom="10rem"
width="20rem"
color="#fff"
/>
```
### Triangle Right
[CSS border trick](https://css-tricks.com/snippets/css/css-triangle/) to create a triangle object that points to the right with a single color.
`width` determines overall width of the triangle.
`heightTop` and `heightBottom` determine the top and bottom height (50% each), respectively.
If the `width` is 2x the value of `heightTop` and `heightBottom` (and both `heightTop` and `heightBottom` are the same value), the triangle will fit in a square with the right point at the midway point of the right side of the square. This is the default behavior.
#### Attributes
| Attribute | Description | Type | Default |
| ------------ | ----------------------- | -------- | ------- |
| heightTop | object left side width | `string` | '5rem' |
| heightBottom | object right side width | `string` | '5rem' |
| width | object height | `string` | '10rem' |
| color | object color | `string` | '#0f0' |
#### Import
```html
<script
type="module"
src="https://cdn.jsdelivr.net/npm/artistic-elements/dist/artistic/triangle-right.min.js"
></script>
```
#### HTML
```html
<artistic-triangle-right></artistic-triangle-right>
<artistic-triangle-right
heightTop="10rem"
heightBottom="10rem"
width="20rem"
color="#fff"
></artistic-triangle-right>
```
#### Javascript API
```javascript
import { ArtisticTriangleRight } from 'artistic-elements';
const triangleRight = new ArtisticTriangleRight();
triangleRight.heightTop = '10rem';
triangleRight.heightBottom = '10rem';
triangleRight.width = '20rem';
triangleRight.color = '#fff';
document.querySelector('main').append(triangleRight);
```
#### React API
```jsx
import { ArtisticTriangleRight } from 'artistic-elements/dist/react';
<ArtisticTriangleRight />
<ArtisticTriangleRight
heightTop="10rem"
heightBottom="10rem"
width="20rem"
color="#fff"
/>
```
### Radial Circular Gradient
A simple circular object which supports an array of colors with a corresponding array of stops.
Colors array used to create a radial gradient.
Stops array values between `0` and `1`.
Stops array must have the same length as the colors array.
To create a circle, use the same values for `width` and `height`.
#### Attributes
| Attribute | Description | Type | Default |
| --------- | ------------------------------------------- | -------- | ---------------- |
| width | object width | `string` | '10rem' |
| height | object height | `string` | '10rem' |
| colors | object colors for radial-gradient | `array` | ["#f0f", "#ff0"] |
| stops | object position of color in radial-gradient | `array` | [0, 1] |
#### Import
```html
<script
type="module"
src="https://cdn.jsdelivr.net/npm/artistic-elements/dist/artistic/circular-gradient.min.js"
></script>
```
#### HTML
```html
<artistic-radial-circular-gradient></artistic-radial-circular-gradient>
<artistic-radial-circular-gradient
width="20rem"
height="20rem"
colors='["#f0f", "#0f0"]'
stops="[0, 1]"
></artistic-radial-circular-gradient>
```
#### Javascript API
```javascript
import { ArtisticRadialCircleGradient } from 'artistic-elements';
const radialCircleGradient = new ArtisticRadialCircleGradient();
radialCircleGradient.width = '20rem';
radialCircleGradient.height = '20rem';
radialCircleGradient.colors = ['#f0f', '#ff0'];
radialCircleGradient.stops = [0, 1];
document.querySelector('main').append(radialCircleGradient);
```
#### React API
```jsx
import { ArtisticRadialCircleGradient } from 'artistic-elements/dist/react';
<ArtisticRadialCircleGradient />
<ArtisticRadialCircleGradient
width="20rem"
height="20rem"
colors={["#f0f", "#0f0"]}
stops={[0, 1]}
/>
```