@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.
- package/README.md +26 -3
- package/dist/button-CYFTFDKe.cjs +1 -0
- package/dist/button-nJvDl3w8.js +44 -0
- package/dist/calendar.cjs.js +1 -0
- package/dist/calendar.es.js +6 -0
- package/dist/carousel-DEyyJi49.js +179 -0
- package/dist/carousel-Dhhz8m5V.cjs +1 -0
- package/dist/carousel.cjs.js +1 -0
- package/dist/carousel.es.js +8 -0
- package/dist/command-palette-UHk8zZOg.cjs +45 -0
- package/dist/command-palette-d-TrdBsM.js +1778 -0
- package/dist/command.cjs.js +1 -0
- package/dist/command.es.js +13 -0
- package/dist/components/custom/color-picker.d.ts.map +1 -1
- package/dist/components/custom/command-palette.d.ts.map +1 -1
- package/dist/components/custom/enhanced-checkbox.d.ts +1 -1
- package/dist/components/custom/enhanced-checkbox.d.ts.map +1 -1
- package/dist/components/custom/enhanced-combobox.d.ts +1 -1
- package/dist/components/custom/enhanced-combobox.d.ts.map +1 -1
- package/dist/components/custom/enhanced-radio-group.d.ts.map +1 -1
- package/dist/components/custom/enhanced-scroll-area.d.ts +12 -0
- package/dist/components/custom/enhanced-scroll-area.d.ts.map +1 -1
- package/dist/components/custom/enhanced-tabs.d.ts.map +1 -1
- package/dist/components/debug/debug-panel.d.ts.map +1 -1
- package/dist/components/debug/magnifier.d.ts.map +1 -1
- package/dist/components/debug/ui-tester.d.ts.map +1 -1
- package/dist/components/ui/breadcrumb.d.ts.map +1 -1
- package/dist/components/ui/button-group.d.ts.map +1 -1
- package/dist/components/ui/checkbox.d.ts.map +1 -1
- package/dist/components/ui/combobox.d.ts +1 -1
- package/dist/components/ui/combobox.d.ts.map +1 -1
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/components/ui/item.d.ts +1 -1
- package/dist/components/ui/separator.d.ts +34 -1
- package/dist/components/ui/separator.d.ts.map +1 -1
- package/dist/components/ui/sheet.d.ts.map +1 -1
- package/dist/components/ui/sidebar.d.ts +1 -1
- package/dist/components/ui/sidebar.d.ts.map +1 -1
- package/dist/components/ui/toggle-group.d.ts +8 -2
- package/dist/components/ui/toggle-group.d.ts.map +1 -1
- package/dist/components/ui/toggle.d.ts +1 -1
- package/dist/components/ui/toggle.d.ts.map +1 -1
- package/dist/components/ui/tooltip.d.ts.map +1 -1
- package/dist/drawer-BcIxWRN8.cjs +1 -0
- package/dist/drawer-CU4lkcz7.js +119 -0
- package/dist/drawer.cjs.js +1 -0
- package/dist/drawer.es.js +13 -0
- package/dist/enhanced-calendar-5PA8CeF7.cjs +61 -0
- package/dist/enhanced-calendar-BENbxw7_.js +375 -0
- package/dist/entries/calendar.d.ts +9 -0
- package/dist/entries/calendar.d.ts.map +1 -0
- package/dist/entries/carousel.d.ts +7 -0
- package/dist/entries/carousel.d.ts.map +1 -0
- package/dist/entries/command.d.ts +9 -0
- package/dist/entries/command.d.ts.map +1 -0
- package/dist/entries/drawer.d.ts +7 -0
- package/dist/entries/drawer.d.ts.map +1 -0
- package/dist/entries/sonner.d.ts +8 -0
- package/dist/entries/sonner.d.ts.map +1 -0
- package/dist/entries/sortable.d.ts +7 -0
- package/dist/entries/sortable.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +2 -3
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/use-as-ref.d.ts +1 -1
- package/dist/hooks/use-as-ref.d.ts.map +1 -1
- package/dist/hooks/use-intersection-observer.d.ts +13 -0
- package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
- package/dist/index.d.ts +13 -37
- package/dist/index.d.ts.map +1 -1
- package/dist/keyboard-BapbM2wb.cjs +1 -0
- package/dist/keyboard-pkY42Y3a.js +39 -0
- package/dist/nqui.cjs.js +171 -802
- package/dist/nqui.es.js +15299 -72452
- package/dist/sonner-Co6YpYVs.js +546 -0
- package/dist/sonner-DbQhVp8m.cjs +330 -0
- package/dist/sonner.cjs.js +1 -0
- package/dist/sonner.es.js +6 -0
- package/dist/sortable-Cj3cdxGc.cjs +5 -0
- package/dist/sortable-wG_cXiUk.js +366 -0
- package/dist/sortable.cjs.js +1 -0
- package/dist/sortable.es.js +8 -0
- package/dist/styles.css +21 -17
- package/dist/utils-B6yFEsav.js +8 -0
- package/dist/utils-IjLH3w2e.cjs +1 -0
- package/docs/components/README.md +309 -0
- package/docs/components/nqui-accordion.md +20 -0
- package/docs/components/nqui-alert-dialog.md +31 -0
- package/docs/components/nqui-alert.md +19 -0
- package/docs/components/nqui-aspect-ratio.md +17 -0
- package/docs/components/nqui-avatar.md +18 -0
- package/docs/components/nqui-badge.md +42 -0
- package/docs/components/nqui-breadcrumb.md +24 -0
- package/docs/components/nqui-button-group.md +50 -0
- package/docs/components/nqui-button.md +56 -0
- package/docs/components/nqui-calendar.md +46 -0
- package/docs/components/nqui-card.md +31 -0
- package/docs/components/nqui-carousel.md +22 -0
- package/docs/components/nqui-checkbox.md +34 -0
- package/docs/components/nqui-code-block.md +41 -0
- package/docs/components/nqui-code-editor.md +21 -0
- package/docs/components/nqui-collapsible.md +18 -0
- package/docs/components/nqui-color-picker.md +38 -0
- package/docs/components/nqui-color-slider.md +23 -0
- package/docs/components/nqui-combobox.md +73 -0
- package/docs/components/nqui-command-palette.md +29 -0
- package/docs/components/nqui-command.md +39 -0
- package/docs/components/nqui-context-menu.md +33 -0
- package/docs/components/nqui-data-table.md +46 -0
- package/docs/components/nqui-dialog.md +36 -0
- package/docs/components/nqui-drawer.md +27 -0
- package/docs/components/nqui-dropdown-menu.md +56 -0
- package/docs/components/nqui-empty.md +22 -0
- package/docs/components/nqui-field.md +42 -0
- package/docs/components/nqui-frosted-glass.md +19 -0
- package/docs/components/nqui-hover-card.md +18 -0
- package/docs/components/nqui-input-group.md +30 -0
- package/docs/components/nqui-input-otp.md +23 -0
- package/docs/components/nqui-input.md +25 -0
- package/docs/components/nqui-item.md +25 -0
- package/docs/components/nqui-kbd.md +25 -0
- package/docs/components/nqui-label.md +16 -0
- package/docs/components/nqui-logo.md +16 -0
- package/docs/components/nqui-menubar.md +22 -0
- package/docs/components/nqui-native-select.md +28 -0
- package/docs/components/nqui-navigation-menu.md +25 -0
- package/docs/components/nqui-pagination.md +25 -0
- package/docs/components/nqui-popover.md +34 -0
- package/docs/components/nqui-progress.md +22 -0
- package/docs/components/nqui-radio-group.md +42 -0
- package/docs/components/nqui-rating.md +35 -0
- package/docs/components/nqui-resizable.md +23 -0
- package/docs/components/nqui-sandbox.md +27 -0
- package/docs/components/nqui-scroll-area.md +32 -0
- package/docs/components/nqui-select.md +53 -0
- package/docs/components/nqui-separator.md +48 -0
- package/docs/components/nqui-sheet.md +27 -0
- package/docs/components/nqui-sidebar.md +45 -0
- package/docs/components/nqui-skeleton.md +15 -0
- package/docs/components/nqui-slider.md +16 -0
- package/docs/components/nqui-snippet.md +28 -0
- package/docs/components/nqui-sortable.md +46 -0
- package/docs/components/nqui-spinner.md +16 -0
- package/docs/components/nqui-switch.md +15 -0
- package/docs/components/nqui-table-of-contents.md +37 -0
- package/docs/components/nqui-table.md +43 -0
- package/docs/components/nqui-tabs.md +35 -0
- package/docs/components/nqui-textarea.md +15 -0
- package/docs/components/nqui-toaster.md +44 -0
- package/docs/components/nqui-toggle-group.md +65 -0
- package/docs/components/nqui-toggle.md +38 -0
- package/docs/components/nqui-tooltip.md +24 -0
- package/docs/components/nqui-tracker.md +38 -0
- package/docs/internal-notes/APP_BUILDER_PACKAGE.md +86 -0
- package/docs/internal-notes/BUILD_VERIFICATION.md +174 -0
- package/docs/internal-notes/DASHBOARD_LAYOUT_DESIGN.md +1429 -0
- package/docs/internal-notes/FROSTED_GLASS_FIX.md +50 -0
- package/docs/internal-notes/INSTALLATION.md +274 -0
- package/docs/internal-notes/PEER_DEPENDENCIES.md +105 -0
- package/docs/internal-notes/PUBLISHING.md +411 -0
- package/docs/internal-notes/SKILLS-ARCHITECTURE.md +105 -0
- package/docs/internal-notes/layoutdesign.md +616 -0
- package/docs/internal-notes/progress.md +348 -0
- package/docs/internal-notes/stacked-avatar-implementation.md +38 -0
- package/package.json +104 -17
- package/scripts/cli.js +44 -0
- package/scripts/help.js +1 -0
- package/scripts/init-css.js +15 -0
- package/scripts/init-cursor.js +169 -0
- package/scripts/install-peers.js +43 -0
- package/scripts/peer-deps.js +27 -0
- package/scripts/post-install.js +73 -0
- package/scripts/publish-npmjs.js +17 -3
- package/scripts/resolve-target-dir.js +99 -0
- package/scripts/skill-templates.js +109 -0
- package/INSTALLATION.md +0 -221
- package/dist/App.d.ts +0 -3
- package/dist/App.d.ts.map +0 -1
- package/dist/assets/svg/auth-lines.d.ts +0 -4
- package/dist/assets/svg/auth-lines.d.ts.map +0 -1
- package/dist/assets/svg/logo.d.ts +0 -4
- package/dist/assets/svg/logo.d.ts.map +0 -1
- package/dist/components/AppLayout.d.ts +0 -5
- package/dist/components/AppLayout.d.ts.map +0 -1
- package/dist/components/app-builder/AppBuilder.d.ts +0 -15
- package/dist/components/app-builder/AppBuilder.d.ts.map +0 -1
- package/dist/components/app-builder/context/app-builder-context.d.ts +0 -31
- package/dist/components/app-builder/context/app-builder-context.d.ts.map +0 -1
- package/dist/components/app-builder/core/AlignmentToolbar.d.ts +0 -5
- package/dist/components/app-builder/core/AlignmentToolbar.d.ts.map +0 -1
- package/dist/components/app-builder/core/AppCanvas.d.ts +0 -9
- package/dist/components/app-builder/core/AppCanvas.d.ts.map +0 -1
- package/dist/components/app-builder/core/CanvasToolbar.d.ts +0 -7
- package/dist/components/app-builder/core/CanvasToolbar.d.ts.map +0 -1
- package/dist/components/app-builder/core/DraggableWidget.d.ts +0 -12
- package/dist/components/app-builder/core/DraggableWidget.d.ts.map +0 -1
- package/dist/components/app-builder/core/WidgetConfigurator.d.ts +0 -6
- package/dist/components/app-builder/core/WidgetConfigurator.d.ts.map +0 -1
- package/dist/components/app-builder/core/WidgetPalette.d.ts +0 -6
- package/dist/components/app-builder/core/WidgetPalette.d.ts.map +0 -1
- package/dist/components/app-builder/core/WidgetRenderer.d.ts +0 -3
- package/dist/components/app-builder/core/WidgetRenderer.d.ts.map +0 -1
- package/dist/components/app-builder/core/index.d.ts +0 -8
- package/dist/components/app-builder/core/index.d.ts.map +0 -1
- package/dist/components/app-builder/essentials/button.d.ts +0 -3
- package/dist/components/app-builder/essentials/button.d.ts.map +0 -1
- package/dist/components/app-builder/essentials/container.d.ts +0 -3
- package/dist/components/app-builder/essentials/container.d.ts.map +0 -1
- package/dist/components/app-builder/essentials/index.d.ts +0 -3
- package/dist/components/app-builder/essentials/index.d.ts.map +0 -1
- package/dist/components/app-builder/hooks/index.d.ts +0 -3
- package/dist/components/app-builder/hooks/index.d.ts.map +0 -1
- package/dist/components/app-builder/hooks/use-app-builder.d.ts +0 -3
- package/dist/components/app-builder/hooks/use-app-builder.d.ts.map +0 -1
- package/dist/components/app-builder/hooks/use-canvas-state.d.ts +0 -24
- package/dist/components/app-builder/hooks/use-canvas-state.d.ts.map +0 -1
- package/dist/components/app-builder/index.d.ts +0 -19
- package/dist/components/app-builder/index.d.ts.map +0 -1
- package/dist/components/app-builder/registry/create-registry.d.ts +0 -10
- package/dist/components/app-builder/registry/create-registry.d.ts.map +0 -1
- package/dist/components/app-builder/registry/default-registry.d.ts +0 -6
- package/dist/components/app-builder/registry/default-registry.d.ts.map +0 -1
- package/dist/components/app-builder/registry/index.d.ts +0 -4
- package/dist/components/app-builder/registry/index.d.ts.map +0 -1
- package/dist/components/app-builder/registry/registry-helpers.d.ts +0 -22
- package/dist/components/app-builder/registry/registry-helpers.d.ts.map +0 -1
- package/dist/components/app-builder/types.d.ts +0 -64
- package/dist/components/app-builder/types.d.ts.map +0 -1
- package/dist/components/app-builder/utils/collision-detection.d.ts +0 -26
- package/dist/components/app-builder/utils/collision-detection.d.ts.map +0 -1
- package/dist/components/app-builder/utils/index.d.ts +0 -2
- package/dist/components/app-builder/utils/index.d.ts.map +0 -1
- package/dist/components/app-sidebar.d.ts +0 -4
- package/dist/components/app-sidebar.d.ts.map +0 -1
- package/dist/components/blocks/chart-compositions/chart-composition-01.d.ts +0 -2
- package/dist/components/blocks/chart-compositions/chart-composition-01.d.ts.map +0 -1
- package/dist/components/blocks/chart-compositions/chart-composition-02.d.ts +0 -2
- package/dist/components/blocks/chart-compositions/chart-composition-02.d.ts.map +0 -1
- package/dist/components/blocks/chart-compositions/chart-composition-03.d.ts +0 -2
- package/dist/components/blocks/chart-compositions/chart-composition-03.d.ts.map +0 -1
- package/dist/components/blocks/chart-compositions/index.d.ts +0 -4
- package/dist/components/blocks/chart-compositions/index.d.ts.map +0 -1
- package/dist/components/blocks/index.d.ts +0 -3
- package/dist/components/blocks/index.d.ts.map +0 -1
- package/dist/components/blocks/tables/index.d.ts +0 -4
- package/dist/components/blocks/tables/index.d.ts.map +0 -1
- package/dist/components/blocks/tables/table-01.d.ts +0 -2
- package/dist/components/blocks/tables/table-01.d.ts.map +0 -1
- package/dist/components/blocks/tables/table-02.d.ts +0 -2
- package/dist/components/blocks/tables/table-02.d.ts.map +0 -1
- package/dist/components/blocks/tables/table-03.d.ts +0 -2
- package/dist/components/blocks/tables/table-03.d.ts.map +0 -1
- package/dist/components/chart/area-chart/AreaChart.d.ts +0 -57
- package/dist/components/chart/area-chart/AreaChart.d.ts.map +0 -1
- package/dist/components/chart/area-chart/index.d.ts +0 -3
- package/dist/components/chart/area-chart/index.d.ts.map +0 -1
- package/dist/components/chart/bar-chart/BarChart.d.ts +0 -62
- package/dist/components/chart/bar-chart/BarChart.d.ts.map +0 -1
- package/dist/components/chart/bar-chart/index.d.ts +0 -3
- package/dist/components/chart/bar-chart/index.d.ts.map +0 -1
- package/dist/components/chart/bar-list/BarList.d.ts +0 -23
- package/dist/components/chart/bar-list/BarList.d.ts.map +0 -1
- package/dist/components/chart/bar-list/index.d.ts +0 -3
- package/dist/components/chart/bar-list/index.d.ts.map +0 -1
- package/dist/components/chart/category-bar/CategoryBar.d.ts +0 -15
- package/dist/components/chart/category-bar/CategoryBar.d.ts.map +0 -1
- package/dist/components/chart/category-bar/index.d.ts +0 -3
- package/dist/components/chart/category-bar/index.d.ts.map +0 -1
- package/dist/components/chart/combo-chart/ComboChart.d.ts +0 -67
- package/dist/components/chart/combo-chart/ComboChart.d.ts.map +0 -1
- package/dist/components/chart/combo-chart/index.d.ts +0 -3
- package/dist/components/chart/combo-chart/index.d.ts.map +0 -1
- package/dist/components/chart/donut-chart/DonutChart.d.ts +0 -37
- package/dist/components/chart/donut-chart/DonutChart.d.ts.map +0 -1
- package/dist/components/chart/donut-chart/index.d.ts +0 -3
- package/dist/components/chart/donut-chart/index.d.ts.map +0 -1
- package/dist/components/chart/index.d.ts +0 -19
- package/dist/components/chart/index.d.ts.map +0 -1
- package/dist/components/chart/line-chart/LineChart.d.ts +0 -55
- package/dist/components/chart/line-chart/LineChart.d.ts.map +0 -1
- package/dist/components/chart/line-chart/index.d.ts +0 -3
- package/dist/components/chart/line-chart/index.d.ts.map +0 -1
- package/dist/components/chart/progress-circle/ProgressCircle.d.ts +0 -92
- package/dist/components/chart/progress-circle/ProgressCircle.d.ts.map +0 -1
- package/dist/components/chart/progress-circle/index.d.ts +0 -3
- package/dist/components/chart/progress-circle/index.d.ts.map +0 -1
- package/dist/components/chart/spark-chart/SparkChart.d.ts +0 -40
- package/dist/components/chart/spark-chart/SparkChart.d.ts.map +0 -1
- package/dist/components/chart/spark-chart/index.d.ts +0 -3
- package/dist/components/chart/spark-chart/index.d.ts.map +0 -1
- package/dist/components/component-example.d.ts +0 -2
- package/dist/components/component-example.d.ts.map +0 -1
- package/dist/components/custom/enhanced-separator.d.ts +0 -36
- package/dist/components/custom/enhanced-separator.d.ts.map +0 -1
- package/dist/components/custom/segmented-control.d.ts +0 -48
- package/dist/components/custom/segmented-control.d.ts.map +0 -1
- package/dist/components/example.d.ts +0 -7
- package/dist/components/example.d.ts.map +0 -1
- package/dist/components/login-form.d.ts +0 -2
- package/dist/components/login-form.d.ts.map +0 -1
- package/dist/components/nav-user.d.ts +0 -8
- package/dist/components/nav-user.d.ts.map +0 -1
- package/dist/components/pm/gantt/contexts.d.ts +0 -13
- package/dist/components/pm/gantt/contexts.d.ts.map +0 -1
- package/dist/components/pm/gantt/gantt-columns.d.ts +0 -7
- package/dist/components/pm/gantt/gantt-columns.d.ts.map +0 -1
- package/dist/components/pm/gantt/gantt-demo.d.ts +0 -2
- package/dist/components/pm/gantt/gantt-demo.d.ts.map +0 -1
- package/dist/components/pm/gantt/gantt-dependencies.d.ts +0 -23
- package/dist/components/pm/gantt/gantt-dependencies.d.ts.map +0 -1
- package/dist/components/pm/gantt/gantt-features.d.ts +0 -9
- package/dist/components/pm/gantt/gantt-features.d.ts.map +0 -1
- package/dist/components/pm/gantt/gantt-header.d.ts +0 -5
- package/dist/components/pm/gantt/gantt-header.d.ts.map +0 -1
- package/dist/components/pm/gantt/gantt-markers.d.ts +0 -11
- package/dist/components/pm/gantt/gantt-markers.d.ts.map +0 -1
- package/dist/components/pm/gantt/gantt-modals.d.ts +0 -5
- package/dist/components/pm/gantt/gantt-modals.d.ts.map +0 -1
- package/dist/components/pm/gantt/gantt-provider.d.ts +0 -5
- package/dist/components/pm/gantt/gantt-provider.d.ts.map +0 -1
- package/dist/components/pm/gantt/gantt-setting-modal.d.ts +0 -4
- package/dist/components/pm/gantt/gantt-setting-modal.d.ts.map +0 -1
- package/dist/components/pm/gantt/gantt-sidebar.d.ts +0 -7
- package/dist/components/pm/gantt/gantt-sidebar.d.ts.map +0 -1
- package/dist/components/pm/gantt/gantt-toolbar.d.ts +0 -29
- package/dist/components/pm/gantt/gantt-toolbar.d.ts.map +0 -1
- package/dist/components/pm/gantt/index.d.ts +0 -16
- package/dist/components/pm/gantt/index.d.ts.map +0 -1
- package/dist/components/pm/gantt/types.d.ts +0 -299
- package/dist/components/pm/gantt/types.d.ts.map +0 -1
- package/dist/components/pm/gantt/utils.d.ts +0 -29
- package/dist/components/pm/gantt/utils.d.ts.map +0 -1
- package/dist/components/pm/index.d.ts +0 -13
- package/dist/components/pm/index.d.ts.map +0 -1
- package/dist/components/pm/mockdata.d.ts +0 -13
- package/dist/components/pm/mockdata.d.ts.map +0 -1
- package/dist/components/pm/pm-column-templates.d.ts +0 -30
- package/dist/components/pm/pm-column-templates.d.ts.map +0 -1
- package/dist/components/pm/pm-data-utils.d.ts +0 -82
- package/dist/components/pm/pm-data-utils.d.ts.map +0 -1
- package/dist/components/pm/pm-definition.d.ts +0 -75
- package/dist/components/pm/pm-definition.d.ts.map +0 -1
- package/dist/components/pm/pm-theme-context.d.ts +0 -17
- package/dist/components/pm/pm-theme-context.d.ts.map +0 -1
- package/dist/components/pm/pm-types.d.ts +0 -81
- package/dist/components/pm/pm-types.d.ts.map +0 -1
- package/dist/components/pm/project-table-view.d.ts +0 -17
- package/dist/components/pm/project-table-view.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid-cell-variants.d.ts +0 -14
- package/dist/components/pm/table/data-grid-cell-variants.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid-cell-wrapper.d.ts +0 -9
- package/dist/components/pm/table/data-grid-cell-wrapper.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid-cell.d.ts +0 -5
- package/dist/components/pm/table/data-grid-cell.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid-column-header.d.ts +0 -10
- package/dist/components/pm/table/data-grid-column-header.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid-context-menu.d.ts +0 -10
- package/dist/components/pm/table/data-grid-context-menu.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid-filter-menu.d.ts +0 -10
- package/dist/components/pm/table/data-grid-filter-menu.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid-keyboard-shortcuts.d.ts +0 -12
- package/dist/components/pm/table/data-grid-keyboard-shortcuts.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid-paste-dialog.d.ts +0 -9
- package/dist/components/pm/table/data-grid-paste-dialog.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid-row-height-menu.d.ts +0 -10
- package/dist/components/pm/table/data-grid-row-height-menu.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid-row.d.ts +0 -27
- package/dist/components/pm/table/data-grid-row.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid-search.d.ts +0 -8
- package/dist/components/pm/table/data-grid-search.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid-select-column.d.ts +0 -11
- package/dist/components/pm/table/data-grid-select-column.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid-skeleton.d.ts +0 -12
- package/dist/components/pm/table/data-grid-skeleton.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid-sort-menu.d.ts +0 -10
- package/dist/components/pm/table/data-grid-sort-menu.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid-view-menu.d.ts +0 -10
- package/dist/components/pm/table/data-grid-view-menu.d.ts.map +0 -1
- package/dist/components/pm/table/data-grid.d.ts +0 -11
- package/dist/components/pm/table/data-grid.d.ts.map +0 -1
- package/dist/components/shadcn-studio/blocks/login-page-05/login-form.d.ts +0 -3
- package/dist/components/shadcn-studio/blocks/login-page-05/login-form.d.ts.map +0 -1
- package/dist/components/shadcn-studio/blocks/login-page-05/login-page-05.d.ts +0 -3
- package/dist/components/shadcn-studio/blocks/login-page-05/login-page-05.d.ts.map +0 -1
- package/dist/components/shadcn-studio/logo.d.ts +0 -5
- package/dist/components/shadcn-studio/logo.d.ts.map +0 -1
- package/dist/components/showcase/app-builder/app-builder-context.d.ts +0 -16
- package/dist/components/showcase/app-builder/app-builder-context.d.ts.map +0 -1
- package/dist/components/showcase/app-builder/app-canvas.d.ts +0 -11
- package/dist/components/showcase/app-builder/app-canvas.d.ts.map +0 -1
- package/dist/components/showcase/app-builder/widget-configurator.d.ts +0 -10
- package/dist/components/showcase/app-builder/widget-configurator.d.ts.map +0 -1
- package/dist/components/showcase/app-builder/widget-palette.d.ts +0 -6
- package/dist/components/showcase/app-builder/widget-palette.d.ts.map +0 -1
- package/dist/components/showcase/app-builder/widget-registry.d.ts +0 -29
- package/dist/components/showcase/app-builder/widget-registry.d.ts.map +0 -1
- package/dist/components/showcase/app-builder/widget-renderer.d.ts +0 -7
- package/dist/components/showcase/app-builder/widget-renderer.d.ts.map +0 -1
- package/dist/components/table/DataTable.d.ts +0 -71
- package/dist/components/table/DataTable.d.ts.map +0 -1
- package/dist/components/table/Table.d.ts +0 -12
- package/dist/components/table/Table.d.ts.map +0 -1
- package/dist/components/table/data-table-helpers.d.ts +0 -49
- package/dist/components/table/data-table-helpers.d.ts.map +0 -1
- package/dist/components/table/index.d.ts +0 -5
- package/dist/components/table/index.d.ts.map +0 -1
- package/dist/components/theme-toggle.d.ts +0 -2
- package/dist/components/theme-toggle.d.ts.map +0 -1
- package/dist/components/ui/chart.d.ts +0 -41
- package/dist/components/ui/chart.d.ts.map +0 -1
- package/dist/components/ui/shadcn-io/code-block/index.d.ts +0 -67
- package/dist/components/ui/shadcn-io/code-block/index.d.ts.map +0 -1
- package/dist/components/ui/shadcn-io/code-block/server.d.ts +0 -10
- package/dist/components/ui/shadcn-io/code-block/server.d.ts.map +0 -1
- package/dist/components/ui/shadcn-io/code-editor/index.d.ts +0 -35
- package/dist/components/ui/shadcn-io/code-editor/index.d.ts.map +0 -1
- package/dist/components/ui/shadcn-io/sandbox/index.d.ts +0 -38
- package/dist/components/ui/shadcn-io/sandbox/index.d.ts.map +0 -1
- package/dist/components/ui/shadcn-io/snippet/index.d.ts +0 -21
- package/dist/components/ui/shadcn-io/snippet/index.d.ts.map +0 -1
- package/dist/hooks/use-chart-highlight.d.ts +0 -43
- package/dist/hooks/use-chart-highlight.d.ts.map +0 -1
- package/dist/hooks/use-data-grid.d.ts +0 -59
- package/dist/hooks/use-data-grid.d.ts.map +0 -1
- package/dist/hooks/use-on-window-resize.d.ts +0 -2
- package/dist/hooks/use-on-window-resize.d.ts.map +0 -1
- package/dist/lib/data-grid-filters.d.ts +0 -29
- package/dist/lib/data-grid-filters.d.ts.map +0 -1
- package/dist/lib/data-grid.d.ts +0 -47
- package/dist/lib/data-grid.d.ts.map +0 -1
- package/dist/main.d.ts +0 -3
- package/dist/main.d.ts.map +0 -1
- package/dist/mockdata/chartData.d.ts +0 -71
- package/dist/mockdata/chartData.d.ts.map +0 -1
- package/dist/mockdata/toc.d.ts +0 -23
- package/dist/mockdata/toc.d.ts.map +0 -1
- package/dist/pages/AppBuilder.d.ts +0 -2
- package/dist/pages/AppBuilder.d.ts.map +0 -1
- package/dist/pages/ChartShowcase.d.ts +0 -2
- package/dist/pages/ChartShowcase.d.ts.map +0 -1
- package/dist/pages/ComponentShowcase.d.ts +0 -2
- package/dist/pages/ComponentShowcase.d.ts.map +0 -1
- package/dist/pages/DataTableShowcase.d.ts +0 -2
- package/dist/pages/DataTableShowcase.d.ts.map +0 -1
- package/dist/pages/Drafts.d.ts +0 -2
- package/dist/pages/Drafts.d.ts.map +0 -1
- package/dist/pages/GanttShowcase.d.ts +0 -2
- package/dist/pages/GanttShowcase.d.ts.map +0 -1
- package/dist/pages/Inbox.d.ts +0 -2
- package/dist/pages/Inbox.d.ts.map +0 -1
- package/dist/pages/Junk.d.ts +0 -2
- package/dist/pages/Junk.d.ts.map +0 -1
- package/dist/pages/Sent.d.ts +0 -2
- package/dist/pages/Sent.d.ts.map +0 -1
- package/dist/pages/Settings.d.ts +0 -2
- package/dist/pages/Settings.d.ts.map +0 -1
- package/dist/pages/Trash.d.ts +0 -2
- package/dist/pages/Trash.d.ts.map +0 -1
- package/dist/pages/gantt-data.d.ts +0 -16
- package/dist/pages/gantt-data.d.ts.map +0 -1
- package/dist/stories/mockData.d.ts +0 -157
- package/dist/stories/mockData.d.ts.map +0 -1
- package/dist/types/data-grid.d.ts +0 -179
- package/dist/types/data-grid.d.ts.map +0 -1
- package/dist/utils/chart-colors.d.ts +0 -62
- package/dist/utils/chart-colors.d.ts.map +0 -1
- package/dist/utils/chart-highlight.d.ts +0 -34
- package/dist/utils/chart-highlight.d.ts.map +0 -1
- package/dist/utils/chart-utils.d.ts +0 -2
- package/dist/utils/chart-utils.d.ts.map +0 -1
- package/dist/utils/focus-ring.d.ts +0 -2
- package/dist/utils/focus-ring.d.ts.map +0 -1
- package/dist/utils/get-y-axis-domain.d.ts +0 -2
- package/dist/utils/get-y-axis-domain.d.ts.map +0 -1
- package/dist/utils/index.d.ts +0 -10
- 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 |
|