@arbor-education/design-system.components 0.25.3 → 0.25.5

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 (110) hide show
  1. package/.gather/skills/write-stories/README.md +1 -1
  2. package/.gather/skills/write-stories/SKILL.md +1 -1
  3. package/.gather/skills/write-stories/meta.md +1 -1
  4. package/CHANGELOG.md +16 -0
  5. package/component-library.md +26 -1
  6. package/dist/components/breadcrumbs/BreadcrumbCopyButton.d.ts +3 -0
  7. package/dist/components/breadcrumbs/BreadcrumbCopyButton.d.ts.map +1 -0
  8. package/dist/components/breadcrumbs/BreadcrumbCopyButton.js +13 -0
  9. package/dist/components/breadcrumbs/BreadcrumbCopyButton.js.map +1 -0
  10. package/dist/components/breadcrumbs/BreadcrumbDropdown.d.ts +3 -0
  11. package/dist/components/breadcrumbs/BreadcrumbDropdown.d.ts.map +1 -0
  12. package/dist/components/breadcrumbs/BreadcrumbDropdown.js +8 -0
  13. package/dist/components/breadcrumbs/BreadcrumbDropdown.js.map +1 -0
  14. package/dist/components/breadcrumbs/BreadcrumbEllipsis.d.ts +3 -0
  15. package/dist/components/breadcrumbs/BreadcrumbEllipsis.d.ts.map +1 -0
  16. package/dist/components/breadcrumbs/BreadcrumbEllipsis.js +7 -0
  17. package/dist/components/breadcrumbs/BreadcrumbEllipsis.js.map +1 -0
  18. package/dist/components/breadcrumbs/BreadcrumbItemSeparator.d.ts +2 -0
  19. package/dist/components/breadcrumbs/BreadcrumbItemSeparator.d.ts.map +1 -0
  20. package/dist/components/breadcrumbs/BreadcrumbItemSeparator.js +5 -0
  21. package/dist/components/breadcrumbs/BreadcrumbItemSeparator.js.map +1 -0
  22. package/dist/components/breadcrumbs/BreadcrumbLink.d.ts +6 -0
  23. package/dist/components/breadcrumbs/BreadcrumbLink.d.ts.map +1 -0
  24. package/dist/components/breadcrumbs/BreadcrumbLink.js +9 -0
  25. package/dist/components/breadcrumbs/BreadcrumbLink.js.map +1 -0
  26. package/dist/components/breadcrumbs/Breadcrumbs.d.ts +21 -0
  27. package/dist/components/breadcrumbs/Breadcrumbs.d.ts.map +1 -0
  28. package/dist/components/breadcrumbs/Breadcrumbs.js +51 -0
  29. package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -0
  30. package/dist/components/breadcrumbs/Breadcrumbs.stories.d.ts +81 -0
  31. package/dist/components/breadcrumbs/Breadcrumbs.stories.d.ts.map +1 -0
  32. package/dist/components/breadcrumbs/Breadcrumbs.stories.js +681 -0
  33. package/dist/components/breadcrumbs/Breadcrumbs.stories.js.map +1 -0
  34. package/dist/components/breadcrumbs/Breadcrumbs.test.d.ts +2 -0
  35. package/dist/components/breadcrumbs/Breadcrumbs.test.d.ts.map +1 -0
  36. package/dist/components/breadcrumbs/Breadcrumbs.test.js +160 -0
  37. package/dist/components/breadcrumbs/Breadcrumbs.test.js.map +1 -0
  38. package/dist/components/breadcrumbs/types.d.ts +27 -0
  39. package/dist/components/breadcrumbs/types.d.ts.map +1 -0
  40. package/dist/components/breadcrumbs/types.js +2 -0
  41. package/dist/components/breadcrumbs/types.js.map +1 -0
  42. package/dist/components/fileUpload/FileUpload.d.ts +21 -0
  43. package/dist/components/fileUpload/FileUpload.d.ts.map +1 -0
  44. package/dist/components/fileUpload/FileUpload.js +23 -0
  45. package/dist/components/fileUpload/FileUpload.js.map +1 -0
  46. package/dist/components/fileUpload/FileUpload.stories.d.ts +71 -0
  47. package/dist/components/fileUpload/FileUpload.stories.d.ts.map +1 -0
  48. package/dist/components/fileUpload/FileUpload.stories.js +736 -0
  49. package/dist/components/fileUpload/FileUpload.stories.js.map +1 -0
  50. package/dist/components/fileUpload/FileUpload.test.d.ts +2 -0
  51. package/dist/components/fileUpload/FileUpload.test.d.ts.map +1 -0
  52. package/dist/components/fileUpload/FileUpload.test.js +99 -0
  53. package/dist/components/fileUpload/FileUpload.test.js.map +1 -0
  54. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.js +1 -1
  55. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.js.map +1 -1
  56. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts.map +1 -1
  57. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js +14 -15
  58. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js.map +1 -1
  59. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.test.js +11 -0
  60. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.test.js.map +1 -1
  61. package/dist/components/icon/allowedIcons.d.ts +1 -0
  62. package/dist/components/icon/allowedIcons.d.ts.map +1 -1
  63. package/dist/components/icon/allowedIcons.js +2 -1
  64. package/dist/components/icon/allowedIcons.js.map +1 -1
  65. package/dist/components/skeleton/Skeleton.d.ts +10 -0
  66. package/dist/components/skeleton/Skeleton.d.ts.map +1 -0
  67. package/dist/components/skeleton/Skeleton.js +9 -0
  68. package/dist/components/skeleton/Skeleton.js.map +1 -0
  69. package/dist/components/skeleton/Skeleton.stories.d.ts +99 -0
  70. package/dist/components/skeleton/Skeleton.stories.d.ts.map +1 -0
  71. package/dist/components/skeleton/Skeleton.stories.js +539 -0
  72. package/dist/components/skeleton/Skeleton.stories.js.map +1 -0
  73. package/dist/components/skeleton/Skeleton.test.d.ts +2 -0
  74. package/dist/components/skeleton/Skeleton.test.d.ts.map +1 -0
  75. package/dist/components/skeleton/Skeleton.test.js +49 -0
  76. package/dist/components/skeleton/Skeleton.test.js.map +1 -0
  77. package/dist/index.css +225 -0
  78. package/dist/index.css.map +1 -1
  79. package/dist/index.d.ts +3 -0
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +3 -0
  82. package/dist/index.js.map +1 -1
  83. package/package.json +2 -1
  84. package/src/components/breadcrumbs/BreadcrumbCopyButton.tsx +27 -0
  85. package/src/components/breadcrumbs/BreadcrumbDropdown.tsx +27 -0
  86. package/src/components/breadcrumbs/BreadcrumbEllipsis.tsx +16 -0
  87. package/src/components/breadcrumbs/BreadcrumbItemSeparator.tsx +3 -0
  88. package/src/components/breadcrumbs/BreadcrumbLink.tsx +29 -0
  89. package/src/components/breadcrumbs/Breadcrumbs.stories.tsx +870 -0
  90. package/src/components/breadcrumbs/Breadcrumbs.test.tsx +185 -0
  91. package/src/components/breadcrumbs/Breadcrumbs.tsx +92 -0
  92. package/src/components/breadcrumbs/breadcrumbs.scss +158 -0
  93. package/src/components/breadcrumbs/types.ts +31 -0
  94. package/src/components/button/button.scss +2 -0
  95. package/src/components/dropdown/dropdown.scss +1 -0
  96. package/src/components/fileUpload/FileUpload.stories.tsx +920 -0
  97. package/src/components/fileUpload/FileUpload.test.tsx +172 -0
  98. package/src/components/fileUpload/FileUpload.tsx +144 -0
  99. package/src/components/fileUpload/fileUpload.scss +74 -0
  100. package/src/components/formField/inputs/selectDropdown/SelectDropdown.stories.tsx +15 -16
  101. package/src/components/formField/inputs/selectDropdown/SelectDropdown.test.tsx +19 -0
  102. package/src/components/formField/inputs/selectDropdown/SelectDropdown.tsx +1 -1
  103. package/src/components/icon/allowedIcons.tsx +2 -0
  104. package/src/components/progress/progress.scss +1 -0
  105. package/src/components/skeleton/Skeleton.stories.tsx +748 -0
  106. package/src/components/skeleton/Skeleton.test.tsx +55 -0
  107. package/src/components/skeleton/Skeleton.tsx +36 -0
  108. package/src/components/skeleton/skeleton.scss +23 -0
  109. package/src/index.scss +3 -0
  110. package/src/index.ts +3 -0
