@arbor-education/design-system.components 0.3.6 → 0.4.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.
Files changed (138) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/CLAUDE.md +9 -0
  3. package/dist/components/avatar/Avatar.d.ts +11 -0
  4. package/dist/components/avatar/Avatar.d.ts.map +1 -0
  5. package/dist/components/avatar/Avatar.js +17 -0
  6. package/dist/components/avatar/Avatar.js.map +1 -0
  7. package/dist/components/avatar/Avatar.stories.d.ts +14 -0
  8. package/dist/components/avatar/Avatar.stories.d.ts.map +1 -0
  9. package/dist/components/avatar/Avatar.stories.js +66 -0
  10. package/dist/components/avatar/Avatar.stories.js.map +1 -0
  11. package/dist/components/avatar/Avatar.test.d.ts +2 -0
  12. package/dist/components/avatar/Avatar.test.d.ts.map +1 -0
  13. package/dist/components/avatar/Avatar.test.js +51 -0
  14. package/dist/components/avatar/Avatar.test.js.map +1 -0
  15. package/dist/components/banner/Banner.d.ts +19 -0
  16. package/dist/components/banner/Banner.d.ts.map +1 -0
  17. package/dist/components/banner/Banner.js +33 -0
  18. package/dist/components/banner/Banner.js.map +1 -0
  19. package/dist/components/banner/Banner.stories.d.ts +72 -0
  20. package/dist/components/banner/Banner.stories.d.ts.map +1 -0
  21. package/dist/components/banner/Banner.stories.js +84 -0
  22. package/dist/components/banner/Banner.stories.js.map +1 -0
  23. package/dist/components/banner/Banner.test.d.ts +2 -0
  24. package/dist/components/banner/Banner.test.d.ts.map +1 -0
  25. package/dist/components/banner/Banner.test.js +72 -0
  26. package/dist/components/banner/Banner.test.js.map +1 -0
  27. package/dist/components/dropdown/Dropdown.d.ts +2 -0
  28. package/dist/components/dropdown/Dropdown.d.ts.map +1 -1
  29. package/dist/components/dropdown/Dropdown.js +5 -1
  30. package/dist/components/dropdown/Dropdown.js.map +1 -1
  31. package/dist/components/dropdown/items/DropdownGroup.d.ts +3 -0
  32. package/dist/components/dropdown/items/DropdownGroup.d.ts.map +1 -0
  33. package/dist/components/dropdown/items/DropdownGroup.js +8 -0
  34. package/dist/components/dropdown/items/DropdownGroup.js.map +1 -0
  35. package/dist/components/dropdown/items/DropdownSeparator.d.ts +3 -0
  36. package/dist/components/dropdown/items/DropdownSeparator.d.ts.map +1 -0
  37. package/dist/components/dropdown/items/DropdownSeparator.js +8 -0
  38. package/dist/components/dropdown/items/DropdownSeparator.js.map +1 -0
  39. package/dist/components/userDropdown/UserDropdown.d.ts +47 -0
  40. package/dist/components/userDropdown/UserDropdown.d.ts.map +1 -0
  41. package/dist/components/userDropdown/UserDropdown.js +13 -0
  42. package/dist/components/userDropdown/UserDropdown.js.map +1 -0
  43. package/dist/components/userDropdown/UserDropdown.stories.d.ts +12 -0
  44. package/dist/components/userDropdown/UserDropdown.stories.d.ts.map +1 -0
  45. package/dist/components/userDropdown/UserDropdown.stories.js +222 -0
  46. package/dist/components/userDropdown/UserDropdown.stories.js.map +1 -0
  47. package/dist/components/userDropdown/UserDropdown.test.d.ts +2 -0
  48. package/dist/components/userDropdown/UserDropdown.test.d.ts.map +1 -0
  49. package/dist/components/userDropdown/UserDropdown.test.js +197 -0
  50. package/dist/components/userDropdown/UserDropdown.test.js.map +1 -0
  51. package/dist/components/userDropdown/assets/arbor.png +0 -0
  52. package/dist/components/userDropdown/assets/govhub.png +0 -0
  53. package/dist/components/userDropdown/assets/key.png +0 -0
  54. package/dist/components/userDropdown/assets/logos.d.ts +7 -0
  55. package/dist/components/userDropdown/assets/logos.d.ts.map +1 -0
  56. package/dist/components/userDropdown/assets/logos.js +13 -0
  57. package/dist/components/userDropdown/assets/logos.js.map +1 -0
  58. package/dist/components/userDropdown/assets/robin.png +0 -0
  59. package/dist/components/userDropdown/assets/sampeople.png +0 -0
  60. package/dist/components/userDropdown/assets/timetabler.png +0 -0
  61. package/dist/components/userDropdown/internal/UserDropdownAppItem.d.ts +3 -0
  62. package/dist/components/userDropdown/internal/UserDropdownAppItem.d.ts.map +1 -0
  63. package/dist/components/userDropdown/internal/UserDropdownAppItem.js +9 -0
  64. package/dist/components/userDropdown/internal/UserDropdownAppItem.js.map +1 -0
  65. package/dist/components/userDropdown/internal/UserDropdownCollapsibleSection.d.ts +9 -0
  66. package/dist/components/userDropdown/internal/UserDropdownCollapsibleSection.d.ts.map +1 -0
  67. package/dist/components/userDropdown/internal/UserDropdownCollapsibleSection.js +11 -0
  68. package/dist/components/userDropdown/internal/UserDropdownCollapsibleSection.js.map +1 -0
  69. package/dist/components/userDropdown/internal/UserDropdownSignOut.d.ts +7 -0
  70. package/dist/components/userDropdown/internal/UserDropdownSignOut.d.ts.map +1 -0
  71. package/dist/components/userDropdown/internal/UserDropdownSignOut.js +9 -0
  72. package/dist/components/userDropdown/internal/UserDropdownSignOut.js.map +1 -0
  73. package/dist/components/userDropdown/internal/UserDropdownTrigger.d.ts +11 -0
  74. package/dist/components/userDropdown/internal/UserDropdownTrigger.d.ts.map +1 -0
  75. package/dist/components/userDropdown/internal/UserDropdownTrigger.js +10 -0
  76. package/dist/components/userDropdown/internal/UserDropdownTrigger.js.map +1 -0
  77. package/dist/components/userDropdown/internal/UserDropdownUserInfo.d.ts +8 -0
  78. package/dist/components/userDropdown/internal/UserDropdownUserInfo.d.ts.map +1 -0
  79. package/dist/components/userDropdown/internal/UserDropdownUserInfo.js +17 -0
  80. package/dist/components/userDropdown/internal/UserDropdownUserInfo.js.map +1 -0
  81. package/dist/index.css +463 -53
  82. package/dist/index.css.map +1 -1
  83. package/dist/index.d.ts +5 -0
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +4 -0
  86. package/dist/index.js.map +1 -1
  87. package/package.json +3 -2
  88. package/src/components/avatar/Avatar.stories.tsx +84 -0
  89. package/src/components/avatar/Avatar.test.tsx +60 -0
  90. package/src/components/avatar/Avatar.tsx +68 -0
  91. package/src/components/avatar/avatar.scss +71 -0
  92. package/src/components/banner/Banner.stories.tsx +96 -0
  93. package/src/components/banner/Banner.test.tsx +86 -0
  94. package/src/components/banner/Banner.tsx +81 -0
  95. package/src/components/banner/banner.scss +67 -0
  96. package/src/components/button/button.scss +0 -5
  97. package/src/components/card/card.scss +0 -3
  98. package/src/components/dropdown/Dropdown.tsx +5 -1
  99. package/src/components/dropdown/dropdown.scss +4 -4
  100. package/src/components/dropdown/items/DropdownGroup.tsx +11 -0
  101. package/src/components/dropdown/items/DropdownSeparator.tsx +9 -0
  102. package/src/components/formField/fieldset/fieldset.scss +0 -2
  103. package/src/components/formField/formField.scss +0 -2
  104. package/src/components/formField/inputs/checkbox/checkboxInput.scss +0 -2
  105. package/src/components/formField/inputs/input.scss +0 -3
  106. package/src/components/formField/inputs/radio/radioButtonInput.scss +0 -2
  107. package/src/components/formField/inputs/selectDropdown/selectDropdown.scss +0 -1
  108. package/src/components/formField/label/label.scss +0 -2
  109. package/src/components/modal/modal.scss +0 -3
  110. package/src/components/pill/pill.scss +0 -3
  111. package/src/components/searchBar/searchBar.scss +0 -3
  112. package/src/components/table/columnFilters/columnFilters.scss +0 -6
  113. package/src/components/table/pagination/pagination.scss +0 -4
  114. package/src/components/tabs/tabs.scss +0 -2
  115. package/src/components/tag/tag.scss +0 -3
  116. package/src/components/toast/toast.scss +0 -1
  117. package/src/components/tooltip/tooltip.scss +0 -3
  118. package/src/components/userDropdown/UserDropdown.stories.tsx +237 -0
  119. package/src/components/userDropdown/UserDropdown.test.tsx +349 -0
  120. package/src/components/userDropdown/UserDropdown.tsx +110 -0
  121. package/src/components/userDropdown/assets/arbor.png +0 -0
  122. package/src/components/userDropdown/assets/govhub.png +0 -0
  123. package/src/components/userDropdown/assets/key.png +0 -0
  124. package/src/components/userDropdown/assets/logos.ts +13 -0
  125. package/src/components/userDropdown/assets/robin.png +0 -0
  126. package/src/components/userDropdown/assets/sampeople.png +0 -0
  127. package/src/components/userDropdown/assets/timetabler.png +0 -0
  128. package/src/components/userDropdown/internal/UserDropdownAppItem.tsx +21 -0
  129. package/src/components/userDropdown/internal/UserDropdownCollapsibleSection.tsx +38 -0
  130. package/src/components/userDropdown/internal/UserDropdownSignOut.tsx +19 -0
  131. package/src/components/userDropdown/internal/UserDropdownTrigger.tsx +42 -0
  132. package/src/components/userDropdown/internal/UserDropdownUserInfo.tsx +60 -0
  133. package/src/components/userDropdown/userDropdown.scss +377 -0
  134. package/src/global.scss +9 -1
  135. package/src/index.scss +3 -0
  136. package/src/index.ts +5 -0
  137. package/tsconfig.json +1 -1
  138. package/vite-env.d.ts +31 -0
