@arbor-education/design-system.components 0.4.0 → 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 (103) hide show
  1. package/CHANGELOG.md +6 -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/dropdown/Dropdown.d.ts +2 -0
  16. package/dist/components/dropdown/Dropdown.d.ts.map +1 -1
  17. package/dist/components/dropdown/Dropdown.js +5 -1
  18. package/dist/components/dropdown/Dropdown.js.map +1 -1
  19. package/dist/components/dropdown/items/DropdownGroup.d.ts +3 -0
  20. package/dist/components/dropdown/items/DropdownGroup.d.ts.map +1 -0
  21. package/dist/components/dropdown/items/DropdownGroup.js +8 -0
  22. package/dist/components/dropdown/items/DropdownGroup.js.map +1 -0
  23. package/dist/components/dropdown/items/DropdownSeparator.d.ts +3 -0
  24. package/dist/components/dropdown/items/DropdownSeparator.d.ts.map +1 -0
  25. package/dist/components/dropdown/items/DropdownSeparator.js +8 -0
  26. package/dist/components/dropdown/items/DropdownSeparator.js.map +1 -0
  27. package/dist/components/userDropdown/UserDropdown.d.ts +47 -0
  28. package/dist/components/userDropdown/UserDropdown.d.ts.map +1 -0
  29. package/dist/components/userDropdown/UserDropdown.js +13 -0
  30. package/dist/components/userDropdown/UserDropdown.js.map +1 -0
  31. package/dist/components/userDropdown/UserDropdown.stories.d.ts +12 -0
  32. package/dist/components/userDropdown/UserDropdown.stories.d.ts.map +1 -0
  33. package/dist/components/userDropdown/UserDropdown.stories.js +222 -0
  34. package/dist/components/userDropdown/UserDropdown.stories.js.map +1 -0
  35. package/dist/components/userDropdown/UserDropdown.test.d.ts +2 -0
  36. package/dist/components/userDropdown/UserDropdown.test.d.ts.map +1 -0
  37. package/dist/components/userDropdown/UserDropdown.test.js +197 -0
  38. package/dist/components/userDropdown/UserDropdown.test.js.map +1 -0
  39. package/dist/components/userDropdown/assets/arbor.png +0 -0
  40. package/dist/components/userDropdown/assets/govhub.png +0 -0
  41. package/dist/components/userDropdown/assets/key.png +0 -0
  42. package/dist/components/userDropdown/assets/logos.d.ts +7 -0
  43. package/dist/components/userDropdown/assets/logos.d.ts.map +1 -0
  44. package/dist/components/userDropdown/assets/logos.js +13 -0
  45. package/dist/components/userDropdown/assets/logos.js.map +1 -0
  46. package/dist/components/userDropdown/assets/robin.png +0 -0
  47. package/dist/components/userDropdown/assets/sampeople.png +0 -0
  48. package/dist/components/userDropdown/assets/timetabler.png +0 -0
  49. package/dist/components/userDropdown/internal/UserDropdownAppItem.d.ts +3 -0
  50. package/dist/components/userDropdown/internal/UserDropdownAppItem.d.ts.map +1 -0
  51. package/dist/components/userDropdown/internal/UserDropdownAppItem.js +9 -0
  52. package/dist/components/userDropdown/internal/UserDropdownAppItem.js.map +1 -0
  53. package/dist/components/userDropdown/internal/UserDropdownCollapsibleSection.d.ts +9 -0
  54. package/dist/components/userDropdown/internal/UserDropdownCollapsibleSection.d.ts.map +1 -0
  55. package/dist/components/userDropdown/internal/UserDropdownCollapsibleSection.js +11 -0
  56. package/dist/components/userDropdown/internal/UserDropdownCollapsibleSection.js.map +1 -0
  57. package/dist/components/userDropdown/internal/UserDropdownSignOut.d.ts +7 -0
  58. package/dist/components/userDropdown/internal/UserDropdownSignOut.d.ts.map +1 -0
  59. package/dist/components/userDropdown/internal/UserDropdownSignOut.js +9 -0
  60. package/dist/components/userDropdown/internal/UserDropdownSignOut.js.map +1 -0
  61. package/dist/components/userDropdown/internal/UserDropdownTrigger.d.ts +11 -0
  62. package/dist/components/userDropdown/internal/UserDropdownTrigger.d.ts.map +1 -0
  63. package/dist/components/userDropdown/internal/UserDropdownTrigger.js +10 -0
  64. package/dist/components/userDropdown/internal/UserDropdownTrigger.js.map +1 -0
  65. package/dist/components/userDropdown/internal/UserDropdownUserInfo.d.ts +8 -0
  66. package/dist/components/userDropdown/internal/UserDropdownUserInfo.d.ts.map +1 -0
  67. package/dist/components/userDropdown/internal/UserDropdownUserInfo.js +17 -0
  68. package/dist/components/userDropdown/internal/UserDropdownUserInfo.js.map +1 -0
  69. package/dist/index.css +400 -0
  70. package/dist/index.css.map +1 -1
  71. package/dist/index.d.ts +4 -0
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +3 -0
  74. package/dist/index.js.map +1 -1
  75. package/package.json +2 -2
  76. package/src/components/avatar/Avatar.stories.tsx +84 -0
  77. package/src/components/avatar/Avatar.test.tsx +60 -0
  78. package/src/components/avatar/Avatar.tsx +68 -0
  79. package/src/components/avatar/avatar.scss +71 -0
  80. package/src/components/dropdown/Dropdown.tsx +5 -1
  81. package/src/components/dropdown/dropdown.scss +4 -1
  82. package/src/components/dropdown/items/DropdownGroup.tsx +11 -0
  83. package/src/components/dropdown/items/DropdownSeparator.tsx +9 -0
  84. package/src/components/userDropdown/UserDropdown.stories.tsx +237 -0
  85. package/src/components/userDropdown/UserDropdown.test.tsx +349 -0
  86. package/src/components/userDropdown/UserDropdown.tsx +110 -0
  87. package/src/components/userDropdown/assets/arbor.png +0 -0
  88. package/src/components/userDropdown/assets/govhub.png +0 -0
  89. package/src/components/userDropdown/assets/key.png +0 -0
  90. package/src/components/userDropdown/assets/logos.ts +13 -0
  91. package/src/components/userDropdown/assets/robin.png +0 -0
  92. package/src/components/userDropdown/assets/sampeople.png +0 -0
  93. package/src/components/userDropdown/assets/timetabler.png +0 -0
  94. package/src/components/userDropdown/internal/UserDropdownAppItem.tsx +21 -0
  95. package/src/components/userDropdown/internal/UserDropdownCollapsibleSection.tsx +38 -0
  96. package/src/components/userDropdown/internal/UserDropdownSignOut.tsx +19 -0
  97. package/src/components/userDropdown/internal/UserDropdownTrigger.tsx +42 -0
  98. package/src/components/userDropdown/internal/UserDropdownUserInfo.tsx +60 -0
  99. package/src/components/userDropdown/userDropdown.scss +377 -0
  100. package/src/index.scss +2 -0
  101. package/src/index.ts +4 -0
  102. package/tsconfig.json +1 -1
  103. package/vite-env.d.ts +31 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#126](https://github.com/arbor-education/design-system.components/pull/126) [`3c0783e`](https://github.com/arbor-education/design-system.components/commit/3c0783e66d6babf6a835991e1c1ff2df8903d269) Thanks [@AmeeMorris](https://github.com/AmeeMorris)! - MIS-68964 UserDropdown component