@@ -0,0 +1,55 @@
1
+ import { render, screen } from '@testing-library/react';
2
+ import '@testing-library/jest-dom/vitest';
3
+ import { describe, expect, test } from 'vitest';
4
+ import { Skeleton } from './Skeleton.js';
5
+
6
+ describe('Skeleton', () => {
7
+ test('renders a skeleton placeholder by default', () => {
8
+ const { container } = render(<Skeleton />);
9
+ const el = container.firstChild as HTMLElement;
10
+ expect(el.tagName).toBe('SPAN');
11
+ expect(el).toHaveClass('ds-skeleton');
12
+ expect(el).toHaveAttribute('aria-hidden', 'true');
13
+ });
14
+
15
+ test('renders children inside aria-hidden container while loading', () => {
16
+ const { container } = render(<Skeleton loading={true}>Loaded content</Skeleton>);
17
+ const skeleton = container.querySelector('.ds-skeleton') as HTMLElement;
18
+ expect(skeleton).toHaveAttribute('aria-hidden', 'true');
19
+ expect(skeleton).toHaveTextContent('Loaded content');
20
+ });
21
+
22
+ test('renders children when not loading', () => {
23
+ render(<Skeleton loading={false}>Loaded content</Skeleton>);
24
+ expect(screen.getByText('Loaded content')).toBeInTheDocument();
25
+ });
26
+
27
+ test('does not render skeleton element when not loading', () => {
28
+ const { container } = render(<Skeleton loading={false}>Loaded content</Skeleton>);
29
+ expect(container.querySelector('.ds-skeleton')).not.toBeInTheDocument();
30
+ });
31
+
32
+ test('applies width and height as inline styles', () => {
33
+ const { container } = render(<Skeleton width="200px" height="16px" />);
34
+ const el = container.firstChild as HTMLElement;
35
+ expect(el).toHaveStyle({ width: '200px', height: '16px' });
36
+ });
37
+
38
+ test('merges additional style with width and height', () => {
39
+ const { container } = render(<Skeleton width="100px" height="100px" style={{ borderRadius: '50%' }} />);
40
+ const el = container.firstChild as HTMLElement;
41
+ expect(el).toHaveStyle({ width: '100px', height: '100px', borderRadius: '50%' });
42
+ });
43
+
44
+ test('applies additional className', () => {
45
+ const { container } = render(<Skeleton className="custom-class" />);
46
+ const el = container.firstChild as HTMLElement;
47
+ expect(el).toHaveClass('ds-skeleton', 'custom-class');
48
+ });
49
+
50
+ test('passes through additional HTML attributes', () => {
51
+ const { container } = render(<Skeleton data-testid="my-skeleton" />);
52
+ const el = container.firstChild as HTMLElement;
53
+ expect(el).toHaveAttribute('data-testid', 'my-skeleton');
54
+ });
55
+ });
@@ -0,0 +1,36 @@
1
+ import classNames from 'classnames';
2
+
3
+ export type SkeletonProps = React.HTMLAttributes<HTMLSpanElement> & {
4
+ loading?: boolean;
5
+ width?: string | number;
6
+ height?: string | number;
7
+ };
8
+
9
+ export const Skeleton = ({
10
+ loading = true,
11
+ width,
12
+ height,
13
+ className,
14
+ style,
15
+ children,
16
+ ...props
17
+ }: SkeletonProps): React.JSX.Element => {
18
+ if (!loading) {
19
+ return <>{children}</>;
20
+ }
21
+
22
+ return (
23
+ <span
24
+ {...props}
25
+ aria-hidden="true"
26
+ className={classNames('ds-skeleton', className)}
27
+ style={{ width, height, ...style }}
28
+ >
29
+ {children}
30
+ </span>
31
+ );
32
+ };
33
+
34
+ export namespace Skeleton {
35
+ export type Props = SkeletonProps;
36
+ }
@@ -0,0 +1,23 @@
1
+ @keyframes ds-skeleton-shimmer {
2
+ from {
3
+ background-color: var(--color-grey-100);
4
+ }
5
+
6
+ to {
7
+ background-color: var(--color-grey-200);
8
+ }
9
+ }
10
+
11
+ .ds-skeleton {
12
+ display: inline-block;
13
+ border-radius: var(--border-radius-xsmall);
14
+ background-color: var(--color-grey-200);
15
+ animation: 1s infinite alternate-reverse ds-skeleton-shimmer;
16
+ color: transparent;
17
+ pointer-events: none;
18
+ user-select: none;
19
+
20
+ > * {
21
+ visibility: hidden;
22
+ }
23
+ }
package/src/index.scss CHANGED
@@ -1,6 +1,7 @@
1
1
  @use "../node_modules/react-day-picker/src/style.css";
