@indico-data/design-system 2.21.2 → 2.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ type Props = {
2
+ value: string;
3
+ status: 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'primary' | 'secondary';
4
+ size: 'sm' | 'md' | 'lg';
5
+ };
6
+ export declare const Pill: ({ value, status, size, ...rest }: Props) => import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,8 @@
1
+ import { Meta, StoryObj } from '@storybook/react';
2
+ import { Pill } from './Pill';
3
+ declare const meta: Meta;
4
+ export default meta;
5
+ type Story = StoryObj<typeof Pill>;
6
+ export declare const Default: Story;
7
+ export declare const AllSizes: Story;
8
+ export declare const AllStatuses: Story;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export { Pill } from './Pill';
@@ -19,3 +19,4 @@ export { Skeleton } from './components/skeleton';
19
19
  export { Card } from './components/card';
20
20
  export { Popper } from './components/popper';
21
21
  export { Menu } from './components/menu';
22
+ export { Pill } from './components/pill';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indico-data/design-system",
3
- "version": "2.21.2",
3
+ "version": "2.22.0",
4
4
  "description": "",
5
5
  "author": "",
6
6
  "main": "lib/index.js",
@@ -0,0 +1,20 @@
1
+ import { Canvas, Meta, Controls, Story } from '@storybook/blocks';
2
+ import * as Pill from './Pill.stories';
3
+
4
+ <Meta title="Layout/Pill" name="Pill" of={Pill} />
5
+
6
+ # Pill
7
+
8
+ Pills are used to display information in a compact way. They are often used to display tags, categories, or statuses.
9
+
10
+ <Canvas of={Pill.Default} />
11
+
12
+ <Controls of={Pill.Default} />
13
+
14
+ ## Sizes
15
+
16
+ <Story of={Pill.AllSizes} />
17
+
18
+ ## CoStatuseslors
19
+
20
+ <Story of={Pill.AllStatuses} />
@@ -0,0 +1,113 @@
1
+ import { Meta, StoryObj } from '@storybook/react';
2
+ import { Pill } from './Pill';
3
+ import { Container, Row, Col } from 'react-grid-system';
4
+
5
+ const meta: Meta = {
6
+ title: 'Layout/Pill',
7
+ component: Pill,
8
+ argTypes: {
9
+ status: {
10
+ control: {
11
+ type: 'select',
12
+ options: ['success', 'warning', 'error', 'info', 'neutral', 'primary', 'secondary'],
13
+ },
14
+ description: 'Applies a CSS class to change the style of the pill',
15
+ table: {
16
+ category: 'Props',
17
+ type: {
18
+ summary: 'success | warning | error | info | neutral | primary | secondary',
19
+ },
20
+ },
21
+ },
22
+ value: {
23
+ control: 'text',
24
+ description: 'The value to display in the pill',
25
+ table: {
26
+ category: 'Props',
27
+ type: {
28
+ summary: 'string',
29
+ },
30
+ },
31
+ defaultValue: { summary: '' },
32
+ },
33
+ size: {
34
+ control: {
35
+ type: 'select',
36
+ options: ['sm', 'md', 'lg'],
37
+ },
38
+ description: 'Applies a CSS class to change the size of the pill',
39
+ table: {
40
+ category: 'Props',
41
+ type: {
42
+ summary: 'sm | md | lg',
43
+ },
44
+ },
45
+ },
46
+ },
47
+ };
48
+
49
+ export default meta;
50
+
51
+ type Story = StoryObj<typeof Pill>;
52
+
53
+ export const Default: Story = {
54
+ args: {
55
+ value: 'Success',
56
+ status: 'success',
57
+ },
58
+ render: (args) => {
59
+ return <Pill value={args.value} status={args.status} size={args.size} />;
60
+ },
61
+ };
62
+
63
+ export const AllSizes: Story = {
64
+ render: () => {
65
+ return (
66
+ <Container>
67
+ <Row>
68
+ <Col>
69
+ <Pill value="Large (lg)" status="info" size="lg" />
70
+ </Col>
71
+ <Col>
72
+ <Pill value="Medium (md)" status="info" size="md" />
73
+ </Col>
74
+ <Col>
75
+ <Pill value="Small (sm)" status="info" size="sm" />
76
+ </Col>
77
+ </Row>
78
+ </Container>
79
+ );
80
+ },
81
+ };
82
+
83
+ export const AllStatuses: Story = {
84
+ render: () => {
85
+ return (
86
+ <Container>
87
+ <Row>
88
+ <Col>
89
+ <Pill value="Success" status="success" size="md" />
90
+ </Col>
91
+ <Col>
92
+ <Pill value="Warning" status="warning" size="md" />
93
+ </Col>
94
+ <Col>
95
+ <Pill value="Error" status="error" size="md" />
96
+ </Col>
97
+ <Col>
98
+ <Pill value="Primary" status="primary" size="md" />
99
+ </Col>
100
+ <Col>
101
+ <Pill value="Secondary" status="secondary" size="md" />
102
+ </Col>
103
+ <Col>
104
+ <Pill value="Info" status="info" size="md" />
105
+ </Col>
106
+ <Col>
107
+ <Pill value="Neutral" status="neutral" size="md" />
108
+ </Col>
109
+ </Row>
110
+ </Container>
111
+ );
112
+ },
113
+ };
@@ -0,0 +1,20 @@
1
+ import classNames from 'classnames';
2
+
3
+ type Props = {
4
+ value: string;
5
+ status: 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'primary' | 'secondary';
6
+ size: 'sm' | 'md' | 'lg';
7
+ };
8
+
9
+ export const Pill = ({ value, status = 'info', size = 'sm', ...rest }: Props) => {
10
+ const className = classNames('pill', {
11
+ [`pill--${status}`]: status,
12
+ [`pill--${size}`]: size,
13
+ });
14
+
15
+ return (
16
+ <div className={className} {...rest}>
17
+ {value}
18
+ </div>
19
+ );
20
+ };
@@ -0,0 +1,34 @@
1
+ import { render, screen } from '@testing-library/react';
2
+ import { Pill } from '@/components/pill/Pill';
3
+
4
+ type Status = 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'primary' | 'secondary';
5
+ type Size = 'sm' | 'md' | 'lg';
6
+
7
+ const sizes = ['sm', 'md', 'lg'] as Size[];
8
+ const statuses = [
9
+ 'success',
10
+ 'warning',
11
+ 'error',
12
+ 'info',
13
+ 'neutral',
14
+ 'primary',
15
+ 'secondary',
16
+ ] as Status[];
17
+
18
+ describe('Pill', () => {
19
+ sizes.forEach((size) => {
20
+ it(`checks that the proper size class is applied when size is ${size}`, () => {
21
+ render(<Pill value="Success" status="success" size={size} data-testid={`pill-${size}`} />);
22
+ const pill = screen.getByTestId(`pill-${size}`);
23
+ expect(pill).toHaveClass(`pill pill--success pill--${size}`);
24
+ });
25
+ });
26
+
27
+ statuses.forEach((status) => {
28
+ it(`checks that the proper style class has been applied when status is ${status}`, () => {
29
+ render(<Pill value="Status" status={status} size="md" data-testid={`pill-${status}`} />);
30
+ const pill = screen.getByTestId(`pill-${status}`);
31
+ expect(pill).toHaveClass(`pill pill--${status} pill--md`);
32
+ });
33
+ });
34
+ });
@@ -0,0 +1 @@
1
+ export { Pill } from './Pill';
@@ -0,0 +1,125 @@
1
+ // Common Variables
2
+ :root,
3
+ :root [data-theme='light'],
4
+ :root [data-theme='dark'] {
5
+ --pf-pill-primary-background-color: var(--pf-primary-color);
6
+ --pf-pill-primary-font-color: var(--pf-white-color);
7
+ --pf-pill-primary-border-color: var(--pf-primary-color);
8
+
9
+ --pf-pill-secondary-background-color: var(--pf-secondary-color);
10
+ --pf-pill-secondary-font-color: var(--pf-white-color);
11
+ --pf-pill-secondary-border-color: var(--pf-secondary-color);
12
+
13
+ --pf-pill-error-background-color: var(--pf-error-color);
14
+ --pf-pill-error-font-color: var(--pf-white-color);
15
+ --pf-pill-error-border-color: var(--pf-error-color);
16
+
17
+ --pf-pill-warning-background-color: var(--pf-warning-color);
18
+ --pf-pill-warning-font-color: var(--pf-white-color);
19
+ --pf-pill-warning-border-color: var(--pf-warning-color);
20
+
21
+ --pf-pill-info-background-color: var(--pf-info-color);
22
+ --pf-pill-info-font-color: var(--pf-white-color);
23
+ --pf-pill-info-border-color: var(--pf-info-color);
24
+
25
+ --pf-pill-success-background-color: var(--pf-success-color);
26
+ --pf-pill-success-font-color: var(--pf-white-color);
27
+ --pf-pill-success-border-color: var(--pf-success-color);
28
+
29
+ --pf-pill-neutral-background-color: var(--pf-gray-color);
30
+ --pf-pill-neutral-font-color: var(--pf-white-color);
31
+ --pf-pill-neutral-border-color: var(--pf-gray-color);
32
+ }
33
+
34
+ // Dark Theme Specific Variables
35
+ :root [data-theme='dark'] {
36
+ --pf-pill-primary-background-color: var(--pf-primary-color-900);
37
+ --pf-pill-primary-font-color: var(--pf-white-color);
38
+ --pf-pill-primary-border-color: var(--pf-primary-color-100);
39
+
40
+ --pf-pill-secondary-background-color: var(--pf-secondary-color-800);
41
+ --pf-pill-secondary-font-color: var(--pf-white-color);
42
+ --pf-pill-secondary-border-color: var(--pf-secondary-color-400);
43
+
44
+ --pf-pill-error-background-color: var(--pf-red-color-900);
45
+ --pf-pill-error-font-color: var(--pf-white-color);
46
+ --pf-pill-error-border-color: var(--pf-red-color-600);
47
+
48
+ --pf-pill-warning-background-color: var(--pf-orange-color-800);
49
+ --pf-pill-warning-font-color: var(--pf-white-color);
50
+ --pf-pill-warning-border-color: var(--pf-orange-color-600);
51
+
52
+ --pf-pill-info-background-color: var(--pf-secondary-color-800);
53
+ --pf-pill-info-font-color: var(--pf-white-color);
54
+ --pf-pill-info-border-color: var(--pf-secondary-color-300);
55
+
56
+ --pf-pill-success-background-color: var(--pf-green-color-900);
57
+ --pf-pill-success-font-color: var(--pf-white-color);
58
+ --pf-pill-success-border-color: var(--pf-green-color-600);
59
+
60
+ --pf-pill-neutral-background-color: var(--pf-gray-color-900);
61
+ --pf-pill-neutral-font-color: var(--pf-gray-color-100);
62
+ --pf-pill-neutral-border-color: var(--pf-gray-color-700);
63
+ }
64
+
65
+ .pill {
66
+ display: inline-block;
67
+ border-radius: var(--pf-rounded-pill);
68
+ padding: var(--pf-padding-1) var(--pf-padding-2);
69
+ font-size: var(--pf-font-size-overline);
70
+ font-weight: var(--pf-font-weight-medium);
71
+ white-space: nowrap;
72
+ line-height: 1;
73
+ border: solid 1px;
74
+
75
+ &--sm {
76
+ padding: var(--pf-padding-1) var(--pf-padding-2);
77
+ font-size: var(--pf-font-size-overline);
78
+ }
79
+
80
+ &--md {
81
+ padding: var(--pf-padding-2) var(--pf-padding-3);
82
+ font-size: var(--pf-font-size-body);
83
+ }
84
+
85
+ &--lg {
86
+ padding: var(--pf-padding-3) var(--pf-padding-4);
87
+ font-size: var(--pf-font-size-h2);
88
+ }
89
+
90
+ &--error {
91
+ background-color: var(--pf-pill-error-background-color);
92
+ color: var(--pf-pill-error-font-color);
93
+ border-color: var(--pf-pill-error-border-color);
94
+ }
95
+ &--warning {
96
+ background-color: var(--pf-pill-warning-background-color);
97
+ color: var(--pf-pill-warning-font-color);
98
+ border-color: var(--pf-pill-warning-border-color);
99
+ }
100
+ &--info {
101
+ background-color: var(--pf-pill-info-background-color);
102
+ color: var(--pf-pill-info-font-color);
103
+ border-color: var(--pf-pill-info-border-color);
104
+ }
105
+ &--success {
106
+ background-color: var(--pf-pill-success-background-color);
107
+ color: var(--pf-pill-success-font-color);
108
+ border-color: var(--pf-pill-success-border-color);
109
+ }
110
+ &--neutral {
111
+ background-color: var(--pf-pill-neutral-background-color);
112
+ color: var(--pf-pill-neutral-font-color);
113
+ border-color: var(--pf-pill-neutral-border-color);
114
+ }
115
+ &--primary {
116
+ background-color: var(--pf-pill-primary-background-color);
117
+ color: var(--pf-pill-primary-font-color);
118
+ border-color: var(--pf-pill-primary-border-color);
119
+ }
120
+ &--secondary {
121
+ background-color: var(--pf-pill-secondary-background-color);
122
+ color: var(--pf-pill-secondary-font-color);
123
+ border-color: var(--pf-pill-secondary-border-color);
124
+ }
125
+ }
package/src/index.ts CHANGED
@@ -73,3 +73,4 @@ export { Skeleton } from './components/skeleton';
73
73
  export { Card } from './components/card';
