@arbor-education/design-system.components 0.23.2 → 0.24.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 (124) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/CONTRIBUTING.md +24 -22
  3. package/dist/components/sidebarNav/SidebarNav.d.ts +46 -0
  4. package/dist/components/sidebarNav/SidebarNav.d.ts.map +1 -0
  5. package/dist/components/sidebarNav/SidebarNav.js +102 -0
  6. package/dist/components/sidebarNav/SidebarNav.js.map +1 -0
  7. package/dist/components/sidebarNav/SidebarNav.stories.d.ts +61 -0
  8. package/dist/components/sidebarNav/SidebarNav.stories.d.ts.map +1 -0
  9. package/dist/components/sidebarNav/SidebarNav.stories.js +253 -0
  10. package/dist/components/sidebarNav/SidebarNav.stories.js.map +1 -0
  11. package/dist/components/sidebarNav/SidebarNav.test.d.ts +2 -0
  12. package/dist/components/sidebarNav/SidebarNav.test.d.ts.map +1 -0
  13. package/dist/components/sidebarNav/SidebarNav.test.js +240 -0
  14. package/dist/components/sidebarNav/SidebarNav.test.js.map +1 -0
  15. package/dist/components/sidebarNav/SidebarNavContext.d.ts +13 -0
  16. package/dist/components/sidebarNav/SidebarNavContext.d.ts.map +1 -0
  17. package/dist/components/sidebarNav/SidebarNavContext.js +15 -0
  18. package/dist/components/sidebarNav/SidebarNavContext.js.map +1 -0
  19. package/dist/components/sidebarNav/SidebarNavGroup.d.ts +10 -0
  20. package/dist/components/sidebarNav/SidebarNavGroup.d.ts.map +1 -0
  21. package/dist/components/sidebarNav/SidebarNavGroup.js +16 -0
  22. package/dist/components/sidebarNav/SidebarNavGroup.js.map +1 -0
  23. package/dist/components/sidebarNav/SidebarNavItem.d.ts +32 -0
  24. package/dist/components/sidebarNav/SidebarNavItem.d.ts.map +1 -0
  25. package/dist/components/sidebarNav/SidebarNavItem.js +43 -0
  26. package/dist/components/sidebarNav/SidebarNavItem.js.map +1 -0
  27. package/dist/components/sidebarNav/SidebarNavItemFavourite.d.ts +8 -0
  28. package/dist/components/sidebarNav/SidebarNavItemFavourite.d.ts.map +1 -0
  29. package/dist/components/sidebarNav/SidebarNavItemFavourite.js +14 -0
  30. package/dist/components/sidebarNav/SidebarNavItemFavourite.js.map +1 -0
  31. package/dist/components/sidebarNav/SidebarNavPanel.d.ts +4 -0
  32. package/dist/components/sidebarNav/SidebarNavPanel.d.ts.map +1 -0
  33. package/dist/components/sidebarNav/SidebarNavPanel.js +9 -0
  34. package/dist/components/sidebarNav/SidebarNavPanel.js.map +1 -0
  35. package/dist/components/sidebarNav/SidebarNavPanelNav.d.ts +10 -0
  36. package/dist/components/sidebarNav/SidebarNavPanelNav.d.ts.map +1 -0
  37. package/dist/components/sidebarNav/SidebarNavPanelNav.js +21 -0
  38. package/dist/components/sidebarNav/SidebarNavPanelNav.js.map +1 -0
  39. package/dist/components/sidebarNav/SidebarNavRail.d.ts +6 -0
  40. package/dist/components/sidebarNav/SidebarNavRail.d.ts.map +1 -0
  41. package/dist/components/sidebarNav/SidebarNavRail.js +7 -0
  42. package/dist/components/sidebarNav/SidebarNavRail.js.map +1 -0
  43. package/dist/components/sidebarNav/SidebarNavRailItem.d.ts +10 -0
  44. package/dist/components/sidebarNav/SidebarNavRailItem.d.ts.map +1 -0
  45. package/dist/components/sidebarNav/SidebarNavRailItem.js +24 -0
  46. package/dist/components/sidebarNav/SidebarNavRailItem.js.map +1 -0
  47. package/dist/components/sidebarNav/SidebarNavRailList.d.ts +4 -0
  48. package/dist/components/sidebarNav/SidebarNavRailList.d.ts.map +1 -0
  49. package/dist/components/sidebarNav/SidebarNavRailList.js +7 -0
  50. package/dist/components/sidebarNav/SidebarNavRailList.js.map +1 -0
  51. package/dist/components/sidebarNav/SidebarNavRailSlot.d.ts +6 -0
  52. package/dist/components/sidebarNav/SidebarNavRailSlot.d.ts.map +1 -0
  53. package/dist/components/sidebarNav/SidebarNavRailSlot.js +7 -0
  54. package/dist/components/sidebarNav/SidebarNavRailSlot.js.map +1 -0
  55. package/dist/components/sidebarNav/SidebarNavSeparator.d.ts +6 -0
  56. package/dist/components/sidebarNav/SidebarNavSeparator.d.ts.map +1 -0
  57. package/dist/components/sidebarNav/SidebarNavSeparator.js +8 -0
  58. package/dist/components/sidebarNav/SidebarNavSeparator.js.map +1 -0
  59. package/dist/components/sidebarNav/SidebarNavTitle.d.ts +4 -0
  60. package/dist/components/sidebarNav/SidebarNavTitle.d.ts.map +1 -0
  61. package/dist/components/sidebarNav/SidebarNavTitle.js +7 -0
  62. package/dist/components/sidebarNav/SidebarNavTitle.js.map +1 -0
  63. package/dist/components/sidebarNav/SidebarNavTooltip.d.ts +7 -0
  64. package/dist/components/sidebarNav/SidebarNavTooltip.d.ts.map +1 -0
  65. package/dist/components/sidebarNav/SidebarNavTooltip.js +9 -0
  66. package/dist/components/sidebarNav/SidebarNavTooltip.js.map +1 -0
  67. package/dist/components/sidebarNav/SidebarNavTrigger.d.ts +8 -0
  68. package/dist/components/sidebarNav/SidebarNavTrigger.d.ts.map +1 -0
  69. package/dist/components/sidebarNav/SidebarNavTrigger.js +15 -0
  70. package/dist/components/sidebarNav/SidebarNavTrigger.js.map +1 -0
  71. package/dist/components/sidebarNav/index.d.ts +4 -0
  72. package/dist/components/sidebarNav/index.d.ts.map +1 -0
  73. package/dist/components/sidebarNav/index.js +3 -0
  74. package/dist/components/sidebarNav/index.js.map +1 -0
  75. package/dist/components/sidebarNav/resolvePanelItemProps.d.ts +4 -0
  76. package/dist/components/sidebarNav/resolvePanelItemProps.d.ts.map +1 -0
  77. package/dist/components/sidebarNav/resolvePanelItemProps.js +43 -0
  78. package/dist/components/sidebarNav/resolvePanelItemProps.js.map +1 -0
  79. package/dist/components/sidebarNav/resolvePanelItemProps.test.d.ts +2 -0
  80. package/dist/components/sidebarNav/resolvePanelItemProps.test.d.ts.map +1 -0
  81. package/dist/components/sidebarNav/resolvePanelItemProps.test.js +52 -0
  82. package/dist/components/sidebarNav/resolvePanelItemProps.test.js.map +1 -0
  83. package/dist/components/sidebarNav/types.d.ts +100 -0
  84. package/dist/components/sidebarNav/types.d.ts.map +1 -0
  85. package/dist/components/sidebarNav/types.js +4 -0
  86. package/dist/components/sidebarNav/types.js.map +1 -0
  87. package/dist/components/sidebarNav/useControllableBoolean.d.ts +9 -0
  88. package/dist/components/sidebarNav/useControllableBoolean.d.ts.map +1 -0
  89. package/dist/components/sidebarNav/useControllableBoolean.js +14 -0
  90. package/dist/components/sidebarNav/useControllableBoolean.js.map +1 -0
  91. package/dist/index.css +275 -0
  92. package/dist/index.css.map +1 -1
  93. package/dist/index.d.ts +3 -0
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +2 -0
  96. package/dist/index.js.map +1 -1
  97. package/package.json +1 -1
  98. package/src/components/sidebarNav/SidebarNav.stories.tsx +484 -0
  99. package/src/components/sidebarNav/SidebarNav.test.tsx +611 -0
  100. package/src/components/sidebarNav/SidebarNav.tsx +230 -0
  101. package/src/components/sidebarNav/SidebarNavContext.tsx +28 -0
  102. package/src/components/sidebarNav/SidebarNavGroup.tsx +59 -0
  103. package/src/components/sidebarNav/SidebarNavItem.tsx +160 -0
  104. package/src/components/sidebarNav/SidebarNavItemFavourite.tsx +49 -0
  105. package/src/components/sidebarNav/SidebarNavPanel.tsx +20 -0
  106. package/src/components/sidebarNav/SidebarNavPanelNav.tsx +55 -0
  107. package/src/components/sidebarNav/SidebarNavRail.tsx +20 -0
  108. package/src/components/sidebarNav/SidebarNavRailItem.tsx +84 -0
  109. package/src/components/sidebarNav/SidebarNavRailList.tsx +11 -0
  110. package/src/components/sidebarNav/SidebarNavRailSlot.tsx +15 -0
  111. package/src/components/sidebarNav/SidebarNavSeparator.tsx +19 -0
  112. package/src/components/sidebarNav/SidebarNavTitle.tsx +13 -0
  113. package/src/components/sidebarNav/SidebarNavTooltip.tsx +24 -0
  114. package/src/components/sidebarNav/SidebarNavTrigger.tsx +52 -0
  115. package/src/components/sidebarNav/index.ts +6 -0
  116. package/src/components/sidebarNav/resolvePanelItemProps.test.ts +57 -0
  117. package/src/components/sidebarNav/resolvePanelItemProps.ts +50 -0
  118. package/src/components/sidebarNav/sidebarNav.scss +283 -0
  119. package/src/components/sidebarNav/types.ts +126 -0
  120. package/src/components/sidebarNav/useControllableBoolean.ts +20 -0
  121. package/src/docs/Contributing.mdx +7 -0
  122. package/src/index.scss +1 -0
  123. package/src/index.ts +12 -0
  124. package/src/tokens.scss +14 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.24.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#201](https://github.com/arbor-education/design-system.components/pull/201) [`96bdfeb`](https://github.com/arbor-education/design-system.components/commit/96bdfebc8dfb69e88ba0bede7102d6688e6d3ef0) Thanks [@angusmglfraser](https://github.com/angusmglfraser)! - FRENDS-90 📝 Update contributing guidelines to reflect current versioning conventions and notes on proper use of changesets
