@arbor-education/design-system.components 0.25.2 → 0.25.4

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 (90) 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 +14 -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/row/Row.d.ts +1 -0
  43. package/dist/components/row/Row.d.ts.map +1 -1
  44. package/dist/components/row/Row.js +4 -2
  45. package/dist/components/row/Row.js.map +1 -1
  46. package/dist/components/row/Row.stories.d.ts +111 -4
  47. package/dist/components/row/Row.stories.d.ts.map +1 -1
  48. package/dist/components/row/Row.stories.js +362 -64
  49. package/dist/components/row/Row.stories.js.map +1 -1
  50. package/dist/components/row/Row.test.js +19 -0
  51. package/dist/components/row/Row.test.js.map +1 -1
  52. package/dist/components/skeleton/Skeleton.d.ts +10 -0
  53. package/dist/components/skeleton/Skeleton.d.ts.map +1 -0
  54. package/dist/components/skeleton/Skeleton.js +9 -0
  55. package/dist/components/skeleton/Skeleton.js.map +1 -0
  56. package/dist/components/skeleton/Skeleton.stories.d.ts +99 -0
  57. package/dist/components/skeleton/Skeleton.stories.d.ts.map +1 -0
  58. package/dist/components/skeleton/Skeleton.stories.js +539 -0
  59. package/dist/components/skeleton/Skeleton.stories.js.map +1 -0
  60. package/dist/components/skeleton/Skeleton.test.d.ts +2 -0
  61. package/dist/components/skeleton/Skeleton.test.d.ts.map +1 -0
  62. package/dist/components/skeleton/Skeleton.test.js +49 -0
  63. package/dist/components/skeleton/Skeleton.test.js.map +1 -0
  64. package/dist/index.css +159 -0
  65. package/dist/index.css.map +1 -1
  66. package/dist/index.d.ts +2 -0
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +2 -0
  69. package/dist/index.js.map +1 -1
  70. package/package.json +1 -1
  71. package/src/components/breadcrumbs/BreadcrumbCopyButton.tsx +27 -0
  72. package/src/components/breadcrumbs/BreadcrumbDropdown.tsx +27 -0
  73. package/src/components/breadcrumbs/BreadcrumbEllipsis.tsx +16 -0
  74. package/src/components/breadcrumbs/BreadcrumbItemSeparator.tsx +3 -0
  75. package/src/components/breadcrumbs/BreadcrumbLink.tsx +29 -0
  76. package/src/components/breadcrumbs/Breadcrumbs.stories.tsx +870 -0
  77. package/src/components/breadcrumbs/Breadcrumbs.test.tsx +185 -0
  78. package/src/components/breadcrumbs/Breadcrumbs.tsx +92 -0
  79. package/src/components/breadcrumbs/breadcrumbs.scss +158 -0
  80. package/src/components/breadcrumbs/types.ts +31 -0
  81. package/src/components/dropdown/dropdown.scss +1 -0
  82. package/src/components/row/Row.stories.tsx +504 -81
  83. package/src/components/row/Row.test.tsx +25 -0
  84. package/src/components/row/Row.tsx +11 -1
  85. package/src/components/skeleton/Skeleton.stories.tsx +748 -0
  86. package/src/components/skeleton/Skeleton.test.tsx +55 -0
  87. package/src/components/skeleton/Skeleton.tsx +36 -0
  88. package/src/components/skeleton/skeleton.scss +23 -0
  89. package/src/index.scss +2 -0
  90. package/src/index.ts +2 -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,7 @@
57
58
  @use "components/dataViewCard/dataViewCard.scss";
58
59
  @use "components/treeRow/treeRow.scss";
59
60
  @use "components/sidebarNav/sidebarNav.scss";
61
+ @use "components/skeleton/skeleton.scss";
60
62
 
61
63
  // stylelint-disable-next-line at-rule-disallowed-list -- plain CSS import (font face), exempt from Sass @import deprecation
62
64
  @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';