74
74
  export { Popper } from './components/popper';
75
75
  export { Menu } from './components/menu';
76
+ export { Pill } from './components/pill';
@@ -19,6 +19,7 @@
19
19
  @import '../components/menu/styles/Menu.scss';
20
20
  @import '../components/popper/styles/Popper.scss';
21
21
  @import '../legacy/components/inputs/NoInputDatePicker/NoInputDatePicker.scss';
22
+ @import '../components/pill/styles/Pill.scss';
22
23
  @import 'typography';
23
24
  @import 'colors';
24
25
  @import 'borders';
@@ -50,7 +50,7 @@
50
50
  --pf-green-color-600: #168116;
51
51
  --pf-green-color-700: #106710;
52
52
  --pf-green-color-800: #0d5a0d;
53
- --pf-green-color-900: #0a500a;
53
+ --pf-green-color-900: #003c00;
54
54
 
55
55
  //Orange color
56
56
  --pf-orange-color: #da9534;
@@ -73,14 +73,18 @@
73
73
  --pf-red-color-300: #ff7577;
74
74
  --pf-red-color-400: #ff6466;
75
75
  --pf-red-color-500: #f44d4f;
76
- --pf-red-color-600: #cf4244;
76
+ --pf-red-color-600: #ba5759;
77
77
  --pf-red-color-700: #b4393a;
