@indico-data/design-system 3.1.0 → 3.2.1

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.
package/lib/types.d.ts CHANGED
@@ -6,7 +6,9 @@ export type PermafrostComponent = {
6
6
  };
7
7
  import { IconSizes, IconName } from './components/icons/types';
8
8
  export type { IconSizes, IconName };
9
- export type SemanticColor = 'neutral' | 'info' | 'warning' | 'error' | 'success' | 'teal' | 'purple' | 'orange' | 'pending';
9
+ export type ChromaticColor = 'blue' | 'purple' | 'red' | 'yellow' | 'gray' | 'green' | 'pink' | 'orange' | 'teal';
10
+ export type Color = ChromaticColor | 'black' | 'white';
11
+ export type SemanticColor = 'neutral' | 'info' | 'warning' | 'error' | 'success' | 'pending';
10
12
  import { SelectOption } from './components/forms/select/types';
11
13
  export type { SelectOption };
12
14
  import { TableProps, TableColumn, Direction, Alignment } from './components/table/types';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indico-data/design-system",
3
- "version": "3.1.0",
3
+ "version": "3.2.1",
4
4
  "description": "",
5
5
  "author": "",
6
6
  "main": "lib/index.js",
@@ -15,6 +15,10 @@ Pills are used to display information in a compact way. They are often used to d
15
15
 
16
16
  <Story of={Pill.AllSizes} />
17
17
 
18
- ## Statuses
18
+ ## Default Colors
19
19
 
20
- <Story of={Pill.AllStatuses} />
20
+ <Story of={Pill.AllDefaultColors} />
21
+
22
+ # Shades
23
+
24
+ <Story of={Pill.AllShades} />
@@ -1,6 +1,22 @@
1
1
  import { Meta, StoryObj } from '@storybook/react';
2
2
  import { Pill } from './Pill';
3
3
  import { Container, Row, Col } from 'react-grid-system';
4
+ import { ChromaticColor } from '@/types';
5
+ import { PillShade } from './types';
6
+
7
+ const CHROMATIC_COLORS: ChromaticColor[] = [
8
+ 'blue',
9
+ 'purple',
10
+ 'red',
11
+ 'yellow',
12
+ 'gray',
13
+ 'green',
14
+ 'pink',
15
+ 'orange',
16
+ 'teal',
17
+ ];
18
+
19
+ const SHADES: PillShade[] = [1, 2, 3, 4, 5];
4
20
 