8
+
3
9
  ## 0.4.0
4
10
 
5
11
  ### Minor Changes
package/CLAUDE.md CHANGED
@@ -130,6 +130,15 @@ The Table component is a wrapper around AG Grid:
130
130
  - lint-staged runs ESLint on TypeScript files and stylelint on SCSS files
131
131
  - All linters run with `--fix` flag to auto-fix issues when possible
132
132
 
133
+ ## Branch rules
134
+ - Never try to push directly to main, all work must be on a branch
135
+ - Branch namining conventions are:
136
+ - The branch must have a jira ticket number in it i.e. `MIS-68964`
137
+ - The branch should start with `feature/` `bugfix/` `issue/`
138
+
139
+ ## Commit rules
140
+ - Each commit message should start with the same Jira ticket number as the branch name followed by a description of whats being committed. i.e. `MIS-68964 changed x prop to be a string`
141
+
133
142
  ## Notes for Claude
134
143
  - This is an active production codebase serving educational institutions
135
144
  - Changes can affect millions of users - be thoughtful and careful
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ export type AvatarSize = 'small' | 'medium' | 'large' | 'extra-large';
3
+ export type AvatarProps = {
4
+ size?: AvatarSize;
5
+ src?: string;
6
+ alt?: string;
7
+ initials?: string;
8
+ className?: string;
9
+ } & React.HTMLAttributes<HTMLDivElement>;
10
+ export declare const Avatar: (props: AvatarProps) => import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=Avatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/Avatar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;AAEtE,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;AAEzC,eAAO,MAAM,MAAM,GAAI,OAAO,WAAW,4CAsDxC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import classNames from 'classnames';
3
+ import React from 'react';
4
+ export const Avatar = (props) => {
5
+ const { size = 'medium', src, alt = '', initials, className, ...rest } = props;
6
+ const renderContent = () => {
7
+ if (src) {
8
+ return (_jsx("img", { src: src, alt: alt, className: "ds-avatar__image" }));
9
+ }
10
+ if (initials) {
11
+ return (_jsx("span", { className: "ds-avatar__initials", "aria-label": alt, children: initials }));
12
+ }
13
+ return (_jsx("span", { className: "ds-avatar__placeholder", "aria-label": alt || 'User avatar', children: _jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", className: "ds-avatar__placeholder-icon", children: _jsx("path", { d: "M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" }) }) }));
14
+ };
15
+ return (_jsx("div", { className: classNames('ds-avatar', `ds-avatar--${size}`, className), ...rest, children: renderContent() }));
16
+ };
17
+ //# sourceMappingURL=Avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Avatar.js","sourceRoot":"","sources":["../../../src/components/avatar/Avatar.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAkB,EAAE,EAAE;IAC3C,MAAM,EACJ,IAAI,GAAG,QAAQ,EACf,GAAG,EACH,GAAG,GAAG,EAAE,EACR,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,GAAG,KAAK,CAAC;IAEV,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CACL,cACE,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAC,kBAAkB,GAC5B,CACH,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CACL,eAAM,SAAS,EAAC,qBAAqB,gBAAa,GAAG,YAClD,QAAQ,GACJ,CACR,CAAC;QACJ,CAAC;QAED,OAAO,CACL,eAAM,SAAS,EAAC,wBAAwB,gBAAa,GAAG,IAAI,aAAa,YACvE,cACE,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,cAAc,EACnB,SAAS,EAAC,6BAA6B,YAEvC,eAAM,CAAC,EAAC,+GAA+G,GAAG,GACtH,GACD,CACR,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,CACL,cACE,SAAS,EAAE,UAAU,CACnB,WAAW,EACX,cAAc,IAAI,EAAE,EACpB,SAAS,CACV,KACG,IAAI,YAEP,aAAa,EAAE,GACZ,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { Avatar } from './Avatar';
3
+ declare const meta: Meta<typeof Avatar>;
4
+ type Story = StoryObj<typeof Avatar>;
5
+ export declare const Default: Story;
6
+ export declare const WithInitials: Story;
7
+ export declare const Placeholder: Story;
8
+ export declare const Small: Story;
9
+ export declare const Medium: Story;
10
+ export declare const Large: Story;
11
+ export declare const ExtraLarge: Story;
12
+ export declare const AllSizes: Story;
13
+ export default meta;
14
+ //# sourceMappingURL=Avatar.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Avatar.stories.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/Avatar.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,MAAM,CAU7B,CAAC;AAEF,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,MAAM,CAAC,CAAC;AAErC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAMpB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAStB,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Avatar } from './Avatar';
3
+ const meta = {
4
+ title: 'Components/Avatar',
5
+ component: Avatar,
6
+ tags: ['autodocs'],
7
+ argTypes: {
8
+ size: {
9
+ control: 'select',
10
+ options: ['small', 'medium', 'large', 'extra-large'],
11
+ },
12
+ },
13
+ };
14
+ export const Default = {
15
+ args: {
16
+ size: 'medium',
17
+ src: 'https://i.pravatar.cc/150?img=1',
18
+ alt: 'User avatar',
19
+ },
20
+ };
21
+ export const WithInitials = {
22
+ args: {
23
+ size: 'medium',
24
+ initials: 'CM',
25
+ alt: 'Christine Montgomery',
26
+ },
27
+ };
28
+ export const Placeholder = {
29
+ args: {
30
+ size: 'medium',
31
+ alt: 'User avatar',
32
+ },
33
+ };
34
+ export const Small = {
35
+ args: {
36
+ size: 'small',
37
+ src: 'https://i.pravatar.cc/150?img=2',
38
+ alt: 'User avatar',
39
+ },
40
+ };
41
+ export const Medium = {
42
+ args: {
43
+ size: 'medium',
44
+ src: 'https://i.pravatar.cc/150?img=3',
45
+ alt: 'User avatar',
46
+ },
47
+ };
48
+ export const Large = {
49
+ args: {
50
+ size: 'large',
51
+ src: 'https://i.pravatar.cc/150?img=4',
52
+ alt: 'User avatar',
53
+ },
54
+ };
55
+ export const ExtraLarge = {
56
+ args: {
57
+ size: 'extra-large',
58
+ src: 'https://i.pravatar.cc/150?img=5',
59
+ alt: 'User avatar',
60
+ },
61
+ };
62
+ export const AllSizes = {
63
+ render: () => (_jsxs("div", { style: { display: 'flex', gap: '16px', alignItems: 'center' }, children: [_jsx(Avatar, { size: "small", src: "https://i.pravatar.cc/150?img=6", alt: "Small avatar" }), _jsx(Avatar, { size: "medium", src: "https://i.pravatar.cc/150?img=7", alt: "Medium avatar" }), _jsx(Avatar, { size: "large", src: "https://i.pravatar.cc/150?img=8", alt: "Large avatar" }), _jsx(Avatar, { size: "extra-large", src: "https://i.pravatar.cc/150?img=9", alt: "Extra large avatar" })] })),
64
+ };
65
+ export default meta;
66
+ //# sourceMappingURL=Avatar.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Avatar.stories.js","sourceRoot":"","sources":["../../../src/components/avatar/Avatar.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,IAAI,GAAwB;IAChC,KAAK,EAAE,mBAAmB;IAC1B,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC;SACrD;KACF;CACF,CAAC;AAIF,MAAM,CAAC,MAAM,OAAO,GAAU;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,iCAAiC;QACtC,GAAG,EAAE,aAAa;KACnB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAU;IACjC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,sBAAsB;KAC5B;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAU;IAChC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,aAAa;KACnB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAU;IAC1B,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,GAAG,EAAE,iCAAiC;QACtC,GAAG,EAAE,aAAa;KACnB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAU;IAC3B,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,iCAAiC;QACtC,GAAG,EAAE,aAAa;KACnB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAU;IAC1B,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,GAAG,EAAE,iCAAiC;QACtC,GAAG,EAAE,aAAa;KACnB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAU;IAC/B,IAAI,EAAE;QACJ,IAAI,EAAE,aAAa;QACnB,GAAG,EAAE,iCAAiC;QACtC,GAAG,EAAE,aAAa;KACnB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAU;IAC7B,MAAM,EAAE,GAAG,EAAE,CAAC,CACZ,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,aAChE,KAAC,MAAM,IAAC,IAAI,EAAC,OAAO,EAAC,GAAG,EAAC,iCAAiC,EAAC,GAAG,EAAC,cAAc,GAAG,EAChF,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,GAAG,EAAC,iCAAiC,EAAC,GAAG,EAAC,eAAe,GAAG,EAClF,KAAC,MAAM,IAAC,IAAI,EAAC,OAAO,EAAC,GAAG,EAAC,iCAAiC,EAAC,GAAG,EAAC,cAAc,GAAG,EAChF,KAAC,MAAM,IAAC,IAAI,EAAC,aAAa,EAAC,GAAG,EAAC,iCAAiC,EAAC,GAAG,EAAC,oBAAoB,GAAG,IACxF,CACP;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,2 @@
1
+ import '@testing-library/jest-dom/vitest';
2
+ //# sourceMappingURL=Avatar.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Avatar.test.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/Avatar.test.tsx"],"names":[],"mappings":"AAGA,OAAO,kCAAkC,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { expect, test, describe } from 'vitest';
3
+ import { render, screen } from '@testing-library/react';
4
+ import { Avatar } from './Avatar';
5
+ import '@testing-library/jest-dom/vitest';
6
+ describe('Avatar', () => {
7
+ test('renders with image when src is provided', () => {
8
+ render(_jsx(Avatar, { src: "https://example.com/avatar.jpg", alt: "Test User" }));
9
+ const image = screen.getByRole('img', { hidden: true });
10
+ expect(image).toBeInTheDocument();
11
+ expect(image).toHaveAttribute('src', 'https://example.com/avatar.jpg');
12
+ expect(image).toHaveAttribute('alt', 'Test User');
13
+ });
14
+ test('renders with initials when no src is provided', () => {
15
+ render(_jsx(Avatar, { initials: "CM", alt: "Christine Montgomery" }));
16
+ expect(screen.getByText('CM')).toBeInTheDocument();
17
+ expect(screen.getByLabelText('Christine Montgomery')).toBeInTheDocument();
18
+ });
19
+ test('renders placeholder when no src or initials provided', () => {
20
+ render(_jsx(Avatar, { alt: "User avatar" }));
21
+ expect(screen.getByLabelText('User avatar')).toBeInTheDocument();
22
+ });
23
+ test('renders placeholder with default label when no alt provided', () => {
24
+ render(_jsx(Avatar, {}));
25
+ expect(screen.getByLabelText('User avatar')).toBeInTheDocument();
26
+ });
27
+ test('applies size variant class', () => {
28
+ const { container, rerender } = render(_jsx(Avatar, { size: "small" }));
29
+ expect(container.firstChild).toHaveClass('ds-avatar--small');
30
+ rerender(_jsx(Avatar, { size: "medium" }));
31
+ expect(container.firstChild).toHaveClass('ds-avatar--medium');
32
+ rerender(_jsx(Avatar, { size: "large" }));
33
+ expect(container.firstChild).toHaveClass('ds-avatar--large');
34
+ rerender(_jsx(Avatar, { size: "extra-large" }));
35
+ expect(container.firstChild).toHaveClass('ds-avatar--extra-large');
36
+ });
37
+ test('applies default medium size when no size specified', () => {
38
+ const { container } = render(_jsx(Avatar, {}));
39
+ expect(container.firstChild).toHaveClass('ds-avatar--medium');
40
+ });
41
+ test('applies custom className', () => {
42
+ const { container } = render(_jsx(Avatar, { className: "custom-class" }));
43
+ expect(container.firstChild).toHaveClass('ds-avatar');
44
+ expect(container.firstChild).toHaveClass('custom-class');
45
+ });
46
+ test('spreads additional HTML attributes', () => {
47
+ const { container } = render(_jsx(Avatar, { "data-testid": "avatar-test" }));
48
+ expect(container.firstChild).toHaveAttribute('data-testid', 'avatar-test');
49
+ });
50
+ });
51
+ //# sourceMappingURL=Avatar.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Avatar.test.js","sourceRoot":"","sources":["../../../src/components/avatar/Avatar.test.tsx"],"names":[],"mappings":"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"}
@@ -12,5 +12,7 @@ export declare const Dropdown: {
12
12
  }) => import("react/jsx-runtime").JSX.Element;
13
13
  Item: (props: DropdownMenu.DropdownMenuItemProps) => import("react/jsx-runtime").JSX.Element;
14
14
  SelectItem: (props: import("./items/DropdownSelectItem").DropdowSelectItemProps) => import("react/jsx-runtime").JSX.Element;
15
+ Separator: (props: DropdownMenu.DropdownMenuSeparatorProps) => import("react/jsx-runtime").JSX.Element;
16
+ Group: (props: DropdownMenu.DropdownMenuGroupProps) => import("react/jsx-runtime").JSX.Element;
15
17
  };
16
18
  //# sourceMappingURL=Dropdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown/Dropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAMxC,eAAO,MAAM,QAAQ;YAAW,YAAY,CAAC,iBAAiB;;;;;;;;;;;;CAO7D,CAAC"}
1
+ {"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown/Dropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAQxC,eAAO,MAAM,QAAQ;YAAW,YAAY,CAAC,iBAAiB;;;;;;;;;;;;;;CAO7D,CAAC"}
@@ -4,12 +4,16 @@ import { DropdownTrigger } from './DropdownTrigger';
4
4
  import { DropdownContent } from './DropdownContent';
5
5
  import { DropdownItem } from './items/DropdownItem';
6
6
  import { DropdownSelectItem } from './items/DropdownSelectItem';
7
+ import { DropdownSeparator } from './items/DropdownSeparator';
8
+ import { DropdownGroup } from './items/DropdownGroup';
7
9
  export const Dropdown = (props) => {
8
10
  const { children, ...rest } = props;
9
- return (_jsx(DropdownMenu.Root, { ...rest, children: children }));
11
+ return (_jsx(DropdownMenu.Root, { modal: false, ...rest, children: children }));
10
12
  };
11
13
  Dropdown.Trigger = DropdownTrigger;
12
14
  Dropdown.Content = DropdownContent;
13
15
  Dropdown.Item = DropdownItem;
14
16
  Dropdown.SelectItem = DropdownSelectItem;
17
+ Dropdown.Separator = DropdownSeparator;
18
+ Dropdown.Group = DropdownGroup;
15
19
  //# sourceMappingURL=Dropdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["../../../src/components/dropdown/Dropdown.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAqC,EAAE,EAAE;IAChE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACpC,OAAO,CACL,KAAC,YAAY,CAAC,IAAI,OAAK,IAAI,YACxB,QAAQ,GACS,CACrB,CAAC;AACJ,CAAC,CAAC;AAEF,QAAQ,CAAC,OAAO,GAAG,eAAe,CAAC;AACnC,QAAQ,CAAC,OAAO,GAAG,eAAe,CAAC;AACnC,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC;AAC7B,QAAQ,CAAC,UAAU,GAAG,kBAAkB,CAAC"}
1
+ {"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["../../../src/components/dropdown/Dropdown.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAqC,EAAE,EAAE;IAChE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACpC,OAAO,CACL,KAAC,YAAY,CAAC,IAAI,IAAC,KAAK,EAAE,KAAK,KAAM,IAAI,YACtC,QAAQ,GACS,CACrB,CAAC;AACJ,CAAC,CAAC;AAEF,QAAQ,CAAC,OAAO,GAAG,eAAe,CAAC;AACnC,QAAQ,CAAC,OAAO,GAAG,eAAe,CAAC;AACnC,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC;AAC7B,QAAQ,CAAC,UAAU,GAAG,kBAAkB,CAAC;AACzC,QAAQ,CAAC,SAAS,GAAG,iBAAiB,CAAC;AACvC,QAAQ,CAAC,KAAK,GAAG,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { DropdownMenu } from 'radix-ui';
2
+ export declare const DropdownGroup: (props: DropdownMenu.DropdownMenuGroupProps) => import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=DropdownGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropdownGroup.d.ts","sourceRoot":"","sources":["../../../../src/components/dropdown/items/DropdownGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,eAAO,MAAM,aAAa,GAAI,OAAO,YAAY,CAAC,sBAAsB,4CAOvE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { DropdownMenu } from 'radix-ui';
3
+ import classNames from 'classnames';
4
+ export const DropdownGroup = (props) => {
5
+ const { children, className = '', ...rest } = props;
6
+ return (_jsx(DropdownMenu.Group, { className: classNames('ds-dropdown__group', className), ...rest, children: children }));
7
+ };
8
+ //# sourceMappingURL=DropdownGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropdownGroup.js","sourceRoot":"","sources":["../../../../src/components/dropdown/items/DropdownGroup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAA0C,EAAE,EAAE;IAC1E,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACpD,OAAO,CACL,KAAC,YAAY,CAAC,KAAK,IAAC,SAAS,EAAE,UAAU,CAAC,oBAAoB,EAAE,SAAS,CAAC,KAAM,IAAI,YACjF,QAAQ,GACU,CACtB,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { DropdownMenu } from 'radix-ui';
2
+ export declare const DropdownSeparator: (props: DropdownMenu.DropdownMenuSeparatorProps) => import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=DropdownSeparator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropdownSeparator.d.ts","sourceRoot":"","sources":["../../../../src/components/dropdown/items/DropdownSeparator.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,eAAO,MAAM,iBAAiB,GAAI,OAAO,YAAY,CAAC,0BAA0B,4CAK/E,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { DropdownMenu } from 'radix-ui';
3
+ import classNames from 'classnames';
4
+ export const DropdownSeparator = (props) => {
5
+ const { className = '', ...rest } = props;
6
+ return (_jsx(DropdownMenu.Separator, { className: classNames('ds-dropdown__separator', className), ...rest }));
7
+ };
8
+ //# sourceMappingURL=DropdownSeparator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropdownSeparator.js","sourceRoot":"","sources":["../../../../src/components/dropdown/items/DropdownSeparator.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAA8C,EAAE,EAAE;IAClF,MAAM,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC1C,OAAO,CACL,KAAC,YAAY,CAAC,SAAS,IAAC,SAAS,EAAE,UAAU,CAAC,wBAAwB,EAAE,SAAS,CAAC,KAAM,IAAI,GAAI,CACjG,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,47 @@
1
+ import React from 'react';
2
+ export type UserDropdownUser = {
3
+ name: string;
4
+ subtitle?: string;
5
+ avatarSrc?: string;
6
+ avatarAlt?: string;
7
+ avatarInitials?: string;
8
+ };
9
+ export type UserDropdownApp = {
10
+ logo?: React.ReactNode;
11
+ name: string;
12
+ description?: string;
13
+ onClick?: () => void;
14
+ };
15
+ export type UserDropdownSection = {
16
+ label?: string;
17
+ apps: UserDropdownApp[];
18
+ };
19
+ export type UserDropdownUserInfoAction = {
20
+ type: 'link';
21
+ onClick: () => void;
22
+ } | {
23
+ type: 'menu';
24
+ items: Array<{
25
+ label: string;
26
+ onClick: () => void;
27
+ }>;
28
+ };
29
+ export type UserDropdownProps = {
30
+ user: UserDropdownUser;
31
+ logoSrc?: string;
32
+ logoAlt?: string;
33
+ sections?: UserDropdownSection[];
34
+ discoverSection?: {
35
+ label: string;
36
+ apps: UserDropdownApp[];
37
+ defaultOpen?: boolean;
38
+ };
39
+ userInfoAction?: UserDropdownUserInfoAction;
40
+ onSignOut: () => void;
41
+ signOutLabel?: string;
42
+ open?: boolean;
43
+ onOpenChange?: (open: boolean) => void;
44
+ variant?: 'dark' | 'light';
45
+ };
46
+ export declare const UserDropdown: (props: UserDropdownProps) => import("react/jsx-runtime").JSX.Element;
47
+ //# sourceMappingURL=UserDropdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserDropdown.d.ts","sourceRoot":"","sources":["../../../src/components/userDropdown/UserDropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,eAAe,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC;AAE7E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,eAAe,CAAC,EAAE;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,eAAe,EAAE,CAAC;QACxB,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,CAAC;IACF,cAAc,CAAC,EAAE,0BAA0B,CAAC;IAC5C,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,iBAAiB,4CA2DpD,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { Dropdown } from '../dropdown/Dropdown';
4
+ import { UserDropdownTrigger } from './internal/UserDropdownTrigger';
5
+ import { UserDropdownUserInfo } from './internal/UserDropdownUserInfo';
6
+ import { UserDropdownAppItem } from './internal/UserDropdownAppItem';
7
+ import { UserDropdownCollapsibleSection } from './internal/UserDropdownCollapsibleSection';
8
+ import { UserDropdownSignOut } from './internal/UserDropdownSignOut';
9
+ export const UserDropdown = (props) => {
10
+ const { user, logoSrc, logoAlt, sections = [], discoverSection, userInfoAction, onSignOut, signOutLabel, open, onOpenChange, variant = 'dark', } = props;
11
+ return (_jsxs(Dropdown, { open: open, onOpenChange: onOpenChange, children: [_jsx(UserDropdownTrigger, { avatarSrc: user.avatarSrc, avatarAlt: user.avatarAlt, avatarInitials: user.avatarInitials, logoSrc: logoSrc, logoAlt: logoAlt, variant: variant }), _jsxs(Dropdown.Content, { className: "ds-user-dropdown__content", contentProps: { sideOffset: 12 }, children: [_jsx(UserDropdownUserInfo, { user: user, action: userInfoAction }), sections.length > 0 && (_jsxs(_Fragment, { children: [_jsx(Dropdown.Separator, { className: "ds-user-dropdown__divider" }), sections.map((section, index) => (_jsxs(React.Fragment, { children: [section.label && _jsx("div", { className: "ds-user-dropdown__section-label", children: section.label }), _jsx(Dropdown.Group, { className: "ds-user-dropdown__section", children: section.apps.map((app, appIndex) => (_jsx(UserDropdownAppItem, { ...app }, appIndex))) })] }, index)))] })), discoverSection && (_jsx(UserDropdownCollapsibleSection, { label: discoverSection.label, apps: discoverSection.apps, defaultOpen: discoverSection.defaultOpen })), _jsx(Dropdown.Separator, { className: "ds-user-dropdown__divider" }), _jsx(UserDropdownSignOut, { onClick: onSignOut, label: signOutLabel })] })] }));
12
+ };
13
+ //# sourceMappingURL=UserDropdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserDropdown.js","sourceRoot":"","sources":["../../../src/components/userDropdown/UserDropdown.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,8BAA8B,EAAE,MAAM,2CAA2C,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AA4CrE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAwB,EAAE,EAAE;IACvD,MAAM,EACJ,IAAI,EACJ,OAAO,EACP,OAAO,EACP,QAAQ,GAAG,EAAE,EACb,eAAe,EACf,cAAc,EACd,SAAS,EACT,YAAY,EACZ,IAAI,EACJ,YAAY,EACZ,OAAO,GAAG,MAAM,GACjB,GAAG,KAAK,CAAC;IAEV,OAAO,CACL,MAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,aAC9C,KAAC,mBAAmB,IAClB,SAAS,EAAE,IAAI,CAAC,SAAS,EACzB,SAAS,EAAE,IAAI,CAAC,SAAS,EACzB,cAAc,EAAE,IAAI,CAAC,cAAc,EACnC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAChB,EAEF,MAAC,QAAQ,CAAC,OAAO,IAAC,SAAS,EAAC,2BAA2B,EAAC,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,aACtF,KAAC,oBAAoB,IAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,GAAI,EAE3D,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CACtB,8BACE,KAAC,QAAQ,CAAC,SAAS,IAAC,SAAS,EAAC,2BAA2B,GAAG,EAC3D,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAChC,MAAC,KAAK,CAAC,QAAQ,eACZ,OAAO,CAAC,KAAK,IAAI,cAAK,SAAS,EAAC,iCAAiC,YAAE,OAAO,CAAC,KAAK,GAAO,EACxF,KAAC,QAAQ,CAAC,KAAK,IAAC,SAAS,EAAC,2BAA2B,YAClD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CACnC,KAAC,mBAAmB,OAAoB,GAAG,IAAjB,QAAQ,CAAa,CAChD,CAAC,GACa,KANE,KAAK,CAOT,CAClB,CAAC,IACD,CACJ,EAEA,eAAe,IAAI,CAClB,KAAC,8BAA8B,IAC7B,KAAK,EAAE,eAAe,CAAC,KAAK,EAC5B,IAAI,EAAE,eAAe,CAAC,IAAI,EAC1B,WAAW,EAAE,eAAe,CAAC,WAAW,GACxC,CACH,EAED,KAAC,QAAQ,CAAC,SAAS,IAAC,SAAS,EAAC,2BAA2B,GAAG,EAE5D,KAAC,mBAAmB,IAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,GAAI,IAC/C,IACV,CACZ,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { UserDropdown } from './UserDropdown';
3
+ declare const meta: Meta<typeof UserDropdown>;
4
+ type Story = StoryObj<typeof UserDropdown>;
5
+ export declare const Default: Story;
6
+ export declare const WithApps: Story;
7
+ export declare const Minimal: Story;
8
+ export declare const WithMenu: Story;
9
+ export declare const DarkVariant: Story;
10
+ export declare const LightVariant: Story;
11
+ export default meta;
12
+ //# sourceMappingURL=UserDropdown.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserDropdown.stories.d.ts","sourceRoot":"","sources":["../../../src/components/userDropdown/UserDropdown.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,YAAY,CAInC,CAAC;AAEF,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,CAAC;AAoB3C,eAAO,MAAM,OAAO,EAAE,KAkErB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAkBtB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KASrB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAiCtB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAkCzB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAkC1B,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,222 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { UserDropdown } from './UserDropdown';
3
+ import { ArborLogo, GovhubLogo, KeyLogo, RobinLogo, SampeopleLogo, TimetablerLogo } from './assets/logos';
4
+ const meta = {
5
+ title: 'Components/UserDropdown',
6
+ component: UserDropdown,
7
+ tags: ['autodocs'],
8
+ };
9
+ // Mock avatar image (placeholder)
10
+ 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';
11
+ // Import real logos from assets
12
+ const logoArborWorkflows = ArborLogo;
13
+ const logoGovernorHub = GovhubLogo;
14
+ const logoTheKey = KeyLogo;
15
+ const logoRobin = RobinLogo;
16
+ const logoSamPeople = SampeopleLogo;
17
+ const logoTimetabler = TimetablerLogo;
18
+ const AppLogo = ({ src, alt }) => (_jsx("img", { src: src, alt: alt, width: 24, height: 24, style: { objectFit: 'contain' } }));
19
+ // Mock company logo SVG
20
+ 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';
21
+ export const Default = {
22
+ args: {
23
+ user: {
24
+ name: 'Christine Montgomery-Smith',
25
+ subtitle: 'Business Manager',
26
+ avatarSrc,
27
+ avatarAlt: 'Christine Montgomery-Smith',
28
+ },
29
+ logoSrc: mockLogoSrc,
30
+ logoAlt: 'Arbor',
31
+ sections: [
32
+ {
33
+ label: 'My Apps',
34
+ apps: [
35
+ {
36
+ logo: _jsx(AppLogo, { src: logoArborWorkflows, alt: "Arbor Workflows" }),
37
+ name: 'Arbor Workflows',
38
+ onClick: () => { console.log('Open Arbor Workflows'); },
39
+ },
40
+ {
41
+ logo: _jsx(AppLogo, { src: logoGovernorHub, alt: "GovernorHub" }),
42
+ name: 'GovernorHub',
43
+ onClick: () => { console.log('Open GovernorHub'); },
44
+ },
45
+ {
46
+ logo: _jsx(AppLogo, { src: logoTheKey, alt: "The Key" }),
47
+ name: 'The Key',
48
+ onClick: () => { console.log('Open The Key'); },
49
+ },
50
+ ],
51
+ },
52
+ ],
53
+ discoverSection: {
54
+ label: 'Discover the Arbor suite',
55
+ defaultOpen: true,
56
+ apps: [
57
+ {
58
+ logo: _jsx(AppLogo, { src: logoArborWorkflows, alt: "Arbor Finance" }),
59
+ name: 'Arbor Finance',
60
+ description: 'Cloud-based accounting',
61
+ onClick: () => { console.log('Open Arbor Finance'); },
62
+ },
63
+ {
64
+ logo: _jsx(AppLogo, { src: logoRobin, alt: "Robin" }),
65
+ name: 'Robin',
66
+ description: 'AI website compliance checks',
67
+ onClick: () => { console.log('Open Robin'); },
68
+ },
69
+ {
70
+ logo: _jsx(AppLogo, { src: logoSamPeople, alt: "SAMPeople" }),
71
+ name: 'SAMPeople',
72
+ description: 'HR and recruitment',
73
+ onClick: () => { console.log('Open SAMPeople'); },
74
+ },
75
+ {
76
+ logo: _jsx(AppLogo, { src: logoTimetabler, alt: "Timetabler" }),
77
+ name: 'Timetabler',
78
+ description: 'Schedule timetables and more',
79
+ onClick: () => { console.log('Open Timetabler'); },
80
+ },
81
+ ],
82
+ },
83
+ userInfoAction: { type: 'link', onClick: () => { console.log('View profile'); } },
84
+ onSignOut: () => { console.log('Sign out'); },
85
+ signOutLabel: 'Sign out of Arbor',
86
+ },
87
+ };
88
+ export const WithApps = {
89
+ args: {
90
+ user: {
91
+ name: 'Christine Montgomery-Smith',
92
+ subtitle: 'Business Manager',
93
+ avatarInitials: 'CM',
94
+ },
95
+ sections: [
96
+ {
97
+ label: 'Quick Actions',
98
+ apps: [
99
+ { name: 'Settings', onClick: () => { console.log('Settings'); } },
100
+ { name: 'Help', onClick: () => { console.log('Help'); } },
101
+ ],
102
+ },
103
+ ],
104
+ onSignOut: () => { console.log('Sign out'); },
105
+ },
106
+ };
107
+ export const Minimal = {
108
+ args: {
109
+ user: {
110
+ name: 'Christine Montgomery',
111
+ avatarInitials: 'CM',
112
+ avatarAlt: 'Christine Montgomery',
113
+ },
114
+ onSignOut: () => { console.log('Sign out'); },
115
+ },
116
+ };
117
+ export const WithMenu = {
118
+ args: {
119
+ user: {
120
+ name: 'Christine Montgomery-Smith',
121
+ subtitle: 'Business Manager',
122
+ avatarSrc,
123
+ avatarAlt: 'Christine Montgomery-Smith',
124
+ },
125
+ logoSrc: mockLogoSrc,
126
+ logoAlt: 'Arbor',
127
+ sections: [
128
+ {
129
+ label: 'My Apps',
130
+ apps: [
131
+ {
132
+ logo: _jsx(AppLogo, { src: logoArborWorkflows, alt: "Arbor Workflows" }),
133
+ name: 'Arbor Workflows',
134
+ onClick: () => { console.log('Open Arbor Workflows'); },
135
+ },
136
+ ],
137
+ },
138
+ ],
139
+ userInfoAction: {
140
+ type: 'menu',
141
+ items: [
142
+ { label: 'Help centre', onClick: () => { console.log('Help centre'); } },
143
+ { label: 'About', onClick: () => { console.log('About'); } },
144
+ { label: 'Leave feedback', onClick: () => { console.log('Leave feedback'); } },
145
+ ],
146
+ },
147
+ onSignOut: () => { console.log('Sign out'); },
148
+ signOutLabel: 'Sign out of Arbor',
149
+ },
150
+ };
151
+ export const DarkVariant = {
152
+ args: {
153
+ user: {
154
+ name: 'Christine Montgomery-Smith',
155
+ subtitle: 'Business Manager',
156
+ avatarSrc,
157
+ avatarAlt: 'Christine Montgomery-Smith',
158
+ },
159
+ logoSrc: mockLogoSrc,
160
+ logoAlt: 'Arbor',
161
+ variant: 'dark',
162
+ sections: [
163
+ {
164
+ label: 'My Apps',
165
+ apps: [
166
+ {
167
+ logo: _jsx(AppLogo, { src: logoArborWorkflows, alt: "Arbor Workflows" }),
168
+ name: 'Arbor Workflows',
169
+ onClick: () => { console.log('Open Arbor Workflows'); },
170
+ },
171
+ ],
172
+ },
173
+ ],
174
+ onSignOut: () => { console.log('Sign out'); },
175
+ signOutLabel: 'Sign out of Arbor',
176
+ },
177
+ parameters: {
178
+ backgrounds: {
179
+ default: 'dark',
180
+ values: [
181
+ { name: 'dark', value: '#2f2f2f' },
182
+ ],
183
+ },
184
+ },
185
+ };
186
+ export const LightVariant = {
187
+ args: {
188
+ user: {
189
+ name: 'Christine Montgomery-Smith',
190
+ subtitle: 'Business Manager',
191
+ avatarSrc,
192
+ avatarAlt: 'Christine Montgomery-Smith',
193
+ },
194
+ logoSrc: mockLogoSrc,
195
+ logoAlt: 'Arbor',
196
+ variant: 'light',
197
+ sections: [
198
+ {
199
+ label: 'My Apps',
200
+ apps: [
201
+ {
202
+ logo: _jsx(AppLogo, { src: logoArborWorkflows, alt: "Arbor Workflows" }),
203
+ name: 'Arbor Workflows',
204
+ onClick: () => { console.log('Open Arbor Workflows'); },
205
+ },
206
+ ],
207
+ },
208
+ ],
209
+ onSignOut: () => { console.log('Sign out'); },
210
+ signOutLabel: 'Sign out of Arbor',
211
+ },
212
+ parameters: {
213
+ backgrounds: {
214
+ default: 'light',
215
+ values: [
216
+ { name: 'light', value: '#ffffff' },
217
+ ],
218
+ },
219
+ },
220
+ };
221
+ export default meta;
222
+ //# sourceMappingURL=UserDropdown.stories.js.map