@exxatdesignux/ui 0.3.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 (214) hide show
  1. package/CHANGELOG.md +701 -6
  2. package/README.md +138 -0
  3. package/bin/init.mjs +134 -31
  4. package/consumer-extras/cursor-rules/exxat-board-cards.mdc +1 -1
  5. package/consumer-extras/cursor-rules/exxat-centralized-list-dataset.mdc +2 -2
  6. package/consumer-extras/cursor-rules/exxat-collaboration-access.mdc +1 -1
  7. package/consumer-extras/cursor-rules/exxat-data-tables.mdc +2 -0
  8. package/consumer-extras/cursor-rules/exxat-dedicated-search-surfaces.mdc +1 -1
  9. package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +3 -3
  10. package/consumer-extras/cursor-rules/exxat-library-hub-header.mdc +28 -0
  11. package/consumer-extras/cursor-rules/exxat-mono-ids.mdc +1 -1
  12. package/consumer-extras/cursor-rules/exxat-person-identity-display.mdc +1 -1
  13. package/consumer-extras/cursor-rules/exxat-primary-nav-secondary-panel.mdc +6 -6
  14. package/consumer-extras/cursor-rules/exxat-reuse-before-custom.mdc +1 -1
  15. package/consumer-extras/cursor-skills/exxat-board-cards/SKILL.md +2 -2
  16. package/consumer-extras/cursor-skills/exxat-centralized-list-dataset/SKILL.md +1 -1
  17. package/consumer-extras/cursor-skills/exxat-collaboration-access/SKILL.md +3 -3
  18. package/consumer-extras/cursor-skills/exxat-dedicated-search-surfaces/SKILL.md +2 -2
  19. package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +7 -7
  20. package/consumer-extras/cursor-skills/exxat-kpi-flat-band/SKILL.md +1 -1
  21. package/consumer-extras/cursor-skills/exxat-list-page-view-shells/SKILL.md +1 -1
  22. package/consumer-extras/cursor-skills/exxat-mono-ids/SKILL.md +4 -4
  23. package/consumer-extras/cursor-skills/exxat-primary-nav-secondary-panel/SKILL.md +8 -8
  24. package/consumer-extras/cursor-skills/exxat-token-economy/SKILL.md +277 -0
  25. package/consumer-extras/handbook/HANDBOOK.md +2 -0
  26. package/consumer-extras/handbook/glossary.md +2 -1
  27. package/consumer-extras/handbook/reference-implementations.md +31 -4
  28. package/consumer-extras/patterns/collaboration-access-pattern.md +7 -7
  29. package/consumer-extras/patterns/data-views-pattern.md +18 -16
  30. package/consumer-extras/patterns/kpi-flat-band-pattern.md +2 -2
  31. package/dist/components/data-table/index.js +2 -2
  32. package/dist/components/data-table/index.js.map +1 -1
  33. package/dist/components/data-table/pagination.js +3 -3
  34. package/dist/components/data-table/pagination.js.map +1 -1
  35. package/dist/components/data-table/use-table-state.d.ts +1 -1
  36. package/dist/components/data-table/use-table-state.js.map +1 -1
  37. package/dist/components/data-views/data-row-list.js.map +1 -1
  38. package/dist/components/data-views/finder-panel-view.d.ts +1 -1
  39. package/dist/components/data-views/finder-panel-view.js.map +1 -1
  40. package/dist/components/data-views/hub-table.d.ts +9 -3
  41. package/dist/components/data-views/hub-table.js +262 -40
  42. package/dist/components/data-views/hub-table.js.map +1 -1
  43. package/dist/components/data-views/index.js +262 -40
  44. package/dist/components/data-views/index.js.map +1 -1
  45. package/dist/components/data-views/list-page-split-hub-tokens.d.ts +2 -2
  46. package/dist/components/data-views/list-page-split-hub-tokens.js.map +1 -1
  47. package/dist/components/data-views/list-page-tree-column-header.d.ts +1 -1
  48. package/dist/components/data-views/list-page-tree-column-header.js.map +1 -1
  49. package/dist/components/data-views/list-page-tree-panel-shell.js.map +1 -1
  50. package/dist/components/data-views/os-folder-glyph.d.ts +1 -1
  51. package/dist/components/data-views/os-folder-glyph.js.map +1 -1
  52. package/dist/components/ui/avatar.d.ts +1 -1
  53. package/dist/components/ui/key-metrics.js.map +1 -1
  54. package/dist/index.js +136 -39
  55. package/dist/index.js.map +1 -1
  56. package/package.json +3 -2
  57. package/src/components/data-table/index.tsx +2 -2
  58. package/src/components/data-table/pagination.tsx +5 -1
  59. package/src/components/data-table/use-table-state.ts +1 -1
  60. package/src/components/data-views/data-row-list.tsx +1 -1
  61. package/src/components/data-views/finder-panel-view.tsx +2 -2
  62. package/src/components/data-views/hub-table.tsx +149 -41
  63. package/src/components/data-views/list-page-split-hub-tokens.ts +2 -2
  64. package/src/components/data-views/list-page-tree-column-header.tsx +1 -1
  65. package/src/components/data-views/os-folder-glyph.tsx +1 -1
  66. package/src/components/ui/key-metrics.tsx +1 -1
  67. package/template/.claude/skills/exxat-ds-skill/SKILL.md +8 -7
  68. package/template/.cursor/rules/exxat-accessibility.mdc +1 -1
  69. package/template/.cursor/rules/exxat-command-menu.mdc +1 -1
  70. package/template/.cursor/rules/exxat-dashboard-view-charts.mdc +6 -6
  71. package/template/.cursor/rules/exxat-data-tables.mdc +3 -3
  72. package/template/.cursor/rules/exxat-kbd-shortcuts.mdc +5 -5
  73. package/template/.cursor/rules/exxat-mono-ids.mdc +1 -1
  74. package/template/.cursor/rules/exxat-page-vs-drawer.mdc +1 -1
  75. package/template/.cursor/rules/exxat-table-properties-drawer.mdc +1 -1
  76. package/template/AGENTS.md +43 -37
  77. package/template/app/(app)/columns/page.tsx +11 -0
  78. package/template/app/(app)/library/all/page.tsx +11 -0
  79. package/template/app/(app)/library/find/page.tsx +12 -0
  80. package/template/app/(app)/{question-bank → library}/layout.tsx +16 -16
  81. package/template/app/(app)/library/list/page.tsx +12 -0
  82. package/template/app/(app)/{question-bank → library}/new/page.tsx +10 -10
  83. package/template/app/(app)/library/page.tsx +11 -0
  84. package/template/app/(app)/tokens-themes/page.tsx +11 -0
  85. package/template/components/ask-leo-composer.tsx +2 -2
  86. package/template/components/columns-client.tsx +158 -0
  87. package/template/components/columns-showcase.tsx +541 -0
  88. package/template/components/data-views/index.ts +32 -6
  89. package/template/components/data-views/{question-bank-folder-tree-branch.tsx → library-folder-tree-branch.tsx} +19 -19
  90. package/template/components/data-views/table-cells.tsx +673 -0
  91. package/template/components/folder-details-shell.tsx +11 -11
  92. package/template/components/hub-tree-panel-view.tsx +24 -24
  93. package/template/components/{question-bank-board-view.tsx → library-board-view.tsx} +44 -44
  94. package/template/components/{question-bank-client.tsx → library-client.tsx} +82 -82
  95. package/template/components/{question-bank-dashboard-charts.tsx → library-dashboard-charts.tsx} +14 -14
  96. package/template/components/{question-bank-favorite-button.tsx → library-favorite-button.tsx} +7 -7
  97. package/template/components/{question-bank-hub-client.tsx → library-hub-client.tsx} +43 -43
  98. package/template/components/{question-bank-new-folder-sheet.tsx → library-new-folder-sheet.tsx} +14 -14
  99. package/template/components/{question-bank-os-folder-view.tsx → library-os-folder-view.tsx} +31 -31
  100. package/template/components/{question-bank-page-header.tsx → library-page-header.tsx} +6 -6
  101. package/template/components/library-panel-activator.tsx +8 -0
  102. package/template/components/{question-bank-secondary-nav.tsx → library-secondary-nav.tsx} +60 -60
  103. package/template/components/{question-bank-table.tsx → library-table.tsx} +97 -97
  104. package/template/components/list-hub-status-badge.tsx +2 -2
  105. package/template/components/{new-question-composer.tsx → new-library-item-form.tsx} +37 -37
  106. package/template/components/sidebar/app-sidebar.tsx +61 -5
  107. package/template/components/sidebar/secondary-panel.tsx +109 -56
  108. package/template/components/sidebar/sidebar-auto-collapse.tsx +2 -2
  109. package/template/components/sidebar/sidebar-auto-open.tsx +2 -1
  110. package/template/components/table-properties/types.ts +1 -1
  111. package/template/components/templates/discovery-hub-template.tsx +1 -1
  112. package/template/components/templates/new-focus-template.tsx +2 -2
  113. package/template/components/templates/secondary-panel-hub-template.tsx +1 -1
  114. package/template/components/tokens-secondary-nav.tsx +192 -0
  115. package/template/components/tokens-themes-client.tsx +476 -0
  116. package/template/components/tokens-themes-section.tsx +386 -0
  117. package/template/docs/HANDBOOK.md +187 -0
  118. package/template/docs/blueprints/README.md +1 -1
  119. package/template/docs/blueprints/board-card.md +1 -1
  120. package/template/docs/blueprints/data-table.md +2 -2
  121. package/template/docs/blueprints/list-page-template.md +3 -3
  122. package/template/docs/blueprints/page-header.md +4 -4
  123. package/template/docs/collaboration-access-pattern.md +7 -7
  124. package/template/docs/component-selection-guide.md +1 -1
  125. package/template/docs/data-views-pattern.md +18 -16
  126. package/template/docs/glossary.md +58 -0
  127. package/template/docs/kpi-flat-band-pattern.md +3 -3
  128. package/template/docs/kpi-trend-pattern.md +18 -3
  129. package/template/docs/large-dataset-strategy.md +155 -0
  130. package/template/docs/library-hub-header-pattern.md +25 -0
  131. package/template/docs/migrations/_template.md +1 -1
  132. package/template/docs/reference-implementations.md +151 -0
  133. package/template/docs/token-taxonomy.md +1 -1
  134. package/template/docs/voice-and-tone.md +262 -0
  135. package/template/eslint.config.mjs +9 -39
  136. package/template/hooks/use-secondary-panel-hub-nav.ts +10 -10
  137. package/template/lib/ask-leo-route-context.ts +6 -18
  138. package/template/lib/coach-mark-registry.ts +0 -16
  139. package/template/lib/command-menu-config.ts +5 -12
  140. package/template/lib/command-menu-search-data.ts +8 -39
  141. package/template/lib/{question-bank-authoring.ts → library-authoring.ts} +89 -88
  142. package/template/lib/library-dedicated-search.ts +19 -0
  143. package/template/lib/library-hub-search.ts +90 -0
  144. package/template/lib/library-nav.ts +477 -0
  145. package/template/lib/library-recent-searches.ts +22 -0
  146. package/template/lib/{placements-supported-views.ts → library-supported-views.ts} +2 -2
  147. package/template/lib/list-status-badges.ts +16 -104
  148. package/template/lib/mock/dashboard.ts +1 -1
  149. package/template/lib/mock/{question-bank-folders.ts → library-folders.ts} +30 -30
  150. package/template/lib/mock/library-header-collaborators.ts +54 -0
  151. package/template/lib/mock/{question-bank-inspector.ts → library-inspector.ts} +29 -29
  152. package/template/lib/mock/{question-bank-kpi.ts → library-kpi.ts} +20 -20
  153. package/template/lib/mock/library.ts +249 -0
  154. package/template/lib/mock/navigation.tsx +32 -26
  155. package/template/lib/table-state-lifecycle.ts +1 -1
  156. package/template/next.config.mjs +7 -4
  157. package/template/package.json +0 -1
  158. package/tokens/hooks-index.json +2874 -0
  159. package/consumer-extras/cursor-rules/exxat-question-bank-hub-header.mdc +0 -28
  160. package/template/app/(app)/examples/page.tsx +0 -41
  161. package/template/app/(app)/question-bank/find/page.tsx +0 -12
  162. package/template/app/(app)/question-bank/library/page.tsx +0 -11
  163. package/template/app/(app)/question-bank/list/page.tsx +0 -12
  164. package/template/app/(app)/question-bank/page.tsx +0 -11
  165. package/template/components/compliance-board-view.tsx +0 -142
  166. package/template/components/compliance-client.tsx +0 -92
  167. package/template/components/compliance-page-header.tsx +0 -89
  168. package/template/components/compliance-table.tsx +0 -468
  169. package/template/components/data-view-dashboard-charts-compliance.tsx +0 -963
  170. package/template/components/data-view-dashboard-charts-team.tsx +0 -971
  171. package/template/components/data-view-dashboard-charts.tsx +0 -1503
  172. package/template/components/new-placement-back-btn.tsx +0 -28
  173. package/template/components/new-placement-form.tsx +0 -942
  174. package/template/components/placement-board-card.tsx +0 -250
  175. package/template/components/placement-detail.tsx +0 -438
  176. package/template/components/placements-board-view.tsx +0 -397
  177. package/template/components/placements-client.tsx +0 -220
  178. package/template/components/placements-list-view.tsx +0 -124
  179. package/template/components/placements-page-header.tsx +0 -166
  180. package/template/components/placements-table-cells.test.tsx +0 -22
  181. package/template/components/placements-table-cells.tsx +0 -173
  182. package/template/components/placements-table-columns.tsx +0 -210
  183. package/template/components/placements-table.tsx +0 -934
  184. package/template/components/question-bank-panel-activator.tsx +0 -8
  185. package/template/components/rotations-empty-state.tsx +0 -50
  186. package/template/components/rotations-panel-activator.tsx +0 -8
  187. package/template/components/sites-board-view.tsx +0 -67
  188. package/template/components/sites-client.tsx +0 -154
  189. package/template/components/sites-table.tsx +0 -249
  190. package/template/components/team-board-view.tsx +0 -122
  191. package/template/components/team-client.tsx +0 -100
  192. package/template/components/team-page-header.tsx +0 -92
  193. package/template/components/team-table.tsx +0 -553
  194. package/template/docs/question-bank-hub-header-pattern.md +0 -25
  195. package/template/lib/compliance-supported-views.ts +0 -10
  196. package/template/lib/data-view-dashboard-placements-layout.ts +0 -215
  197. package/template/lib/mock/compliance-kpi.ts +0 -61
  198. package/template/lib/mock/compliance.ts +0 -146
  199. package/template/lib/mock/placements-kpi.ts +0 -134
  200. package/template/lib/mock/placements.ts +0 -176
  201. package/template/lib/mock/question-bank-header-collaborators.ts +0 -54
  202. package/template/lib/mock/question-bank.ts +0 -249
  203. package/template/lib/mock/sites-directory.ts +0 -16
  204. package/template/lib/mock/sites-kpi.ts +0 -25
  205. package/template/lib/mock/team-kpi.ts +0 -60
  206. package/template/lib/mock/team.ts +0 -118
  207. package/template/lib/placement-board-card-layout.ts +0 -79
  208. package/template/lib/question-bank-dedicated-search.ts +0 -19
  209. package/template/lib/question-bank-hub-search.ts +0 -90
  210. package/template/lib/question-bank-nav.ts +0 -477
  211. package/template/lib/question-bank-recent-searches.ts +0 -22
  212. package/template/lib/question-bank-supported-views.ts +0 -12
  213. package/template/lib/sites-supported-views.ts +0 -10
  214. package/template/lib/team-supported-views.ts +0 -10
