diff --git a/__tests__/Tag.test.tsx b/__tests__/Tag.test.tsx new file mode 100644 index 0000000..5fad12e --- /dev/null +++ b/__tests__/Tag.test.tsx @@ -0,0 +1,16 @@ +import { shallow } from 'enzyme'; +import React from 'react'; +import { Tag, Variant } from '@/components'; + +describe('Tag test', () => { + + it('should render tag', () => { + const container = shallow( + + Hello world + + ); + + expect(container.find('.tag.tag-orange').length).toBe(1); + }); +}); diff --git a/src/components/Tag/Tag.tsx b/src/components/Tag/Tag.tsx new file mode 100644 index 0000000..b82a222 --- /dev/null +++ b/src/components/Tag/Tag.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import PropTypes from 'prop-types'; +import { Variant } from '@/components'; +import clsx from 'clsx'; + +export interface TagProps extends React.HTMLAttributes { + variant: Variant | string; +} + +const Tag = React.forwardRef(( + { + children, + className, + variant + }, + ref +): React.ReactElement => ( +
+ {children} +
+)); + +Tag.displayName = 'Tag'; +Tag.propTypes = { + children: PropTypes.node, + className: PropTypes.string, + variant: PropTypes.string.isRequired +} + +export default Tag; diff --git a/src/components/Tag/index.ts b/src/components/Tag/index.ts new file mode 100644 index 0000000..03a21a6 --- /dev/null +++ b/src/components/Tag/index.ts @@ -0,0 +1 @@ +export { default as Tag } from './Tag'; diff --git a/src/components/index.ts b/src/components/index.ts index 22c7f1e..41a7ea9 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -8,3 +8,4 @@ export * from './Icon'; export * from './utils'; export * from './TextField'; export * from './SelectField'; +export * from './Tag'; diff --git a/src/style/base/_variables.scss b/src/style/base/_variables.scss index 7f0298c..5da7188 100644 --- a/src/style/base/_variables.scss +++ b/src/style/base/_variables.scss @@ -8,6 +8,7 @@ $colors: ( 'default': hsl(0, 65%, 51%), 'hover': hsl(0, 66%, 47%), 'active': hsl(0, 73%, 41%), + 'dark': hsl(0, 73%, 41%), 'default-font-color': #fff, //AA ), 'pink': ( @@ -15,6 +16,7 @@ $colors: ( 'default': hsl(338, 78%, 48%), 'hover': hsl(336, 78%, 43%), 'active': hsl(334, 79%, 38%), + 'dark': hsl(328, 81%, 29%), 'default-font-color': #fff, //AA ), 'purple': ( @@ -22,6 +24,7 @@ $colors: ( 'default': hsl(287, 65%, 40%), 'hover': hsl(282, 68%, 38%), 'active': hsl(277, 70%, 35%), + 'dark': hsl(267, 75%, 31%), 'default-font-color': #fff, //AAAA ), 'deep-purple': ( @@ -30,6 +33,7 @@ $colors: ( 'default': hsl(260, 54%, 45%), 'hover': hsl(258, 58%, 42%), 'active': hsl(251, 69%, 34%), + 'dark': hsl(251, 69%, 34%), 'default-font-color': #fff, ), 'indigo': ( @@ -37,6 +41,7 @@ $colors: ( 'default': hsl(232, 50%, 45%), 'hover': hsl(232, 54%, 41%), 'active': hsl(233, 57%, 37%), + 'dark': hsl(235, 66%, 30%), 'default-font-color': #fff, //AAA ), 'blue': ( @@ -44,6 +49,7 @@ $colors: ( 'default': hsl(210, 79%, 46%), 'hover': hsl(212, 80%, 42%), 'active': hsl(216, 85%, 34%), + 'dark': hsl(216, 85%, 34%), 'default-font-color': #fff, //AA ), 'light-blue': ( @@ -51,6 +57,7 @@ $colors: ( 'default': hsl(199, 91%, 64%), 'hover': hsl(199, 92%, 56%), 'active': hsl(199, 98%, 48%), + 'dark': hsl(206, 99%, 31%), 'default-font-color': #000, //AAA ), 'teal': ( @@ -58,6 +65,7 @@ $colors: ( 'default': hsl(187, 100%, 38%), 'hover': hsl(186, 100%, 33%), 'active': hsl(185, 100%, 28%), + 'dark': hsl(182, 100%, 20%), 'default-font-color': #000, //AAA ), 'green': ( @@ -65,6 +73,7 @@ $colors: ( 'default': hsl(123, 41%, 45%), 'hover': hsl(123, 43%, 39%), 'active': hsl(123, 46%, 34%), + 'dark': hsl(124, 55%, 24%), 'default-font-color': #000, //AA ), 'light-green': ( @@ -72,6 +81,7 @@ $colors: ( 'default': hsl(89, 46%, 48%), 'hover': hsl(92, 48%, 42%), 'active': hsl(95, 49%, 36%), + 'dark': hsl(103, 56%, 26%), 'default-font-color': #000, //AAA ), 'lime': ( @@ -79,6 +89,7 @@ $colors: ( 'default': hsl(64, 60%, 50%), 'hover': hsl(62, 61%, 44%), 'active': hsl(60, 63%, 38%), + 'dark': hsl(54, 70%, 30%), 'default-font-color': #000, //AAA ), 'yellow': ( @@ -86,6 +97,7 @@ $colors: ( 'default': hsl(49, 98%, 60%), 'hover': hsl(43, 96%, 58%), 'active': hsl(37, 95%, 56%), + 'dark': hsl(28, 92%, 53%), 'default-font-color': #000, //AAA ), 'amber': ( @@ -93,6 +105,7 @@ $colors: ( 'default': hsl(42, 100%, 50%), 'hover': hsl(38, 100%, 50%), 'active': hsl(34, 100%, 50%), + 'dark': hsl(26, 100%, 50%), 'default-font-color': #000, //AAA ), 'orange': ( @@ -100,6 +113,7 @@ $colors: ( 'default': hsl(33, 100%, 49%), 'hover': hsl(30, 100%, 48%), 'active': hsl(27, 100%, 47%), + 'dark': hsl(21, 100%, 45%), 'default-font-color': #000, //AAA ), 'brown': ( @@ -107,6 +121,7 @@ $colors: ( 'default': hsl(15, 25%, 34%), 'hover': hsl(14, 26%, 29%), 'active': hsl(11, 26%, 24%), + 'dark': hsl(9, 28%, 19%), 'default-font-color': #fff, //AAA ), 'gray': ( @@ -114,6 +129,7 @@ $colors: ( 'default': hsl(0, 0%, 46%), 'hover': hsl(0, 0%, 38%), 'active': hsl(0, 0%, 26%), + 'dark': hsl(0, 0%, 13%), 'default-font-color': #fff, //AA ), 'blue-gray': ( @@ -121,6 +137,7 @@ $colors: ( 'default': hsl(199, 18%, 33%), 'hover': hsl(200, 18%, 26%), 'active': hsl(200, 19%, 18%), + 'dark': hsl(200, 19%, 18%), 'default-font-color': #fff, //AAA ) ); @@ -168,7 +185,7 @@ $primary-color-light-background: color('deep-purple', 'background'); $danger-color: color('red', 'default'); $danger-color-hover: color('red', 'hover'); $danger-color-active: color('red', 'active'); -$danger-color-light-background: color('red', 'default'); +$danger-color-light-background: color('red', 'background'); $success-color: color('green', 'default'); $success-color-hover: color('green', 'hover'); diff --git a/src/style/components/_tags.scss b/src/style/components/_tags.scss new file mode 100644 index 0000000..2a4f99b --- /dev/null +++ b/src/style/components/_tags.scss @@ -0,0 +1,35 @@ +@use "../base/variables"; + +.tag { + align-items: center; + border-radius: var(--base-border-radius); + display: inline-block; + font: { + weight: 500; + } + padding: calc(var(--base-gutter) / 2); + + &.tag-primary, &.tag-purple { + background: var(--primary-color-light-background); + color: var(--primary-color); + } + + &.tag-danger { + background: var(--danger-color-light-background); + color: var(--danger-color); + } + + + .tag { + margin-left: var(--base-gutter); + } + + @each $color, $_ in variables.$colors { + &.tag-#{$color} { + background: variables.color($color, 'background'); + color: variables.color($color, 'dark'); + font: { + weight: 500; + } + } + } +} diff --git a/src/style/index.scss b/src/style/index.scss index 0a57069..e98512b 100644 --- a/src/style/index.scss +++ b/src/style/index.scss @@ -14,6 +14,7 @@ @use "components/card"; @use "components/icons"; @use "components/forms"; +@use "components/tags"; /** * 3. Layout diff --git a/www/src/index.tsx b/www/src/index.tsx index 32fb8f4..f425b8f 100644 --- a/www/src/index.tsx +++ b/www/src/index.tsx @@ -1,13 +1,13 @@ import * as React from 'react'; +import { useState } from 'react'; import * as ReactDom from 'react-dom'; import '../../src/style/index.scss'; -import { Button, Card, Col, Grid, Icon, Page, Row, SelectField, TextField, Variant } from '../../src'; +import { Button, Card, Col, Grid, Icon, Page, Row, SelectField, Tag, TextField, Variant } from '../../src'; import Container from '../../src/components/Container/Container'; import FormGroup from '../../src/components/Form/Group'; import FormLabel from '../../src/components/Form/Label'; import FormMessage from '../../src/components/Form/Message'; -import { useState } from 'react'; const TestControllable = () => { const [value, setValue] = useState(''); @@ -227,6 +227,31 @@ ReactDom.render( + + + + test text + Primary + Danger + Rood + Roze + Paars + Diep-paars + Indigo + Blauw + Lichtblauw + Teal + Groen + Lichtgroen + Limoen + Geel + Amber + Oranje + Bruin + Grijs + Blauwgrijs + +