5
21
  const meta: Meta = {
6
22
  title: 'Components/Pill',
@@ -66,8 +82,8 @@ type Story = StoryObj<typeof Pill>;
66
82
 
67
83
  export const Default: Story = {
68
84
  args: {
69
- children: 'Success',
70
- color: 'success',
85
+ children: 'Green',
86
+ color: 'green',
71
87
  },
72
88
  render: (args) => {
73
89
  return (
@@ -84,19 +100,13 @@ export const AllSizes: Story = {
84
100
  <Container>
85
101
  <Row>
86
102
  <Col>
87
- <Pill color="neutral" size="lg">
88
- Large (lg)
89
- </Pill>
103
+ <Pill size="lg">Large (lg)</Pill>
90
104
  </Col>
91
105
  <Col>
92
- <Pill color="neutral" size="md">
93
- Medium (md)
94
- </Pill>
106
+ <Pill size="md">Medium (md)</Pill>
95
107
  </Col>
96
108
  <Col>
97
- <Pill color="neutral" size="sm">
98
- Small (sm)
99
- </Pill>
109
+ <Pill size="sm">Small (sm)</Pill>
100
110
  </Col>
101
111
  </Row>
102
112
  </Container>
@@ -104,58 +114,40 @@ export const AllSizes: Story = {
104
114
  },
105
115
  };
106
116
 
107
- export const AllStatuses: Story = {
117
+ export const AllDefaultColors: Story = {
108
118
  render: () => {
109
119
  return (
110
120
  <Container>
111
- <Row>
112
- <Col>
113
- <Pill color="success" size="md">
114
- Success
115
- </Pill>
116
- </Col>
117
- <Col>
118
- <Pill color="warning" size="md">
119
- Warning
120
- </Pill>
121
- </Col>
122
- <Col>
123
- <Pill color="error" size="md">
124
- Error
125
- </Pill>
126
- </Col>
127
- <Col>
128
- <Pill color="purple" size="md">
129
- Purple
130
- </Pill>
131
- </Col>
132
- <Col>
133
- <Pill color="info" size="md">
134
- Info
135
- </Pill>
136
- </Col>
137
- <Col>
138
- <Pill color="teal" size="md">
139
- Teal
140
- </Pill>
141
- </Col>
142
- <Col>
143
- <Pill color="neutral" size="md">
144
- Neutral
145
- </Pill>
146
- </Col>
147
- <Col>
148
- <Pill color="pending" size="md">
149
- Pending
150
- </Pill>
151
- </Col>
152
- <Col>
153
- <Pill color="orange" size="md">
154
- Orange
155
- </Pill>
156
- </Col>
121
+ <Row justify="start">
122
+ {CHROMATIC_COLORS.map((color: ChromaticColor) => (
123
+ <Col xs="content" className="mb-2">
124
+ <Pill color={color} size="md">
125
+ {color}
126
+ </Pill>
127
+ </Col>
128
+ ))}
157
129
  </Row>
158
130
  </Container>
159
131
  );
160
132
  },
161
133
  };
134
+
135
+ export const AllShades: Story = {
136
+ render: () => {
137
+ return (
138
+ <Container>
139
+ {CHROMATIC_COLORS.map((color: ChromaticColor) => (
140
+ <Row key={color}>
141
+ {SHADES.map((shade: PillShade) => (
142
+ <Col width={100} className="mb-2">
143
+ <Pill shade={shade} color={color} size="md">
144
+ {color}-{shade}
145
+ </Pill>
146
+ </Col>
147
+ ))}
148
+ </Row>
149
+ ))}
150
+ </Container>
151
+ );
152
+ },
153
+ };
@@ -4,12 +4,14 @@ import { PillProps } from './types';
4
4
  export const Pill = ({
5
5
  children,
6
6
  className,
7
- color = 'neutral',
7
+ color = 'gray',
8
8
  size = 'sm',
9
+ shade,
9
10
  ...rest
10
11
  }: PillProps) => {
11
12
  const pillClasses = classNames('pill', className, {
12
- [`pill--${color}`]: color,
13
+ [`pill--${color}`]: color && !shade,
14
+ [`pill--${color}-${shade}`]: color && shade,
13
15
  [`pill--${size}`]: size,
14
16
  });
15
17
 
@@ -1,28 +1,32 @@
1
1
  import { render, screen } from '@testing-library/react';
2
2
  import { Pill } from '@/components/pill/Pill';
3
- import { PillColor, PillSize } from '../types';
3
+ import { PillColor, PillShade, PillSize } from '../types';
4
4
 
5
5
  const sizes = ['sm', 'md', 'lg'] as PillSize[];
6
6
  const colors = [
7
- 'success',
8
- 'warning',
9
- 'error',
10
- 'info',
11
- 'neutral',
12
- 'primary',
13
- 'secondary',
7
+ 'blue',
8
+ 'purple',
9
+ 'red',
10
+ 'yellow',
11
+ 'gray',
12
+ 'green',
13
+ 'pink',
14
+ 'orange',
15
+ 'teal',
14
16
  ] as PillColor[];
15
17
 
18
+ const shades = [1, 2, 3, 4, 5] as PillShade[];
19
+
16
20
  describe('Pill', () => {
17
21
  sizes.forEach((size) => {
18
22
  it(`checks that the proper size class is applied when size is ${size}`, () => {
19
23
  render(
20
- <Pill color="success" size={size} data-testid={`pill-${size}`}>
24
+ <Pill color="blue" size={size} data-testid={`pill-${size}`}>
21
25
  Success
22
26
  </Pill>,
23
27
  );
24
28
  const pill = screen.getByTestId(`pill-${size}`);
25
- expect(pill).toHaveClass(`pill pill--success pill--${size}`);
29
+ expect(pill).toHaveClass(`pill pill--blue pill--${size}`);
26
30
  });
27
31
  });
28
32
 
@@ -37,4 +41,18 @@ describe('Pill', () => {
37
41
  expect(pill).toHaveClass(`pill pill--${color} pill--md`);
38
42
  });
39
43
  });
44
+
45
+ colors.forEach((color) => {
46
+ shades.forEach((shade) => {
47
+ it(`checks that the proper style class has been applied when color is ${color} and shade is ${shade}`, () => {
48
+ render(
49
+ <Pill color={color} size="md" shade={shade} data-testid={`pill-${color}-${shade}`}>
50
+ Status
51
+ </Pill>,
52
+ );
53
+ const pill = screen.getByTestId(`pill-${color}-${shade}`);
54
+ expect(pill).toHaveClass(`pill pill--${color}-${shade} pill--md`);
55
+ });
56
+ });
57
+ });
40
58
  });
@@ -1,82 +1,3 @@
1
- // Light Theme Specific Variables
2
- :root [data-theme='light'] {
3
- --pf-pill-info-background-color: var(--pf-info-color-dark);
4
- --pf-pill-info-font-color: var(--pf-gray-color-50);
5
- --pf-pill-info-border-color: var(--pf-info-color-dark);
6
-
7
- --pf-pill-error-background-color: var(--pf-error-color-dark);
8
- --pf-pill-error-font-color: var(--pf-gray-color-50);
9
- --pf-pill-error-border-color: var(--pf-error-color-dark);
10
-
11
- --pf-pill-warning-background-color: var(--pf-warning-color-dark);
12
- --pf-pill-warning-font-color: var(--pf-gray-color-50);
13
- --pf-pill-warning-border-color: var(--pf-warning-color-dark);
14
-
15
- --pf-pill-neutral-background-color: var(--pf-gray-color-700);
16
- --pf-pill-neutral-font-color: var(--pf-gray-color-50);
17
- --pf-pill-neutral-border-color: var(--pf-gray-color-700);
18
-
19
- --pf-pill-success-background-color: var(--pf-success-color-dark);
20
- --pf-pill-success-font-color: var(--pf-gray-color-50);
21
- --pf-pill-success-border-color: var(--pf-success-color-dark);
22
-
23
- --pf-pill-purple-background-color: color-mix(in srgb, var(--pf-purple-color-450) 75%, black);
24
- --pf-pill-purple-font-color: var(--pf-gray-color-50);
25
- --pf-pill-purple-border-color: color-mix(in srgb, var(--pf-purple-color-450) 75%, black);
26
-
27
- --pf-pill-pending-background-color: var(--pf-pending-color-dark);
28
- --pf-pill-pending-font-color: var(--pf-gray-color-50);
29
- --pf-pill-pending-border-color: var(--pf-pending-color-dark);
30
-
31
- --pf-pill-orange-background-color: color-mix(in srgb, var(--pf-orange-color-500) 75%, black);
32
- --pf-pill-orange-font-color: var(--pf-gray-color-50);
33
- --pf-pill-orange-border-color: color-mix(in srgb, var(--pf-orange-color-500) 75%, black);
34
-
35
- --pf-pill-teal-background-color: color-mix(in srgb, var(--pf-teal-color-600) 75%, black);
36
- --pf-pill-teal-font-color: var(--pf-gray-color-50);
37
- --pf-pill-teal-border-color: color-mix(in srgb, var(--pf-teal-color-600) 75%, black);
38
- }
39
-
40
- // Dark Theme Specific Variables
41
- :root [data-theme='dark'],
42
- :root {
43
- --pf-pill-info-background-color: var(--pf-info-color-dark);
44
- --pf-pill-info-font-color: var(--pf-gray-color-50);
45
- --pf-pill-info-border-color: var(--pf-info-color-dark);
46
-
47
- --pf-pill-error-background-color: var(--pf-error-color-dark);
48
- --pf-pill-error-font-color: var(--pf-gray-color-50);
49
- --pf-pill-error-border-color: var(--pf-error-color-dark);
50
-
51
- --pf-pill-warning-background-color: var(--pf-warning-color-dark);
52
- --pf-pill-warning-font-color: var(--pf-gray-color-50);
53
- --pf-pill-warning-border-color: var(--pf-warning-color-dark);
54
-
55
- --pf-pill-neutral-background-color: var(--pf-gray-color-700);
56
- --pf-pill-neutral-font-color: var(--pf-gray-color-50);
57
- --pf-pill-neutral-border-color: var(--pf-gray-color-700);
58
-
59
- --pf-pill-success-background-color: var(--pf-success-color-dark);
60
- --pf-pill-success-font-color: var(--pf-gray-color-50);
61
- --pf-pill-success-border-color: var(--pf-success-color-dark);
62
-
63
- --pf-pill-purple-background-color: color-mix(in srgb, var(--pf-purple-color-450) 75%, black);
64
- --pf-pill-purple-font-color: var(--pf-gray-color-50);
65
- --pf-pill-purple-border-color: color-mix(in srgb, var(--pf-purple-color-450) 75%, black);
66
-
67
- --pf-pill-pending-background-color: var(--pf-pending-color-dark);
68
- --pf-pill-pending-font-color: var(--pf-gray-color-50);
69
- --pf-pill-pending-border-color: var(--pf-pending-color-dark);
70
-
71
- --pf-pill-orange-background-color: color-mix(in srgb, var(--pf-orange-color-500) 75%, black);
72
- --pf-pill-orange-font-color: var(--pf-gray-color-50);
73
- --pf-pill-orange-border-color: color-mix(in srgb, var(--pf-orange-color-500) 75%, black);
74
-
75
- --pf-pill-teal-background-color: color-mix(in srgb, var(--pf-teal-color-600) 75%, black);
76
- --pf-pill-teal-font-color: var(--pf-gray-color-50);
77
- --pf-pill-teal-border-color: color-mix(in srgb, var(--pf-teal-color-600) 75%, black);
78
- }
79
-
80
1
  .pill {
81
2
  display: inline-block;
82
3
  border-radius: var(--pf-rounded);
@@ -85,7 +6,7 @@
85
6
  font-weight: var(--pf-font-weight-medium);
86
7
  white-space: nowrap;
87
8
  line-height: 1;
88
- border: solid 1px;
9
+ color: var(--pf-font-color-light);
89
10
 
90
11
  &--sm {
91
12
  padding: var(--pf-padding-1) var(--pf-padding-2);
@@ -102,56 +23,17 @@
102
23
  font-size: var(--pf-font-size-h2);
103
24
  }
104
25
 
105
- &--error {
106
- background-color: var(--pf-pill-error-background-color);
107
- color: var(--pf-pill-error-font-color);
108
- border-color: var(--pf-pill-error-border-color);
109
- }
110
- &--warning {
111
- background-color: var(--pf-pill-warning-background-color);
112
- color: var(--pf-pill-warning-font-color);
113
- border-color: var(--pf-pill-warning-border-color);
114
- }
115
- &--info {
116
- background-color: var(--pf-pill-info-background-color);
117
- color: var(--pf-pill-info-font-color);
118
- border-color: var(--pf-pill-info-border-color);
119
- }
120
- &--success {
121
- background-color: var(--pf-pill-success-background-color);
122
- color: var(--pf-pill-success-font-color);
123
- border-color: var(--pf-pill-success-border-color);
124
- }
125
- &--neutral {
126
- background-color: var(--pf-pill-neutral-background-color);
127
- color: var(--pf-pill-neutral-font-color);
128
- border-color: var(--pf-pill-neutral-border-color);
129
- }
130
- &--info {
131
- background-color: var(--pf-pill-info-background-color);
132
- color: var(--pf-pill-info-font-color);
133
- border-color: var(--pf-pill-info-border-color);
134
- }
135
- &--pending {
136
- background-color: var(--pf-pill-pending-background-color);
137
- color: var(--pf-pill-pending-font-color);
138
- border-color: var(--pf-pill-pending-border-color);
139
- }
26
+ @each $color in $chromatic-color-names {
27
+ &--#{$color} {
28
+ background-color: var(--pf-item-#{$color}-color);
29
+ border-color: var(--pf-item-#{$color}-color);
30
+ }
140
31
 
141
- &--purple {
142
- background-color: var(--pf-pill-purple-background-color);
143
- color: var(--pf-pill-purple-font-color);
144
- border-color: var(--pf-pill-purple-border-color);
145
- }
146
-
147
- &--orange {
148
- background-color: var(--pf-pill-orange-background-color);
149
- color: var(--pf-pill-orange-font-color);
150
- border-color: var(--pf-pill-orange-border-color);
151
- }
152
- &--teal {
153
- background-color: var(--pf-pill-teal-background-color);
154
- color: var(--pf-pill-teal-font-color);
155
- border-color: var(--pf-pill-teal-border-color);
32
+ @each $shade, $color-number in $item-shades-to-color-number {
33
+ &--#{$color}-#{$shade} {
34
+ background-color: var(--pf-item-#{$color}-#{$shade}-color);
35
+ border-color: var(--pf-item-#{$color}-#{$shade}-color);
36
+ }
37
+ }
156
38
  }
157
39
  }
@@ -1,8 +1,9 @@
1
- import { SemanticColor } from '../../types';
1
+ import { ChromaticColor } from '../../types';
2
2
  import React from 'react';
3
3
 
4
4
  export type PillSize = 'sm' | 'md' | 'lg';
5
- export type PillColor = SemanticColor | 'neutral';
5
+ export type PillColor = ChromaticColor;
6
+ export type PillShade = 1 | 2 | 3 | 4 | 5;
6
7
 
7
8
  export interface PillProps {
8
9
  /** The content displayed inside the pill */
@@ -11,5 +12,7 @@ export interface PillProps {
11
12
  color?: PillColor;
12
13
  /** Applies a CSS class to change the size of the pill */
13
14
  size?: PillSize;
15
+ /** Applies a CSS class to change the shade of the pill */
16
+ shade?: PillShade;
14
17
  className?: string;
15
18
  }
@@ -1,5 +1,6 @@
1
1
  $color-names: 'primary', 'secondary', 'tertiary', 'gray', 'red', 'orange', 'yellow', 'green',
2
2
  'purple', 'pink', 'teal', 'brand';
3
+ $chromatic-color-names: 'blue', 'purple', 'red', 'yellow', 'gray', 'green', 'pink', 'orange', 'teal';
3
4
  $color-grades: ();
4
5
  @for $i from 1 through 20 {
5
6
  $color-grades: append($color-grades, #{$i * 50}, comma);
@@ -42,3 +43,11 @@ $utility-color-names: 'success', 'info', 'neutral', 'warning', 'error', 'brand';
42
43
  .active-link-color {
43
44
  color: var(--pf-active-link-color);
44
45
  }
46
+
47
+ $item-shades-to-color-number: (
48
+ 1: 450,
49
+ 2: 500,
50
+ 3: 550,
51
+ 4: 600,
52
+ 5: 700,
53
+ );
@@ -3,6 +3,8 @@
3
3
  // ***********************************************************************************************************************************
4
4
  --pf-white-color: #ffffff;
5
5
  --pf-black-color: #000000;
6
+
7
+ // Background Colors
6
8
  --pf-page-background-color: var(--pf-gray-color-100);
7
9
  --pf-background-color-primary: var(--pf-gray-color-150);
8
10
  --pf-background-color-secondary: var(--pf-gray-color-50);
@@ -74,6 +76,8 @@
74
76
  // ***********************************************************************************************************************************
75
77
  --pf-font-color: var(--pf-gray-color-50);
76
78
  --pf-font-color-inverted: var(--pf-gray-color-900);
79
+
80
+ // Background Colors
77
81
  --pf-font-color-soft: var(--pf-tertiary-color-300);
78
82
  --pf-font-color-placeholder: var(--pf-tertiary-color-500);
79
83
  --pf-font-color-accent: var(--pf-secondary-color-400);
@@ -85,6 +89,24 @@
85
89
  --pf-font-color-neutral: var(--pf-neutral-color);
86
90
  --pf-font-color-pending: var(--pf-pending-color);
87
91
  --pf-font-color-brand: var(--pf-brand-color);
92
+ --pf-font-color-light: var(--pf-gray-color-50);
93
+
94
+ // Item Colors
95
+ --pf-item-blue-color: var(--pf-blue-color-550);
96
+ --pf-item-red-color: var(--pf-red-color-500);
97
+ --pf-item-yellow-color: var(--pf-yellow-color-550);
98
+ --pf-item-gray-color: var(--pf-gray-color-700);
99
+ --pf-item-green-color: var(--pf-green-color-600);
100
+ --pf-item-purple-color: var(--pf-purple-color-500);
101
+ --pf-item-pink-color: var(--pf-pink-color-600);
102
+ --pf-item-orange-color: var(--pf-orange-color-500);
103
+ --pf-item-teal-color: var(--pf-teal-color-600);
104
+
105
+ @each $color in $chromatic-color-names {
106
+ @each $shade, $color-number in $item-shades-to-color-number {
107
+ --pf-item-#{$color}-#{$shade}-color: var(--pf-#{$color}-color-#{$color-number});
108
+ }
109
+ }
88
110
 
89
111
  // Links
90
112
  // ***********************************************************************************************************************************
@@ -1,7 +1,17 @@
1
- // Variables
1
+ // Globals
2
2
  @import './assets/fonts/noto/notosans.css';
3
3
  @import 'variables/index.scss';
4
+ @import 'utilities';
5
+ @import 'sheets'; // Port to an sheets component when we build it
6
+ @import 'typography';
7
+ @import 'colors';
8
+ @import 'borders';
9
+ @import 'padding';
10
+ @import 'margin';
11
+ @import 'gap';
12
+ @import 'animations';
4
13
  @import './globals.scss';
14
+
5
15
  // Components
6
16
  @import '../components/button/styles/Button.scss';
7
17
  @import '../components/icons/styles/Icon.scss';
@@ -32,12 +42,3 @@
32
42
  @import '../components/truncate/styles/Truncate.scss';
33
43
  @import '../components/toast/styles/Toast.scss';
34
44
  @import '../components/stepper/styles/Stepper.scss';
35
- @import 'utilities';
36
- @import 'sheets'; // Port to an sheets component when we build it
37
- @import 'typography';
38
- @import 'colors';
39
- @import 'borders';
40
- @import 'padding';
41
- @import 'margin';
42
- @import 'gap';
43
- @import 'animations';