@indico-data/design-system 2.21.2 → 2.23.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
+ children: React.ReactNode | React.ReactNode[];
3
+ status?: 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'primary' | 'secondary';
4
+ size?: 'sm' | 'md' | 'lg';
5
+ };
6
+ export declare const Pill: ({ children, 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.23.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,136 @@
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: 'Components/Pill',
7
+ component: Pill,
8
+ argTypes: {
9
+ children: {
10
+ control: 'text',
11
+ description: 'The content displayed inside the pill',
12
+ table: {
13
+ category: 'Props',
14
+ type: {
15
+ summary: 'React.ReactNode',
16
+ },
17
+ },
18
+ },
19
+ status: {
20
+ control: {
21
+ type: 'select',
22
+ options: ['success', 'warning', 'error', 'info', 'neutral', 'primary', 'secondary'],
23
+ },
24
+ description: 'Applies a CSS class to change the style of the pill',
25
+ table: {
26
+ category: 'Props',
27
+ type: {
28
+ summary: 'success | warning | error | info | neutral | primary | secondary',
29
+ },
30
+ },
31
+ },
32
+ size: {
33
+ control: {
34
+ type: 'select',
35
+ options: ['sm', 'md', 'lg'],
36
+ },
37
+ description: 'Applies a CSS class to change the size of the pill',
38
+ table: {
39
+ category: 'Props',
40
+ type: {
41
+ summary: 'sm | md | lg',
42
+ },
43
+ },
44
+ },
45
+ },
46
+ };
47
+
48
+ export default meta;
49
+
50
+ type Story = StoryObj<typeof Pill>;
51
+
52
+ export const Default: Story = {
53
+ args: {
54
+ children: 'Success',
55
+ status: 'success',
56
+ },
57
+ render: (args) => {
58
+ return (
59
+ <Pill status={args.status} size={args.size}>
60
+ {args.children}
61
+ </Pill>
62
+ );
63
+ },
64
+ };
65
+
66
+ export const AllSizes: Story = {
67
+ render: () => {
68
+ return (
69
+ <Container>
70
+ <Row>
71
+ <Col>
72
+ <Pill status="info" size="lg">
73
+ Large (lg)
74
+ </Pill>
75
+ </Col>
76
+ <Col>
77
+ <Pill status="info" size="md">
78
+ Medium (md)
79
+ </Pill>
80
+ </Col>
81
+ <Col>
82
+ <Pill status="info" size="sm">
83
+ Small (sm)
84
+ </Pill>
85
+ </Col>
86
+ </Row>
87
+ </Container>
88
+ );
89
+ },
90
+ };
91
+
92
+ export const AllStatuses: Story = {
93
+ render: () => {
94
+ return (
95
+ <Container>
96
+ <Row>
97
+ <Col>
98
+ <Pill status="success" size="md">
99
+ Success
100
+ </Pill>
101
+ </Col>
102
+ <Col>
103
+ <Pill status="warning" size="md">
104
+ Warning
105
+ </Pill>
106
+ </Col>
107
+ <Col>
108
+ <Pill status="error" size="md">
109
+ Error
110
+ </Pill>
111
+ </Col>
112
+ <Col>
113
+ <Pill status="primary" size="md">
114
+ Primary
115
+ </Pill>
116
+ </Col>
117
+ <Col>
118
+ <Pill status="secondary" size="md">
119
+ Secondary
120
+ </Pill>
121
+ </Col>
122
+ <Col>
123
+ <Pill status="info" size="md">
124
+ Info
125
+ </Pill>
126
+ </Col>
127
+ <Col>
128
+ <Pill status="neutral" size="md">
129
+ Neutral
130
+ </Pill>
131
+ </Col>
132
+ </Row>
133
+ </Container>
134
+ );
135
+ },
136
+ };
@@ -0,0 +1,20 @@
1
+ import classNames from 'classnames';
2
+
3
+ type Props = {
4
+ children: React.ReactNode | React.ReactNode[];
5
+ status?: 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'primary' | 'secondary';
6
+ size?: 'sm' | 'md' | 'lg';
7
+ };
8
+
9
+ export const Pill = ({ children, 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
+ {children}
18
+ </div>
19
+ );
20
+ };
@@ -0,0 +1,42 @@
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(
22
+ <Pill status="success" size={size} data-testid={`pill-${size}`}>
23
+ Success
24
+ </Pill>,
25
+ );
26
+ const pill = screen.getByTestId(`pill-${size}`);
27
+ expect(pill).toHaveClass(`pill pill--success pill--${size}`);
28
+ });
29
+ });
30
+
31
+ statuses.forEach((status) => {
32
+ it(`checks that the proper style class has been applied when status is ${status}`, () => {
33
+ render(
34
+ <Pill status={status} size="md" data-testid={`pill-${status}`}>
35
+ Status
36
+ </Pill>,
37
+ );
38
+ const pill = screen.getByTestId(`pill-${status}`);
39
+ expect(pill).toHaveClass(`pill pill--${status} pill--md`);
40
+ });
41
+ });
42
+ });
@@ -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
  }