@@ -0,0 +1,81 @@
1
+ import { cva } from 'class-variance-authority';
2
+ import { Button } from 'Components/button/Button';
3
+
4
+ import type { IconName } from 'Components/icon/allowedIcons';
5
+ import { Icon } from 'Components/icon/Icon';
6
+
7
+ export enum BANNER_LEVEL {
8
+ INFO = 'info',
9
+ NEUTRAL = 'neutral',
10
+ WARNING = 'warning',
11
+ DESTRUCTIVE = 'destructive',
12
+ }
13
+
14
+ export type BannerProps = {
15
+ className?: string;
16
+ level?: BANNER_LEVEL;
17
+ icon?: IconName;
18
+ title?: string;
19
+ buttonText?: string;
20
+ buttonOnClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
21
+ text?: string;
22
+ hideIcon?: boolean;
23
+ };
24
+
25
+ const bannerClassName = cva(['ds-banner'], {
26
+ variants: {
27
+ level: {
28
+ [BANNER_LEVEL.INFO]: 'ds-banner--info',
29
+ [BANNER_LEVEL.NEUTRAL]: 'ds-banner--neutral',
30
+ [BANNER_LEVEL.WARNING]: 'ds-banner--warning',
31
+ [BANNER_LEVEL.DESTRUCTIVE]: 'ds-banner--destructive',
32
+ },
33
+ },
34
+ });
35
+
36
+ const DEFAULT_ICON_MAP: Record<BANNER_LEVEL, IconName> = {
37
+ [BANNER_LEVEL.INFO]: 'info',
38
+ [BANNER_LEVEL.NEUTRAL]: 'info',
39
+ [BANNER_LEVEL.WARNING]: 'triangle-alert',
40
+ [BANNER_LEVEL.DESTRUCTIVE]: 'circle-alert',
41
+ };
42
+
43
+ export const Banner = (props: BannerProps) => {
44
+ const {
45
+ className,
46
+ level = BANNER_LEVEL.NEUTRAL,
47
+ icon: rawIcon,
48
+ hideIcon = false,
49
+ title,
50
+ buttonText,
51
+ buttonOnClick,
52
+ text,
53
+ } = props;
54
+
55
+ const icon = hideIcon ? null : rawIcon ?? DEFAULT_ICON_MAP[level];
56
+
57
+ return (
58
+ <div
59
+ className={bannerClassName({ level, className })}
60
+ >
61
+ {icon && <Icon size={24} name={icon} />}
62
+ <div className="ds-banner__central-container">
63
+ {title && (
64
+ <h3 className="ds-banner__title">
65
+ {title}
66
+ </h3>
67
+ )}
68
+ {text && <span>{text}</span>}
69
+ </div>
70
+ {buttonText && (
71
+ <Button
72
+ onClick={buttonOnClick}
73
+ className="ds-banner__button"
74
+ variant="text-link"
75
+ >
76
+ {buttonText}
77
+ </Button>
78
+ )}
79
+ </div>
80
+ );
81
+ };
@@ -0,0 +1,67 @@
1
+ .ds-banner {
2
+ display: flex;
3
+ flex-flow: row nowrap;
4
+ gap: var(--banner-spacing-gap);
5
+ padding: var(--banner-spacing-vertical) var(--banner-spacing-horizontal);
6
+ border-radius: var(--banner-radius);
7
+ border-width: 1px;
8
+ border-style: solid;
9
+
10
+ &__central-container {
11
+ flex-grow: 1;
12
+ display: flex;
13
+ flex-direction: column;
14
+ align-items: flex-start;
15
+ gap: var(--spacing-small);
16
+ }
17
+
18
+ &__title {
19
+ margin: 0;
20
+ }
21
+
22
+ &__button {
23
+ color: inherit;
24
+ align-self: flex-end;
25
+ text-wrap: nowrap;
26
+ }
27
+
28
+ &--info {
29
+ svg {
30
+ stroke: var(--banner-info-color-icon);
31
+ }
32
+
33
+ border-color: var(--banner-info-color-border);
34
+ background-color: var(--banner-info-color-background);
35
+ color: var(--banner-info-color-text);
36
+ }
37
+
38
+ &--neutral {
39
+ svg {
40
+ stroke: var(--banner-neutral-color-icon);
41
+ }
42
+
43
+ border-color: var(--banner-neutral-color-border);
44
+ background-color: var(--banner-neutral-color-background);
45
+ color: var(--banner-neutral-color-text);
46
+ }
47
+
48
+ &--warning {
49
+ svg {
50
+ stroke: var(--banner-warning-color-icon);
51
+ }
52
+
53
+ border-color: var(--banner-warning-color-border);
54
+ background-color: var(--banner-warning-color-background);
55
+ color: var(--banner-warning-color-text);
56
+ }
57
+
58
+ &--destructive {
59
+ svg {
60
+ stroke: var(--banner-destructive-color-icon);
61
+ }
62
+
63
+ border-color: var(--banner-destructive-color-border);
64
+ background-color: var(--banner-destructive-color-background);
65
+ color: var(--banner-destructive-color-text);
66
+ }
67
+ }
@@ -6,7 +6,6 @@
6
6
  justify-content: center;
