@nqlib/nqui 0.3.2 → 0.4.0

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 (475) hide show
  1. package/README.md +26 -3
  2. package/dist/button-CYFTFDKe.cjs +1 -0
  3. package/dist/button-nJvDl3w8.js +44 -0
  4. package/dist/calendar.cjs.js +1 -0
  5. package/dist/calendar.es.js +6 -0
  6. package/dist/carousel-DEyyJi49.js +179 -0
  7. package/dist/carousel-Dhhz8m5V.cjs +1 -0
  8. package/dist/carousel.cjs.js +1 -0
  9. package/dist/carousel.es.js +8 -0
  10. package/dist/command-palette-UHk8zZOg.cjs +45 -0
  11. package/dist/command-palette-d-TrdBsM.js +1778 -0
  12. package/dist/command.cjs.js +1 -0
  13. package/dist/command.es.js +13 -0
  14. package/dist/components/custom/color-picker.d.ts.map +1 -1
  15. package/dist/components/custom/command-palette.d.ts.map +1 -1
  16. package/dist/components/custom/enhanced-checkbox.d.ts +1 -1
  17. package/dist/components/custom/enhanced-checkbox.d.ts.map +1 -1
  18. package/dist/components/custom/enhanced-combobox.d.ts +1 -1
  19. package/dist/components/custom/enhanced-combobox.d.ts.map +1 -1
  20. package/dist/components/custom/enhanced-radio-group.d.ts.map +1 -1
  21. package/dist/components/custom/enhanced-scroll-area.d.ts +12 -0
  22. package/dist/components/custom/enhanced-scroll-area.d.ts.map +1 -1
  23. package/dist/components/custom/enhanced-tabs.d.ts.map +1 -1
  24. package/dist/components/debug/debug-panel.d.ts.map +1 -1
  25. package/dist/components/debug/magnifier.d.ts.map +1 -1
  26. package/dist/components/debug/ui-tester.d.ts.map +1 -1
  27. package/dist/components/ui/breadcrumb.d.ts.map +1 -1
  28. package/dist/components/ui/button-group.d.ts.map +1 -1
  29. package/dist/components/ui/checkbox.d.ts.map +1 -1
  30. package/dist/components/ui/combobox.d.ts +1 -1
  31. package/dist/components/ui/combobox.d.ts.map +1 -1
  32. package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
  33. package/dist/components/ui/item.d.ts +1 -1
  34. package/dist/components/ui/separator.d.ts +34 -1
  35. package/dist/components/ui/separator.d.ts.map +1 -1
  36. package/dist/components/ui/sheet.d.ts.map +1 -1
  37. package/dist/components/ui/sidebar.d.ts +1 -1
  38. package/dist/components/ui/sidebar.d.ts.map +1 -1
  39. package/dist/components/ui/toggle-group.d.ts +8 -2
  40. package/dist/components/ui/toggle-group.d.ts.map +1 -1
  41. package/dist/components/ui/toggle.d.ts +1 -1
  42. package/dist/components/ui/toggle.d.ts.map +1 -1
  43. package/dist/components/ui/tooltip.d.ts.map +1 -1
  44. package/dist/drawer-BcIxWRN8.cjs +1 -0
  45. package/dist/drawer-CU4lkcz7.js +119 -0
  46. package/dist/drawer.cjs.js +1 -0
  47. package/dist/drawer.es.js +13 -0
  48. package/dist/enhanced-calendar-5PA8CeF7.cjs +61 -0
  49. package/dist/enhanced-calendar-BENbxw7_.js +375 -0
  50. package/dist/entries/calendar.d.ts +9 -0
  51. package/dist/entries/calendar.d.ts.map +1 -0
  52. package/dist/entries/carousel.d.ts +7 -0
  53. package/dist/entries/carousel.d.ts.map +1 -0
  54. package/dist/entries/command.d.ts +9 -0
  55. package/dist/entries/command.d.ts.map +1 -0
  56. package/dist/entries/drawer.d.ts +7 -0
  57. package/dist/entries/drawer.d.ts.map +1 -0
  58. package/dist/entries/sonner.d.ts +8 -0
  59. package/dist/entries/sonner.d.ts.map +1 -0
  60. package/dist/entries/sortable.d.ts +7 -0
  61. package/dist/entries/sortable.d.ts.map +1 -0
  62. package/dist/hooks/index.d.ts +2 -3
  63. package/dist/hooks/index.d.ts.map +1 -1
  64. package/dist/hooks/use-as-ref.d.ts +1 -1
  65. package/dist/hooks/use-as-ref.d.ts.map +1 -1
  66. package/dist/hooks/use-intersection-observer.d.ts +13 -0
  67. package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
  68. package/dist/index.d.ts +13 -37
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/keyboard-BapbM2wb.cjs +1 -0
  71. package/dist/keyboard-pkY42Y3a.js +39 -0
  72. package/dist/nqui.cjs.js +171 -802
  73. package/dist/nqui.es.js +15299 -72452
  74. package/dist/sonner-Co6YpYVs.js +546 -0
  75. package/dist/sonner-DbQhVp8m.cjs +330 -0
  76. package/dist/sonner.cjs.js +1 -0
  77. package/dist/sonner.es.js +6 -0
  78. package/dist/sortable-Cj3cdxGc.cjs +5 -0
  79. package/dist/sortable-wG_cXiUk.js +366 -0
  80. package/dist/sortable.cjs.js +1 -0
  81. package/dist/sortable.es.js +8 -0
  82. package/dist/styles.css +21 -17
  83. package/dist/utils-B6yFEsav.js +8 -0
  84. package/dist/utils-IjLH3w2e.cjs +1 -0
  85. package/docs/components/README.md +309 -0
  86. package/docs/components/nqui-accordion.md +20 -0
  87. package/docs/components/nqui-alert-dialog.md +31 -0
  88. package/docs/components/nqui-alert.md +19 -0
  89. package/docs/components/nqui-aspect-ratio.md +17 -0
  90. package/docs/components/nqui-avatar.md +18 -0
  91. package/docs/components/nqui-badge.md +42 -0
  92. package/docs/components/nqui-breadcrumb.md +24 -0
  93. package/docs/components/nqui-button-group.md +50 -0
  94. package/docs/components/nqui-button.md +56 -0
  95. package/docs/components/nqui-calendar.md +46 -0
  96. package/docs/components/nqui-card.md +31 -0
  97. package/docs/components/nqui-carousel.md +22 -0
  98. package/docs/components/nqui-checkbox.md +34 -0
  99. package/docs/components/nqui-code-block.md +41 -0
  100. package/docs/components/nqui-code-editor.md +21 -0
  101. package/docs/components/nqui-collapsible.md +18 -0
  102. package/docs/components/nqui-color-picker.md +38 -0
  103. package/docs/components/nqui-color-slider.md +23 -0
  104. package/docs/components/nqui-combobox.md +73 -0
  105. package/docs/components/nqui-command-palette.md +29 -0
  106. package/docs/components/nqui-command.md +39 -0
  107. package/docs/components/nqui-context-menu.md +33 -0
  108. package/docs/components/nqui-data-table.md +46 -0
  109. package/docs/components/nqui-dialog.md +36 -0
  110. package/docs/components/nqui-drawer.md +27 -0
  111. package/docs/components/nqui-dropdown-menu.md +56 -0
  112. package/docs/components/nqui-empty.md +22 -0
  113. package/docs/components/nqui-field.md +42 -0
  114. package/docs/components/nqui-frosted-glass.md +19 -0
  115. package/docs/components/nqui-hover-card.md +18 -0
  116. package/docs/components/nqui-input-group.md +30 -0
  117. package/docs/components/nqui-input-otp.md +23 -0
  118. package/docs/components/nqui-input.md +25 -0
  119. package/docs/components/nqui-item.md +25 -0
  120. package/docs/components/nqui-kbd.md +25 -0
  121. package/docs/components/nqui-label.md +16 -0
  122. package/docs/components/nqui-logo.md +16 -0
  123. package/docs/components/nqui-menubar.md +22 -0
  124. package/docs/components/nqui-native-select.md +28 -0
  125. package/docs/components/nqui-navigation-menu.md +25 -0
  126. package/docs/components/nqui-pagination.md +25 -0
  127. package/docs/components/nqui-popover.md +34 -0
  128. package/docs/components/nqui-progress.md +22 -0
  129. package/docs/components/nqui-radio-group.md +42 -0
  130. package/docs/components/nqui-rating.md +35 -0
  131. package/docs/components/nqui-resizable.md +23 -0
  132. package/docs/components/nqui-sandbox.md +27 -0
  133. package/docs/components/nqui-scroll-area.md +32 -0
  134. package/docs/components/nqui-select.md +53 -0
  135. package/docs/components/nqui-separator.md +48 -0
  136. package/docs/components/nqui-sheet.md +27 -0
  137. package/docs/components/nqui-sidebar.md +45 -0
  138. package/docs/components/nqui-skeleton.md +15 -0
  139. package/docs/components/nqui-slider.md +16 -0
  140. package/docs/components/nqui-snippet.md +28 -0
  141. package/docs/components/nqui-sortable.md +46 -0
  142. package/docs/components/nqui-spinner.md +16 -0
  143. package/docs/components/nqui-switch.md +15 -0
  144. package/docs/components/nqui-table-of-contents.md +37 -0
  145. package/docs/components/nqui-table.md +43 -0
  146. package/docs/components/nqui-tabs.md +35 -0
  147. package/docs/components/nqui-textarea.md +15 -0
  148. package/docs/components/nqui-toaster.md +44 -0
  149. package/docs/components/nqui-toggle-group.md +65 -0
  150. package/docs/components/nqui-toggle.md +38 -0
  151. package/docs/components/nqui-tooltip.md +24 -0
  152. package/docs/components/nqui-tracker.md +38 -0
  153. package/docs/internal-notes/APP_BUILDER_PACKAGE.md +86 -0
  154. package/docs/internal-notes/BUILD_VERIFICATION.md +174 -0
  155. package/docs/internal-notes/DASHBOARD_LAYOUT_DESIGN.md +1429 -0
  156. package/docs/internal-notes/FROSTED_GLASS_FIX.md +50 -0
  157. package/docs/internal-notes/INSTALLATION.md +274 -0
  158. package/docs/internal-notes/PEER_DEPENDENCIES.md +105 -0
  159. package/docs/internal-notes/PUBLISHING.md +411 -0
  160. package/docs/internal-notes/SKILLS-ARCHITECTURE.md +105 -0
  161. package/docs/internal-notes/layoutdesign.md +616 -0
  162. package/docs/internal-notes/progress.md +348 -0
  163. package/docs/internal-notes/stacked-avatar-implementation.md +38 -0
  164. package/package.json +104 -17
  165. package/scripts/cli.js +44 -0
  166. package/scripts/help.js +1 -0
  167. package/scripts/init-css.js +15 -0
  168. package/scripts/init-cursor.js +169 -0
  169. package/scripts/install-peers.js +43 -0
  170. package/scripts/peer-deps.js +27 -0
  171. package/scripts/post-install.js +73 -0
  172. package/scripts/publish-npmjs.js +17 -3
  173. package/scripts/resolve-target-dir.js +99 -0
  174. package/scripts/skill-templates.js +109 -0
  175. package/INSTALLATION.md +0 -221
  176. package/dist/App.d.ts +0 -3
  177. package/dist/App.d.ts.map +0 -1
  178. package/dist/assets/svg/auth-lines.d.ts +0 -4
  179. package/dist/assets/svg/auth-lines.d.ts.map +0 -1
  180. package/dist/assets/svg/logo.d.ts +0 -4
  181. package/dist/assets/svg/logo.d.ts.map +0 -1
  182. package/dist/components/AppLayout.d.ts +0 -5
  183. package/dist/components/AppLayout.d.ts.map +0 -1
  184. package/dist/components/app-builder/AppBuilder.d.ts +0 -15
  185. package/dist/components/app-builder/AppBuilder.d.ts.map +0 -1
  186. package/dist/components/app-builder/context/app-builder-context.d.ts +0 -31
  187. package/dist/components/app-builder/context/app-builder-context.d.ts.map +0 -1
  188. package/dist/components/app-builder/core/AlignmentToolbar.d.ts +0 -5
  189. package/dist/components/app-builder/core/AlignmentToolbar.d.ts.map +0 -1
  190. package/dist/components/app-builder/core/AppCanvas.d.ts +0 -9
  191. package/dist/components/app-builder/core/AppCanvas.d.ts.map +0 -1
  192. package/dist/components/app-builder/core/CanvasToolbar.d.ts +0 -7
  193. package/dist/components/app-builder/core/CanvasToolbar.d.ts.map +0 -1
  194. package/dist/components/app-builder/core/DraggableWidget.d.ts +0 -12
  195. package/dist/components/app-builder/core/DraggableWidget.d.ts.map +0 -1
  196. package/dist/components/app-builder/core/WidgetConfigurator.d.ts +0 -6
  197. package/dist/components/app-builder/core/WidgetConfigurator.d.ts.map +0 -1
  198. package/dist/components/app-builder/core/WidgetPalette.d.ts +0 -6
  199. package/dist/components/app-builder/core/WidgetPalette.d.ts.map +0 -1
  200. package/dist/components/app-builder/core/WidgetRenderer.d.ts +0 -3
  201. package/dist/components/app-builder/core/WidgetRenderer.d.ts.map +0 -1
  202. package/dist/components/app-builder/core/index.d.ts +0 -8
  203. package/dist/components/app-builder/core/index.d.ts.map +0 -1
  204. package/dist/components/app-builder/essentials/button.d.ts +0 -3
  205. package/dist/components/app-builder/essentials/button.d.ts.map +0 -1
  206. package/dist/components/app-builder/essentials/container.d.ts +0 -3
  207. package/dist/components/app-builder/essentials/container.d.ts.map +0 -1
  208. package/dist/components/app-builder/essentials/index.d.ts +0 -3
  209. package/dist/components/app-builder/essentials/index.d.ts.map +0 -1
  210. package/dist/components/app-builder/hooks/index.d.ts +0 -3
  211. package/dist/components/app-builder/hooks/index.d.ts.map +0 -1
  212. package/dist/components/app-builder/hooks/use-app-builder.d.ts +0 -3
  213. package/dist/components/app-builder/hooks/use-app-builder.d.ts.map +0 -1
  214. package/dist/components/app-builder/hooks/use-canvas-state.d.ts +0 -24
  215. package/dist/components/app-builder/hooks/use-canvas-state.d.ts.map +0 -1
  216. package/dist/components/app-builder/index.d.ts +0 -19
  217. package/dist/components/app-builder/index.d.ts.map +0 -1
  218. package/dist/components/app-builder/registry/create-registry.d.ts +0 -10
  219. package/dist/components/app-builder/registry/create-registry.d.ts.map +0 -1
  220. package/dist/components/app-builder/registry/default-registry.d.ts +0 -6
  221. package/dist/components/app-builder/registry/default-registry.d.ts.map +0 -1
  222. package/dist/components/app-builder/registry/index.d.ts +0 -4
  223. package/dist/components/app-builder/registry/index.d.ts.map +0 -1
  224. package/dist/components/app-builder/registry/registry-helpers.d.ts +0 -22
  225. package/dist/components/app-builder/registry/registry-helpers.d.ts.map +0 -1
  226. package/dist/components/app-builder/types.d.ts +0 -64
  227. package/dist/components/app-builder/types.d.ts.map +0 -1
  228. package/dist/components/app-builder/utils/collision-detection.d.ts +0 -26
  229. package/dist/components/app-builder/utils/collision-detection.d.ts.map +0 -1
  230. package/dist/components/app-builder/utils/index.d.ts +0 -2
  231. package/dist/components/app-builder/utils/index.d.ts.map +0 -1
  232. package/dist/components/app-sidebar.d.ts +0 -4
  233. package/dist/components/app-sidebar.d.ts.map +0 -1
  234. package/dist/components/blocks/chart-compositions/chart-composition-01.d.ts +0 -2
  235. package/dist/components/blocks/chart-compositions/chart-composition-01.d.ts.map +0 -1
  236. package/dist/components/blocks/chart-compositions/chart-composition-02.d.ts +0 -2
  237. package/dist/components/blocks/chart-compositions/chart-composition-02.d.ts.map +0 -1
  238. package/dist/components/blocks/chart-compositions/chart-composition-03.d.ts +0 -2
  239. package/dist/components/blocks/chart-compositions/chart-composition-03.d.ts.map +0 -1
  240. package/dist/components/blocks/chart-compositions/index.d.ts +0 -4
  241. package/dist/components/blocks/chart-compositions/index.d.ts.map +0 -1
  242. package/dist/components/blocks/index.d.ts +0 -3
  243. package/dist/components/blocks/index.d.ts.map +0 -1
  244. package/dist/components/blocks/tables/index.d.ts +0 -4
  245. package/dist/components/blocks/tables/index.d.ts.map +0 -1
  246. package/dist/components/blocks/tables/table-01.d.ts +0 -2
  247. package/dist/components/blocks/tables/table-01.d.ts.map +0 -1
  248. package/dist/components/blocks/tables/table-02.d.ts +0 -2
  249. package/dist/components/blocks/tables/table-02.d.ts.map +0 -1
  250. package/dist/components/blocks/tables/table-03.d.ts +0 -2
  251. package/dist/components/blocks/tables/table-03.d.ts.map +0 -1
  252. package/dist/components/chart/area-chart/AreaChart.d.ts +0 -57
  253. package/dist/components/chart/area-chart/AreaChart.d.ts.map +0 -1
  254. package/dist/components/chart/area-chart/index.d.ts +0 -3
  255. package/dist/components/chart/area-chart/index.d.ts.map +0 -1
  256. package/dist/components/chart/bar-chart/BarChart.d.ts +0 -62
  257. package/dist/components/chart/bar-chart/BarChart.d.ts.map +0 -1
  258. package/dist/components/chart/bar-chart/index.d.ts +0 -3
  259. package/dist/components/chart/bar-chart/index.d.ts.map +0 -1
  260. package/dist/components/chart/bar-list/BarList.d.ts +0 -23
  261. package/dist/components/chart/bar-list/BarList.d.ts.map +0 -1
  262. package/dist/components/chart/bar-list/index.d.ts +0 -3
  263. package/dist/components/chart/bar-list/index.d.ts.map +0 -1
  264. package/dist/components/chart/category-bar/CategoryBar.d.ts +0 -15
  265. package/dist/components/chart/category-bar/CategoryBar.d.ts.map +0 -1
  266. package/dist/components/chart/category-bar/index.d.ts +0 -3
  267. package/dist/components/chart/category-bar/index.d.ts.map +0 -1
  268. package/dist/components/chart/combo-chart/ComboChart.d.ts +0 -67
  269. package/dist/components/chart/combo-chart/ComboChart.d.ts.map +0 -1
  270. package/dist/components/chart/combo-chart/index.d.ts +0 -3
  271. package/dist/components/chart/combo-chart/index.d.ts.map +0 -1
  272. package/dist/components/chart/donut-chart/DonutChart.d.ts +0 -37
  273. package/dist/components/chart/donut-chart/DonutChart.d.ts.map +0 -1
  274. package/dist/components/chart/donut-chart/index.d.ts +0 -3
  275. package/dist/components/chart/donut-chart/index.d.ts.map +0 -1
  276. package/dist/components/chart/index.d.ts +0 -19
  277. package/dist/components/chart/index.d.ts.map +0 -1
  278. package/dist/components/chart/line-chart/LineChart.d.ts +0 -55
  279. package/dist/components/chart/line-chart/LineChart.d.ts.map +0 -1
  280. package/dist/components/chart/line-chart/index.d.ts +0 -3
  281. package/dist/components/chart/line-chart/index.d.ts.map +0 -1
  282. package/dist/components/chart/progress-circle/ProgressCircle.d.ts +0 -92
  283. package/dist/components/chart/progress-circle/ProgressCircle.d.ts.map +0 -1
  284. package/dist/components/chart/progress-circle/index.d.ts +0 -3
  285. package/dist/components/chart/progress-circle/index.d.ts.map +0 -1
  286. package/dist/components/chart/spark-chart/SparkChart.d.ts +0 -40
  287. package/dist/components/chart/spark-chart/SparkChart.d.ts.map +0 -1
  288. package/dist/components/chart/spark-chart/index.d.ts +0 -3
  289. package/dist/components/chart/spark-chart/index.d.ts.map +0 -1
  290. package/dist/components/component-example.d.ts +0 -2
  291. package/dist/components/component-example.d.ts.map +0 -1
  292. package/dist/components/custom/enhanced-separator.d.ts +0 -36
  293. package/dist/components/custom/enhanced-separator.d.ts.map +0 -1
  294. package/dist/components/custom/segmented-control.d.ts +0 -48
  295. package/dist/components/custom/segmented-control.d.ts.map +0 -1
  296. package/dist/components/example.d.ts +0 -7
  297. package/dist/components/example.d.ts.map +0 -1
  298. package/dist/components/login-form.d.ts +0 -2
  299. package/dist/components/login-form.d.ts.map +0 -1
  300. package/dist/components/nav-user.d.ts +0 -8
  301. package/dist/components/nav-user.d.ts.map +0 -1
  302. package/dist/components/pm/gantt/contexts.d.ts +0 -13
  303. package/dist/components/pm/gantt/contexts.d.ts.map +0 -1
  304. package/dist/components/pm/gantt/gantt-columns.d.ts +0 -7
  305. package/dist/components/pm/gantt/gantt-columns.d.ts.map +0 -1
  306. package/dist/components/pm/gantt/gantt-demo.d.ts +0 -2
  307. package/dist/components/pm/gantt/gantt-demo.d.ts.map +0 -1
  308. package/dist/components/pm/gantt/gantt-dependencies.d.ts +0 -23
  309. package/dist/components/pm/gantt/gantt-dependencies.d.ts.map +0 -1
  310. package/dist/components/pm/gantt/gantt-features.d.ts +0 -9
  311. package/dist/components/pm/gantt/gantt-features.d.ts.map +0 -1
  312. package/dist/components/pm/gantt/gantt-header.d.ts +0 -5
  313. package/dist/components/pm/gantt/gantt-header.d.ts.map +0 -1
  314. package/dist/components/pm/gantt/gantt-markers.d.ts +0 -11
  315. package/dist/components/pm/gantt/gantt-markers.d.ts.map +0 -1
  316. package/dist/components/pm/gantt/gantt-modals.d.ts +0 -5
  317. package/dist/components/pm/gantt/gantt-modals.d.ts.map +0 -1
  318. package/dist/components/pm/gantt/gantt-provider.d.ts +0 -5
  319. package/dist/components/pm/gantt/gantt-provider.d.ts.map +0 -1
  320. package/dist/components/pm/gantt/gantt-setting-modal.d.ts +0 -4
  321. package/dist/components/pm/gantt/gantt-setting-modal.d.ts.map +0 -1
  322. package/dist/components/pm/gantt/gantt-sidebar.d.ts +0 -7
  323. package/dist/components/pm/gantt/gantt-sidebar.d.ts.map +0 -1
  324. package/dist/components/pm/gantt/gantt-toolbar.d.ts +0 -29
  325. package/dist/components/pm/gantt/gantt-toolbar.d.ts.map +0 -1
  326. package/dist/components/pm/gantt/index.d.ts +0 -16
  327. package/dist/components/pm/gantt/index.d.ts.map +0 -1
  328. package/dist/components/pm/gantt/types.d.ts +0 -299
  329. package/dist/components/pm/gantt/types.d.ts.map +0 -1
  330. package/dist/components/pm/gantt/utils.d.ts +0 -29
  331. package/dist/components/pm/gantt/utils.d.ts.map +0 -1
  332. package/dist/components/pm/index.d.ts +0 -13
  333. package/dist/components/pm/index.d.ts.map +0 -1
  334. package/dist/components/pm/mockdata.d.ts +0 -13
  335. package/dist/components/pm/mockdata.d.ts.map +0 -1
  336. package/dist/components/pm/pm-column-templates.d.ts +0 -30
  337. package/dist/components/pm/pm-column-templates.d.ts.map +0 -1
  338. package/dist/components/pm/pm-data-utils.d.ts +0 -82
  339. package/dist/components/pm/pm-data-utils.d.ts.map +0 -1
  340. package/dist/components/pm/pm-definition.d.ts +0 -75
  341. package/dist/components/pm/pm-definition.d.ts.map +0 -1
  342. package/dist/components/pm/pm-theme-context.d.ts +0 -17
  343. package/dist/components/pm/pm-theme-context.d.ts.map +0 -1
  344. package/dist/components/pm/pm-types.d.ts +0 -81
  345. package/dist/components/pm/pm-types.d.ts.map +0 -1
  346. package/dist/components/pm/project-table-view.d.ts +0 -17
  347. package/dist/components/pm/project-table-view.d.ts.map +0 -1
  348. package/dist/components/pm/table/data-grid-cell-variants.d.ts +0 -14
  349. package/dist/components/pm/table/data-grid-cell-variants.d.ts.map +0 -1
  350. package/dist/components/pm/table/data-grid-cell-wrapper.d.ts +0 -9
  351. package/dist/components/pm/table/data-grid-cell-wrapper.d.ts.map +0 -1
  352. package/dist/components/pm/table/data-grid-cell.d.ts +0 -5
  353. package/dist/components/pm/table/data-grid-cell.d.ts.map +0 -1
  354. package/dist/components/pm/table/data-grid-column-header.d.ts +0 -10
  355. package/dist/components/pm/table/data-grid-column-header.d.ts.map +0 -1
  356. package/dist/components/pm/table/data-grid-context-menu.d.ts +0 -10
  357. package/dist/components/pm/table/data-grid-context-menu.d.ts.map +0 -1
  358. package/dist/components/pm/table/data-grid-filter-menu.d.ts +0 -10
  359. package/dist/components/pm/table/data-grid-filter-menu.d.ts.map +0 -1
  360. package/dist/components/pm/table/data-grid-keyboard-shortcuts.d.ts +0 -12
  361. package/dist/components/pm/table/data-grid-keyboard-shortcuts.d.ts.map +0 -1
  362. package/dist/components/pm/table/data-grid-paste-dialog.d.ts +0 -9
  363. package/dist/components/pm/table/data-grid-paste-dialog.d.ts.map +0 -1
  364. package/dist/components/pm/table/data-grid-row-height-menu.d.ts +0 -10
  365. package/dist/components/pm/table/data-grid-row-height-menu.d.ts.map +0 -1
  366. package/dist/components/pm/table/data-grid-row.d.ts +0 -27
  367. package/dist/components/pm/table/data-grid-row.d.ts.map +0 -1
  368. package/dist/components/pm/table/data-grid-search.d.ts +0 -8
  369. package/dist/components/pm/table/data-grid-search.d.ts.map +0 -1
  370. package/dist/components/pm/table/data-grid-select-column.d.ts +0 -11
  371. package/dist/components/pm/table/data-grid-select-column.d.ts.map +0 -1
  372. package/dist/components/pm/table/data-grid-skeleton.d.ts +0 -12
  373. package/dist/components/pm/table/data-grid-skeleton.d.ts.map +0 -1
  374. package/dist/components/pm/table/data-grid-sort-menu.d.ts +0 -10
  375. package/dist/components/pm/table/data-grid-sort-menu.d.ts.map +0 -1
  376. package/dist/components/pm/table/data-grid-view-menu.d.ts +0 -10
  377. package/dist/components/pm/table/data-grid-view-menu.d.ts.map +0 -1
  378. package/dist/components/pm/table/data-grid.d.ts +0 -11
  379. package/dist/components/pm/table/data-grid.d.ts.map +0 -1
  380. package/dist/components/shadcn-studio/blocks/login-page-05/login-form.d.ts +0 -3
  381. package/dist/components/shadcn-studio/blocks/login-page-05/login-form.d.ts.map +0 -1
  382. package/dist/components/shadcn-studio/blocks/login-page-05/login-page-05.d.ts +0 -3
  383. package/dist/components/shadcn-studio/blocks/login-page-05/login-page-05.d.ts.map +0 -1
  384. package/dist/components/shadcn-studio/logo.d.ts +0 -5
  385. package/dist/components/shadcn-studio/logo.d.ts.map +0 -1
  386. package/dist/components/showcase/app-builder/app-builder-context.d.ts +0 -16
  387. package/dist/components/showcase/app-builder/app-builder-context.d.ts.map +0 -1
  388. package/dist/components/showcase/app-builder/app-canvas.d.ts +0 -11
  389. package/dist/components/showcase/app-builder/app-canvas.d.ts.map +0 -1
  390. package/dist/components/showcase/app-builder/widget-configurator.d.ts +0 -10
  391. package/dist/components/showcase/app-builder/widget-configurator.d.ts.map +0 -1
  392. package/dist/components/showcase/app-builder/widget-palette.d.ts +0 -6
  393. package/dist/components/showcase/app-builder/widget-palette.d.ts.map +0 -1
  394. package/dist/components/showcase/app-builder/widget-registry.d.ts +0 -29
  395. package/dist/components/showcase/app-builder/widget-registry.d.ts.map +0 -1
  396. package/dist/components/showcase/app-builder/widget-renderer.d.ts +0 -7
  397. package/dist/components/showcase/app-builder/widget-renderer.d.ts.map +0 -1
  398. package/dist/components/table/DataTable.d.ts +0 -71
  399. package/dist/components/table/DataTable.d.ts.map +0 -1
  400. package/dist/components/table/Table.d.ts +0 -12
  401. package/dist/components/table/Table.d.ts.map +0 -1
  402. package/dist/components/table/data-table-helpers.d.ts +0 -49
  403. package/dist/components/table/data-table-helpers.d.ts.map +0 -1
  404. package/dist/components/table/index.d.ts +0 -5
  405. package/dist/components/table/index.d.ts.map +0 -1
  406. package/dist/components/theme-toggle.d.ts +0 -2
  407. package/dist/components/theme-toggle.d.ts.map +0 -1
  408. package/dist/components/ui/chart.d.ts +0 -41
  409. package/dist/components/ui/chart.d.ts.map +0 -1
  410. package/dist/components/ui/shadcn-io/code-block/index.d.ts +0 -67
  411. package/dist/components/ui/shadcn-io/code-block/index.d.ts.map +0 -1
  412. package/dist/components/ui/shadcn-io/code-block/server.d.ts +0 -10
  413. package/dist/components/ui/shadcn-io/code-block/server.d.ts.map +0 -1
  414. package/dist/components/ui/shadcn-io/code-editor/index.d.ts +0 -35
  415. package/dist/components/ui/shadcn-io/code-editor/index.d.ts.map +0 -1
  416. package/dist/components/ui/shadcn-io/sandbox/index.d.ts +0 -38
  417. package/dist/components/ui/shadcn-io/sandbox/index.d.ts.map +0 -1
  418. package/dist/components/ui/shadcn-io/snippet/index.d.ts +0 -21
  419. package/dist/components/ui/shadcn-io/snippet/index.d.ts.map +0 -1
  420. package/dist/hooks/use-chart-highlight.d.ts +0 -43
  421. package/dist/hooks/use-chart-highlight.d.ts.map +0 -1
  422. package/dist/hooks/use-data-grid.d.ts +0 -59
  423. package/dist/hooks/use-data-grid.d.ts.map +0 -1
  424. package/dist/hooks/use-on-window-resize.d.ts +0 -2
  425. package/dist/hooks/use-on-window-resize.d.ts.map +0 -1
  426. package/dist/lib/data-grid-filters.d.ts +0 -29
  427. package/dist/lib/data-grid-filters.d.ts.map +0 -1
  428. package/dist/lib/data-grid.d.ts +0 -47
  429. package/dist/lib/data-grid.d.ts.map +0 -1
  430. package/dist/main.d.ts +0 -3
  431. package/dist/main.d.ts.map +0 -1
  432. package/dist/mockdata/chartData.d.ts +0 -71
  433. package/dist/mockdata/chartData.d.ts.map +0 -1
  434. package/dist/mockdata/toc.d.ts +0 -23
  435. package/dist/mockdata/toc.d.ts.map +0 -1
  436. package/dist/pages/AppBuilder.d.ts +0 -2
  437. package/dist/pages/AppBuilder.d.ts.map +0 -1
  438. package/dist/pages/ChartShowcase.d.ts +0 -2
  439. package/dist/pages/ChartShowcase.d.ts.map +0 -1
  440. package/dist/pages/ComponentShowcase.d.ts +0 -2
  441. package/dist/pages/ComponentShowcase.d.ts.map +0 -1
  442. package/dist/pages/DataTableShowcase.d.ts +0 -2
  443. package/dist/pages/DataTableShowcase.d.ts.map +0 -1
  444. package/dist/pages/Drafts.d.ts +0 -2
  445. package/dist/pages/Drafts.d.ts.map +0 -1
  446. package/dist/pages/GanttShowcase.d.ts +0 -2
  447. package/dist/pages/GanttShowcase.d.ts.map +0 -1
  448. package/dist/pages/Inbox.d.ts +0 -2
  449. package/dist/pages/Inbox.d.ts.map +0 -1
  450. package/dist/pages/Junk.d.ts +0 -2
  451. package/dist/pages/Junk.d.ts.map +0 -1
  452. package/dist/pages/Sent.d.ts +0 -2
  453. package/dist/pages/Sent.d.ts.map +0 -1
  454. package/dist/pages/Settings.d.ts +0 -2
  455. package/dist/pages/Settings.d.ts.map +0 -1
  456. package/dist/pages/Trash.d.ts +0 -2
  457. package/dist/pages/Trash.d.ts.map +0 -1
  458. package/dist/pages/gantt-data.d.ts +0 -16
  459. package/dist/pages/gantt-data.d.ts.map +0 -1
  460. package/dist/stories/mockData.d.ts +0 -157
  461. package/dist/stories/mockData.d.ts.map +0 -1
  462. package/dist/types/data-grid.d.ts +0 -179
  463. package/dist/types/data-grid.d.ts.map +0 -1
  464. package/dist/utils/chart-colors.d.ts +0 -62
  465. package/dist/utils/chart-colors.d.ts.map +0 -1
  466. package/dist/utils/chart-highlight.d.ts +0 -34
  467. package/dist/utils/chart-highlight.d.ts.map +0 -1
  468. package/dist/utils/chart-utils.d.ts +0 -2
  469. package/dist/utils/chart-utils.d.ts.map +0 -1
  470. package/dist/utils/focus-ring.d.ts +0 -2
  471. package/dist/utils/focus-ring.d.ts.map +0 -1
  472. package/dist/utils/get-y-axis-domain.d.ts +0 -2
  473. package/dist/utils/get-y-axis-domain.d.ts.map +0 -1
  474. package/dist/utils/index.d.ts +0 -10
  475. package/dist/utils/index.d.ts.map +0 -1