2
2
  @use "./tokens.scss";
3
3
  @use "./global.scss";
4
+ @use "components/breadcrumbs/breadcrumbs.scss";
4
5
  @use "components/button/button.scss";
5
6
  @use "components/icon/icon.scss";
6
7
  @use "components/iconText/iconText.scss";
@@ -57,6 +58,8 @@
57
58
  @use "components/dataViewCard/dataViewCard.scss";
58
59
  @use "components/treeRow/treeRow.scss";
59
60
  @use "components/sidebarNav/sidebarNav.scss";
61
+ @use "components/fileUpload/fileUpload.scss";
62
+ @use "components/skeleton/skeleton.scss";
60
63
 
61
64
  // stylelint-disable-next-line at-rule-disallowed-list -- plain CSS import (font face), exempt from Sass @import deprecation
62
65
  @import "https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap";
package/src/index.ts CHANGED
@@ -3,6 +3,7 @@ export { Avatar } from 'Components/avatar/Avatar';
3
3
  export { AvatarGroup } from 'Components/avatarGroup/AvatarGroup';
4
4
  export { Badge } from 'Components/badge/Badge';
5
5
  export { Banner } from 'Components/banner/Banner';
6
+ export { Breadcrumbs } from 'Components/breadcrumbs/Breadcrumbs';
6
7
  export { Button } from 'Components/button/Button';