7
7
  gap: var(--button-medium-spacing-gap-vertical);
8
8
  border-radius: var(--button-medium-radius);
9
- font-family: var(--font-family-standard);
10
9
  font-weight: var(--font-weight-semi-bold);
11
10
  padding: var(--button-medium-spacing-vertical) var(--button-medium-spacing-horizontal);
12
11
  border: none;
@@ -14,7 +13,6 @@
14
13
  transition: background-color 0.2s, color 0.2s, border-color 0.2s, box-shadow 0.2s;
15
14
  position: relative;
16
15
  text-decoration: none;
17
- font-size: var(--font-size-2-13);
18
16
 
19
17
  &--no-horizontal-padding {
20
18
  padding: var(--button-medium-spacing-vertical) 0;
@@ -108,10 +106,7 @@
108
106
  color: var(--color-grey-900, #2F2F2F);
109
107
 
110
108
  /* typography/body/p1-regular */
111
- font-family: var(--type-body-p-family, Inter);
112
- font-size: var(--type-body-p-size, 13px);
113
109
  font-style: normal;
114
- font-weight: var(--type-body-p-weight, 400);
115
110
  line-height: 150%; /* 19.5px */
116
111
  display: flex;
117
112
  padding: var(--spacing-small) var(--spacing-small) var(--spacing-small) var(--spacing-medium);
@@ -74,9 +74,6 @@
74
74
 
75
75
  .ds-card__paragraph {
76
76
  margin: 0;
77
- font-family: var(--type-body-p-family);
78
- font-size: var(--type-body-p-size);
79
- font-weight: var(--type-body-p-weight);
80
77
  }
81
78
  }
82
79
  }