8
+
9
+ ## 0.24.0
10
+
11
+ ### Minor Changes
12
+
13
+ - [#199](https://github.com/arbor-education/design-system.components/pull/199) [`26542e8`](https://github.com/arbor-education/design-system.components/commit/26542e8c6382368b23b2b18b8e37bef58afbc8a9) Thanks [@danielpeplow](https://github.com/danielpeplow)! - Add SidebarNav compound component with icon rail slots, collapsible panel navigation, favourites, and help menu.
14
+
3
15
  ## 0.23.2
4
16
 
5
17
  ### Patch Changes
package/CONTRIBUTING.md CHANGED
@@ -60,18 +60,18 @@ Format: `{JIRA-TICKET} {gitmoji} {Short, imperative description}`
60
60
  - Keep it under 72 characters
61
61
 
62
62
  **Common gitmoji:**
63
- | Emoji | Use for |
64
- |-------|---------|
65
- | ✨ | New feature |
66
- | 🐛 | Bug fix |
67
- | ♻️ | Refactor (no behaviour change) |
68
- | 💄 | Styling / visual change |
69
- | 🧪 | Tests only |
70
- | 📝 | Documentation |
71
- | ⬆️ | Dependency upgrade |
72
- | 🔧 | Config / tooling change |
73
- | 💥 | Breaking change |
74
- | ♿️ | Accessibility improvement |
63
+ | Emoji | Use for |
64
+ | ----- | ------------------------------ |
65
+ | ✨ | New feature |
66
+ | 🐛 | Bug fix |
67
+ | ♻️ | Refactor (no behaviour change) |
68
+ | 💄 | Styling / visual change |
69
+ | 🧪 | Tests only |
70
+ | 📝 | Documentation |
71
+ | ⬆️ | Dependency upgrade |
72
+ | 🔧 | Config / tooling change |
73
+ | 💥 | Breaking change |
74
+ | ♿️ | Accessibility improvement |
75
75
 
76
76
  ### Description
77
77
 
@@ -130,24 +130,16 @@ Run through this checklist yourself before requesting review:
130
130
  ### Hard rules for agents
131
131
 
132
132
  1. **One PR per Jira ticket.** Never combine work from multiple tickets into a single PR, even if the work seems related.
133
-
134
133
  2. **Stop and check scope before starting.** Before writing any code, identify the minimal set of files required to complete the task. If you find yourself touching more than ~5 files or ~200 lines, pause and ask the human whether the task should be split.
135
-
136
134
  3. **Never bundle refactoring with feature work.** If you notice an opportunity to refactor while implementing a feature, stop. Create a note for the human. Do not refactor in the same PR unless explicitly instructed.
137
-
138
135
  4. **Never touch files outside the task scope.** Do not "improve" adjacent code, fix unrelated formatting, or clean up files you didn't need to open to complete the task.
139
-
140
136
  5. **Never open a PR with failing tests.** All tests must pass. `yarn test:coverage` must complete with 100% of tests passing.
141
-
142
137
  6. **Never open a PR with type errors.** `yarn check-types` must pass cleanly.
143
-
144
138
  7. **Write a complete PR description.** Use the template. Answer all four questions. Do not leave sections blank.
145
-
146
139
  8. **Warn before generating large changes.** If completing a task would require changes to more than 400 lines of meaningful code or more than 10 files, stop and tell the human before proceeding. Ask whether the task should be broken into smaller pieces.
147
-
148
- 9. **Commit atomically.** Each commit should be a coherent, working unit. Do not commit broken intermediate states.
149
-
140
+ 9. **Commit atomically.** Each commit should be a coherent, working unit. Do not commit broken intermediate states, and avoid large commits with a broad scope where possible.
150
141
  10. **Ask, don't assume.** When the scope or approach is unclear, ask the human rather than making assumptions that lead to larger-than-expected changes.
142
+ 11. **Do not write changeset files yourself.** AI agents have a propensity to directly write their own changeset files, which often hallucinate the structure of the files, or the name of the changeset project, which can result in stray changeset files not being added to the changelog on releases. **All** changeset files **must** be generated by running `yarn changeset`.
151
143
 
152
144
  ---
153
145
 
@@ -183,6 +175,16 @@ See [CLAUDE.md](./CLAUDE.md) for the definitive reference. In summary:
183
175
 
184
176
  ---
185
177
 
178
+ ## A Note on Versioning
179
+
180
+ Generally we use semantic versioning (https://semver.org/), however, we are reserving version 1.0.0 for the first wide release of this project. Therefore, in the mean time, we follow the following convention with regards to change levels:
181
+
182
+ - Major version bumps are reserved for the first wide release
183
+ - Minor version bumps are for breaking changes
184
+ - Patch version bumps are for all other changes (including added functionality)
185
+
186
+ ---
187
+
186
188
  ## Resources
187
189
 
188
190
  - [gitmoji reference](https://gitmoji.dev/)
@@ -0,0 +1,46 @@
1
+ import { SidebarNavGroup } from './SidebarNavGroup.js';
2
+ import type { SidebarNavGroupProps } from './SidebarNavGroup.js';
3
+ import { SidebarNavItem } from './SidebarNavItem.js';
4
+ import type { SidebarNavItemProps } from './SidebarNavItem.js';
5
+ import { SidebarNavPanelNav } from './SidebarNavPanelNav.js';
6
+ import type { SidebarNavPanelNavProps } from './SidebarNavPanelNav.js';
7
+ import { SidebarNavPanel } from './SidebarNavPanel.js';
8
+ import type { SidebarNavPanelProps } from './SidebarNavPanel.js';
9
+ import { SidebarNavRail } from './SidebarNavRail.js';
10
+ import type { SidebarNavRailProps } from './SidebarNavRail.js';
11
+ import { SidebarNavRailItem } from './SidebarNavRailItem.js';
12
+ import type { SidebarNavRailItemProps } from './SidebarNavRailItem.js';
13
+ import { SidebarNavRailList } from './SidebarNavRailList.js';
14
+ import { SidebarNavRailSlot } from './SidebarNavRailSlot.js';
15
+ import { SidebarNavSeparator } from './SidebarNavSeparator.js';
16
+ import { SidebarNavTitle } from './SidebarNavTitle.js';
17
+ import { SidebarNavTrigger } from './SidebarNavTrigger.js';
18
+ import type { SidebarNavTriggerProps } from './SidebarNavTrigger.js';
19
+ import type { SidebarNavProps } from './types.js';
20
+ declare const SidebarNavImpl: (props: SidebarNavProps) => import("react/jsx-runtime").JSX.Element;
21
+ type SidebarNavComponent = typeof SidebarNavImpl & {
22
+ Rail: typeof SidebarNavRail;
23
+ Separator: typeof SidebarNavSeparator;
24
+ RailList: typeof SidebarNavRailList;
25
+ RailItem: typeof SidebarNavRailItem;
26
+ RailSlot: typeof SidebarNavRailSlot;
27
+ Trigger: typeof SidebarNavTrigger;
28
+ Panel: typeof SidebarNavPanel;
29
+ Title: typeof SidebarNavTitle;
30
+ PanelNav: typeof SidebarNavPanelNav;
31
+ Group: typeof SidebarNavGroup;
32
+ Item: typeof SidebarNavItem;
33
+ };
34
+ export declare const SidebarNav: SidebarNavComponent;
35
+ export declare namespace SidebarNav {
36
+ type Props = SidebarNavProps;
37
+ type RailProps = SidebarNavRailProps;
38
+ type RailItemProps = SidebarNavRailItemProps;
39
+ type TriggerProps = SidebarNavTriggerProps;
40
+ type PanelProps = SidebarNavPanelProps;
41
+ type PanelNavProps = SidebarNavPanelNavProps;
42
+ type GroupProps = SidebarNavGroupProps;
43
+ type ItemProps = SidebarNavItemProps;
44
+ }
45
+ export {};
46
+ //# sourceMappingURL=SidebarNav.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarNav.d.ts","sourceRoot":"","sources":["../../../src/components/sidebarNav/SidebarNav.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,YAAY,CAAC;AAoFpB,QAAA,MAAM,cAAc,GAAI,OAAO,eAAe,4CA+E7C,CAAC;AAEF,KAAK,mBAAmB,GAAG,OAAO,cAAc,GAAG;IACjD,IAAI,EAAE,OAAO,cAAc,CAAC;IAC5B,SAAS,EAAE,OAAO,mBAAmB,CAAC;IACtC,QAAQ,EAAE,OAAO,kBAAkB,CAAC;IACpC,QAAQ,EAAE,OAAO,kBAAkB,CAAC;IACpC,QAAQ,EAAE,OAAO,kBAAkB,CAAC;IACpC,OAAO,EAAE,OAAO,iBAAiB,CAAC;IAClC,KAAK,EAAE,OAAO,eAAe,CAAC;IAC9B,KAAK,EAAE,OAAO,eAAe,CAAC;IAC9B,QAAQ,EAAE,OAAO,kBAAkB,CAAC;IACpC,KAAK,EAAE,OAAO,eAAe,CAAC;IAC9B,IAAI,EAAE,OAAO,cAAc,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAqB,mBAAmB,CAAC;AAchE,yBAAiB,UAAU,CAAC;IAC1B,KAAY,KAAK,GAAG,eAAe,CAAC;IACpC,KAAY,SAAS,GAAG,mBAAmB,CAAC;IAC5C,KAAY,aAAa,GAAG,uBAAuB,CAAC;IACpD,KAAY,YAAY,GAAG,sBAAsB,CAAC;IAClD,KAAY,UAAU,GAAG,oBAAoB,CAAC;IAC9C,KAAY,aAAa,GAAG,uBAAuB,CAAC;IACpD,KAAY,UAAU,GAAG,oBAAoB,CAAC;IAC9C,KAAY,SAAS,GAAG,mBAAmB,CAAC;CAC7C"}
@@ -0,0 +1,102 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Icon } from '../icon/Icon.js';
3
+ import classNames from 'classnames';
4
+ import { Tooltip as TooltipPrimitive } from 'radix-ui';
5
+ import React, { useId, useMemo } from 'react';
6
+ import { SidebarNavProvider } from './SidebarNavContext.js';
7
+ import { SidebarNavGroup } from './SidebarNavGroup.js';
8
+ import { SidebarNavItem } from './SidebarNavItem.js';
9
+ import { SidebarNavPanelNav } from './SidebarNavPanelNav.js';
10
+ import { SidebarNavPanel } from './SidebarNavPanel.js';
11
+ import { SidebarNavRail } from './SidebarNavRail.js';
12
+ import { SidebarNavRailItem } from './SidebarNavRailItem.js';
13
+ import { SidebarNavRailList } from './SidebarNavRailList.js';
14
+ import { SidebarNavRailSlot } from './SidebarNavRailSlot.js';
15
+ import { SidebarNavSeparator } from './SidebarNavSeparator.js';
16
+ import { SidebarNavTitle } from './SidebarNavTitle.js';
17
+ import { SidebarNavTrigger } from './SidebarNavTrigger.js';
18
+ import { isSidebarNavRailSeparator } from './types.js';
19
+ import { useControllableBoolean } from './useControllableBoolean.js';
20
+ function renderRailListItem(item) {
21
+ if (item.renderItem) {
22
+ return (_jsx(React.Fragment, { children: item.renderItem(item) }, item.id));
23
+ }
24
+ return (_jsxs(SidebarNavRailItem, { "data-testid": `sidebar-nav-rail-item-${item.id}`, href: item.href, onClick: item.onClick, current: item.current, "aria-label": item.label, children: [_jsx(Icon, { name: item.iconName, size: 24, color: item.iconColor }), item.badgeContent] }, item.id));
25
+ }
26
+ function SidebarNavRailFromData(props) {
27
+ const { items } = props;
28
+ const nodes = [];
29
+ let currentGroup = [];
30
+ let groupKey = 'rail-list-leading';
31
+ const flushGroup = () => {
32
+ if (currentGroup.length === 0) {
33
+ return;
34
+ }
35
+ nodes.push(_jsx(SidebarNavRailList, { children: currentGroup.map(renderRailListItem) }, groupKey));
36
+ currentGroup = [];
37
+ };
38
+ for (const entry of items) {
39
+ if (isSidebarNavRailSeparator(entry)) {
40
+ flushGroup();
41
+ nodes.push(_jsx(SidebarNavSeparator, { id: entry.id }, entry.id));
42
+ groupKey = `rail-list-after-${entry.id}`;
43
+ continue;
44
+ }
45
+ if (entry.opensPanel) {
46
+ flushGroup();
47
+ nodes.push(_jsx(SidebarNavTrigger, { "data-testid": `sidebar-nav-panel-trigger-${entry.id}`, tooltip: entry.label, onClick: (e) => {
48
+ entry.onClick?.(e);
49
+ }, children: _jsx(Icon, { name: entry.iconName, size: 24, color: entry.iconColor }) }, entry.id));
50
+ continue;
51
+ }
52
+ currentGroup.push(entry);
53
+ }
54
+ flushGroup();
55
+ return (_jsx(SidebarNavRail, { children: nodes }));
56
+ }
57
+ const SidebarNavImpl = (props) => {
58
+ const { expanded, defaultExpanded = true, onExpandedChange, renderLink, railItems, panelTitle, panelNavItems, className, children, ...rest } = props;
59
+ const panelId = useId();
60
+ const { value: isExpanded, set: setExpanded } = useControllableBoolean({
61
+ value: expanded,
62
+ defaultValue: defaultExpanded,
63
+ onChange: onExpandedChange,
64
+ });
65
+ const useDataRail = railItems !== undefined;
66
+ const useDataPanel = panelTitle !== undefined || panelNavItems !== undefined;
67
+ const childArray = React.Children.toArray(children);
68
+ const railChild = childArray.find(c => c.type === SidebarNavRail);
69
+ const panelChild = childArray.find(c => c.type === SidebarNavPanel);
70
+ if (process.env.NODE_ENV !== 'production') {
71
+ if (useDataPanel && !useDataRail && railChild == null && childArray.length > 0) {
72
+ console.warn('SidebarNav: composable SidebarNav.Rail was not found. In hybrid mode, SidebarNav.Rail must be a direct child of SidebarNav (not wrapped in Fragment or other wrappers).');
73
+ }
74
+ }
75
+ const content = useDataRail || useDataPanel
76
+ ? (_jsxs(_Fragment, { children: [useDataRail
77
+ ? _jsx(SidebarNavRailFromData, { items: railItems })
78
+ : railChild, useDataPanel
79
+ ? (_jsxs(SidebarNavPanel, { children: [panelTitle !== undefined && (_jsx(SidebarNavTitle, { children: panelTitle })), _jsx(SidebarNavPanelNav, { items: panelNavItems ?? [] })] }))
80
+ : panelChild] }))
81
+ : children;
82
+ const contextValue = useMemo(() => ({
83
+ expanded: isExpanded,
84
+ setExpanded,
85
+ panelId,
86
+ renderLink,
87
+ }), [isExpanded, setExpanded, panelId, renderLink]);
88
+ return (_jsx(TooltipPrimitive.Provider, { delayDuration: 400, children: _jsx(SidebarNavProvider, { value: contextValue, children: _jsx("div", { className: classNames('ds-sidebar-nav', className), "data-testid": "sidebar-nav", ...rest, children: content }) }) }));
89
+ };
90
+ export const SidebarNav = SidebarNavImpl;
91
+ SidebarNav.Rail = SidebarNavRail;
92
+ SidebarNav.Separator = SidebarNavSeparator;
93
+ SidebarNav.RailList = SidebarNavRailList;
94
+ SidebarNav.RailItem = SidebarNavRailItem;
95
+ SidebarNav.RailSlot = SidebarNavRailSlot;
96
+ SidebarNav.Trigger = SidebarNavTrigger;
97
+ SidebarNav.Panel = SidebarNavPanel;
98
+ SidebarNav.Title = SidebarNavTitle;
99
+ SidebarNav.PanelNav = SidebarNavPanelNav;
100
+ SidebarNav.Group = SidebarNavGroup;
101
+ SidebarNav.Item = SidebarNavItem;
102
+ //# sourceMappingURL=SidebarNav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarNav.js","sourceRoot":"","sources":["../../../src/components/sidebarNav/SidebarNav.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAO3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,SAAS,kBAAkB,CAAC,IAA8B;IACxD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,OAAO,CACL,KAAC,KAAK,CAAC,QAAQ,cACZ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IADH,IAAI,CAAC,EAAE,CAEX,CAClB,CAAC;IACJ,CAAC;IAED,OAAO,CACL,MAAC,kBAAkB,mBAEJ,yBAAyB,IAAI,CAAC,EAAE,EAAE,EAC/C,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,OAAO,EAAE,IAAI,CAAC,OAAO,gBACT,IAAI,CAAC,KAAK,aAEtB,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,GAAI,EAC7D,IAAI,CAAC,YAAY,KARb,IAAI,CAAC,EAAE,CASO,CACtB,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAuC;IACrE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACxB,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,IAAI,YAAY,GAA+B,EAAE,CAAC;IAClD,IAAI,QAAQ,GAAG,mBAAmB,CAAC;IAEnC,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,KAAK,CAAC,IAAI,CACR,KAAC,kBAAkB,cAChB,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC,IADd,QAAQ,CAEZ,CACtB,CAAC;QACF,YAAY,GAAG,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,UAAU,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,KAAC,mBAAmB,IAAgB,EAAE,EAAE,KAAK,CAAC,EAAE,IAAtB,KAAK,CAAC,EAAE,CAAkB,CAAC,CAAC;YACjE,QAAQ,GAAG,mBAAmB,KAAK,CAAC,EAAE,EAAE,CAAC;YACzC,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,UAAU,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CACR,KAAC,iBAAiB,mBAEH,6BAA6B,KAAK,CAAC,EAAE,EAAE,EACpD,OAAO,EAAE,KAAK,CAAC,KAAK,EACpB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;oBACb,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;gBACrB,CAAC,YAED,KAAC,IAAI,IAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,GAAI,IAP3D,KAAK,CAAC,EAAE,CAQK,CACrB,CAAC;YACF,SAAS;QACX,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,UAAU,EAAE,CAAC;IAEb,OAAO,CACL,KAAC,cAAc,cACZ,KAAK,GACS,CAClB,CAAC;AACJ,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,KAAsB,EAAE,EAAE;IAChD,MAAM,EACJ,QAAQ,EACR,eAAe,GAAG,IAAI,EACtB,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,UAAU,EACV,aAAa,EACb,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACR,GAAG,KAAK,CAAC;IAEV,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;IACxB,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,sBAAsB,CAAC;QACrE,KAAK,EAAE,QAAQ;QACf,YAAY,EAAE,eAAe;QAC7B,QAAQ,EAAE,gBAAgB;KAC3B,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,SAAS,KAAK,SAAS,CAAC;IAC5C,MAAM,YAAY,GAAG,UAAU,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS,CAAC;IAC7E,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAyB,CAAC;IAC5E,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;IAEpE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC1C,IAAI,YAAY,IAAI,CAAC,WAAW,IAAI,SAAS,IAAI,IAAI,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/E,OAAO,CAAC,IAAI,CACV,yKAAyK,CAC1K,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GACT,WAAW,IAAI,YAAY;QAC3B,CAAC,CAAC,CACE,8BACG,WAAW;oBACV,CAAC,CAAC,KAAC,sBAAsB,IAAC,KAAK,EAAE,SAAS,GAAI;oBAC9C,CAAC,CAAC,SAAS,EACZ,YAAY;oBACX,CAAC,CAAC,CACE,MAAC,eAAe,eACb,UAAU,KAAK,SAAS,IAAI,CAC3B,KAAC,eAAe,cAAE,UAAU,GAAmB,CAChD,EACD,KAAC,kBAAkB,IAAC,KAAK,EAAE,aAAa,IAAI,EAAE,GAAI,IAClC,CACnB;oBACH,CAAC,CAAC,UAAU,IACb,CACJ;QACH,CAAC,CAAC,QAAQ,CAAC;IAEf,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ,EAAE,UAAU;QACpB,WAAW;QACX,OAAO;QACP,UAAU;KACX,CAAC,EACF,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC,CAC/C,CAAC;IAEF,OAAO,CACL,KAAC,gBAAgB,CAAC,QAAQ,IAAC,aAAa,EAAE,GAAG,YAC3C,KAAC,kBAAkB,IAAC,KAAK,EAAE,YAAY,YACrC,cACE,SAAS,EAAE,UAAU,CAAC,gBAAgB,EAAE,SAAS,CAAC,iBACtC,aAAa,KACrB,IAAI,YAEP,OAAO,GACJ,GACa,GACK,CAC7B,CAAC;AACJ,CAAC,CAAC;AAgBF,MAAM,CAAC,MAAM,UAAU,GAAG,cAAqC,CAAC;AAEhE,UAAU,CAAC,IAAI,GAAG,cAAc,CAAC;AACjC,UAAU,CAAC,SAAS,GAAG,mBAAmB,CAAC;AAC3C,UAAU,CAAC,QAAQ,GAAG,kBAAkB,CAAC;AACzC,UAAU,CAAC,QAAQ,GAAG,kBAAkB,CAAC;AACzC,UAAU,CAAC,QAAQ,GAAG,kBAAkB,CAAC;AACzC,UAAU,CAAC,OAAO,GAAG,iBAAiB,CAAC;AACvC,UAAU,CAAC,KAAK,GAAG,eAAe,CAAC;AACnC,UAAU,CAAC,KAAK,GAAG,eAAe,CAAC;AACnC,UAAU,CAAC,QAAQ,GAAG,kBAAkB,CAAC;AACzC,UAAU,CAAC,KAAK,GAAG,eAAe,CAAC;AACnC,UAAU,CAAC,IAAI,GAAG,cAAc,CAAC"}
@@ -0,0 +1,61 @@
1
+ import type { StoryObj } from '@storybook/react-vite';
2
+ import { SidebarNav } from './SidebarNav.js';
3
+ declare function SidebarNavDocsPage(): import("react/jsx-runtime").JSX.Element;
4
+ declare const meta: {
5
+ title: string;
6
+ component: ((props: import("./types.js").SidebarNavProps) => import("react/jsx-runtime").JSX.Element) & {
7
+ Rail: typeof import("./SidebarNavRail.js").SidebarNavRail;
8
+ Separator: typeof import("./SidebarNavSeparator.js").SidebarNavSeparator;
9
+ RailList: typeof import("./SidebarNavRailList.js").SidebarNavRailList;
10
+ RailItem: typeof import("./SidebarNavRailItem.js").SidebarNavRailItem;
11
+ RailSlot: typeof import("./SidebarNavRailSlot.js").SidebarNavRailSlot;
12
+ Trigger: typeof import("./SidebarNavTrigger.js").SidebarNavTrigger;
13
+ Panel: typeof import("./SidebarNavPanel.js").SidebarNavPanel;
14
+ Title: typeof import("./SidebarNavTitle.js").SidebarNavTitle;
15
+ PanelNav: typeof import("./SidebarNavPanelNav.js").SidebarNavPanelNav;
16
+ Group: typeof import("./SidebarNavGroup.js").SidebarNavGroup;
17
+ Item: typeof import("./SidebarNavItem.js").SidebarNavItem;
18
+ };
19
+ parameters: {
20
+ layout: string;
21
+ docs: {
22
+ page: typeof SidebarNavDocsPage;
23
+ };
24
+ };
25
+ tags: string[];
26
+ args: {
27
+ onExpandedChange: import("vitest").Mock<(...args: any[]) => any>;
28
+ };
29
+ argTypes: {
30
+ defaultExpanded: {
31
+ control: "boolean";
32
+ description: string;
33
+ table: {
34
+ defaultValue: {
35
+ summary: string;
36
+ };
37
+ };
38
+ };
39
+ children: {
40
+ control: false;
41
+ };
42
+ railItems: {
43
+ control: false;
44
+ };
45
+ panelNavItems: {
46
+ control: false;
47
+ };
48
+ renderLink: {
49
+ control: false;
50
+ };
51
+ };
52
+ };
53
+ export default meta;
54
+ type Story = StoryObj<typeof SidebarNav>;
55
+ export declare const Default: Story;
56
+ export declare const CollapsedPanel: Story;
57
+ export declare const ConfigDriven: Story;
58
+ export declare const WithFavourites: Story;
59
+ export declare const ConfigDrivenWithFavourites: Story;
60
+ export declare const WithRenderLink: Story;
61
+ //# sourceMappingURL=SidebarNav.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarNav.stories.d.ts","sourceRoot":"","sources":["../../../src/components/sidebarNav/SidebarNav.stories.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAK5D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA2F7C,iBAAS,kBAAkB,4CAmB1B;AAED,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwByB,CAAC;AAEpC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,UAAU,CAAC,CAAC;AA4RzC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAM5B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAM5B,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,KAMxC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAM5B,CAAC"}
@@ -0,0 +1,253 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Controls, Heading as DocHeading, Primary as DocPrimary, Markdown, Stories, Subtitle, Title, } from '@storybook/addon-docs/blocks';
3
+ import { Badge } from '../badge/Badge.js';
4
+ import { Icon } from '../icon/Icon.js';
5
+ import { useMemo, useState } from 'react';
6
+ import { fn } from 'storybook/test';
7
+ import { SidebarNav } from './SidebarNav.js';
8
+ const DESCRIPTION_INTRO = [
9
+ 'SidebarNav is a two-part navigation pattern: a fixed icon rail for global shortcuts and an expandable',
10
+ 'panel for hierarchical section links. Place a `<Separator />` after the burger to divide the panel toggle',
11
+ 'from the rest of the rail icons.',
12
+ ].join('\n');
13
+ const USAGE_GUIDANCE = [
14
+ '### When to use',
15
+ '',
16
+ '- **Application shell navigation** — persistent rail icons (home, favourites, calendar) plus contextual section nav',
17
+ '- **MIS module navigation** — attendance, students, or reporting areas with grouped links',
18
+ '- **Favourites on leaf links** — `canFavourite` on panel items for user-pinned pages',
19
+ '',
20
+ '---',
21
+ '',
22
+ '### When NOT to use',
23
+ '',
24
+ '| Situation | Use instead |',
25
+ '|---|---|',
26
+ '| Horizontal top-level product nav | [`Menubar`](?path=/docs/components-menubar--docs) or app header patterns |',
27
+ '| Single flat list of links | [`Tabs`](?path=/docs/components-tabs--docs) or plain links |',
28
+ '| Account / settings menu | [`Dropdown`](?path=/docs/components-dropdown--docs) |',
29
+ ].join('\n');
30
+ const DEVELOPER_NOTES = [
31
+ '### Rail layout',
32
+ '',
33
+ 'The rail is a single vertical column. Compose **`Trigger` → `SidebarNav.Separator` → `RailList`** (icon rows).',
34
+ 'Insert additional `<SidebarNav.Separator />` siblings between `RailList` blocks when Figma shows a break',
35
+ '(e.g. main shortcuts, emergency alert, help). `RailItem` and `RailSlot` each render their own',
36
+ '`<li>` row wrapper — do not add `ds-sidebar-nav__*` layout classes in consumer code. Use `RailSlot` for other',
37
+ 'custom rail rows inside `RailList`.',
38
+ '',
39
+ 'The rail `<nav>` defaults to `aria-label="Sidebar rail"`; the panel links nav defaults to `"Sidebar links"`.',
40
+ 'Override via `ariaLabel` on `SidebarNav.Rail` or `SidebarNav.PanelNav` when needed.',
41
+ '',
42
+ '### Config-driven API',
43
+ '',
44
+ 'Pass `railItems` as an ordered array of item configs and `{ type: \'separator\', id }` entries. Use',
45
+ '`opensPanel: true` on the burger item to render the panel trigger. Use `renderItem` for custom rail rows.',
46
+ '',
47
+ '### Favourites',
48
+ '',
49
+ 'Panel leaf items support `canFavourite`, `isPressed`, `onFavouriteClick`, and required `favouriteTooltip` when',
50
+ '`canFavourite` is true (sets `aria-label` and shows a tooltip on hover/focus). The favourite `<button>` is a',
51
+ 'sibling of the link (not inside the `<a>`), with `aria-pressed` reflecting state. Persistence is the',
52
+ 'consumer\'s responsibility.',
53
+ '',
54
+ 'The panel toggle (`SidebarNav.Trigger`) always shows tooltip **Show/hide sub navigation** (override via `tooltip` prop).',
55
+ '',
56
+ '### `renderLink`',
57
+ '',
58
+ 'Provide `renderLink` at the root to integrate with your router. Panel items also support `linkElement="button"`',
59
+ 'with `linkElementProps` for SPA actions without a URL. Data-driven items accept `href` and/or `onClick`.',
60
+ 'Top-level `onClick` takes precedence over `linkElementProps.onClick` when both are set.',
61
+ 'When `renderLink` is set, both `linkProps` and `linkElementProps` are forwarded in the args — spread them onto your router link (same order as the default `<a>`: `linkProps` then `linkElementProps`).',
62
+ 'Also spread `ariaLabel`, `ariaCurrent`, and `onClick` from the args as appropriate.',
63
+ '',
64
+ 'Pass `railItems={[]}` to render an intentionally empty data-driven rail. Omit `railItems` to compose the rail with JSX children.',
65
+ '',
66
+ 'For data-driven rail items, pass `iconColor` as a design-token CSS value (e.g. `var(--icons-icon-default)` or `var(--color-semantic-warning-600)`), not hardcoded hex.',
67
+ '',
68
+ 'The root provider passes shared state (panel open/closed, `renderLink`) to rail and panel subcomponents.',
69
+ '',
70
+ '---',
71
+ '',
72
+ '### Test IDs',
73
+ '',
74
+ '| Element | `data-testid` |',
75
+ '|---|---|',
76
+ '| Root | `sidebar-nav` |',
77
+ '| Rail | `sidebar-nav-rail` |',
78
+ '| Panel / trigger | `sidebar-nav-panel`, `sidebar-nav-panel-trigger`, `sidebar-nav-panel-trigger-{id}` |',
79
+ '| Rail item | `sidebar-nav-rail-item-{id}` |',
80
+ '| Rail separator | `sidebar-nav-rail-separator-{id}` |',
81
+ '| Panel item / favourite | `sidebar-nav-panel-item-{itemId}`, `sidebar-nav-panel-item-favourite-{itemId}` — `itemId` is required on composable `SidebarNav.Item` |',
82
+ ].join('\n');
83
+ const RELATED_COMPONENTS = [
84
+ '## Related components',
85
+ '',
86
+ '[Dropdown](?path=/docs/components-dropdown--docs) · [Tooltip](?path=/docs/components-tooltip--docs) ·',
87
+ '[Badge](?path=/docs/components-badge--docs) · [Separator](?path=/docs/components-separator--docs) ·',
88
+ '[IconText](?path=/docs/components-icontext--docs)',
89
+ ].join('\n');
90
+ const PROPS_INTRO = 'The preview below is wired to the **Controls** panel where applicable.';
91
+ function SidebarNavDocsPage() {
92
+ return (_jsxs(_Fragment, { children: [_jsx(Title, {}), _jsx(Subtitle, {}), _jsx(Markdown, { children: DESCRIPTION_INTRO }), _jsx(DocHeading, { children: "Interactive example" }), _jsx(Markdown, { children: PROPS_INTRO }), _jsx(DocPrimary, {}), _jsx(Controls, {}), _jsx(DocHeading, { children: "Usage guidance" }), _jsx(Markdown, { children: USAGE_GUIDANCE }), _jsx(DocHeading, { children: "Developer notes" }), _jsx(Markdown, { children: DEVELOPER_NOTES }), _jsx(DocHeading, { children: "Examples" }), _jsx(Stories, { title: "" }), _jsx(Markdown, { children: RELATED_COMPONENTS })] }));
93
+ }
94
+ const meta = {
95
+ title: 'Components/SidebarNav',
96
+ component: SidebarNav,
97
+ parameters: {
98
+ layout: 'padded',
99
+ docs: {
100
+ page: SidebarNavDocsPage,
101
+ },
102
+ },
103
+ tags: ['autodocs'],
104
+ args: {
105
+ onExpandedChange: fn(),
106
+ },
107
+ argTypes: {
108
+ defaultExpanded: {
109
+ control: 'boolean',
110
+ description: 'Initial panel open state when uncontrolled.',
111
+ table: { defaultValue: { summary: 'true' } },
112
+ },
113
+ children: { control: false },
114
+ railItems: { control: false },
115
+ panelNavItems: { control: false },
116
+ renderLink: { control: false },
117
+ },
118
+ };
119
+ export default meta;
120
+ const withDescription = (story, description) => ({
121
+ ...story,
122
+ parameters: {
123
+ ...story.parameters,
124
+ docs: {
125
+ ...story.parameters?.docs,
126
+ description: { story: description },
127
+ },
128
+ },
129
+ });
130
+ const storyWrapperStyle = { height: 640 };
131
+ const basePanelNavItems = [
132
+ {
133
+ type: 'group',
134
+ id: 'registers',
135
+ label: 'Registers',
136
+ defaultExpanded: true,
137
+ children: [
138
+ { type: 'item', id: 'covid', label: 'Covid-19 Dashboard', href: '/covid' },
139
+ {
140
+ type: 'item',
141
+ id: 'daily',
142
+ label: 'Daily Attendance',
143
+ href: '/daily',
144
+ current: true,
145
+ canFavourite: true,
146
+ isPressed: false,
147
+ favouriteTooltip: 'Add to favourites',
148
+ },
149
+ { type: 'item', id: 'quick', label: 'Quick Follow-Up', href: '/quick' },
150
+ ],
151
+ },
152
+ {
153
+ type: 'group',
154
+ id: 'absentees',
155
+ label: 'Absentees',
156
+ children: [
157
+ { type: 'item', id: 'late', label: 'Latecomers', href: '/latecomers' },
158
+ { type: 'item', id: 'stats', label: 'Statistics', href: '/statistics' },
159
+ ],
160
+ },
161
+ ];
162
+ const figmaRailItems = [
163
+ {
164
+ id: 'burger',
165
+ label: 'Show/hide sub navigation',
166
+ iconName: 'menu',
167
+ opensPanel: true,
168
+ },
169
+ { type: 'separator', id: 'after-burger' },
170
+ { id: 'favourites', label: 'Favourites', iconName: 'favourite-outline', href: '/favourites' },
171
+ {
172
+ id: 'notifications',
173
+ label: 'Notifications',
174
+ iconName: 'message-square-more',
175
+ href: '/notifications',
176
+ badgeContent: _jsx(Badge, { size: "sm", colour: "salmon", children: "6" }),
177
+ },
178
+ { id: 'calendar', label: 'My Calendar', iconName: 'date', href: '/calendar' },
179
+ { type: 'separator', id: 'before-emergency' },
180
+ {
181
+ id: 'emergency',
182
+ label: 'Emergency Alerts',
183
+ iconName: 'triangle-alert',
184
+ href: '/emergency',
185
+ },
186
+ { type: 'separator', id: 'before-help' },
187
+ {
188
+ id: 'help',
189
+ label: 'Help & Learn with Arbor',
190
+ iconName: 'circle-help',
191
+ href: '/help',
192
+ },
193
+ ];
194
+ const SidebarNavShell = ({ children }) => (_jsx("div", { style: storyWrapperStyle, children: children }));
195
+ /** Figma rail: burger → separator → shortcuts → separator → emergency → separator → help. */
196
+ const FigmaRailComposition = () => (_jsxs(_Fragment, { children: [_jsx(SidebarNav.Trigger, { children: _jsx(Icon, { name: "menu", size: 24 }) }), _jsx(SidebarNav.Separator, { id: "after-burger" }), _jsxs(SidebarNav.RailList, { children: [_jsx(SidebarNav.RailItem, { href: "/favourites", "aria-label": "Favourites", children: _jsx(Icon, { name: "favourite-outline", size: 24 }) }), _jsxs(SidebarNav.RailItem, { href: "/notifications", "aria-label": "Notifications", children: [_jsx(Icon, { name: "message-square-more", size: 24 }), _jsx(Badge, { size: "sm", colour: "salmon", children: "6" })] }), _jsx(SidebarNav.RailItem, { href: "/calendar", "aria-label": "My Calendar", children: _jsx(Icon, { name: "date", size: 24 }) })] }), _jsx(SidebarNav.Separator, { id: "before-emergency" }), _jsx(SidebarNav.RailList, { children: _jsx(SidebarNav.RailItem, { href: "/emergency", "aria-label": "Emergency Alerts", children: _jsx(Icon, { name: "triangle-alert", size: 24 }) }) }), _jsx(SidebarNav.Separator, { id: "before-help" }), _jsx(SidebarNav.RailList, { children: _jsx(SidebarNav.RailItem, { href: "/help", "aria-label": "Help & Learn with Arbor", children: _jsx(Icon, { name: "circle-help", size: 24 }) }) })] }));
197
+ const DefaultTemplate = () => (_jsx(SidebarNavShell, { children: _jsxs(SidebarNav, { children: [_jsx(SidebarNav.Rail, { children: _jsx(FigmaRailComposition, {}) }), _jsxs(SidebarNav.Panel, { children: [_jsx(SidebarNav.Title, { children: "Attendance" }), _jsx(SidebarNav.PanelNav, { items: basePanelNavItems })] })] }) }));
198
+ const CollapsedPanelTemplate = () => (_jsx(SidebarNavShell, { children: _jsxs(SidebarNav, { defaultExpanded: false, children: [_jsxs(SidebarNav.Rail, { children: [_jsx(SidebarNav.Trigger, { children: _jsx(Icon, { name: "menu", size: 24 }) }), _jsx(SidebarNav.Separator, { id: "after-burger" }), _jsx(SidebarNav.RailList, { children: _jsx(SidebarNav.RailItem, { href: "/favourites", "aria-label": "Favourites", children: _jsx(Icon, { name: "favourite-outline", size: 24 }) }) })] }), _jsxs(SidebarNav.Panel, { children: [_jsx(SidebarNav.Title, { children: "Attendance" }), _jsx(SidebarNav.PanelNav, { items: [] })] })] }) }));
199
+ const ConfigDrivenTemplate = () => (_jsx(SidebarNavShell, { children: _jsx(SidebarNav, { railItems: figmaRailItems, panelTitle: "Attendance", panelNavItems: basePanelNavItems }) }));
200
+ const WithFavouritesTemplate = () => {
201
+ const [favourites, setFavourites] = useState({ daily: true });
202
+ const toggle = (id) => {
203
+ setFavourites(prev => ({ ...prev, [id]: !prev[id] }));
204
+ };
205
+ return (_jsx(SidebarNavShell, { children: _jsxs(SidebarNav, { children: [_jsxs(SidebarNav.Rail, { children: [_jsx(SidebarNav.Trigger, { children: _jsx(Icon, { name: "menu", size: 24 }) }), _jsx(SidebarNav.Separator, { id: "after-burger" })] }), _jsxs(SidebarNav.Panel, { children: [_jsx(SidebarNav.Title, { children: "Attendance" }), _jsxs(SidebarNav.PanelNav, { children: [_jsx(SidebarNav.Item, { href: "/daily", itemId: "daily", current: true, canFavourite: true, isPressed: Boolean(favourites.daily), favouriteTooltip: favourites.daily ? 'Remove from favourites' : 'Add to favourites', onFavouriteClick: () => toggle('daily'), children: "Daily Attendance" }), _jsx(SidebarNav.Item, { href: "/quick", itemId: "quick", children: "Quick Follow-Up" })] })] })] }) }));
206
+ };
207
+ const ConfigDrivenWithFavouritesTemplate = () => {
208
+ const [favourites, setFavourites] = useState({ daily: true });
209
+ const panelNavItems = useMemo(() => basePanelNavItems.map(node => (node.type === 'group'
210
+ ? {
211
+ ...node,
212
+ children: node.children.map((child) => {
213
+ if (child.id !== 'daily') {
214
+ return child;
215
+ }
216
+ return {
217
+ ...child,
218
+ canFavourite: true,
219
+ isPressed: Boolean(favourites.daily),
220
+ favouriteTooltip: favourites.daily ? 'Remove from favourites' : 'Add to favourites',
221
+ onFavouriteClick: () => setFavourites(prev => ({ ...prev, daily: !prev.daily })),
222
+ };
223
+ }),
224
+ }
225
+ : node)), [favourites.daily]);
226
+ return (_jsx(SidebarNavShell, { children: _jsx(SidebarNav, { railItems: figmaRailItems, panelTitle: "Attendance", panelNavItems: panelNavItems }) }));
227
+ };
228
+ const WithRenderLinkTemplate = () => (_jsx(SidebarNavShell, { children: _jsxs(SidebarNav, { renderLink: ({ href, className, children, ariaCurrent, ariaLabel, onClick, linkProps, linkElementProps, }) => (_jsx("a", { href: href, className: className, "aria-current": ariaCurrent, "aria-label": ariaLabel, "data-router-link": "true", onClick: onClick ?? (e => e.preventDefault()), ...linkProps, ...linkElementProps, children: children })), children: [_jsxs(SidebarNav.Rail, { children: [_jsx(SidebarNav.Trigger, { children: _jsx(Icon, { name: "menu", size: 24 }) }), _jsx(SidebarNav.Separator, { id: "after-burger" })] }), _jsx(SidebarNav.Panel, { children: _jsx(SidebarNav.PanelNav, { items: [{ type: 'item', id: 'home', label: 'Home', href: '/' }] }) })] }) }));
229
+ export const Default = withDescription({
230
+ render: DefaultTemplate,
231
+ parameters: { controls: { disable: true } },
232
+ }, 'Composed rail: `Trigger`, separators between `RailList` sections (favourites/notifications/calendar, emergency, help). Panel uses `Trigger` ↔ `Panel` via context (`aria-controls` / `aria-expanded`).');
233
+ export const CollapsedPanel = withDescription({
234
+ render: CollapsedPanelTemplate,
235
+ parameters: { controls: { disable: true } },
236
+ }, 'Panel hidden by default (`defaultExpanded={false}`). Use the burger trigger to open the panel.');
237
+ export const ConfigDriven = withDescription({
238
+ render: ConfigDrivenTemplate,
239
+ parameters: { controls: { disable: true } },
240
+ }, 'Same Figma rail order via `railItems` (burger, `{ type: \'separator\' }` entries, then icons). Compare with **Default** for the composed `RailList` + `Separator` pattern.');
241
+ export const WithFavourites = withDescription({
242
+ render: WithFavouritesTemplate,
243
+ parameters: { controls: { disable: true } },
244
+ }, 'Composable panel items with `canFavourite`, `isPressed`, and `onFavouriteClick`. State is mocked in the story — wire to your store or API in MIS.');
245
+ export const ConfigDrivenWithFavourites = withDescription({
246
+ render: ConfigDrivenWithFavouritesTemplate,
247
+ parameters: { controls: { disable: true } },
248
+ }, 'Config-driven rail (`figmaRailItems`) and `panelNavItems` with favourite props merged from local state.');
249
+ export const WithRenderLink = withDescription({
250
+ render: WithRenderLinkTemplate,
251
+ parameters: { controls: { disable: true } },
252
+ }, 'Root `renderLink` replaces default `<a>` elements for router integration.');
253
+ //# sourceMappingURL=SidebarNav.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarNav.stories.js","sourceRoot":"","sources":["../../../src/components/sidebarNav/SidebarNav.stories.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import '@testing-library/jest-dom/vitest';
2
+ //# sourceMappingURL=SidebarNav.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarNav.test.d.ts","sourceRoot":"","sources":["../../../src/components/sidebarNav/SidebarNav.test.tsx"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAC"}