@@ -1,8 +1,8 @@
1
1
  "use client"
2
2
 
3
3
  /**
4
- * Question bank secondary sidebar — All / My / folder tree (Font Awesome only).
5
- * Scope syncs to the main hub via `?scope=` + optional `folderId=` (`lib/question-bank-nav.ts`).
4
+ * Library secondary sidebar — All / My / folder tree (Font Awesome only).
5
+ * Scope syncs to the main hub via `?scope=` + optional `folderId=` (`lib/library-nav.ts`).
6
6
  */
7
7
 
8
8
  import * as React from "react"
@@ -27,18 +27,18 @@ import {
27
27
  import { Kbd, KbdGroup } from "@/components/ui/kbd"
28
28
  import { Tip } from "@/components/ui/tip"
29
29
  import { cn } from "@/lib/utils"
30
- import type { QuestionBankFolder } from "@/lib/mock/question-bank-folders"
31
- import { DEFAULT_QUESTION_BANK_FOLDERS, newFolderId, collectFolderDescendantIds } from "@/lib/mock/question-bank-folders"
30
+ import type { LibraryFolder } from "@/lib/mock/library-folders"
31
+ import { DEFAULT_LIBRARY_FOLDERS, newFolderId, collectFolderDescendantIds } from "@/lib/mock/library-folders"
32
32
  import { useSecondaryPanel } from "@/components/sidebar"
33
- import { QuestionBankNewFolderSheet } from "@/components/question-bank-new-folder-sheet"
33
+ import { LibraryNewFolderSheet } from "@/components/library-new-folder-sheet"
34
34
  import {
35
- isQuestionBankNavActive,
36
- parseQuestionBankNav,
37
- QUESTION_BANK_FAVORITES_FOLDER_ID,
38
- questionBankFavoritesFolderHref,
39
- questionBankHubScopeHref,
40
- } from "@/lib/question-bank-nav"
41
- import { QuestionBankFolderTreeBranch } from "@/components/data-views/question-bank-folder-tree-branch"
35
+ isLibraryNavActive,
36
+ parseLibraryNav,
37
+ LIBRARY_FAVORITES_FOLDER_ID,
38
+ libraryFavoritesFolderHref,
39
+ libraryHubScopeHref,
40
+ } from "@/lib/library-nav"
41
+ import { LibraryFolderTreeBranch } from "@/components/data-views/library-folder-tree-branch"
42
42
 