@@ -0,0 +1,616 @@
1
+ # Layout Design Architecture Guide
2
+
3
+ This document provides architectural guidance for implementing consistent layouts, pages, and cards in the nqui component library.
4
+
5
+ ---
6
+
7
+ ## Table of Contents
8
+
9
+ 1. [Core Principles](#core-principles)
10
+ 2. [Z-Index Elevation System](#z-index-elevation-system)
11
+ 3. [App Layout Structure](#app-layout-structure)
12
+ 4. [Sticky Header with Frosted Glass](#sticky-header-with-frosted-glass)
13
+ 5. [Scroll Architecture](#scroll-architecture)
14
+ 6. [Page Implementation](#page-implementation)
15
+ 7. [Card Design Patterns](#card-design-patterns)
16
+ 8. [Common Pitfalls](#common-pitfalls)
17
+
18
+ ---
19
+
20
+ ## Core Principles
21
+
22
+ 1. **Viewport Lock** — `html`, `body`, `#root` are all `height: 100%; overflow: hidden`. The browser never scrolls.
23
+ 2. **Single Scroll Owner** — Each scroll direction has exactly one container that owns it. The page scroll container owns vertical; cards or `ScrollArea` own local scroll.
24
+ 3. **Semantic Z-Index** — Use CSS variables from `elevation.css`, never arbitrary numbers.
25
+ 4. **Flex Shrink Prevention** — Sticky elements use `flex-shrink-0` to prevent compression.
26
+ 5. **Two-Layer Pattern** — Frosted glass effects use separate background and content z-layers.
27
+
28
+ ---
29
+
30
+ ## Z-Index Elevation System
31
+
32
+ All z-index values are defined in `packages/nqui/src/styles/elevation.css`. Always use these variables:
33
+
34
+ ```css
35
+ :root {
36
+ --z-base: 0; /* Default layer */
37
+ --z-background: 0; /* Frosted glass background layer */
38
+ --z-content: 10; /* Standard content */
39
+ --z-sticky-content: 15; /* Card headers, table headers */
40
+ --z-sticky-page: 20; /* Page-level sticky header */
41
+ --z-floating: 30; /* Sidebars, floating panels */
42
+ --z-modal-backdrop: 40; /* Modal overlay */
43
+ --z-modal: 50; /* Modal content */
44
+ --z-popover: 60; /* Dropdowns, popovers */
45
+ --z-tooltip: 70; /* Tooltips */
46
+ --z-debug: 9999; /* Debug tools only */
47
+ }
48
+ ```
49
+
50
+ ### Usage in Tailwind
51
+
52
+ ```tsx
53
+ // Page header - stays above card headers
54
+ <header className="z-[var(--z-sticky-page)]">
55
+
56
+ // Card sticky header - below page header
57
+ <div className="z-[var(--z-sticky-content)]">
58
+
59
+ // Tooltip
60
+ <div className="z-[var(--z-tooltip)]">
61
+ ```
62
+
63
+ ### Hierarchy Rules
64
+
65
+ | Element | Z-Index Variable | Value | Stays Above |
66
+ |---------|------------------|-------|-------------|
67
+ | Page Header | `--z-sticky-page` | 20 | Card headers, content |
68
+ | Card Header | `--z-sticky-content` | 15 | Card content only |
69
+ | Sidebar | `--z-floating` | 30 | Page content |
70
+ | Modal | `--z-modal` | 50 | Everything except tooltips |
71
+ | Popover | `--z-popover` | 60 | Modals |
72
+ | Tooltip | `--z-tooltip` | 70 | Everything |
73
+
74
+ ---
75
+
76
+ ## App Layout Structure
77
+
78
+ The main layout lives in `packages/nqui/src/components/AppLayout.tsx`.
79
+
80
+ ### Container Hierarchy
81
+
82
+ ```
83
+ SidebarProvider
84
+ └── AppSidebar (z-floating: 30)
85
+ └── SidebarInset (h-screen overflow-hidden)
86
+ └── Scroll Container (flex-1 min-h-0 overflow-y-auto overflow-x-hidden)
87
+ ├── Sticky Header (sticky top-0, z-sticky-page: 20)
88
+ │ ├── FrostedGlass (z-background: 0)
89
+ │ └── Content Layer (z-content: 10)
90
+ └── PageContentWrapper
91
+ └── <Outlet /> (your page)
92
+ ```
93
+
94
+ ### Key Implementation
95
+
96
+ ```tsx
97
+ <SidebarInset className="flex flex-col h-screen overflow-hidden">
98
+ <div className="flex-1 min-h-0 overflow-y-auto overflow-x-hidden">
99
+ {/* Sticky header */}
100
+ <header className="sticky top-0 z-[var(--z-sticky-page)] flex-shrink-0 relative">
101
+ <FrostedGlass blur={16} borderRadius={0} className="z-[var(--z-background)]" />
102
+ <div className="relative z-[var(--z-content)] border-b bg-background/40 flex h-16 items-center gap-2 px-4">
103
+ {/* Header content */}
104
+ </div>
105
+ </header>
106
+
107
+ {/* Page content */}
108
+ <PageContentWrapper>
109
+ <Outlet />
110
+ </PageContentWrapper>
111
+ </div>
112
+ </SidebarInset>
113
+ ```
114
+
115
+ ### Critical Classes Explained
116
+
117
+ | Class | Purpose |
118
+ |-------|---------|
119
+ | `h-screen overflow-hidden` | Confines app to viewport, prevents body scroll |
120
+ | `flex-1 min-h-0` | Allows flex child to shrink and enable internal scroll |
121
+ | `overflow-y-auto overflow-x-hidden` | Vertical scroll only in this container |
122
+ | `sticky top-0` | Header sticks to scroll container top |
123
+ | `flex-shrink-0` | Header never compresses under pressure |
124
+ | `relative` | Creates stacking context for z-index layers |
125
+
126
+ ---
127
+
128
+ ## Sticky Header with Frosted Glass
129
+
130
+ The frosted glass header uses a two-layer approach for the blur effect.
131
+
132
+ ### Structure
133
+
134
+ ```tsx
135
+ <header className="sticky top-0 z-[var(--z-sticky-page)] flex-shrink-0 relative">
136
+ {/* Layer 1: Frosted glass effect (behind content) */}
137
+ <FrostedGlass
138
+ blur={16}
139
+ borderRadius={0}
140
+ className="z-[var(--z-background)]"
141
+ />
142
+
143
+ {/* Layer 2: Actual header content (above glass) */}
144
+ <div className="relative z-[var(--z-content)] border-b transition-colors bg-background/40 flex h-16 items-center gap-2 px-4">
145
+ <SidebarTrigger />
146
+ <Separator orientation="vertical" className="h-4" />
147
+ <Breadcrumb>...</Breadcrumb>
148
+ </div>
149
+ </header>
150
+ ```
151
+
152
+ ### How FrostedGlass Works
153
+
154
+ The `FrostedGlass` component (`packages/nqui/src/components/ui/frosted-glass.tsx`):
155
+
156
+ 1. **Extended backdrop** — Uses `h-[200%]` to capture content above and below
157
+ 2. **Blur filter** — `backdrop-filter: blur(Xpx)` with webkit prefix
158
+ 3. **Gradient mask** — Fades bottom edge to prevent harsh cutoff
159
+ 4. **Pointer events** — `pointer-events-none` allows click-through
160
+
161
+ ```tsx
162
+ // Simplified FrostedGlass internals
163
+ <div className="absolute inset-0 pointer-events-none h-[200%] bg-background/3"
164
+ style={{
165
+ backdropFilter: `blur(${blur}px)`,
166
+ WebkitBackdropFilter: `blur(${blur}px)`,
167
+ maskImage: "linear-gradient(to bottom, black 0% 50%, transparent 50% 100%)",
168
+ }}
169
+ />
170
+ ```
171
+
172
+ ---
173
+
174
+ ## Scroll Architecture
175
+
176
+ The app uses a **three-tier scroll model**. Each tier is independent — scrolling in one tier never interferes with another.
177
+
178
+ ### The Three Tiers
179
+
180
+ ```
181
+ ┌──────────────────────────────────────────────────────┐
182
+ │ Tier 0: Viewport (html/body/#root) │
183
+ │ height: 100%, overflow: hidden │
184
+ │ NEVER scrolls — acts as fixed frame │
185
+ │ │
186
+ │ ┌──────────────────────────────────────────────┐ │
187
+ │ │ Tier 1: Page Scroll Container │ │
188
+ │ │ flex-1 min-h-0 overflow-y-auto │ │
189
+ │ │ overflow-x-hidden │ │
190
+ │ │ ↕ VERTICAL ONLY │ │
191
+ │ │ │ │
192
+ │ │ ┌─ sticky header ──────────────────────┐ │ │
193
+ │ │ │ sticky top-0 z-sticky-page (20) │ │ │
194
+ │ │ └──────────────────────────────────────┘ │ │
195
+ │ │ │ │
196
+ │ │ ┌─ page content ──────────────────────┐ │ │
197
+ │ │ │ │ │ │
198
+ │ │ │ ┌─ Tier 2: Local Card Scroll ──┐ │ │ │
199
+ │ │ │ │ ScrollArea or overflow-auto │ │ │ │
200
+ │ │ │ │ ↔ HORIZONTAL and/or │ │ │ │
201
+ │ │ │ │ ↕ VERTICAL (independent) │ │ │ │
202
+ │ │ │ └──────────────────────────────┘ │ │ │
203
+ │ │ │ │ │ │
204
+ │ │ └──────────────────────────────────────┘ │ │
205
+ │ └──────────────────────────────────────────────┘ │
206
+ └──────────────────────────────────────────────────────┘
207
+ ```
208
+
209
+ ### Tier 0 — Viewport Lock
210
+
211
+ Defined in `packages/nqui/src/index.css`:
212
+
213
+ ```css
214
+ @layer base {
215
+ html, body, #root {
216
+ height: 100%;
217
+ overflow: hidden;
218
+ }
219
+ }
220
+ ```
221
+
222
+ Additionally, `AppLayout.tsx` programmatically enforces this:
223
+
224
+ ```tsx
225
+ document.body.style.overflow = 'hidden'
226
+ document.documentElement.style.overflow = 'hidden'
227
+ ```
228
+
229
+ **Result:** The browser's native scroll is completely disabled. No scroll event ever reaches the viewport.
230
+
231
+ ### Tier 1 — Page Scroll Container (Vertical)
232
+
233
+ The single vertical scroll owner. Defined in `AppLayout.tsx`:
234
+
235
+ ```tsx
236
+ <div
237
+ ref={scrollContainerRef}
238
+ className="flex-1 min-h-0 flex flex-col overflow-y-auto overflow-x-hidden"
239
+ >
240
+ <header className="sticky top-0 z-[var(--z-sticky-page)] flex-shrink-0">
241
+ {/* page header — sticks to top of THIS container */}
242
+ </header>
243
+ <PageContentWrapper>
244
+ <Outlet /> {/* all page content scrolls here */}
245
+ </PageContentWrapper>
246
+ </div>
247
+ ```
248
+
249
+ Why this works:
250
+ - `overflow-y-auto` makes this the scroll owner for the entire page
251
+ - `overflow-x-hidden` guarantees no horizontal scroll at the page level
252
+ - `sticky top-0` on the header pins it relative to this container, not the viewport
253
+ - `min-h-0` on the flex child allows it to shrink below its content height, which is what triggers the scrollbar
254
+
255
+ **The sticky header never moves.** The user scrolls through page content while the header stays pinned.
256
+
257
+ ### Tier 2 — Local Card/Widget Scroll
258
+
259
+ Cards and widgets manage their own scroll independently using `ScrollArea` or native overflow. This scroll is **completely isolated** from Tier 1 — scrolling inside a card does not scroll the page.
260
+
261
+ There are two approaches:
262
+
263
+ #### Approach A: `ScrollArea` component (preferred)
264
+
265
+ Uses Radix ScrollArea primitive with styled scrollbar and optional fade-mask edges. Supports `orientation="vertical"`, `"horizontal"`, or `"both"`.
266
+
267
+ **Horizontal scroll example** — wide form fields inside a card:
268
+
269
+ ```tsx
270
+ <Card>
271
+ <CardHeader>
272
+ <CardTitle>Event Registration</CardTitle>
273
+ </CardHeader>
274
+ <CardContent>
275
+ <ScrollArea orientation="horizontal" className="w-full">
276
+ <div className="flex gap-4 pb-4 min-w-max">
277
+ <div className="min-w-[200px]">
278
+ <Label>Full Name</Label>
279
+ <Input placeholder="Jane Doe" />
280
+ </div>
281
+ <div className="min-w-[220px]">
282
+ <Label>Email</Label>
283
+ <Input type="email" placeholder="jane@example.com" />
284
+ </div>
285
+ {/* more fields... */}
286
+ </div>
287
+ </ScrollArea>
288
+ </CardContent>
289
+ </Card>
290
+ ```
291
+
292
+ Key details:
293
+ - `ScrollArea orientation="horizontal"` renders a horizontal Radix scrollbar and applies a left/right fade mask
294
+ - `min-w-max` on the inner `div` forces it to its natural width — this guarantees overflow on narrow viewports
295
+ - `pb-4` reserves space for the scrollbar below the content
296
+ - The styled scrollbar is visible and draggable (not hidden like native overflow)
297
+
298
+ **See live:** ComponentShowcase → "Horizontal Scroll" section
299
+
300
+ **Vertical scroll with frosted glass header** — card with `stickyHeader` prop:
301
+
302
+ ```tsx
303
+ <Card stickyHeader className="h-[500px]">
304
+ <CardHeader>
305
+ <CardTitle>Frosted Glass Header with Scroll</CardTitle>
306
+ <CardDescription>Scroll to see the frosted blur effect</CardDescription>
307
+ </CardHeader>
308
+ <CardContent>
309
+ {/* Long content — scrolls vertically inside the card */}
310
+ </CardContent>
311
+ </Card>
312
+ ```
313
+
314
+ When `stickyHeader` is set:
315
+ - `Card` adds `flex flex-col` and `overflow-hidden` to itself
316
+ - `CardHeader` becomes `sticky top-0 z-[var(--z-sticky-content)]` with a `FrostedGlass` background layer
317
+ - `CardContent` automatically wraps children in `<ScrollArea className="flex-1 min-h-0">` so the body scrolls vertically while the header stays pinned
318
+
319
+ This is the same two-layer frosted glass pattern as the page header, scoped to the card.
320
+
321
+ **See live:** ComponentShowcase → Layout Components → "Frosted Glass Header with Scroll"
322
+
323
+ #### Approach B: Native `overflow-auto` (for tables)
324
+
325
+ `TableRoot` uses native CSS overflow for horizontal scrolling. Simpler but no styled scrollbar or fade mask.
326
+
327
+ ```tsx
328
+ <TableRoot>
329
+ {/* w-full overflow-auto whitespace-nowrap */}
330
+ <Table>
331
+ <TableHead>...</TableHead>
332
+ <TableBody>...</TableBody>
333
+ </Table>
334
+ </TableRoot>
335
+ ```
336
+
337
+ `DataTable` wraps in `TableRoot` automatically, so no extra work needed.
338
+
339
+ ### How the Tiers Stay Independent
340
+
341
+ | Interaction | What happens |
342
+ |-------------|-------------|
343
+ | User scrolls the page | Tier 1 scrolls vertically. Sticky header stays. Cards move with content. |
344
+ | User scrolls inside a `ScrollArea` card | Only that card's content moves. Page does not scroll. |
345
+ | User horizontally scrolls a wide form/table | Only that card/table scrolls horizontally. Page has `overflow-x-hidden` so it never shifts. |
346
+ | User scrolls to bottom of card, keeps scrolling | Scroll stops at the card boundary. It does **not** propagate up to the page. (Radix ScrollArea isolates scroll.) |
347
+ | Browser is narrowed | Horizontal overflow inside `ScrollArea`/`TableRoot` activates. Page layout remains stable. |
348
+
349
+ ### ScrollArea Component Reference
350
+
351
+ **File:** `packages/nqui/src/components/custom/enhanced-scroll-area.tsx`
352
+
353
+ ```tsx
354
+ <ScrollArea
355
+ orientation="vertical" // "vertical" | "horizontal" | "both"
356
+ fadeMask={true} // fade edges (default: true)
357
+ className="h-[300px]" // constrain height for vertical scroll
358
+ >
359
+ {children}
360
+ </ScrollArea>
361
+ ```
362
+
363
+ | Prop | Default | Effect |
364
+ |------|---------|--------|
365
+ | `orientation` | `"vertical"` | Which scrollbar(s) to render and which axis to fade-mask |
366
+ | `fadeMask` | `true` | Applies CSS `mask-image` gradient to fade content at scroll edges |
367
+
368
+ Radix ScrollArea captures scroll events within its viewport, so scroll never leaks to parent containers.
369
+
370
+ ---
371
+
372
+ ## Page Implementation
373
+
374
+ All pages render inside `PageContentWrapper` via React Router's `<Outlet />`.
375
+
376
+ ### Standard Page Template
377
+
378
+ ```tsx
379
+ export default function MyPage() {
380
+ return (
381
+ <div className="flex flex-1 flex-col gap-6 p-6 min-w-0 overflow-x-hidden">
382
+ {/* Page header (optional) */}
383
+ <div className="flex items-center justify-between">
384
+ <h1 className="text-2xl font-bold">Page Title</h1>
385
+ <Button>Action</Button>
386
+ </div>
387
+
388
+ {/* Content grid */}
389
+ <div className="grid gap-6 md:grid-cols-2 lg:grid-cols-3">
390
+ <Card>...</Card>
391
+ <Card>...</Card>
392
+ <Card>...</Card>
393
+ </div>
394
+ </div>
395
+ )
396
+ }
397
+ ```
398
+
399
+ ### Page Spacing Guidelines
400
+
401
+ | Element | Class |
402
+ |---------|-------|
403
+ | Page padding | `p-6` |
404
+ | Gap between sections | `gap-6` |
405
+ | Card grid gap | `gap-6` |
406
+ | Responsive columns | `md:grid-cols-2 lg:grid-cols-3` |
407
+ | Prevent flex overflow | `min-w-0 overflow-x-hidden` |
408
+
409
+ ---
410
+
411
+ ## Card Design Patterns
412
+
413
+ ### Basic Card
414
+
415
+ ```tsx
416
+ <Card>
417
+ <CardHeader>
418
+ <CardTitle>Card Title</CardTitle>
419
+ <CardDescription>Optional description</CardDescription>
420
+ </CardHeader>
421
+ <CardContent>
422
+ {/* Your content */}
423
+ </CardContent>
424
+ </Card>
425
+ ```
426
+
427
+ ### Card with Sticky Frosted Header (vertical scroll)
428
+
429
+ Use the `stickyHeader` prop — no manual wiring needed:
430
+
431
+ ```tsx
432
+ <Card stickyHeader className="h-[500px]">
433
+ <CardHeader>
434
+ <CardTitle>Scrollable Content</CardTitle>
435
+ </CardHeader>
436
+ <CardContent>
437
+ {/* Long content — automatically wrapped in ScrollArea */}
438
+ </CardContent>
439
+ </Card>
440
+ ```
441
+
442
+ What `stickyHeader` does internally:
443
+ - `Card` → adds `flex flex-col`
444
+ - `CardHeader` → adds `sticky top-0 z-[var(--z-sticky-content)] flex-shrink-0` + `FrostedGlass` layer
445
+ - `CardContent` → wraps children in `<ScrollArea className="flex-1 min-h-0">`
446
+
447
+ ### Card with Horizontal Scroll (wide content)
448
+
449
+ ```tsx
450
+ <Card>
451
+ <CardHeader>
452
+ <CardTitle>Wide Content</CardTitle>
453
+ </CardHeader>
454
+ <CardContent>
455
+ <ScrollArea orientation="horizontal" className="w-full">
456
+ <div className="flex gap-4 pb-4 min-w-max">
457
+ {/* Wide row of elements */}
458
+ </div>
459
+ </ScrollArea>
460
+ </CardContent>
461
+ </Card>
462
+ ```
463
+
464
+ ### Card with Table (horizontal scroll)
465
+
466
+ ```tsx
467
+ <Card>
468
+ <CardHeader>
469
+ <CardTitle>Data Table</CardTitle>
470
+ </CardHeader>
471
+ <CardContent>
472
+ {/* TableRoot handles horizontal scroll automatically */}
473
+ <DataTable columns={columns} data={data} />
474
+ </CardContent>
475
+ </Card>
476
+ ```
477
+
478
+ ---
479
+
480
+ ## Common Pitfalls
481
+
482
+ ### 1. Using arbitrary z-index values
483
+
484
+ ```tsx
485
+ // BAD - arbitrary number
486
+ <div className="z-50">
487
+
488
+ // GOOD - semantic variable
489
+ <div className="z-[var(--z-modal)]">
490
+ ```
491
+
492
+ ### 2. Missing flex-shrink-0 on sticky headers
493
+
494
+ ```tsx
495
+ // BAD - header can be compressed
496
+ <header className="sticky top-0">
497
+
498
+ // GOOD - header maintains height
499
+ <header className="sticky top-0 flex-shrink-0">
500
+ ```
501
+
502
+ ### 3. Forgetting min-h-0 on flex scroll containers
503
+
504
+ ```tsx
505
+ // BAD - scroll may not work
506
+ <div className="flex-1 overflow-y-auto">
507
+
508
+ // GOOD - allows flex child to shrink for scroll
509
+ <div className="flex-1 min-h-0 overflow-y-auto">
510
+ ```
511
+
512
+ ### 4. Using viewport scroll instead of container scroll
513
+
514
+ ```tsx
515
+ // BAD - scrolls entire page
516
+ <body className="overflow-auto">
517
+
518
+ // GOOD - isolated scroll container
519
+ <div className="h-screen overflow-hidden">
520
+ <div className="flex-1 min-h-0 overflow-y-auto">
521
+ ```
522
+
523
+ ### 5. Card header not sticky when content scrolls
524
+
525
+ ```tsx
526
+ // BAD - manual wiring, easy to miss a class
527
+ <Card className="flex flex-col max-h-[500px]">
528
+ <CardHeader className="sticky top-0 ...">
529
+ <CardContent className="flex-1 overflow-y-auto">
530
+
531
+ // GOOD - one prop handles everything
532
+ <Card stickyHeader className="h-[500px]">
533
+ <CardHeader> {/* automatically sticky + frosted glass */}
534
+ <CardContent> {/* automatically wrapped in ScrollArea */}
535
+ ```
536
+
537
+ ### 6. Horizontal overflow breaking page layout
538
+
539
+ ```tsx
540
+ // BAD - content overflows the page
541
+ <div className="w-full">
542
+ <WideContent />
543
+ </div>
544
+
545
+ // GOOD - contained with ScrollArea
546
+ <ScrollArea orientation="horizontal" className="w-full">
547
+ <div className="min-w-max">
548
+ <WideContent />
549
+ </div>
550
+ </ScrollArea>
551
+
552
+ // ALSO GOOD - for tables (uses native overflow)
553
+ <TableRoot>
554
+ <Table>...</Table>
555
+ </TableRoot>
556
+ ```
557
+
558
+ ### 7. Forgetting pb padding for horizontal scrollbar
559
+
560
+ ```tsx
561
+ // BAD - scrollbar overlaps content
562
+ <ScrollArea orientation="horizontal">
563
+ <div className="flex gap-4 min-w-max">
564
+
565
+ // GOOD - padding reserves space for scrollbar
566
+ <ScrollArea orientation="horizontal">
567
+ <div className="flex gap-4 pb-4 min-w-max">
568
+ ```
569
+
570
+ ---
571
+
572
+ ## Quick Reference
573
+
574
+ ### New Page Checklist
575
+
576
+ - [ ] Use `flex flex-1 flex-col` as root container
577
+ - [ ] Apply `p-6 gap-6` for consistent spacing
578
+ - [ ] Add `min-w-0 overflow-x-hidden` to prevent horizontal blowout
579
+ - [ ] Use responsive grid for cards: `grid gap-6 md:grid-cols-2`
580
+
581
+ ### New Card Checklist
582
+
583
+ - [ ] Use `Card`, `CardHeader`, `CardContent` components
584
+ - [ ] For vertically scrollable cards: use `stickyHeader` prop + set a height
585
+ - [ ] For horizontally scrollable content: wrap in `<ScrollArea orientation="horizontal">`
586
+ - [ ] For tables: `DataTable` handles scroll automatically via `TableRoot`
587
+
588
+ ### Sticky Element Checklist
589
+
590
+ - [ ] Add `sticky top-0`
591
+ - [ ] Add `flex-shrink-0`
592
+ - [ ] Use appropriate z-index variable (`--z-sticky-page` or `--z-sticky-content`)
593
+ - [ ] Ensure parent has `overflow-y-auto` (or is a `ScrollArea`)
594
+ - [ ] Ensure flex parent has `min-h-0`
595
+
596
+ ---
597
+
598
+ ## File References
599
+
600
+ | File | Purpose |
601
+ |------|---------|
602
+ | `packages/nqui/src/index.css` | Viewport lock (`html/body/root overflow: hidden`) |
603
+ | `packages/nqui/src/styles/elevation.css` | Z-index CSS variables |
604
+ | `packages/nqui/src/components/AppLayout.tsx` | Main layout with page scroll container + sticky header |
605
+ | `packages/nqui/src/components/ui/frosted-glass.tsx` | Frosted glass effect |
606
+ | `packages/nqui/src/components/ui/card.tsx` | Card with `stickyHeader` prop (auto sticky + ScrollArea) |
607
+ | `packages/nqui/src/components/custom/enhanced-scroll-area.tsx` | ScrollArea with orientation + fade mask |
608
+ | `packages/nqui/src/components/table/Table.tsx` | TableRoot with native horizontal scroll |
609
+
610
+ ## Live Examples
611
+
612
+ | Example | Location in showcase | What it demonstrates |
613
+ |---------|---------------------|----------------------|
614
+ | Horizontal Scroll | ComponentShowcase → "Horizontal Scroll" | `ScrollArea orientation="horizontal"` with wide form fields |
615
+ | Frosted Glass Header with Scroll | ComponentShowcase → Layout Components → "Frosted Glass Header with Scroll" | `Card stickyHeader` with vertical scroll + frosted blur |
616
+ | Table horizontal scroll | ChartShowcase → "Table - Basic" | `TableRoot` / `DataTable` native overflow on narrow viewport |