7
8
  export { Card, type CardProps } from 'Components/card/Card';
8
9
  export { Combobox } from 'Components/combobox/Combobox';
@@ -30,6 +31,7 @@ export { NumberInput } from 'Components/formField/inputs/number/NumberInput';
30
31
  export { RadioButtonGroup } from 'Components/formField/inputs/radio/RadioButtonGroup';
31
32
  export { RadioButtonInput } from 'Components/formField/inputs/radio/RadioButtonInput';
32
33
  export { SelectDropdown } from 'Components/formField/inputs/selectDropdown/SelectDropdown';
34
+ export { Skeleton } from 'Components/skeleton/Skeleton';
33
35
  export { TextInput } from 'Components/formField/inputs/text/TextInput';
34
36
  export { TextArea } from 'Components/formField/inputs/textArea/TextArea';
35
37
  export { TimeInput } from 'Components/formField/inputs/time/TimeInput';
@@ -86,3 +88,4 @@ export { PopupParentContext } from 'Utils/popupParent/PopupParentContext';
86
88
  export { SlideoverUtils } from 'Utils/SlideoverUtils';
87
89
  export { ArborLogo, type ArborLogoProps } from 'Components/arborLogo/ArborLogo';
88
90
  export { DataViewCard, type DataViewCardProps } from 'Components/dataViewCard/DataViewCard';
91
+ export { FileUpload, type FileUploadProps } from 'Components/fileUpload/FileUpload';