43
43
  function NavRow({
44
44
  href,
@@ -119,31 +119,31 @@ function IconNavRow({
119
119
  )
120
120
  }
121
121
 
122
- export function QuestionBankSecondaryNav() {
122
+ export function LibrarySecondaryNav() {
123
123
  const pathname = usePathname()
124
124
  const router = useRouter()
125
125
  const searchParams = useSearchParams()
126
126
  const searchParamsKey = searchParams.toString()
127
- const { openPanel, questionBankFolderBridge, questionBankAccessBridge, secondaryPanelCompact } =
127
+ const { openPanel, libraryFolderBridge, libraryAccessBridge, secondaryPanelCompact } =
128
128
  useSecondaryPanel()
129
129
  const [newFolderOpen, setNewFolderOpen] = React.useState(false)
130
130
  const [newFolderParentId, setNewFolderParentId] = React.useState<string | null>(null)
131
- const [customizingFolder, setCustomizingFolder] = React.useState<QuestionBankFolder | null>(null)
132
- const [deleteFolder, setDeleteFolder] = React.useState<QuestionBankFolder | null>(null)
131
+ const [customizingFolder, setCustomizingFolder] = React.useState<LibraryFolder | null>(null)
132
+ const [deleteFolder, setDeleteFolder] = React.useState<LibraryFolder | null>(null)
133
133
  const nav = React.useMemo(
134
- () => parseQuestionBankNav(new URLSearchParams(searchParamsKey)),
134
+ () => parseLibraryNav(new URLSearchParams(searchParamsKey)),
135
135
  [searchParamsKey],
136
136
  )
137
137
 
138
- const folders = questionBankFolderBridge?.folders ?? DEFAULT_QUESTION_BANK_FOLDERS
139
- const canManageFolders = questionBankFolderBridge != null
140
- const canManageAccess = questionBankAccessBridge != null
138
+ const folders = libraryFolderBridge?.folders ?? DEFAULT_LIBRARY_FOLDERS
139
+ const canManageFolders = libraryFolderBridge != null
140
+ const canManageAccess = libraryAccessBridge != null
141
141
 
142
142
  /** Favorites is a primary nav row (with All / My), not under “Folders”. */
143
143
  const folderTreeRoots = React.useMemo(
144
144
  () =>
145
145
  folders
146
- .filter(f => f.parentId === null && f.id !== QUESTION_BANK_FAVORITES_FOLDER_ID)
146
+ .filter(f => f.parentId === null && f.id !== LIBRARY_FAVORITES_FOLDER_ID)
147
147
  .sort((a, b) => a.name.localeCompare(b.name)),
148
148
  [folders],
149
149
  )
@@ -160,22 +160,22 @@ export function QuestionBankSecondaryNav() {
160
160
  setNewFolderOpen(true)
161
161
  }, [])
162
162
 
163
- const openCustomizeFolder = React.useCallback((folder: QuestionBankFolder) => {
163
+ const openCustomizeFolder = React.useCallback((folder: LibraryFolder) => {
164
164
  setCustomizingFolder(folder)
165
165
  setNewFolderParentId(folder.parentId)
166
166
  setNewFolderOpen(true)
167
167
  }, [])
168
168
 
169
169
  const openManageAccess = React.useCallback(() => {
170
- questionBankAccessBridge?.openManageAccess()
171
- }, [questionBankAccessBridge])
170
+ libraryAccessBridge?.openManageAccess()
171
+ }, [libraryAccessBridge])
172
172
 
173
- const openDeleteFolder = React.useCallback((folder: QuestionBankFolder) => {
173
+ const openDeleteFolder = React.useCallback((folder: LibraryFolder) => {
174
174
  setDeleteFolder(folder)
175
175
  }, [])
176
176
 
177
177
  const commitDeleteFolder = React.useCallback(() => {
178
- if (!deleteFolder || !questionBankFolderBridge) return
178
+ if (!deleteFolder || !libraryFolderBridge) return
179
179
  const victim = deleteFolder
180
180
  const parent = victim.parentId
181
181
  const desc = collectFolderDescendantIds(folders, victim.id)
@@ -189,14 +189,14 @@ export function QuestionBankSecondaryNav() {
189
189
  const reassignTarget =
190
190
  parentStillExists ? parent : (fallbackRoot ?? remaining[0]!.id)
191
191
 
192
- questionBankFolderBridge.onFoldersChange(remaining)
193
- questionBankFolderBridge.onItemsChange(prev =>
192
+ libraryFolderBridge.onFoldersChange(remaining)
193
+ libraryFolderBridge.onItemsChange(prev =>
194
194
  prev.map(item => (desc.has(item.folderId) ? { ...item, folderId: reassignTarget } : item)),
195
195
  )
196
196
 
197
197
  if (nav.scope === "folder" && nav.folderId && desc.has(nav.folderId)) {
198
198
  router.replace(
199
- questionBankHubScopeHref(
199
+ libraryHubScopeHref(
200
200
  pathname,
201
201
  new URLSearchParams(searchParamsKey),
202
202
  parentStillExists
@@ -207,13 +207,13 @@ export function QuestionBankSecondaryNav() {
207
207
  }
208
208
 
209
209
  setDeleteFolder(null)
210
- }, [deleteFolder, folders, nav.folderId, nav.scope, pathname, questionBankFolderBridge, router, searchParamsKey])
210
+ }, [deleteFolder, folders, nav.folderId, nav.scope, pathname, libraryFolderBridge, router, searchParamsKey])
211
211
 
212
212
  const sheetParentId = customizingFolder?.parentId ?? newFolderParentId
213
213
 
214
214
  const flattenedFolderLinks = React.useMemo(() => {
215
- const out: QuestionBankFolder[] = []
216
- const walk = (folder: QuestionBankFolder) => {
215
+ const out: LibraryFolder[] = []
216
+ const walk = (folder: LibraryFolder) => {
217
217
  out.push(folder)
218
218
  folders
219
219
  .filter(c => c.parentId === folder.id)
@@ -226,7 +226,7 @@ export function QuestionBankSecondaryNav() {
226
226
 
227
227
  const hubNavModals = (
228
228
  <>
229
- <QuestionBankNewFolderSheet
229
+ <LibraryNewFolderSheet
230
230
  open={newFolderOpen}
231
231
  onOpenChange={open => {
232
232
  setNewFolderOpen(open)
@@ -242,11 +242,11 @@ export function QuestionBankSecondaryNav() {
242
242
  ? "Update the folder name, color, and icon shown in the navigation and folder views."
243
243
  : sheetParentId
244
244
  ? "The folder is created inside the folder selected in the navigation."
245
- : "Add a top-level folder to the question bank."
245
+ : "Add a top-level folder to the library."
246
246
  }
247
247
  onCreated={folder => {
248
248
  if (customizingFolder) {
249
- questionBankFolderBridge?.onFoldersChange(prev =>
249
+ libraryFolderBridge?.onFoldersChange(prev =>
250
250
  prev.map(item =>
251
251
  item.id === customizingFolder.id
252
252
  ? {
@@ -259,7 +259,7 @@ export function QuestionBankSecondaryNav() {
259
259
  ),
260
260
  )
261
261
  } else {
262
- questionBankFolderBridge?.onFoldersChange(prev => [...prev, { ...folder, id: newFolderId() }])
262
+ libraryFolderBridge?.onFoldersChange(prev => [...prev, { ...folder, id: newFolderId() }])
263
263
  }
264
264
  setNewFolderOpen(false)
265
265
  setCustomizingFolder(null)
@@ -299,7 +299,7 @@ export function QuestionBankSecondaryNav() {
299
299
  if (secondaryPanelCompact) {
300
300
  return (
301
301
  <>
302
- <nav className="flex min-h-0 flex-1 flex-col" role="navigation" aria-label="Question bank">
302
+ <nav className="flex min-h-0 flex-1 flex-col" role="navigation" aria-label="Library">
303
303
  <div className="flex flex-col items-center border-b border-sidebar-border/60 px-1 py-2">
304
304
  <Tip label="Show labels" side="right">
305
305
  <Button
@@ -308,7 +308,7 @@ export function QuestionBankSecondaryNav() {
308
308
  variant="ghost"
309
309
  className="size-9 shrink-0"
310
310
  aria-label="Show labels"
311
- onClick={() => openPanel("question-bank")}
311
+ onClick={() => openPanel("library")}
312
312
  >
313
313
  <i className="fa-light fa-angles-right text-[15px]" aria-hidden="true" />
314
314
  </Button>
@@ -316,25 +316,25 @@ export function QuestionBankSecondaryNav() {
316
316
  </div>
317
317
  <ul className="flex flex-1 flex-col items-center gap-1 overflow-y-auto px-1 py-2" role="list">
318
318
  <IconNavRow
319
- href={questionBankHubScopeHref(pathname, searchParams, { scope: "all" })}
320
- active={isQuestionBankNavActive(pathname, nav, "all")}
319
+ href={libraryHubScopeHref(pathname, searchParams, { scope: "all" })}
320
+ active={isLibraryNavActive(pathname, nav, "all")}
321
321
  iconClass="fa-table-list"
322
322
  label="All questions"
323
- onClick={() => openPanel("question-bank")}
323
+ onClick={() => openPanel("library")}
324
324
  />
325
325
  <IconNavRow
326
- href={questionBankHubScopeHref(pathname, searchParams, { scope: "my" })}
327
- active={isQuestionBankNavActive(pathname, nav, "my")}
326
+ href={libraryHubScopeHref(pathname, searchParams, { scope: "my" })}
327
+ active={isLibraryNavActive(pathname, nav, "my")}
328
328
  iconClass="fa-user"
329
329
  label="My questions"
330
- onClick={() => openPanel("question-bank")}
330
+ onClick={() => openPanel("library")}
331
331
  />
332
332
  <IconNavRow
333
- href={questionBankFavoritesFolderHref(pathname, searchParams)}
334
- active={isQuestionBankNavActive(pathname, nav, "folder", QUESTION_BANK_FAVORITES_FOLDER_ID)}
333
+ href={libraryFavoritesFolderHref(pathname, searchParams)}
334
+ active={isLibraryNavActive(pathname, nav, "folder", LIBRARY_FAVORITES_FOLDER_ID)}
335
335
  iconClass="fa-star"
336
336
  label="Favorites"
337
- onClick={() => openPanel("question-bank")}
337
+ onClick={() => openPanel("library")}
338
338
  />
339
339
  <li className="flex w-full justify-center pt-1" role="none">
340
340
  <DropdownMenu>
@@ -354,18 +354,18 @@ export function QuestionBankSecondaryNav() {
354
354
  <div className="px-2 py-1.5 text-xs text-muted-foreground">No folders</div>
355
355
  ) : (
356
356
  flattenedFolderLinks.map(folder => {
357
- const href = questionBankHubScopeHref(pathname, searchParams, {
357
+ const href = libraryHubScopeHref(pathname, searchParams, {
358
358
  scope: "folder",
359
359
  folderId: folder.id,
360
360
  })
361
- const active = isQuestionBankNavActive(pathname, nav, "folder", folder.id)
361
+ const active = isLibraryNavActive(pathname, nav, "folder", folder.id)
362
362
  return (
363
363
  <DropdownMenuItem key={folder.id} asChild>
364
364
  <Link
365
365
  href={href}
366
366
  scroll={false}
367
367
  className={cn(active && "bg-accent")}
368
- onClick={() => openPanel("question-bank")}
368
+ onClick={() => openPanel("library")}
369
369
  >
370
370
  {folder.name}
371
371
  </Link>
@@ -401,27 +401,27 @@ export function QuestionBankSecondaryNav() {
401
401
 
402
402
  return (
403
403
  <>
404
- <div className="min-h-0 flex-1 overflow-y-auto px-3 pb-4" role="navigation" aria-label="Question bank">
404
+ <div className="min-h-0 flex-1 overflow-y-auto px-3 pb-4" role="navigation" aria-label="Library">
405
405
  <ul className="space-y-0.5" role="list">
406
406
  <NavRow
407
- href={questionBankHubScopeHref(pathname, searchParams, { scope: "all" })}
408
- active={isQuestionBankNavActive(pathname, nav, "all")}
407
+ href={libraryHubScopeHref(pathname, searchParams, { scope: "all" })}
408
+ active={isLibraryNavActive(pathname, nav, "all")}
409
409
  iconClass="fa-table-list"
410
410
  label="All questions"
411
- onClick={() => openPanel("question-bank")}
411
+ onClick={() => openPanel("library")}
412
412
  />
413
413
  <NavRow
414
- href={questionBankHubScopeHref(pathname, searchParams, { scope: "my" })}
415
- active={isQuestionBankNavActive(pathname, nav, "my")}
414
+ href={libraryHubScopeHref(pathname, searchParams, { scope: "my" })}
415
+ active={isLibraryNavActive(pathname, nav, "my")}
416
416
  iconClass="fa-user"
417
417
  label="My questions"
418
418
  />
419
419
  <NavRow
420
- href={questionBankFavoritesFolderHref(pathname, searchParams)}
421
- active={isQuestionBankNavActive(pathname, nav, "folder", QUESTION_BANK_FAVORITES_FOLDER_ID)}
420
+ href={libraryFavoritesFolderHref(pathname, searchParams)}
421
+ active={isLibraryNavActive(pathname, nav, "folder", LIBRARY_FAVORITES_FOLDER_ID)}
422
422
  iconClass="fa-star"
423
423
  label="Favorites"
424
- onClick={() => openPanel("question-bank")}
424
+ onClick={() => openPanel("library")}
425
425
  />
426
426
  <li role="presentation" className="select-none">
427
427
  <div className="flex items-center justify-between gap-2 px-2 pt-3 pb-1">
@@ -445,7 +445,7 @@ export function QuestionBankSecondaryNav() {
445
445
  </li>
446
446
  {folderTreeRoots.map(folder => (
447
447
  <li key={folder.id} className="min-w-0 w-full list-none">
448
- <QuestionBankFolderTreeBranch
448
+ <LibraryFolderTreeBranch
449
449
  folder={folder}
450
450
  folders={folders}
451
451
  pathname={pathname}