@@ -3,11 +3,13 @@ import { DropdownTrigger } from './DropdownTrigger';
3
3
  import { DropdownContent } from './DropdownContent';
4
4
  import { DropdownItem } from './items/DropdownItem';
5
5
  import { DropdownSelectItem } from './items/DropdownSelectItem';
6
+ import { DropdownSeparator } from './items/DropdownSeparator';
7
+ import { DropdownGroup } from './items/DropdownGroup';
6
8
 
7
9
  export const Dropdown = (props: DropdownMenu.DropdownMenuProps) => {
8
10
  const { children, ...rest } = props;
9
11
  return (
10
- <DropdownMenu.Root {...rest}>
12
+ <DropdownMenu.Root modal={false} {...rest}>
11
13
  {children}
12
14
  </DropdownMenu.Root>
13
15
  );
@@ -17,3 +19,5 @@ Dropdown.Trigger = DropdownTrigger;
17
19
  Dropdown.Content = DropdownContent;
18
20
  Dropdown.Item = DropdownItem;
19
21
  Dropdown.SelectItem = DropdownSelectItem;
22
+ Dropdown.Separator = DropdownSeparator;
23
+ Dropdown.Group = DropdownGroup;
@@ -5,11 +5,11 @@
5
5
  background-color: var(--form-dropdown-color-background);
6
6
  min-width: 200px;
7
7
  border: 1px solid var(--color-grey-200);
8
- font-family: var(--type-body-p-family);
9
- font-size: var(--type-body-p-size);
10
8
  font-style: normal;
11
- font-weight: var(--type-body-p-weight);
12
9
  line-height: 150%;
10
+ max-height: 300px;
11
+ max-height: var(--radix-popper-available-height);
12
+ overflow-y: auto;
13
13
  }