78
- --pf-red-color-800: #9a3132;
79
- --pf-red-color-900: #752324;
78
+ --pf-red-color-800: #7b2728;
79
+ --pf-red-color-900: #4d1717;
80
80
 
81
81
  // Utility Colors
82
82
  --pf-error-color: var(--pf-red-color);
83
83
  --pf-success-color: var(--pf-green-color);
84
84
  --pf-warning-color: var(--pf-orange-color);
85
- --pf-info-color: var(--pf-gray-color);
85
+ --pf-neutral-color: var(--pf-gray-color);
86
+ --pf-info-color: var(--pf-secondary-color);
87
+
88
+ --pf-link-color: var(--pf-gray-color-300);
89
+ --pf-link-hover-color: var(--pf-gray-color-100);
86
90
  }
@@ -79,10 +79,11 @@
79
79
  --pf-white-color: #ffffff;
80
80
 
81
81
  // Utility Colors
82
- --pf-error-color: var(--pf-red-color);
83
- --pf-success-color: var(--pf-green-color);
84
- --pf-warning-color: var(--pf-orange-color);
85
- --pf-info-color: var(--pf-gray-color);
82
+ --pf-error-color: var(--pf-red-color-600);
83
+ --pf-success-color: var(--pf-green-color-600);
84
+ --pf-warning-color: var(--pf-orange-color-600);
85
+ --pf-neutral-color: var(--pf-gray-color);
86
+ --pf-info-color: var(--pf-secondary-color-600);
86
87
  --pf-link-color: var(--pf-secondary-color);
87
88
  --pf-link-hover-color: var(--pf-secondary-color-400);
88
89
  }