@nxgt/material 3.79.1 → 3.81.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/CHANGELOG.md +94 -0
- package/README.md +48 -8
- package/dist/{alert-dialog-653apk3f.js → alert-dialog-DOZ0SfQs.js} +1 -1
- package/dist/{async-slice-CXLbQuOc.js → async-slice-BfVokA46.js} +1 -1
- package/dist/{button-3op3rtZh.js → button-CSKUtMI3.js} +2 -2
- package/dist/{calculator-KqIMBXSh.js → calculator-Cv00UQgR.js} +10 -10
- package/dist/calculator-field.js +6 -6
- package/dist/{calculator-segment-BlJE1LaS.js → calculator-segment-CwnC2cV_.js} +1 -1
- package/dist/calculator.js +1 -1
- package/dist/charts.js +3 -3
- package/dist/{chip-MuKDwtkG.js → chip-BGn0V6Pt.js} +3 -3
- package/dist/{code-editor-Bp2RrdNx.js → code-editor-B25-mWhb.js} +4 -4
- package/dist/code-editor.js +4 -4
- package/dist/{code-language-items-B7WR5ua_.js → code-language-items-oRjtO3qV.js} +2 -2
- package/dist/components/base-content.css +11 -0
- package/dist/components/components.css +5 -0
- package/dist/components/ui/actions/fab/fab-dock.css +19 -6
- package/dist/components/ui/collections/data-table/data-table-items-tiles.css +27 -1
- package/dist/components/ui/display/tube-cap/tube-cap.css +87 -0
- package/dist/components/ui/layout/app-search/app-search.css +62 -0
- package/dist/components/ui/layout/app-shell/activity-backdrop.css +10 -2
- package/dist/components/ui/layout/app-shell/app-header.css +108 -0
- package/dist/components/ui/layout/navigation-toolbar/navigation-toolbar.css +43 -0
- package/dist/{components-CTyNC_zW.js → components-B00kDHzJ.js} +23101 -18734
- package/dist/components.js +37 -37
- package/dist/{conversion-variant-BDFAxqe9.js → conversion-variant-wZd-G6xR.js} +3 -3
- package/dist/{currency-field-DWHB5oms.js → currency-field-DizBTAat.js} +4 -4
- package/dist/{date.utils-DUvqcjan.js → date.utils-JTEIo3mM.js} +98 -98
- package/dist/{dialog-Bm5LvVlB.js → dialog-B-3s-oXt.js} +3 -3
- package/dist/dnd.js +2 -2
- package/dist/{dropdown-menu-xlZ6NYUA.js → dropdown-menu-C6rcYGB9.js} +1 -1
- package/dist/editor.js +19 -19
- package/dist/{empty-state-C0kviQdW.js → empty-state-CSkghnD9.js} +1 -1
- package/dist/{financial-variant-CggTpad2.js → financial-variant-igpGRbGw.js} +5 -5
- package/dist/{hooks-Dg94jPRq.js → hooks-DvIsom2p.js} +2 -2
- package/dist/hooks.js +9 -8
- package/dist/{hover-card-B1g55Hi6.js → hover-card-DuaVVKMb.js} +1 -1
- package/dist/i18n.js +3 -3
- package/dist/{icon-badge-BcW66bRk.js → icon-badge-3ThP6EOl.js} +1 -1
- package/dist/{icon-button-Cogxy1cy.js → icon-button-4PKlaI1g.js} +2 -2
- package/dist/lib/components/ui/actions/button/button-tones.d.ts +17 -16
- package/dist/lib/components/ui/collections/day-grouped-list/day-grouped-list.d.ts +6 -1
- package/dist/lib/components/ui/collections/filter/use-filter-field-config.d.ts +2 -0
- package/dist/lib/components/ui/collections/server-table/types-states.d.ts +5 -1
- package/dist/lib/components/ui/display/index.d.ts +1 -0
- package/dist/lib/components/ui/display/tube-cap/index.d.ts +2 -0
- package/dist/lib/components/ui/display/tube-cap/tube-cap.d.ts +27 -0
- package/dist/lib/components/ui/display/tube-cap/tube-cap.kinds.d.ts +7 -0
- package/dist/lib/components/ui/fields/contacts/placeholders.d.ts +1 -1
- package/dist/lib/components/ui/fields/repeatable-group/partials/repeatable-group-row.d.ts +3 -1
- package/dist/lib/components/ui/fields/repeatable-group/partials/repeatable-group-rows.d.ts +2 -1
- package/dist/lib/components/ui/fields/repeatable-group/repeatable-group.d.ts +1 -1
- package/dist/lib/components/ui/fields/repeatable-group/types.d.ts +7 -0
- package/dist/lib/components/ui/layout/app-bar/top-app-bar.d.ts +18 -3
- package/dist/lib/components/ui/layout/app-search/app-search-bar.d.ts +11 -0
- package/dist/lib/components/ui/layout/app-search/app-search.types.d.ts +47 -0
- package/dist/lib/components/ui/layout/app-search/index.d.ts +3 -0
- package/dist/lib/components/ui/layout/app-search/partials/on-phone.d.ts +2 -0
- package/dist/lib/components/ui/layout/app-search/partials/phone-search.d.ts +3 -0
- package/dist/lib/components/ui/layout/app-search/partials/pill-search.d.ts +3 -0
- package/dist/lib/components/ui/layout/app-search/pill-form.d.ts +18 -0
- package/dist/lib/components/ui/layout/app-search/search-panel.d.ts +24 -0
- package/dist/lib/components/ui/layout/app-search/search-results.d.ts +14 -0
- package/dist/lib/components/ui/layout/app-search/search-shortcut.d.ts +15 -0
- package/dist/lib/components/ui/layout/app-search/search-view.d.ts +22 -0
- package/dist/lib/components/ui/layout/app-search/use-pill-panel.d.ts +22 -0
- package/dist/lib/components/ui/layout/app-search/use-search-text.d.ts +8 -0
- package/dist/lib/components/ui/layout/app-shell/activity-app-bar.d.ts +35 -0
- package/dist/lib/components/ui/layout/app-shell/activity-chrome.d.ts +26 -3
- package/dist/lib/components/ui/layout/app-shell/activity-column-props.d.ts +22 -0
- package/dist/lib/components/ui/layout/app-shell/activity-column.d.ts +10 -2
- package/dist/lib/components/ui/layout/app-shell/activity-layout-navigation.types.d.ts +94 -0
- package/dist/lib/components/ui/layout/app-shell/activity-layout.d.ts +8 -1
- package/dist/lib/components/ui/layout/app-shell/activity-layout.types.d.ts +2 -1
- package/dist/lib/components/ui/layout/app-shell/activity-rails.d.ts +16 -0
- package/dist/lib/components/ui/layout/app-shell/activity-sidebar-lane.d.ts +22 -0
- package/dist/lib/components/ui/layout/app-shell/activity-top-nav.d.ts +11 -0
- package/dist/lib/components/ui/layout/app-shell/activity-two-level-lane.d.ts +14 -0
- package/dist/lib/components/ui/layout/app-shell/app-back.d.ts +22 -0
- package/dist/lib/components/ui/layout/app-shell/app-header-row.d.ts +3 -0
- package/dist/lib/components/ui/layout/app-shell/app-header.d.ts +33 -1
- package/dist/lib/components/ui/layout/app-shell/app-shell.utils.d.ts +8 -0
- package/dist/lib/components/ui/layout/app-shell/app-sidebar-entries.d.ts +13 -0
- package/dist/lib/components/ui/layout/app-shell/app-sidebar-label-item.d.ts +3 -1
- package/dist/lib/components/ui/layout/app-shell/bottom-chrome.d.ts +13 -0
- package/dist/lib/components/ui/layout/app-shell/header-title.d.ts +18 -2
- package/dist/lib/components/ui/layout/app-shell/header.utils.d.ts +37 -0
- package/dist/lib/components/ui/layout/app-shell/index.d.ts +3 -0
- package/dist/lib/components/ui/layout/app-shell/navigation-parts.d.ts +38 -0
- package/dist/lib/components/ui/layout/app-shell/navigation.utils.d.ts +36 -0
- package/dist/lib/components/ui/layout/app-shell/page-title-scope.d.ts +14 -0
- package/dist/lib/components/ui/layout/app-shell/page-title.d.ts +12 -1
- package/dist/lib/components/ui/layout/app-shell/shell-scroll.d.ts +32 -0
- package/dist/lib/components/ui/layout/app-shell/sticky-offset.d.ts +8 -0
- package/dist/lib/components/ui/layout/app-shell/types.d.ts +14 -0
- package/dist/lib/components/ui/layout/app-shell/use-focus-while-hidden.d.ts +9 -0
- package/dist/lib/components/ui/layout/app-shell/use-header-height.d.ts +12 -0
- package/dist/lib/components/ui/layout/app-shell/use-header-scroll.d.ts +19 -0
- package/dist/lib/components/ui/layout/app-shell/use-shell-header.d.ts +20 -0
- package/dist/lib/components/ui/layout/auth-card/auth-card-split.d.ts +14 -0
- package/dist/lib/components/ui/layout/auth-card/auth-card.d.ts +13 -1
- package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid-context.d.ts +21 -0
- package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid.d.ts +9 -0
- package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid.state.d.ts +30 -0
- package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid.tiles.d.ts +8 -0
- package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid.types.d.ts +50 -0
- package/dist/lib/components/ui/layout/dashboard-grid/dashboard-grid.utils.d.ts +70 -0
- package/dist/lib/components/ui/layout/dashboard-grid/dashboard-tile.d.ts +7 -0
- package/dist/lib/components/ui/layout/dashboard-grid/index.d.ts +4 -0
- package/dist/lib/components/ui/layout/dashboard-grid/partials/dashboard-announcer.d.ts +6 -0
- package/dist/lib/components/ui/layout/dashboard-grid/partials/dashboard-edit-bar.d.ts +11 -0
- package/dist/lib/components/ui/layout/dashboard-grid/partials/dashboard-move-buttons.d.ts +9 -0
- package/dist/lib/components/ui/layout/dashboard-grid/partials/dashboard-toolbar.d.ts +7 -0
- package/dist/lib/components/ui/layout/dashboard-grid/use-dashboard-grid.d.ts +21 -0
- package/dist/lib/components/ui/layout/dashboard-grid/use-dashboard-moves.d.ts +22 -0
- package/dist/lib/components/ui/layout/doc/doc-context.d.ts +2 -0
- package/dist/lib/components/ui/layout/doc/doc.d.ts +5 -0
- package/dist/lib/components/ui/layout/doc/index.d.ts +1 -1
- package/dist/lib/components/ui/layout/doc/partials/doc-embedded-bar.d.ts +9 -0
- package/dist/lib/components/ui/layout/doc/partials/doc-embedded.d.ts +8 -0
- package/dist/lib/components/ui/layout/doc/use-doc.d.ts +9 -1
- package/dist/lib/components/ui/layout/editor-layout/editor-layout.d.ts +14 -0
- package/dist/lib/components/ui/layout/editor-layout/editor-layout.types.d.ts +31 -0
- package/dist/lib/components/ui/layout/editor-layout/index.d.ts +4 -0
- package/dist/lib/components/ui/layout/editor-layout/partials/editor-layout-body.d.ts +11 -0
- package/dist/lib/components/ui/layout/editor-layout/partials/editor-layout-canvas.d.ts +8 -0
- package/dist/lib/components/ui/layout/editor-layout/partials/editor-layout-context.d.ts +12 -0
- package/dist/lib/components/ui/layout/editor-layout/partials/editor-layout-start.d.ts +8 -0
- package/dist/lib/components/ui/layout/editor-layout/partials/editor-layout-triggers.d.ts +10 -0
- package/dist/lib/components/ui/layout/editor-layout/partials/use-editor-layout-names.d.ts +8 -0
- package/dist/lib/components/ui/layout/editor-layout/partials/use-editor-layout-state.d.ts +21 -0
- package/dist/lib/components/ui/layout/index.d.ts +9 -0
- package/dist/lib/components/ui/layout/landing/index.d.ts +6 -0
- package/dist/lib/components/ui/layout/landing/landing-layout.d.ts +15 -0
- package/dist/lib/components/ui/layout/landing/landing-layout.types.d.ts +27 -0
- package/dist/lib/components/ui/layout/landing/landing-section.d.ts +12 -0
- package/dist/lib/components/ui/layout/landing/landing-section.types.d.ts +32 -0
- package/dist/lib/components/ui/layout/landing/landing.classes.d.ts +20 -0
- package/dist/lib/components/ui/layout/landing/partials/landing-header.d.ts +11 -0
- package/dist/lib/components/ui/layout/landing/partials/landing-section-intro.d.ts +13 -0
- package/dist/lib/components/ui/layout/landing/partials/site-footer-group.d.ts +8 -0
- package/dist/lib/components/ui/layout/landing/site-footer.d.ts +13 -0
- package/dist/lib/components/ui/layout/landing/site-footer.types.d.ts +29 -0
- package/dist/lib/components/ui/layout/list-details-layout/internal.d.ts +2 -0
- package/dist/lib/components/ui/layout/list-details-layout/list-details-layout.d.ts +9 -17
- package/dist/lib/components/ui/layout/list-details-layout/partials/history-mark.d.ts +2 -0
- package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-context.d.ts +17 -1
- package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-history.d.ts +8 -0
- package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-inspector.d.ts +21 -0
- package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-layout.types.d.ts +47 -0
- package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-resizer.d.ts +9 -0
- package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-root.d.ts +3 -0
- package/dist/lib/components/ui/layout/list-details-layout/partials/list-details-trigger.d.ts +13 -4
- package/dist/lib/components/ui/layout/list-details-layout/partials/use-inspector-focus.d.ts +8 -0
- package/dist/lib/components/ui/layout/list-details-layout/partials/use-list-details-param.d.ts +26 -0
- package/dist/lib/components/ui/layout/list-details-layout/partials/use-list-details-state.d.ts +15 -0
- package/dist/lib/components/ui/layout/list-details-layout/partials/use-list-width.d.ts +16 -0
- package/dist/lib/components/ui/layout/list-details-layout/partials/use-pane-focus.d.ts +6 -4
- package/dist/lib/components/ui/layout/navigation-bar/index.d.ts +3 -0
- package/dist/lib/components/ui/layout/navigation-bar/internal.d.ts +4 -0
- package/dist/lib/components/ui/layout/navigation-bar/navigation-bar.classes.d.ts +14 -0
- package/dist/lib/components/ui/layout/navigation-bar/navigation-bar.d.ts +35 -0
- package/dist/lib/components/ui/layout/navigation-bar/navigation-bar.utils.d.ts +19 -0
- package/dist/lib/components/ui/layout/navigation-bar/partials/bar-badge.d.ts +5 -0
- package/dist/lib/components/ui/layout/navigation-bar/partials/bar-entry.d.ts +12 -0
- package/dist/lib/components/ui/layout/navigation-bar/partials/navigation-bar-item.d.ts +22 -0
- package/dist/lib/components/ui/layout/navigation-bar/partials/navigation-bar-more.d.ts +24 -0
- package/dist/lib/components/ui/layout/navigation-bar/use-nav-bar-inset.d.ts +12 -0
- package/dist/lib/components/ui/layout/navigation-drawer/index.d.ts +5 -0
- package/dist/lib/components/ui/layout/navigation-drawer/navigation-drawer.classes.d.ts +9 -0
- package/dist/lib/components/ui/layout/navigation-drawer/navigation-drawer.d.ts +45 -0
- package/dist/lib/components/ui/layout/navigation-drawer/navigation-drawer.utils.d.ts +14 -0
- package/dist/lib/components/ui/layout/navigation-drawer/partials/navigation-drawer-body.d.ts +3 -0
- package/dist/lib/components/ui/layout/navigation-drawer/partials/navigation-drawer-item.d.ts +20 -0
- package/dist/lib/components/ui/layout/navigation-drawer/partials/navigation-drawer-modal.d.ts +17 -0
- package/dist/lib/components/ui/layout/navigation-drawer/partials/navigation-drawer-section.d.ts +15 -0
- package/dist/lib/components/ui/layout/navigation-rail/index.d.ts +3 -0
- package/dist/lib/components/ui/layout/navigation-rail/navigation-rail-panel.d.ts +26 -0
- package/dist/lib/components/ui/layout/navigation-rail/navigation-rail.classes.d.ts +23 -0
- package/dist/lib/components/ui/layout/navigation-rail/navigation-rail.d.ts +42 -1
- package/dist/lib/components/ui/layout/navigation-rail/navigation-rail.utils.d.ts +4 -0
- package/dist/lib/components/ui/layout/navigation-rail/partials/navigation-rail-body.d.ts +3 -0
- package/dist/lib/components/ui/layout/navigation-rail/partials/navigation-rail-item.d.ts +20 -0
- package/dist/lib/components/ui/layout/navigation-rail/partials/navigation-rail-panel-item.d.ts +7 -0
- package/dist/lib/components/ui/layout/navigation-rail/partials/navigation-rail-toggle.d.ts +7 -0
- package/dist/lib/components/ui/layout/navigation-rail/use-rail-expanded.d.ts +13 -0
- package/dist/lib/components/ui/layout/navigation-toolbar/index.d.ts +2 -0
- package/dist/lib/components/ui/layout/navigation-toolbar/navigation-toolbar.classes.d.ts +20 -0
- package/dist/lib/components/ui/layout/navigation-toolbar/navigation-toolbar.d.ts +51 -0
- package/dist/lib/components/ui/layout/navigation-toolbar/partials/navigation-toolbar-item.d.ts +25 -0
- package/dist/lib/components/ui/layout/navigation-toolbar/partials/navigation-toolbar-more.d.ts +3 -0
- package/dist/lib/components/ui/layout/pane-layout/internal.d.ts +3 -0
- package/dist/lib/components/ui/layout/pane-layout/pane-layout.d.ts +16 -2
- package/dist/lib/components/ui/layout/pane-layout/partials/pane-layout-classes.d.ts +7 -0
- package/dist/lib/components/ui/layout/pane-layout/partials/pane-layout-context.d.ts +13 -0
- package/dist/lib/components/ui/layout/pane-layout/partials/use-pane-layout-state.d.ts +16 -0
- package/dist/lib/components/ui/layout/pane-layout/partials/use-pane-narrow.d.ts +6 -0
- package/dist/lib/components/ui/layout/responsive-grid/index.d.ts +4 -1
- package/dist/lib/components/ui/layout/responsive-grid/responsive-grid-item.d.ts +19 -0
- package/dist/lib/components/ui/layout/responsive-grid/responsive-grid-spans.d.ts +19 -0
- package/dist/lib/components/ui/layout/responsive-grid/responsive-grid.d.ts +24 -2
- package/dist/lib/components/ui/layout/responsive-grid/responsive-grid.utils.d.ts +12 -0
- package/dist/lib/components/ui/layout/settings-layout/index.d.ts +2 -0
- package/dist/lib/components/ui/layout/settings-layout/partials/settings-link.d.ts +7 -0
- package/dist/lib/components/ui/layout/settings-layout/partials/settings-list.d.ts +11 -0
- package/dist/lib/components/ui/layout/settings-layout/partials/settings-page.d.ts +5 -0
- package/dist/lib/components/ui/layout/settings-layout/settings-layout.d.ts +10 -0
- package/dist/lib/components/ui/layout/settings-layout/settings-layout.types.d.ts +33 -0
- package/dist/lib/components/ui/layout/settings-layout/settings-layout.utils.d.ts +13 -0
- package/dist/lib/components/ui/layout/thread-layout/thread-layout-classes.d.ts +17 -0
- package/dist/lib/components/ui/layout/thread-layout/thread-layout-parts.d.ts +14 -0
- package/dist/lib/components/ui/layout/thread-layout/thread-layout-stepper.d.ts +11 -0
- package/dist/lib/components/ui/layout/thread-layout/thread-layout.d.ts +30 -3
- package/dist/lib/components/ui/layout/top-nav/index.d.ts +5 -0
- package/dist/lib/components/ui/layout/top-nav/partials/top-nav-item.d.ts +23 -0
- package/dist/lib/components/ui/layout/top-nav/partials/top-nav-menu.d.ts +22 -0
- package/dist/lib/components/ui/layout/top-nav/top-nav.classes.d.ts +10 -0
- package/dist/lib/components/ui/layout/top-nav/top-nav.d.ts +34 -0
- package/dist/lib/components/ui/layout/top-nav/top-nav.utils.d.ts +10 -0
- package/dist/lib/components/ui/media/galleries/gallery.d.ts +1 -1
- package/dist/lib/components/ui/media/galleries/lightbox-gallery.d.ts +1 -1
- package/dist/lib/components/ui/media/galleries/mini-gallery.d.ts +1 -1
- package/dist/lib/components/ui/overlays/dialog/dialog-parts.d.ts +1 -1
- package/dist/lib/components/ui/overlays/sheet/sheet-parts.d.ts +5 -0
- package/dist/lib/components/ui/selection/choice-card-group/choice-card-balance.d.ts +4 -0
- package/dist/lib/components/ui/selection/choice-card-group/choice-card-group.d.ts +3 -1
- package/dist/lib/components/ui/selection/choice-card-group/choice-card-group.types.d.ts +7 -0
- package/dist/lib/components/ui/selection/sortable-list/partials/sortable-list-body.d.ts +5 -1
- package/dist/lib/components/ui/selection/sortable-list/partials/sortable-list-row-parts.d.ts +2 -1
- package/dist/lib/components/ui/selection/sortable-list/partials/sortable-list-row-props.d.ts +8 -5
- package/dist/lib/components/ui/selection/sortable-list/partials/use-owed-focus.d.ts +10 -0
- package/dist/lib/components/ui/selection/sortable-list/sortable-list-context.d.ts +2 -0
- package/dist/lib/components/ui/selection/sortable-list/sortable-list.keyboard.d.ts +1 -1
- package/dist/lib/components/ui/widgets/event-calendar/event-calendar-context.d.ts +3 -0
- package/dist/lib/components/ui/widgets/event-calendar/event-calendar-shell.d.ts +15 -0
- package/dist/lib/components/ui/widgets/event-calendar/event-calendar-template.d.ts +9 -0
- package/dist/lib/components/ui/widgets/event-calendar/event-calendar.d.ts +7 -3
- package/dist/lib/components/ui/widgets/event-calendar/event-calendar.template.d.ts +41 -0
- package/dist/lib/components/ui/widgets/event-calendar/index.d.ts +1 -0
- package/dist/lib/components/ui/widgets/event-calendar/partials/calendar-date-nav.d.ts +2 -0
- package/dist/lib/components/ui/widgets/event-calendar/partials/calendar-lane-toggle.d.ts +5 -0
- package/dist/lib/components/ui/widgets/event-calendar/partials/time-grid-header-template.d.ts +7 -0
- package/dist/lib/components/ui/widgets/event-calendar/template.types.d.ts +73 -0
- package/dist/lib/components/ui/widgets/event-calendar/types.d.ts +2 -0
- package/dist/lib/components/ui/widgets/event-calendar/use-chip-event.d.ts +1 -0
- package/dist/lib/components/ui/widgets/event-calendar/use-drawn-events.d.ts +4 -3
- package/dist/lib/components/ui/widgets/event-calendar/use-template-calendar.d.ts +18 -0
- package/dist/lib/components/ui/widgets/event-calendar/use-template-lane.d.ts +17 -0
- package/dist/lib/components/ui/widgets/kanban/index.d.ts +1 -1
- package/dist/lib/components/ui/widgets/kanban/kanban-context.d.ts +5 -2
- package/dist/lib/components/ui/widgets/kanban/kanban.d.ts +11 -2
- package/dist/lib/components/ui/widgets/kanban/kanban.slice.d.ts +32 -0
- package/dist/lib/components/ui/widgets/kanban/kanban.utils.d.ts +9 -0
- package/dist/lib/components/ui/widgets/kanban/partials/kanban-card-preview.d.ts +3 -1
- package/dist/lib/components/ui/widgets/kanban/partials/kanban-column.d.ts +6 -0
- package/dist/lib/components/ui/widgets/kanban/partials/kanban-move-to.d.ts +13 -0
- package/dist/lib/components/ui/widgets/kanban/partials/kanban-phone-tabs.d.ts +10 -0
- package/dist/lib/components/ui/widgets/kanban/types.d.ts +7 -0
- package/dist/lib/components/ui/widgets/kanban/use-kanban-board-keys.d.ts +7 -0
- package/dist/lib/components/ui/widgets/kanban/use-kanban-item-actions.d.ts +5 -0
- package/dist/lib/components/ui/widgets/kanban/use-kanban-phone-column.d.ts +18 -0
- package/dist/lib/components/ui/widgets/kanban/use-kanban.d.ts +6 -1
- package/dist/lib/hooks/index.d.ts +1 -0
- package/dist/lib/i18n/resources/en/en.d.ts +52 -0
- package/dist/lib/i18n/resources/en/material.json.d.ts +54 -2
- package/dist/lib/i18n/resources/fr/fr.d.ts +52 -0
- package/dist/lib/i18n/resources/fr/material.json.d.ts +54 -2
- package/dist/lib/i18n/resources/resources.d.ts +104 -0
- package/dist/lib/i18n/translator.d.ts +1 -1
- package/dist/lib.js +2 -2
- package/dist/main.js +53 -52
- package/dist/map.js +7 -7
- package/dist/material.css +1 -1
- package/dist/pdf-reader.js +1 -1
- package/dist/{percent-field--WIXV5dX.js → percent-field-QwU1l2Q4.js} +1 -1
- package/dist/{picker-surface-CV09H7Nb.js → picker-surface-CiTycWgV.js} +4 -4
- package/dist/{popover-Cd7DkND4.js → popover-YmbzbKQG.js} +1 -1
- package/dist/{pos-types-DKCkOTYy.js → pos-types-BFrapNmx.js} +1 -1
- package/dist/{pos-variant-GrUfbTTP.js → pos-variant-CctfqieO.js} +4 -4
- package/dist/print.js +1 -1
- package/dist/{programmer-variant-eKJNKENL.js → programmer-variant-Dd0YOixn.js} +2 -2
- package/dist/{public-y6g4ddxd.js → public-CshR_aW7.js} +10 -10
- package/dist/{rich-code-block-CRQ0iyLb.js → rich-code-block-BuJLDoBu.js} +5 -5
- package/dist/{scientific-variant-2y3UxAAU.js → scientific-variant-CjErQxuZ.js} +2 -2
- package/dist/{sortable-provider-DdiI3Fwk.js → sortable-provider-DU2nvpFc.js} +3 -3
- package/dist/{spinner-C1QIewWv.js → spinner-DH1mm8hH.js} +2 -2
- package/dist/{tabs-KGKvve3y.js → tabs-Um0SFyf1.js} +1 -1
- package/dist/theme-picker.js +2 -2
- package/dist/{theme-toggle-C_VeiiCm.js → theme-toggle-C-Ih4uQU.js} +1 -1
- package/dist/{toolbar-items-D310xDuM.js → toolbar-items-BoEY5bkt.js} +4 -4
- package/dist/{translate-material-BypJJ1l5.js → translate-material-D4rn5UaQ.js} +1 -1
- package/dist/{translator-DJkf4J7t.js → translator-CcEgQ-H7.js} +112 -4
- package/dist/{use-chat-composer-BFhRMHcX.js → use-chat-composer-BBF1BI_s.js} +47 -43
- package/dist/{use-click-lock-BZYtTmVt.js → use-click-lock-Bwg_caHO.js} +14 -14
- package/dist/{use-heading-spy-DJR8YYm6.js → use-heading-spy-BgyA6SJl.js} +19 -19
- package/dist/{use-material-translation-CD6QoVal.js → use-material-translation-DYrfV_JJ.js} +1 -1
- package/dist/{use-return-focus-Cevw_6yq.js → use-return-focus-C_Qz_yTk.js} +1 -1
- package/docs/README.md +1 -0
- package/docs/components/data-display.md +40 -8
- package/docs/components/data-table-filter-and-lists.md +7 -3
- package/docs/components/form-fields.md +1 -0
- package/docs/components/media-and-files.md +1 -0
- package/docs/components/navigation-and-layout.md +946 -28
- package/docs/components/overlays-and-menus.md +11 -5
- package/docs/components/rich-widgets.md +111 -1
- package/docs/components/selection-and-choice.md +49 -10
- package/docs/guides/app-shell.md +641 -2
- package/docs/guides/forms.md +7 -0
- package/docs/guides/helpers.md +23 -0
- package/docs/guides/i18n.md +13 -1
- package/docs/guides/layouts.md +215 -0
- package/docs/guides/ssr.md +1 -1
- package/docs/guides/theming.md +7 -7
- package/docs/previews/data-display-tubecap.webp +0 -0
- package/docs/previews/navigation-layout-appshell-page-ground.webp +0 -0
- package/docs/previews/navigation-layout-appshell.webp +0 -0
- package/docs/previews/navigation-layout-authcard-split.webp +0 -0
- package/docs/previews/navigation-layout-authcard.webp +0 -0
- package/docs/previews/navigation-layout-dashboardgrid.webp +0 -0
- package/docs/previews/navigation-layout-editorlayout.webp +0 -0
- package/docs/previews/navigation-layout-landinglayout.webp +0 -0
- package/docs/previews/navigation-layout-panelayout.webp +0 -0
- package/docs/previews/navigation-layout-settingslayout.webp +0 -0
- package/docs/previews/navigation-layout-threadlayout-pages.webp +0 -0
- package/docs/previews/navigation-layout-threadlayout.webp +0 -0
- package/docs/previews/selection-choice-sortablelist.webp +0 -0
- package/docs/roadmap.md +12 -2
- package/docs/troubleshooting.md +50 -2
- package/lib/components/base-content.css +11 -0
- package/lib/components/components.css +5 -0
- package/lib/components/ui/actions/fab/fab-dock.css +19 -6
- package/lib/components/ui/collections/data-table/data-table-items-tiles.css +27 -1
- package/lib/components/ui/display/tube-cap/tube-cap.css +87 -0
- package/lib/components/ui/layout/app-search/app-search.css +62 -0
- package/lib/components/ui/layout/app-shell/activity-backdrop.css +10 -2
- package/lib/components/ui/layout/app-shell/app-header.css +108 -0
- package/lib/components/ui/layout/navigation-toolbar/navigation-toolbar.css +43 -0
- package/lib/themes/ambre.css +1 -1
- package/lib/themes/ardoise.css +1 -1
- package/lib/themes/bleumono.css +1 -1
- package/lib/themes/bluemoon.css +1 -1
- package/lib/themes/corail.css +2 -2
- package/lib/themes/foret.css +1 -1
- package/lib/themes/lavande.css +1 -1
- package/lib/themes/menthe.css +2 -2
- package/lib/themes/ocean.css +1 -1
- package/lib/themes/pink.css +2 -2
- package/lib/themes/prune.css +1 -1
- package/lib/themes/sable.css +1 -1
- package/lib/themes/slate.css +1 -1
- package/lib/themes/teal.css +2 -2
- package/package.json +2 -2
package/docs/guides/forms.md
CHANGED
|
@@ -262,6 +262,13 @@ in `[data-slot="form-actions"]`) and put each group of fields in a
|
|
|
262
262
|
</form>
|
|
263
263
|
```
|
|
264
264
|
|
|
265
|
+
- The form grid insets its fields and its actions by 16px. In a container that
|
|
266
|
+
already pads its content (a settings page, a card, a sheet), set
|
|
267
|
+
`data-padding="none"` on the `.form-grid-layout`: the fields lose their
|
|
268
|
+
padding on all sides and the actions lose it left and right, so both sit
|
|
269
|
+
flush with that container's content edge:
|
|
270
|
+
`<form className="form-grid-layout" data-padding="none">`. The default is
|
|
271
|
+
unchanged.
|
|
265
272
|
- Each section's title is an `h2` (pass `titleAs="h3"` when the form sits
|
|
266
273
|
under an `h2` of your own), so a screen reader moves from section to
|
|
267
274
|
section, and each section is a group named by its title.
|
package/docs/guides/helpers.md
CHANGED
|
@@ -126,6 +126,7 @@ Vue: the Redux helpers are Pinia store factories: `defineLocalStore`
|
|
|
126
126
|
| `useIsClient()` | `false` on the server and first render, `true` after mount: a hydration guard. |
|
|
127
127
|
| `useCspNonce()` | The nonce of the nearest `NonceProvider`, for a `<style>` of your own (`<style nonce={useCspNonce()}>`); `undefined` outside one, on the server and on the client alike. See [CSP](csp.md#nonceprovider). |
|
|
128
128
|
| `useIsMobile()` | `true` below 768 px (`ResponsiveButton` no longer uses it: it collapses with CSS). `false` on the server and while hydrating, so SSR HTML is the desktop layout; a phone switches right after. |
|
|
129
|
+
| `useSsrMediaQuery(query, serverValue)` | Whether a media query matches, for a breakpoint `useIsMobile` (768 px) does not cover. The server and the hydrating client both render `serverValue` (`serverValue` is the answer the query gives on a desktop screen: `true` for `(min-width: …)`, `false` for `(max-width: …)`), and the client switches right after hydrating, so there is no hydration mismatch; a client-only render (SPA, client-side navigation) reads the real answer at once. Without `matchMedia` (jsdom) it answers `serverValue`. See [below](#usessrmediaquery). |
|
|
129
130
|
| `useHeadingSpy(ids, onActive, options?)` | IntersectionObserver over heading ids; reports the topmost visible one. |
|
|
130
131
|
| `useLocalizedDate()` | `{ language, locale, format }`: `DATE_UTILS.format` bound to the `I18nProvider` language (`en` without a provider). |
|
|
131
132
|
| `useNumberFormatter()` | `{ formatNumber, formatCurrency }`: `Intl.NumberFormat` with the options you pass, bound to the `I18nProvider` language (`en-US` without a provider). For what `formatAmount` does not cover: percentages, units, compact notation. |
|
|
@@ -207,6 +208,28 @@ export function Sent({ email }: { email: string }) {
|
|
|
207
208
|
`useFocusOnMount(open)` focuses again whenever `open` turns true, for content
|
|
208
209
|
that stays mounted and is only shown. Storybook: `Guides/Hooks/useFocusOnMount`.
|
|
209
210
|
|
|
211
|
+
### `useSsrMediaQuery`
|
|
212
|
+
|
|
213
|
+
```tsx
|
|
214
|
+
import { useSsrMediaQuery } from '@nxgt/material/hooks';
|
|
215
|
+
|
|
216
|
+
// A panel that is open from 1280 px (xl, 80rem) and folded below.
|
|
217
|
+
function Inspector({ children }: { children: React.ReactNode }) {
|
|
218
|
+
const isXl = useSsrMediaQuery('(min-width: 80rem)', true);
|
|
219
|
+
return isXl ? <aside>{children}</aside> : null;
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
The second argument is what the server renders, and what a hydrating client
|
|
224
|
+
renders on its first pass: it is the answer the query gives on a desktop
|
|
225
|
+
screen (`true` for `(min-width: …)`, `false` for `(max-width: …)`). On an SSR
|
|
226
|
+
page a narrower screen therefore paints the desktop markup first and switches right
|
|
227
|
+
after hydrating (one flash, and no hydration mismatch). A client-only render
|
|
228
|
+
(an SPA, a client-side navigation) reads the real answer from its first
|
|
229
|
+
render, with no flash. Where `matchMedia` does not exist (jsdom) the hook
|
|
230
|
+
answers `serverValue` and never subscribes. When CSS alone can do it
|
|
231
|
+
(`hidden xl:block`), prefer CSS: it has no flash at all.
|
|
232
|
+
|
|
210
233
|
### `useCountdown`
|
|
211
234
|
|
|
212
235
|
The clock behind [`CountdownTimer`](../components/feedback-and-status.md#countdowntimer),
|
package/docs/guides/i18n.md
CHANGED
|
@@ -236,7 +236,8 @@ the camera's button, toggle and image (`material.camera.capture`, `captured`,
|
|
|
236
236
|
barcode accessible names, the calendar's navigation tooltips
|
|
237
237
|
(`material.calendar.*`), the data table's selection checkboxes, the filter's
|
|
238
238
|
presets and `Min`/`Max` fields, the `variant="4"` spinner's label,
|
|
239
|
-
`ScrollToTop`, the
|
|
239
|
+
`ScrollToTop`, the bottom bar's `material.navigation.more` and `.close` (not shown
|
|
240
|
+
until the bar is drawn), the `ThreadLayout` stepper's `nav` name `material.navigation.steps` ("Progress"), the network upload field's `Retry` and `Remove {name}`, the map's
|
|
240
241
|
`You are here` and zoom buttons, and the icon-only close button of
|
|
241
242
|
`DialogClose`, `DrawerClose`, `SheetClose` and `SheetContent`'s
|
|
242
243
|
`withCloseButton`. A range `Slider`'s readout inputs read
|
|
@@ -331,6 +332,17 @@ and its emoji buttons (`material['rich-text-editor'].placeholder` /
|
|
|
331
332
|
(`material['circular-progress'].label`); `MediaPlayer`'s "Media player" for a
|
|
332
333
|
track without a title (`material['media-player'].label`); `PaneLayoutPane`'s
|
|
333
334
|
sheet title on a phone (`material['pane-layout']['sheet-title']`);
|
|
335
|
+
`EditorLayout`'s region names, "Toolbar", "Canvas", "Outline" and "Properties"
|
|
336
|
+
(`material['editor-layout'].toolbar` / `canvas` / `start` / `properties`; French
|
|
337
|
+
"Barre d'outils", "Zone de travail", "Plan", "Propriétés");
|
|
338
|
+
`ListDetailsLayout`'s way back, inspector close and back buttons and the list
|
|
339
|
+
separator's name (`material['list-details'].back` / `inspector-back` /
|
|
340
|
+
`inspector-close` / `resize`);
|
|
341
|
+
`SettingsLayout`'s default title, search name and empty message
|
|
342
|
+
(`material['settings-layout'].title` / `search` / `empty`);
|
|
343
|
+
`LandingLayout`'s phone menu button, "Menu", and `SiteFooter`'s links landmark,
|
|
344
|
+
"Footer" and new-tab hint, "opens in a new tab" (`material.landing.menu` / `footer` /
|
|
345
|
+
`new-tab`; French "Menu", "Pied de page" and "s'ouvre dans un nouvel onglet");
|
|
334
346
|
`JsonViewer`'s "Empty JSON" (`material['json-viewer'].empty`);
|
|
335
347
|
`TimePicker`'s AM / PM (`material['time-picker'].am` / `pm`, "a.m." / "p.m." in
|
|
336
348
|
French); and the names of `DurationField`'s inputs, "Hours" and "Minutes"
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# Layouts
|
|
2
|
+
|
|
3
|
+
A map of the layouts `@nxgt/material` draws, to pick from by need: how the app
|
|
4
|
+
navigates, what its header looks like, and which layout a page takes. Every
|
|
5
|
+
choice is a prop or a component; nothing here is on unless you ask, and the
|
|
6
|
+
shell's default is unchanged. Each section gives a working example and links
|
|
7
|
+
the page that has the full props. Every component in the snippets is imported
|
|
8
|
+
from `@nxgt/material/components`.
|
|
9
|
+
|
|
10
|
+
Three sizes decide what is drawn, by CSS only (so the server and the client
|
|
11
|
+
agree): a **phone** below 768px, a **tablet** from 768px to 1279px and a
|
|
12
|
+
**desktop** from 1280px.
|
|
13
|
+
|
|
14
|
+
## Pick a navigation
|
|
15
|
+
|
|
16
|
+
`ActivityLayout` takes `navigation`: one name for every size, or one per size.
|
|
17
|
+
|
|
18
|
+
| The app needs | Use | Notes |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| three to five main destinations, one thumb away | `'bar'` | a bottom bar on a phone only (below 768px); from 768px the default rail shows, and `{ tablet: 'bar' }` keeps the bar there; the rest go under "More"; badges on the icons |
|
|
21
|
+
| a compact column of icons | `'rail'` | a rail with an optional FAB (`navigationFab`); a phone never draws it: it keeps its menu sheet |
|
|
22
|
+
| the same, with labels and a primary action | `'rail-expanded'` | a wider rail, extended FAB; a phone never draws it: it keeps its menu sheet |
|
|
23
|
+
| many destinations in groups | `'drawer'` | a standard drawer; modal on a phone |
|
|
24
|
+
| a dense tool with the sidebar the user collapses | `'sidebar'` | remembered with `persistKey` |
|
|
25
|
+
| a website-like app with menus | `'top'` | a top navigation with dropdowns; nested in the phone menu |
|
|
26
|
+
| two levels: sections, then pages | `'two-level'` | a rail beside a panel of the section's pages |
|
|
27
|
+
| a content app that wants the whole screen | `'floating'` | a pill of links at the bottom, `hideOnScroll` |
|
|
28
|
+
| the default: a menu sheet on a phone, a rail from 768px | `'modal-drawer'` (the phone preset) | what an unset `navigation` draws |
|
|
29
|
+
| no navigation of its own | `'none'` | |
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
import { ActivityLayout, type MenuItem } from '@nxgt/material/components';
|
|
33
|
+
import { Outlet } from 'react-router';
|
|
34
|
+
|
|
35
|
+
const items: MenuItem[] = [
|
|
36
|
+
{ label: 'Home', url: '/', icon: 'house' },
|
|
37
|
+
{ label: 'Inbox', url: '/inbox', icon: 'envelope', badge: 3 },
|
|
38
|
+
{ label: 'Tasks', url: '/tasks', icon: 'check' },
|
|
39
|
+
{ label: 'Settings', url: '/settings', icon: 'gear', priority: -1 },
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
// a bottom bar on a phone, a rail with a button on a tablet, a sidebar on a desktop
|
|
43
|
+
export function Shell() {
|
|
44
|
+
return (
|
|
45
|
+
<ActivityLayout
|
|
46
|
+
items={items}
|
|
47
|
+
logo="/logo.svg"
|
|
48
|
+
name="Acme"
|
|
49
|
+
navigation={{ phone: 'bar', tablet: 'rail', desktop: 'sidebar', persistKey: 'acme-nav' }}
|
|
50
|
+
>
|
|
51
|
+
<Outlet />
|
|
52
|
+
</ActivityLayout>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Each preset is also exported as a part (`NavigationBar`, `NavigationRail`,
|
|
58
|
+
`NavigationDrawer`, `TopNav`, `NavigationRailPanel`, `NavigationToolbar`) for a
|
|
59
|
+
layout of your own. Every preset, its entries (`bar`, `priority`, `group`,
|
|
60
|
+
`children`, `badge`) and its accessibility are in the
|
|
61
|
+
[app shell guide](app-shell.md#navigation-and-header).
|
|
62
|
+
|
|
63
|
+
## Pick a header
|
|
64
|
+
|
|
65
|
+
`header` takes a name or `{ variant, collapse, hideOnScroll, tabs, search }`.
|
|
66
|
+
|
|
67
|
+
| Variant | What it is |
|
|
68
|
+
| --- | --- |
|
|
69
|
+
| `'small'` | the default bar: title at the start, actions at the end |
|
|
70
|
+
| `'center'` | the title centred |
|
|
71
|
+
| `'medium'`, `'large'` | a taller bar whose headline collapses to the small one on scroll |
|
|
72
|
+
| `'none'` | no bar (a full-bleed page) |
|
|
73
|
+
|
|
74
|
+
```tsx
|
|
75
|
+
<ActivityLayout
|
|
76
|
+
items={items}
|
|
77
|
+
header={{
|
|
78
|
+
variant: 'large',
|
|
79
|
+
hideOnScroll: true,
|
|
80
|
+
search: { placeholder: 'Search projects', shortcut: '/' },
|
|
81
|
+
tabs: (
|
|
82
|
+
<TabsNav aria-label="Project sections" value="activity">
|
|
83
|
+
<TabsNavLink to="/projects/overview" value="overview">Overview</TabsNavLink>
|
|
84
|
+
<TabsNavLink to="/projects/activity" value="activity">Activity</TabsNavLink>
|
|
85
|
+
</TabsNav>
|
|
86
|
+
),
|
|
87
|
+
}}
|
|
88
|
+
>
|
|
89
|
+
<Outlet />
|
|
90
|
+
</ActivityLayout>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
A route changes its own bar with a handle, and draws a back arrow:
|
|
94
|
+
|
|
95
|
+
```tsx
|
|
96
|
+
export const handle = {
|
|
97
|
+
title: 'Atlas redesign',
|
|
98
|
+
header: { variant: 'medium' },
|
|
99
|
+
back: { to: '/projects', label: 'Projects' },
|
|
100
|
+
} satisfies AppShellHandle;
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
The search is a pill with a docked results panel from 768px and a full-screen
|
|
104
|
+
view on a phone. See [The app bar variants](app-shell.md#the-app-bar-variants),
|
|
105
|
+
[the search](app-shell.md#the-app-bars-search),
|
|
106
|
+
[the tabs](app-shell.md#tabs-under-the-app-bar) and
|
|
107
|
+
[the back arrow](app-shell.md#the-back-arrow).
|
|
108
|
+
|
|
109
|
+
## Pick a page layout
|
|
110
|
+
|
|
111
|
+
Inside the shell, a page is one of these. All of them follow the width of their
|
|
112
|
+
own container where noted, so they also work in a dialog or a split pane.
|
|
113
|
+
|
|
114
|
+
| The page is | Use | Phone |
|
|
115
|
+
| --- | --- | --- |
|
|
116
|
+
| a list beside the selected record | `ListDetailsLayout` (`inspector` adds a third pane) | one view at a time, with a back bar |
|
|
117
|
+
| content with a side panel (filters, folders) | `PaneLayout` | the pane is a sheet (`phone="sheet"`, `"bottom"` or `"stack"`) |
|
|
118
|
+
| a form, a wizard or a conversation in a centred column | `ThreadLayout` | the same column, full width |
|
|
119
|
+
| grouped settings | `SettingsLayout` | the list, then the section's page |
|
|
120
|
+
| cards or tiles | `ResponsiveGrid` (spans, masonry) | one column |
|
|
121
|
+
| tiles the user rearranges | `DashboardGrid` | one or two columns |
|
|
122
|
+
| a board of columns | `Kanban` with `phoneLayout="tabs"` | one column per tab, swipe |
|
|
123
|
+
| a tool with a canvas | `EditorLayout` | properties in a bottom sheet |
|
|
124
|
+
| a public page outside the shell | `LandingLayout` | the links in a drawer |
|
|
125
|
+
| sign-in and sign-up | `AuthCard` with `layout="split"` | the card alone |
|
|
126
|
+
| documentation | `Doc` with `chrome="embedded"` inside the shell | the tree in a sheet |
|
|
127
|
+
|
|
128
|
+
A settings screen, from sections:
|
|
129
|
+
|
|
130
|
+
```tsx
|
|
131
|
+
import { SettingsLayout } from '@nxgt/material/components';
|
|
132
|
+
|
|
133
|
+
<SettingsLayout
|
|
134
|
+
search
|
|
135
|
+
sections={[
|
|
136
|
+
{ id: 'profile', group: 'Account', title: 'Profile', description: 'Name and language', content: <ProfileForm /> },
|
|
137
|
+
{ id: 'alerts', group: 'Preferences', title: 'Notifications', description: 'Email and push', content: <AlertsForm /> },
|
|
138
|
+
]}
|
|
139
|
+
/>
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
A list with its detail, selected in the URL. `history="push"` keeps the view in
|
|
143
|
+
`?view=`, so the browser's Back goes from the details to the list on a phone, and
|
|
144
|
+
`useListDetailsParam()` reads and sets the selected id:
|
|
145
|
+
|
|
146
|
+
```tsx
|
|
147
|
+
const [id, select] = useListDetailsParam();
|
|
148
|
+
|
|
149
|
+
<ListDetailsLayout history="push">
|
|
150
|
+
<ListDetailsLayout.List>
|
|
151
|
+
{patients.map((p) => <Row key={p.id} onClick={() => select(p.id, { open: 'details' })} />)}
|
|
152
|
+
</ListDetailsLayout.List>
|
|
153
|
+
<ListDetailsLayout.Details back="Patients"><Sheet id={id} /></ListDetailsLayout.Details>
|
|
154
|
+
</ListDetailsLayout>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
An editor, with its properties in a sheet on a phone:
|
|
158
|
+
|
|
159
|
+
```tsx
|
|
160
|
+
<EditorLayout
|
|
161
|
+
className="h-dvh"
|
|
162
|
+
toolbar={<><UndoRedoButtons /><span className="flex-1" /><EditorLayout.PropertiesTrigger /></>}
|
|
163
|
+
properties={<SelectionForm />}
|
|
164
|
+
>
|
|
165
|
+
<Artboard />
|
|
166
|
+
</EditorLayout>
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
A dashboard the user rearranges (the order is yours to store):
|
|
170
|
+
|
|
171
|
+
```tsx
|
|
172
|
+
<DashboardGrid aria-label="Dashboard" order={order} onOrderChange={setOrder}>
|
|
173
|
+
<DashboardTile id="revenue" title="Revenue" span={{ base: 1, md: 2 }}><RevenueChart /></DashboardTile>
|
|
174
|
+
<DashboardTile id="orders" title="Orders"><OrdersCount /></DashboardTile>
|
|
175
|
+
</DashboardGrid>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
A landing page, outside the shell (it needs a router, like the shell):
|
|
179
|
+
|
|
180
|
+
```tsx
|
|
181
|
+
<LandingLayout
|
|
182
|
+
name="Acme"
|
|
183
|
+
items={[{ label: 'Pricing', url: '/pricing', icon: 'tag' }]}
|
|
184
|
+
actions={<LinkButton to="/start" variant="filled">Get started</LinkButton>}
|
|
185
|
+
hero={<LandingSection variant="hero" tone="ground" title="Plan the work" />}
|
|
186
|
+
footer={<SiteFooter brand="Acme" groups={[]} legal="© 2026 Acme" />}
|
|
187
|
+
>
|
|
188
|
+
<LandingSection title="Everything in one place">…</LandingSection>
|
|
189
|
+
</LandingLayout>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
The props of each are in
|
|
193
|
+
[Navigation & layout](../components/navigation-and-layout.md):
|
|
194
|
+
[`ListDetailsLayout`](../components/navigation-and-layout.md#listdetailslayout)
|
|
195
|
+
(with `PaneLayout` and `ThreadLayout`),
|
|
196
|
+
[`SettingsLayout`](../components/navigation-and-layout.md#settingslayout),
|
|
197
|
+
[`ResponsiveGrid`](../components/navigation-and-layout.md#responsivegrid),
|
|
198
|
+
[`DashboardGrid`](../components/navigation-and-layout.md#dashboardgrid),
|
|
199
|
+
[`EditorLayout`](../components/navigation-and-layout.md#editorlayout) and
|
|
200
|
+
[`LandingLayout`](../components/navigation-and-layout.md#landinglayout).
|
|
201
|
+
|
|
202
|
+
## Whole screens to start from
|
|
203
|
+
|
|
204
|
+
The `Guides/Recipes` stories in Storybook are tested whole screens (the code
|
|
205
|
+
ships with the `screen-recipes` skill of the `nxgt-material` plugin): a home
|
|
206
|
+
dashboard, a list and detail, a form and dialog, a table and settings, a dense
|
|
207
|
+
detail page, a status board, a landing page and a search dialog with its
|
|
208
|
+
results page. Start from the closest one and replace the data.
|
|
209
|
+
|
|
210
|
+
## See also
|
|
211
|
+
|
|
212
|
+
- [App shell](app-shell.md): `items`, breadcrumbs, the page's title, the
|
|
213
|
+
background and the route transitions.
|
|
214
|
+
- [Cards and tiles](cards-and-tiles.md): what goes inside a grid.
|
|
215
|
+
- [Themes](themes.md): the surfaces the layouts sit on.
|
package/docs/guides/ssr.md
CHANGED
|
@@ -167,7 +167,7 @@ State the server cannot know must be resolved the same way on both sides:
|
|
|
167
167
|
| Language | no `localStorage`: `defaultLanguage` | Resolve it from the request and pass `initialLanguage` to `I18nProvider`. See [i18n](i18n.md#server-rendering) |
|
|
168
168
|
| Theme | no preference: light | An inline boot script in `<head>`, and `suppressHydrationWarning` on `<html>`. See [theming](theming.md#no-flash-on-load-a-boot-script) |
|
|
169
169
|
| `formatAmount`, `formatDate` | the server's locale and time zone, unless you pass them | Use `useFormatters({ timeZone })`, which follows the `I18nProvider` language, or pass `locale` and `timeZone` (`createFormatters` binds them). A date-only `YYYY-MM-DD` is the same everywhere. See [printing](printing.md#formatamount-and-formatdate) |
|
|
170
|
-
| Screen width, `prefers-color-scheme` (`useIsMobile`, `useTheme`, `AppHeader`, `DataTable`, `TimeField`, `PaneLayout`, `ListDetailsLayout`, the code blocks, …) | no screen: a desktop, light | Nothing: a hydrating client renders the same, then switches on a phone or a dark screen |
|
|
170
|
+
| Screen width, `prefers-color-scheme` (`useIsMobile`, `useTheme`, `AppHeader`, `DataTable`, `TimeField`, `PaneLayout`, `ListDetailsLayout`, the code blocks, …) | no screen: a desktop, light | Nothing: a hydrating client renders the same, then switches on a phone or a dark screen (`ListDetailsLayout`'s `listWidth` is the default width until then; its inspector is switched by CSS) |
|
|
171
171
|
| An attribute's `DATETIME` / `TIME` instant (`AttributesSummary`, `AttributesEditor`), the opening hours' first day of the week | the server's time zone and Intl data differ from the browser's | Nothing: the instant is written in UTC and the week starts on the language's first day until mount, then the viewer's zone and the locale's week info take over, so hydration matches |
|
|
172
172
|
| `Stepper` layout, `Timeline` sides | CSS breakpoints and a container query, no screen width in JavaScript | Nothing: server and client markup are the same |
|
|
173
173
|
| `Timeline` `grouped` | the server's time zone and clock differ from the browser's | Pass `timeZone` and `now` to group on the server too; without them the day headings appear after mount (the items do not remount) |
|
package/docs/guides/theming.md
CHANGED
|
@@ -68,7 +68,7 @@ at the top are needed is in [getting started](../getting-started.md#styles).
|
|
|
68
68
|
| `--accent`, `--accent-foreground` | `bg-accent`, … | hover surfaces |
|
|
69
69
|
| `--nxgt-accent` | `[--nxgt-accent:…]` | the mark colour of the selection controls: the fill, handle, state layer and stop dots of `Slider`, the on state of `Switch`, the box and dot of `Checkbox` and `Radio`. It defaults to `--primary` (`--primary-text` in dark) and is set per control, so override it on the control itself, not on `:root` |
|
|
70
70
|
| `--error`, `--success`, `--info`, `--warning` (+ `-foreground`) | `bg-error`, `text-success`, … | the status colours of `Button`, `Alert`, `Badge`, toasts |
|
|
71
|
-
| `--primary-text` | `text-primary-text` | primary drawn as text or an icon on a page, card or popover surface: `Typography tone="primary"`, links, the `Alert` primary icon, selected labels. In light, `--primary` mixed toward black: 96 % at most, solved lower on a tinted page so a tonal Button label on a striped row reaches 4.6:1 (
|
|
71
|
+
| `--primary-text` | `text-primary-text` | primary drawn as text or an icon on a page, card or popover surface: `Typography tone="primary"`, links, the `Alert` primary icon, selected labels. In light, `--primary` mixed toward black: 96 % at most, solved lower on a tinted page so a tonal Button label on a striped row, or straight on the page ground, reaches 4.6:1 (92 % on teal, 88 % on corail, 92 % on pink, 95 % on menthe); in dark, `--primary` mixed 60 % with white (`color-mix(in oklab, var(--primary) 40%, white)`), well over 4.5:1 on `--background` and `--card` |
|
|
72
72
|
| `--primary-indicator` | `bg-primary-indicator`, `border-primary-indicator`, `ring-primary-indicator`, `stroke-primary-indicator` | primary drawn as a non-text mark that carries a state (WCAG 1.4.11, 3:1): an active bar or dot, a selected or focused border, a ring, a spinner arc. Equal to `--primary` in light; in dark, `--primary` mixed 25 % with white (`color-mix(in oklab, var(--primary) 75%, white)`), 4.8:1 on `--background`, 4.5:1 on `--card`, 4.2:1 on `--muted` (`--primary` itself gives 2.7, 2.5 and 2.3:1) |
|
|
73
73
|
| `--error-text` | `text-error-text` | error drawn as text: field messages, `HelperText` in its error state, form and dialog errors, `variant="error"` menu items |
|
|
74
74
|
| `--destructive` | `bg-destructive`, `text-destructive` | deprecated alias of `--error`: the light theme sets it to `var(--error)`, the dark theme keeps its own value; use `--error` |
|
|
@@ -936,14 +936,14 @@ ones also take 10 % on focus, as on hover, so their label keeps 4.5:1 over it
|
|
|
936
936
|
|
|
937
937
|
The `tonal`, `outlined` and `link` variants of `Button` and `IconButton` draw
|
|
938
938
|
their text and icon in one tone per colour, read on `--background`, on
|
|
939
|
-
`--card
|
|
940
|
-
the light theme `primary
|
|
941
|
-
|
|
942
|
-
|
|
939
|
+
`--card`, on the page ground (`--ground`, a tinted page) and on the variant's own tint over each (15 % at most, at rest or focused). In
|
|
940
|
+
the light theme `primary` uses `--primary-text` (solved per theme), `secondary`, `info` and `success`
|
|
941
|
+
are mixed with 10 % black, `warning` with 15 % black and `error` with 20 % black (4.6:1 or more
|
|
942
|
+
on the page ground in every preset). In the dark theme `primary` is
|
|
943
943
|
mixed with 60 % white, the `--primary-text` token (8.5:1 at its lowest: the token itself is a dark indigo,
|
|
944
944
|
2.3:1), `success` and `warning` with 15 % white (5.3 and 6.5:1), `error` with
|
|
945
945
|
30 % white (6.0:1), and `secondary` and `info` use the token (5.1 and 5.6:1).
|
|
946
|
-
The tones are mixed from the tokens (`color-mix(in oklab, var(--color-
|
|
946
|
+
The tones are mixed from the tokens (`color-mix(in oklab, var(--color-warning)
|
|
947
947
|
85%, black)`), so an override of a token moves its tone with it; a text colour
|
|
948
948
|
of your own on one of those buttons (`className="text-primary-text"`) replaces the tone
|
|
949
949
|
and is yours to check.
|
|
@@ -1012,7 +1012,7 @@ override on the root, or use a [theme zone](#themes), which re-declares them.
|
|
|
1012
1012
|
for the same reason: the brand colour is a dark fill (it keeps near-white text
|
|
1013
1013
|
readable on a button) and reads at only about 2:1 as text on the dark surfaces.
|
|
1014
1014
|
The light value is `color-mix(in oklab, var(--primary) 96%, black)` at most (primary
|
|
1015
|
-
4 % toward black, 7.9:1 on the white page; the share is solved per theme and drops when a tinted page would leave a tonal Button label under 4.6:1 on a striped row, to
|
|
1015
|
+
4 % toward black, 7.9:1 on the white page; the share is solved per theme and drops when a tinted page would leave a tonal Button label under 4.6:1 on a striped row or on the page ground, to 92 % on teal); the dark one is
|
|
1016
1016
|
`color-mix(in oklab, var(--primary) 40%, white)` (primary mixed 60 % with
|
|
1017
1017
|
white, the recipe of the tonal `Button` labels). `Typography tone="primary"`,
|
|
1018
1018
|
the `Alert` primary icon, links, selected labels and the other primary text of
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/docs/roadmap.md
CHANGED
|
@@ -169,8 +169,10 @@ version they shipped in, and planned entries may name the major they target.
|
|
|
169
169
|
|
|
170
170
|
## Next
|
|
171
171
|
|
|
172
|
-
- **
|
|
173
|
-
|
|
172
|
+
- **Seven more layout recipes** — Feed, Gallery, Auth, Thread, settings,
|
|
173
|
+
dashboard and editor screens, each a tested Storybook recipe under
|
|
174
|
+
Guides/Recipes with its code beside it, on the layouts the shell now ships
|
|
175
|
+
([#2413](https://github.com/softistx/nxgt-material/issues/2413)).
|
|
174
176
|
- **FilterBar "Add a filter" stays on its row** — the button no longer wraps
|
|
175
177
|
alone onto a second row on a desktop screen ([#1752](https://github.com/softistx/nxgt-material/issues/1752)).
|
|
176
178
|
|
|
@@ -259,6 +261,10 @@ version they shipped in, and planned entries may name the major they target.
|
|
|
259
261
|
|
|
260
262
|
## Later
|
|
261
263
|
|
|
264
|
+
- **A lighter first load for the app shell** — `ActivityLayout` pulls about
|
|
265
|
+
831 KB gzipped through the library's single shared chunk; splitting it so the
|
|
266
|
+
shell costs tens of KB at first load, the rest loaded where a page uses it
|
|
267
|
+
(#2417; measured by `scripts/shell-size.spec.ts`).
|
|
262
268
|
- **One `onUpload` options object (next major)** — the upload fields'
|
|
263
269
|
`onUpload(file, onProgress?, signal?)` becomes `onUpload(file, { onProgress,
|
|
264
270
|
signal })`, like the editor's upload context.
|
|
@@ -377,6 +383,10 @@ version they shipped in, and planned entries may name the major they target.
|
|
|
377
383
|
|
|
378
384
|
## Shipped
|
|
379
385
|
|
|
386
|
+
- **Search dialog and results page recipe (next patch)** — a command dialog (Ctrl/Cmd+K and a header button), debounced grouped suggestions, type chips, a conditional filter and highlighted result cards, with its code in the plugin's `screen-recipes` skill ([#2333](https://github.com/softistx/nxgt-material/issues/2333)).
|
|
387
|
+
|
|
388
|
+
- **Layouts: adaptive navigation, headers and page layouts (3.80.0)** — `ActivityLayout` takes `navigation` (a bottom bar with More and badges, a rail with a FAB or expanded, a standard or modal drawer, a collapsible sidebar, a top navigation with dropdowns, two-level navigation, a floating toolbar or none, chosen for phone, tablet and desktop) and `header` (small, center-aligned, medium and large collapsing on scroll, hide on scroll, a search bar that opens full screen on a phone, sticky tabs), and a route adds a back arrow with `handle.back`; each piece is also exported. Page layouts grow with it: an inspector pane and the selection in the URL for `ListDetailsLayout`, phone modes and a container breakpoint for `PaneLayout`, a centred form and wizard for `ThreadLayout`, a split `AuthCard`, spans and masonry for `ResponsiveGrid`, tabs for `Kanban` on a phone, `Doc` drawn inside the shell, and new `SettingsLayout`, `DashboardGrid` (tiles the user rearranges), `EditorLayout` and `LandingLayout` (with `LandingSection` and `SiteFooter`). Everything is opt-in; the shell's default is unchanged. [Layouts guide](guides/layouts.md) ([#2103](https://github.com/softistx/nxgt-material/issues/2103)). Follow-ups: a resize handle for `EditorLayout`'s properties panel and a separate open state for its phone sheet.
|
|
389
|
+
|
|
380
390
|
- **Moment (3.74.0)** — a transient full-screen announcement for a one-off event (a player is eliminated, a role is revealed): a modal dialog named by its title, with an illustration, description, action and tone, dismissed by Escape, a tap, its action or a timer, and no motion under reduced motion ([#2220](https://github.com/softistx/nxgt-material/issues/2220), [#2247](https://github.com/softistx/nxgt-material/pull/2247)). A `modal={false}` variant for live events (focus stays, taps pass through, polite status) follows in the next minor ([#2313](https://github.com/softistx/nxgt-material/issues/2313)).
|
|
381
391
|
- **RecordActionsMenu (next minor)** — one menu for a record's lifecycle: archive with an Undo toast (or confirm first with `archivePolicy="confirm"`), restore, and delete that always confirms and shows the backend's refusal, with `ConfirmDialog` gaining `details` and `refusal` slots.
|
|
382
392
|
- **Assistant approval card (next minor)** — `ChatActionProposal` shows an action an assistant proposes, with its status, deadline and Confirm / Reject, and `ChatToolActivity` is a compact row for a tool step in a chat thread ([#2134](https://github.com/softistx/nxgt-material/issues/2134)).
|
package/docs/troubleshooting.md
CHANGED
|
@@ -78,6 +78,8 @@ words in your error.
|
|
|
78
78
|
- [`ActivityLayout`'s `backdrop` shows nothing, or the blobs are still there](#activitylayouts-backdrop-shows-nothing-or-the-blobs-are-still-there)
|
|
79
79
|
- [Shapes of an `ActivityLayout` `backdrop` run behind the text of the chrome or a list](#shapes-of-an-activitylayout-backdrop-run-behind-the-text-of-the-chrome-or-a-list)
|
|
80
80
|
- [Shaped Gallery tiles are plain rounded squares](#shaped-gallery-tiles-are-plain-rounded-squares)
|
|
81
|
+
- [ChoiceCardGroup shows 2+2 instead of 3+1](#choicecardgroup-shows-22-instead-of-31)
|
|
82
|
+
- [A `ChoiceCardGroup` collapses to nothing in an inline-flex or centred parent](#a-choicecardgroup-collapses-to-nothing-in-an-inline-flex-or-centred-parent)
|
|
81
83
|
- [A component with my own tone (Shape, Fab, Avatar, StatCard, a metric card) shows no colour, or `tone` is a type error](#a-component-with-my-own-tone-shape-fab-avatar-statcard-a-metric-card-shows-no-colour-or-tone-is-a-type-error)
|
|
82
84
|
- [A test expects the old `bg-muted` Avatar fallback, or a filled fallback shows a grey ring](#a-test-expects-the-old-bg-muted-avatar-fallback-or-a-filled-fallback-shows-a-grey-ring)
|
|
83
85
|
|
|
@@ -341,6 +343,8 @@ words in your error.
|
|
|
341
343
|
- [An `Autocomplete` list covers its helper text, or a chip test no longer finds its markup](#an-autocomplete-list-covers-its-helper-text-or-a-chip-test-no-longer-finds-its-markup)
|
|
342
344
|
- [A `CountryField` lost its chip, or its `renderOption` or `filter` does nothing](#a-countryfield-lost-its-chip-or-its-renderoption-or-filter-does-nothing)
|
|
343
345
|
- [A `CountryField` or `TimezoneField` test no longer finds its field or its options](#a-countryfield-or-timezonefield-test-no-longer-finds-its-field-or-its-options)
|
|
346
|
+
- [A test that queries a `SortableList` by `listbox` or `option` finds nothing](#a-test-that-queries-a-sortablelist-by-listbox-or-option-finds-nothing)
|
|
347
|
+
- [axe reports `nested-interactive` on a list whose rows hold buttons](#axe-reports-nested-interactive-on-a-list-whose-rows-hold-buttons)
|
|
344
348
|
- [A `SearchField` lost the height, radius or fill set through `[&_input]`](#a-searchfield-lost-the-height-radius-or-fill-set-through-_input)
|
|
345
349
|
- [`ComboboxEmpty`'s text shows under the options of a `Combobox`](#comboboxemptys-text-shows-under-the-options-of-a-combobox)
|
|
346
350
|
- [`ConfirmDialog` buttons stay in English](#confirmdialog-buttons-stay-in-english)
|
|
@@ -1744,6 +1748,23 @@ page.locator('[data-slot=chip]').getByRole('button', { name: 'Remove Design' });
|
|
|
1744
1748
|
**Why:** the shapes live in an opt-in stylesheet, `@nxgt/material/galleries.css`, which `styles.css` does not import. Without it a shaped tile keeps the `xl` corner (`--nxgt-shape-corner-xl`, 28px). The same fallback shows in a browser without CSS [`shape()`](https://developer.mozilla.org/en-US/docs/Web/CSS/basic-shape/shape) (Chromium-based and Safari today), which drops the `clip-path`. Under `prefers-reduced-motion` the shapes show but do not morph, by design. Also check that nothing overrides `clip-path` on `[data-slot=gallery-tile-media]`.
|
|
1745
1749
|
**Fix:** import it once, next to `styles.css`: `@import "@nxgt/material/galleries.css";` (or `import '@nxgt/material/galleries.css'`). For a browser without `shape()`, accept the rounded fallback, or use a non-shaped preset and pass `shape` only where you want it.
|
|
1746
1750
|
|
|
1751
|
+
|
|
1752
|
+
### ChoiceCardGroup shows 2+2 instead of 3+1
|
|
1753
|
+
|
|
1754
|
+
**When:** a `ChoiceCardGroup` with `columns={3}` (or 4) and 4 cards (or any count that leaves one card alone on the last row) draws two rows of two, where it used to draw three and one.
|
|
1755
|
+
**Why:** rows are balanced by default (`balance`, `true`): when the last row would hold one orphan card and fewer columns avoid it, the group draws fewer columns. It is decided by CSS container queries on the group's own width, so the server and the client print the same markup.
|
|
1756
|
+
**Fix:** keep it, or restore the old fill with `balance={false}`:
|
|
1757
|
+
|
|
1758
|
+
```tsx
|
|
1759
|
+
<ChoiceCardGroup label="Size" columns={3} balance={false} options={options} />
|
|
1760
|
+
```
|
|
1761
|
+
|
|
1762
|
+
### A `ChoiceCardGroup` collapses to nothing in an inline-flex or centred parent
|
|
1763
|
+
|
|
1764
|
+
**When:** the group sits in an `inline-flex` box, a float or a `w-fit` column and its cards are squeezed to zero width or the label shows alone.
|
|
1765
|
+
**Why:** a balanced group (the default, horizontal) is an inline-size container (`@container`), so that it can balance its rows; a container's width does not come from its content, so a shrink-to-fit parent gives it none. With `balance={false}`, or `orientation="vertical"`, there is no container.
|
|
1766
|
+
**Fix:** give the parent a width (`w-full`, a `max-w-*` or a fixed width), centring it with margins rather than shrink-to-fit, or pass `balance={false}` to restore the previous layout.
|
|
1767
|
+
|
|
1747
1768
|
### A component with my own tone (Shape, Fab, Avatar, StatCard, a metric card) shows no colour, or `tone` is a type error
|
|
1748
1769
|
|
|
1749
1770
|
**When:** `<Shape tone="maths" />`, `<Fab tone="maths" />`, an `Avatar`, a `StatCard` or a metric card with `tone="maths"` draws no colour, or TypeScript reports:
|
|
@@ -3272,6 +3293,9 @@ only in the browser reads the real answer from its first render, as before.
|
|
|
3272
3293
|
`Stepper` logged this line until 2.2.0, and a desktop hydrating its server
|
|
3273
3294
|
HTML showed the mismatch (it asks whether the screen is wide); upgrade and
|
|
3274
3295
|
drop any `clientOnly(Stepper)` you added for it.
|
|
3296
|
+
For a breakpoint of your own, use
|
|
3297
|
+
[`useSsrMediaQuery(query, serverValue)`](guides/helpers.md#usessrmediaquery)
|
|
3298
|
+
instead of `useMedia` or a hand-written `useSyncExternalStore`.
|
|
3275
3299
|
|
|
3276
3300
|
### `useMatches must be used within a data router`
|
|
3277
3301
|
|
|
@@ -5105,7 +5129,7 @@ append({ name: '' }, { shouldFocus: false });
|
|
|
5105
5129
|
`aria-disabled`, still focusable, and does nothing by design; the reason, if
|
|
5106
5130
|
`removeDisabledReason` gave one, is its tooltip, shown on hover, focus, tap and
|
|
5107
5131
|
click, and its description), or `min` is
|
|
5108
|
-
reached (the button is `disabled`).
|
|
5132
|
+
reached (the button is `disabled`, or absent with `removeAtMin="hide"`).
|
|
5109
5133
|
**Fix:** return `true` from `removable` for a row that may go, and say why for
|
|
5110
5134
|
the others, so a user is told instead of left guessing:
|
|
5111
5135
|
|
|
@@ -5202,7 +5226,8 @@ The `*` is now drawn by a CSS pseudo-element with an empty `content`
|
|
|
5202
5226
|
field's own `required` / `aria-required` says it is required, and every field
|
|
5203
5227
|
of this library sets it on the element a screen reader lands on (the input, the
|
|
5204
5228
|
picker's combobox, the select's trigger, the slider thumbs, the rating's
|
|
5205
|
-
radiogroup, the editor's textbox, the
|
|
5229
|
+
radiogroup, the editor's textbox, the `TransferList`'s listbox (a `SortableList` is a `list`
|
|
5230
|
+
and only draws the asterisk, with no `aria-required`), or, for a file picker,
|
|
5206
5231
|
a group described as "This field is required."). A `SelectField`'s trigger is
|
|
5207
5232
|
now named by its label (`aria-labelledby`), so `getByRole('combobox', { name:
|
|
5208
5233
|
'Framework' })` finds it.
|
|
@@ -6353,6 +6378,29 @@ expect(screen.getByRole('combobox', { name: 'Time zone' })).toHaveValue('Paris')
|
|
|
6353
6378
|
screen.getByRole('option', { name: 'Paris GMT+2' });
|
|
6354
6379
|
```
|
|
6355
6380
|
|
|
6381
|
+
### A test that queries a `SortableList` by `listbox` or `option` finds nothing
|
|
6382
|
+
|
|
6383
|
+
**When:** a test queries a `SortableList` by `listbox`, `option` or `aria-selected`, after upgrading.
|
|
6384
|
+
**Why:** a row holds buttons of its own (grip, move, remove), which an `option`
|
|
6385
|
+
may not, so axe reported `nested-interactive`. The list is now a `role="list"`
|
|
6386
|
+
of `listitem` rows; `aria-selected`, `aria-activedescendant` and `aria-required`
|
|
6387
|
+
are gone (`aria-disabled` stays on a disabled row).
|
|
6388
|
+
**Fix:**
|
|
6389
|
+
|
|
6390
|
+
```ts
|
|
6391
|
+
const list = screen.getByRole('list', { name: 'Ranking' });
|
|
6392
|
+
const rows = within(list).getAllByRole('listitem');
|
|
6393
|
+
```
|
|
6394
|
+
|
|
6395
|
+
### axe reports `nested-interactive` on a list whose rows hold buttons
|
|
6396
|
+
|
|
6397
|
+
**When:** axe flags a list whose rows hold buttons or other controls.
|
|
6398
|
+
**Why:** a row with `role="option"` (or `button`, `tab`...) may not contain
|
|
6399
|
+
focusable controls: assistive technology reads its children as text.
|
|
6400
|
+
**Fix:** make the row a `listitem` of a `list` (a roving tab stop on the row,
|
|
6401
|
+
the buttons keep their own names), as `SortableList` does. Do not exclude the
|
|
6402
|
+
list from the axe run.
|
|
6403
|
+
|
|
6356
6404
|
### An input inside an `InputGroup` lost a class or a style of `Input`
|
|
6357
6405
|
|
|
6358
6406
|
**When:** a test or a style relies on a class of `Input` or `Textarea`
|
|
@@ -162,6 +162,17 @@
|
|
|
162
162
|
[data-slot="form-actions"] {
|
|
163
163
|
@apply sticky bottom-0 z-10 flex w-full justify-end gap-2 bg-background/80 border-t-8 border-transparent px-4 pb-[max(1rem,env(safe-area-inset-bottom))] backdrop-blur-sm max-sm:*:flex-1;
|
|
164
164
|
}
|
|
165
|
+
/* `data-padding="none"`: the form sits flush in a container that
|
|
166
|
+
already pads it (a page, a card, a sheet): no inset on the fields or
|
|
167
|
+
the actions, so both align with the container's content edge. */
|
|
168
|
+
&[data-padding="none"] {
|
|
169
|
+
[data-slot="form-fields"] {
|
|
170
|
+
@apply p-0;
|
|
171
|
+
}
|
|
172
|
+
[data-slot="form-actions"] {
|
|
173
|
+
@apply px-0;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
165
176
|
}
|
|
166
177
|
|
|
167
178
|
/* No height cap and no scroll of its own: the page (or the overlay) is
|
|
@@ -54,6 +54,7 @@
|
|
|
54
54
|
@import "./ui/actions/button-group/button-group-standard.css";
|
|
55
55
|
/* ActivityLayout: the route transition (cross-fade, none under reduced motion). */
|
|
56
56
|
@import "./ui/layout/app-shell/route-transition.css";
|
|
57
|
+
@import "./ui/layout/app-shell/app-header.css";
|
|
57
58
|
@import "./ui/layout/app-shell/activity-backdrop.css";
|
|
58
59
|
@import "./ui/layout/app-shell/activity-backdrop-shapes.css";
|
|
59
60
|
@import "./ui/layout/auth-card/auth-card-backdrop.css";
|
|
@@ -97,6 +98,7 @@
|
|
|
97
98
|
@import "./ui/actions/toolbar/toolbar-morph-slots.css";
|
|
98
99
|
@import "./ui/actions/toolbar/toolbar-morph-widen.css";
|
|
99
100
|
@import "./ui/actions/toolbar/toolbar-expressive-look.css";
|
|
101
|
+
@import "./ui/layout/navigation-toolbar/navigation-toolbar.css";
|
|
100
102
|
@import "./ui/actions/toolbar/toolbar-density.css";
|
|
101
103
|
@import "./editor-toolbar-expressive.css";
|
|
102
104
|
@import "./editor-floating-bar.css";
|
|
@@ -142,6 +144,8 @@
|
|
|
142
144
|
@import "./ui/display/seat-ring/seat-ring-ring.css";
|
|
143
145
|
/* VoteTally: ranked bars with counts, shares and voters. */
|
|
144
146
|
@import "./ui/display/vote-tally/vote-tally.css";
|
|
147
|
+
/* TubeCap: a specimen tube chip, cap colours fixed by the tube convention. */
|
|
148
|
+
@import "./ui/display/tube-cap/tube-cap.css";
|
|
145
149
|
/* SecretCard: a face that is not rendered until it is revealed. */
|
|
146
150
|
@import "./ui/display/secret-card/secret-card.css";
|
|
147
151
|
/* Alert and Banner span the row in the form grids (#1497). */
|
|
@@ -206,6 +210,7 @@
|
|
|
206
210
|
@import "./ui/fields/attributes/attributes.css";
|
|
207
211
|
/* Background: the gradient preset's CSS, shared (lib/backgrounds/css); the other presets are opt-in: backgrounds.css. */
|
|
208
212
|
@import "./background-shared.css";
|
|
213
|
+
@import "./ui/layout/app-search/app-search.css"; /* AppSearchBar, SearchView */
|
|
209
214
|
@import "./ui/widgets/drawing/drawing.css"; /* @nxgt/material/draw: role colours, focus ring */
|
|
210
215
|
@import "./ui/widgets/drawing/drawing-animate.css";
|
|
211
216
|
@import "./ui/widgets/barcode/barcode.css"; /* @nxgt/material/barcode: symbol colours, label sheet */
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/* FabDock: the bottom-end corner, 16px in (24px from 840px wide, M3's
|
|
2
|
-
* medium window), above the home indicator
|
|
3
|
-
*
|
|
2
|
+
* medium window), above the home indicator, above a docked bar that sets
|
|
3
|
+
* --nxgt-media-dock and above a bottom navigation bar (--nxgt-nav-bar);
|
|
4
|
+
* --nxgt-bottom-chrome is the two together. The bar's room holds the
|
|
5
|
+
* safe area, so the dock clears the taller of the two, not their sum. `contained` places it in its
|
|
6
|
+
* positioned parent.
|
|
4
7
|
* While a FabMenu in it is open, a light scrim covers the page (contained:
|
|
5
8
|
* the pane) behind the pills. The menu is modal, so the whole page is inert
|
|
6
9
|
* either way. */
|
|
@@ -11,8 +14,13 @@
|
|
|
11
14
|
inset-inline-end: var(--fab-dock-gap);
|
|
12
15
|
inset-block-end: calc(
|
|
13
16
|
var(--fab-dock-gap) +
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
max(
|
|
18
|
+
env(safe-area-inset-bottom, 0px),
|
|
19
|
+
var(
|
|
20
|
+
--nxgt-bottom-chrome,
|
|
21
|
+
calc(var(--nxgt-nav-bar, 0px) + var(--nxgt-media-dock, 0px))
|
|
22
|
+
)
|
|
23
|
+
)
|
|
16
24
|
);
|
|
17
25
|
z-index: 40;
|
|
18
26
|
display: flex;
|
|
@@ -33,8 +41,13 @@
|
|
|
33
41
|
padding: var(--fab-dock-gap);
|
|
34
42
|
padding-block-end: calc(
|
|
35
43
|
var(--fab-dock-gap) +
|
|
36
|
-
|
|
37
|
-
|
|
44
|
+
max(
|
|
45
|
+
env(safe-area-inset-bottom, 0px),
|
|
46
|
+
var(
|
|
47
|
+
--nxgt-bottom-chrome,
|
|
48
|
+
calc(var(--nxgt-nav-bar, 0px) + var(--nxgt-media-dock, 0px))
|
|
49
|
+
)
|
|
50
|
+
)
|
|
38
51
|
);
|
|
39
52
|
}
|
|
40
53
|
@media (min-width: 840px) {
|