14
14
 
15
15
  .ds-dropdown__item {
@@ -45,4 +45,4 @@
45
45
  .ds-dropdown__item--check-icon {
46
46
  margin-left: auto;
47
47
  }
48
- }
48
+ }
@@ -0,0 +1,11 @@
1
+ import { DropdownMenu } from 'radix-ui';
2
+ import classNames from 'classnames';
3
+
4
+ export const DropdownGroup = (props: DropdownMenu.DropdownMenuGroupProps) => {
5
+ const { children, className = '', ...rest } = props;
6
+ return (
7
+ <DropdownMenu.Group className={classNames('ds-dropdown__group', className)} {...rest}>
8
+ {children}
9
+ </DropdownMenu.Group>
10
+ );
11
+ };
@@ -0,0 +1,9 @@
1
+ import { DropdownMenu } from 'radix-ui';
2
+ import classNames from 'classnames';
3
+
4
+ export const DropdownSeparator = (props: DropdownMenu.DropdownMenuSeparatorProps) => {
5
+ const { className = '', ...rest } = props;
6
+ return (
7
+ <DropdownMenu.Separator className={classNames('ds-dropdown__separator', className)} {...rest} />
8
+ );
9
+ };
@@ -9,8 +9,6 @@
9
9
  }
10
10
 
11
11
  .ds-fieldset__legend {
12
- font-family: var(--font-family-standard);
13
- font-size: var(--font-size-2-13);
14
12
  font-weight: var(--type-body-bold-weight);
15
13
  color: var(--form-field-label-color-text);
16
14
  line-height: 150%;
@@ -1,6 +1,4 @@
1
1
  .ds-form-field {
2
- font-family: var(--font-family-standard);
3
- font-size: var(--font-size-2-13);
4
2
  line-height: 150%;
5
3
  width: 100%;
6
4
  box-sizing: border-box;
@@ -43,8 +43,6 @@
43
43
 
44
44
  .ds-checkbox-label__text {
45
45
  flex: 1 0 0;
46
- font-size: var(--type-body-p-size);
47
- font-weight: var(--type-body-p-weight);
48
46
  color: var(--checkbox-default-color-text);
49
47
  line-height: var(--line-height-default);
50
48
  }
@@ -2,9 +2,6 @@
2
2
 
3
3
  .ds-input {
4
4
  width: 100%;
5
- font-size: var(--type-body-p-size);
6
- font-family: var(--font-family-standard);
7
- font-weight: var(--font-weight-regular);
8
5
  border: var(--border-weight) solid var(--form-field-text-default-color-border);
9
6
  border-radius: var(--form-field-radius);
10
7
  color: var(--form-field-text-default-color-text);
@@ -19,8 +19,6 @@
19
19
 
20
20
  .ds-radio-button-input__text {
21
21
  flex: 1 0 0;
22
- font-size: var(--type-body-p-size);
23
- font-weight: var(--type-body-p-weight);
24
22
  color: var(--checkbox-default-color-text);
25
23
  line-height: var(--line-height-default);
26
24
  user-select: none;
@@ -16,7 +16,6 @@
16
16
  .ds-select-dropdown__items--header {
17
17
  margin: 0;
18
18
  color: var(--form-dropdown-form-drop-item-title-color-text);
19
- font-size: var(--font-size-2-13);
20
19
  padding: var(--spacing-xsmall) var(--spacing-small) var(--spacing-medium) var(--spacing-small);
21
20
  border-bottom: var(--border-weight) solid var(--page-base-color-border);
22
21
  }
@@ -1,6 +1,4 @@
1
1
  .ds-label {
2
- font-family: var(--font-family-standard);
3
- font-size: var(--font-size-2-13);
4
2
  font-weight: var(--type-body-bold-weight);
5
3
  color: var(--form-field-label-color-text);
6
4
  line-height: 150%;
@@ -23,9 +23,6 @@
23
23
  max-width: calc(100vw - var(--spacing-medium));
24
24
  max-height: calc(100vh - var(--spacing-medium));
25
25
  min-width: var(--modal-min-width);
26
- font-family: var(--type-body-p-family);
27
- font-size: var(--type-body-p-size);
28
- font-weight: var(--type-body-p-weight);
29
26
  line-height: var(--type-body-line-height);
30
27
  color: var(--type-body-p-color);
31
28
 
@@ -10,10 +10,7 @@
10
10
  cursor: pointer;
11
11
 
12
12
  /* typography/body/p1-reg */
13
- font-family: var(--type-body-p-family, Inter);
14
- font-size: var(--type-body-p-size);
15
13
  font-style: normal;
16
- font-weight: var(--type-body-p-weight);
17
14
  line-height: 150%; /* 19.5px */
18
15
 
19
16
  &__inactive{
@@ -50,9 +50,6 @@
50
50
 
51
51
  &__placeholder {
52
52
  color: var(--search-global-default-color-text);
53
- font-family: var(--type-body-p-family);
54
- font-size: var(--type-body-p-size);
55
- font-weight: var(--type-body-p-weight);
56
53
  }
57
54
 
58
55
  &-icon-only {
@@ -43,9 +43,6 @@
43
43
  border: var(--border-weight) solid var(--color-grey-200);
44
44
  border-radius: var(--border-radius-small);
45
45
  color: var(--color-grey-900);
46
- font-family: var(--font-family-standard);
47
- font-size: var(--font-size-2-13);
48
- font-weight: var(--font-weight-regular);
49
46
  padding: 0 var(--spacing-small);
50
47
  justify-content: space-between;
51
48
  }
@@ -59,9 +56,6 @@
59
56
  border: var(--border-weight) solid var(--color-grey-200);
60
57
  border-radius: var(--border-radius-small);
61
58
  color: var(--color-grey-900);
62
- font-family: var(--font-family-standard);
63
- font-size: var(--font-size-2-13);
64
- font-weight: var(--font-weight-regular);
65
59
  box-sizing: border-box;
66
60
 
67
61
  &::-webkit-calendar-picker-indicator {
@@ -20,7 +20,3 @@
20
20
  width: 39px;
21
21
  }
22
22
  }
23
-
24
- .ds-table__pagination-controls, .ds-table__row-count-info {
25
- font-size: var(--font-size-2-13);
26
- }
@@ -4,7 +4,6 @@
4
4
  list-style: none;
5
5
  padding: 0;
6
6
  margin: 0;
7
- font-family: var(--type-body-p-family);
8
7
  align-items: center;
9
8
  justify-content: flex-start;
10
9
  gap: var(--tabs-spacing-horizontal-gap);
@@ -21,7 +20,6 @@
21
20
  .ds-tabs-item__tab {
22
21
  min-width: var(--size-control-xlarge);
23
22
  position: relative;
24
- font-family: var(--type-body-p-family);
25
23
  padding: var(--tabs-tab-item-spacing-vertical) var(--tabs-tab-item-spacing-horizontal);
26
24
  cursor: pointer;
27
25
  display: flex;
@@ -8,10 +8,7 @@
8
8
  width: fit-content;
9
9
 
10
10
  /* typography/body/p1-reg */
11
- font-family: var(--type-body-p-family, Inter);
12
- font-size: var(--type-body-p-size);
13
11
  font-style: normal;
14
- font-weight: var(--type-body-p-weight);
15
12
  line-height: 150%; /* 19.5px */
16
13
 
17
14
  &--neutral {
@@ -17,7 +17,6 @@
17
17
  border-radius: var(--toast-radius);
18
18
  box-shadow: var(--shadow-small);
19
19
  font-family: var(--type-body-bold-family);
20
- font-size: var(--type-body-p-size);
21
20
  font-style: normal;
22
21
  font-weight: var(--type-body-bold-weight);
23
22
  line-height: var(--line-height-default);
@@ -4,9 +4,6 @@
4
4
  background: var(--tooltip-color-background);
5
5
  padding: var(--tooltip-spacing-vertical) var(--tooltip-spacing-horizontal);
6
6
  border-radius: var(--border-radius-small);
7
- font-size: var(--type-body-p-size);
8
- font-family: var(--type-body-p-family);
9
- font-weight: var(--type-body-p-weight);
10
7
 
11
8
  &-arrow {
12
9
  fill: var(--tooltip-color-background);
@@ -0,0 +1,237 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { UserDropdown } from './UserDropdown';
3
+ import { ArborLogo, GovhubLogo, KeyLogo, RobinLogo, SampeopleLogo, TimetablerLogo } from './assets/logos';
4
+
5
+ const meta: Meta<typeof UserDropdown> = {
6
+ title: 'Components/UserDropdown',
7
+ component: UserDropdown,
8
+ tags: ['autodocs'],
9
+ };
10
+
11
+ type Story = StoryObj<typeof UserDropdown>;
12
+
13
+ // Mock avatar image (placeholder)
14
+ const avatarSrc = 'data:image/svg+xml,%3Csvg width="32" height="32" xmlns="http://www.w3.org/2000/svg"%3E%3Ccircle cx="16" cy="16" r="16" fill="%233cad51"/%3E%3Ctext x="16" y="21" font-family="Arial" font-size="14" font-weight="bold" fill="white" text-anchor="middle"%3ECM%3C/text%3E%3C/svg%3E';
15
+
16
+ // Import real logos from assets
17
+ const logoArborWorkflows = ArborLogo;
18
+ const logoGovernorHub = GovhubLogo;
19
+ const logoTheKey = KeyLogo;
20
+ const logoRobin = RobinLogo;
21
+ const logoSamPeople = SampeopleLogo;
22
+ const logoTimetabler = TimetablerLogo;
23
+
24
+ const AppLogo = ({ src, alt }: { src: string; alt: string }) => (
25
+ <img src={src} alt={alt} width={24} height={24} style={{ objectFit: 'contain' }} />
26
+ );
27
+
28
+ // Mock company logo SVG
29
+ const mockLogoSrc = 'data:image/svg+xml,%3Csvg width="50" height="30" xmlns="http://www.w3.org/2000/svg"%3E%3Crect width="50" height="30" rx="4" fill="%233cad51"/%3E%3Ctext x="25" y="20" font-family="Arial" font-size="14" font-weight="bold" fill="white" text-anchor="middle"%3ELogo%3C/text%3E%3C/svg%3E';
30
+
31
+ export const Default: Story = {
32
+ args: {
33
+ user: {
34
+ name: 'Christine Montgomery-Smith',
35
+ subtitle: 'Business Manager',
36
+ avatarSrc,
37
+ avatarAlt: 'Christine Montgomery-Smith',
38
+ },
39
+ logoSrc: mockLogoSrc,
40
+ logoAlt: 'Arbor',
41
+ sections: [
42
+ {
43
+ label: 'My Apps',
44
+ apps: [
45
+ {
46
+ logo: <AppLogo src={logoArborWorkflows} alt="Arbor Workflows" />,
47
+ name: 'Arbor Workflows',
48
+ onClick: () => { console.log('Open Arbor Workflows'); },
49
+ },
50
+ {
51
+ logo: <AppLogo src={logoGovernorHub} alt="GovernorHub" />,
52
+ name: 'GovernorHub',
53
+ onClick: () => { console.log('Open GovernorHub'); },
54
+ },
55
+ {
56
+ logo: <AppLogo src={logoTheKey} alt="The Key" />,
57
+ name: 'The Key',
58
+ onClick: () => { console.log('Open The Key'); },
59
+ },
60
+ ],
61
+ },
62
+ ],
63
+ discoverSection: {
64
+ label: 'Discover the Arbor suite',
65
+ defaultOpen: true,
66
+ apps: [
67
+ {
68
+ logo: <AppLogo src={logoArborWorkflows} alt="Arbor Finance" />,
69
+ name: 'Arbor Finance',
70
+ description: 'Cloud-based accounting',
71
+ onClick: () => { console.log('Open Arbor Finance'); },
72
+ },
73
+ {
74
+ logo: <AppLogo src={logoRobin} alt="Robin" />,
75
+ name: 'Robin',
76
+ description: 'AI website compliance checks',
77
+ onClick: () => { console.log('Open Robin'); },
78
+ },
79
+ {
80
+ logo: <AppLogo src={logoSamPeople} alt="SAMPeople" />,
81
+ name: 'SAMPeople',
82
+ description: 'HR and recruitment',
83
+ onClick: () => { console.log('Open SAMPeople'); },
84
+ },
85
+ {
86
+ logo: <AppLogo src={logoTimetabler} alt="Timetabler" />,
87
+ name: 'Timetabler',
88
+ description: 'Schedule timetables and more',
89
+ onClick: () => { console.log('Open Timetabler'); },
90
+ },
91
+ ],
92
+ },
93
+ userInfoAction: { type: 'link', onClick: () => { console.log('View profile'); } },
94
+ onSignOut: () => { console.log('Sign out'); },
95
+ signOutLabel: 'Sign out of Arbor',
96
+ },
97
+ };
98
+
99
+ export const WithApps: Story = {
100
+ args: {
101
+ user: {
102
+ name: 'Christine Montgomery-Smith',
103
+ subtitle: 'Business Manager',
104
+ avatarInitials: 'CM',
105
+ },
106
+ sections: [
107
+ {
108
+ label: 'Quick Actions',
109
+ apps: [
110
+ { name: 'Settings', onClick: () => { console.log('Settings'); } },
111
+ { name: 'Help', onClick: () => { console.log('Help'); } },
112
+ ],
113
+ },
114
+ ],
115
+ onSignOut: () => { console.log('Sign out'); },
116
+ },
117
+ };
118
+
119
+ export const Minimal: Story = {
120
+ args: {
121
+ user: {
122
+ name: 'Christine Montgomery',
123
+ avatarInitials: 'CM',
124
+ avatarAlt: 'Christine Montgomery',
125
+ },
126
+ onSignOut: () => { console.log('Sign out'); },
127
+ },
128
+ };
129
+
130
+ export const WithMenu: Story = {
131
+ args: {
132
+ user: {
133
+ name: 'Christine Montgomery-Smith',
134
+ subtitle: 'Business Manager',
135
+ avatarSrc,
136
+ avatarAlt: 'Christine Montgomery-Smith',
137
+ },
138
+ logoSrc: mockLogoSrc,
139
+ logoAlt: 'Arbor',
140
+ sections: [
141
+ {
142
+ label: 'My Apps',
143
+ apps: [
144
+ {
145
+ logo: <AppLogo src={logoArborWorkflows} alt="Arbor Workflows" />,
146
+ name: 'Arbor Workflows',
147
+ onClick: () => { console.log('Open Arbor Workflows'); },
148
+ },
149
+ ],
150
+ },
151
+ ],
152
+ userInfoAction: {
153
+ type: 'menu',
154
+ items: [
155
+ { label: 'Help centre', onClick: () => { console.log('Help centre'); } },
156
+ { label: 'About', onClick: () => { console.log('About'); } },
157
+ { label: 'Leave feedback', onClick: () => { console.log('Leave feedback'); } },
158
+ ],
159
+ },
160
+ onSignOut: () => { console.log('Sign out'); },
161
+ signOutLabel: 'Sign out of Arbor',
162
+ },
163
+ };
164
+
165
+ export const DarkVariant: Story = {
166
+ args: {
167
+ user: {
168
+ name: 'Christine Montgomery-Smith',
169
+ subtitle: 'Business Manager',
170
+ avatarSrc,
171
+ avatarAlt: 'Christine Montgomery-Smith',
172
+ },
173
+ logoSrc: mockLogoSrc,
174
+ logoAlt: 'Arbor',
175
+ variant: 'dark',
176
+ sections: [
177
+ {
178
+ label: 'My Apps',
179
+ apps: [
180
+ {
181
+ logo: <AppLogo src={logoArborWorkflows} alt="Arbor Workflows" />,
182
+ name: 'Arbor Workflows',
183
+ onClick: () => { console.log('Open Arbor Workflows'); },
184
+ },
185
+ ],
186
+ },
187
+ ],
188
+ onSignOut: () => { console.log('Sign out'); },
189
+ signOutLabel: 'Sign out of Arbor',
190
+ },
191
+ parameters: {
192
+ backgrounds: {
193
+ default: 'dark',
194
+ values: [
195
+ { name: 'dark', value: '#2f2f2f' },
196
+ ],
197
+ },
198
+ },
199
+ };
200
+
201
+ export const LightVariant: Story = {
202
+ args: {
203
+ user: {
204
+ name: 'Christine Montgomery-Smith',
205
+ subtitle: 'Business Manager',
206
+ avatarSrc,
207
+ avatarAlt: 'Christine Montgomery-Smith',
208
+ },
209
+ logoSrc: mockLogoSrc,
210
+ logoAlt: 'Arbor',
211
+ variant: 'light',
212
+ sections: [
213
+ {
214
+ label: 'My Apps',
215
+ apps: [
216
+ {
217
+ logo: <AppLogo src={logoArborWorkflows} alt="Arbor Workflows" />,
218
+ name: 'Arbor Workflows',
219
+ onClick: () => { console.log('Open Arbor Workflows'); },
220
+ },
221
+ ],
222
+ },
223
+ ],
224
+ onSignOut: () => { console.log('Sign out'); },
225
+ signOutLabel: 'Sign out of Arbor',
226
+ },
227
+ parameters: {
228
+ backgrounds: {
229
+ default: 'light',
230
+ values: [
231
+ { name: 'light', value: '#ffffff' },
232
+ ],
233
+ },
234
+ },
235
+ };
236
+
237
+ export default meta;