@espressif/dashboard-ui-components 1.11.1 → 1.12.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/.claude/rules/dashboard-ui-consumption.md +176 -5
- package/.cursor/rules/dashboard-ui-consumption.mdc +163 -4
- package/CHANGELOG.md +1020 -0
- package/README.md +240 -7
- package/THIRD-PARTY-NOTICES.md +2 -1
- package/dist/alert.props-CcKo49Rb.d.ts +44 -0
- package/dist/animation/index.d.ts +3 -0
- package/dist/animation/index.js +3 -0
- package/dist/avatar.props-2q5BsX-R.d.ts +29 -0
- package/dist/button-BK-DIR_L.d.ts +21 -0
- package/dist/button-BxJ7s6sR.d.ts +76 -0
- package/dist/calendar.props-BtCzuWH1.d.ts +12 -0
- package/dist/carousel/index.d.ts +2 -0
- package/dist/carousel/index.js +2 -0
- package/dist/charts/index.d.ts +5 -0
- package/dist/charts/index.js +9 -0
- package/dist/common/app-logo/app-logo.js +1 -1
- package/dist/common/index.d.ts +9 -20
- package/dist/common/my-account-menu/my-account-menu.js +45 -13
- package/dist/common/profile-card/profile-card.js +3 -2
- package/dist/components/accordion/accordion.js +14 -5
- package/dist/components/accordion/index.d.ts +36 -0
- package/dist/components/accordion/index.js +2 -0
- package/dist/components/advanced-search-box/advanced-search-box.js +8 -2
- package/dist/components/advanced-search-box/index.d.ts +29 -0
- package/dist/components/advanced-search-box/index.js +2 -0
- package/dist/components/alert/alert.js +2 -1
- package/dist/components/alert/index.d.ts +12 -0
- package/dist/components/alert/index.js +2 -0
- package/dist/components/anchored-panel/anchored-panel.js +83 -0
- package/dist/components/anchored-panel/index.d.ts +31 -0
- package/dist/components/anchored-panel/index.js +2 -0
- package/dist/components/animated-containers/index.d.ts +13 -0
- package/dist/components/animated-containers/index.js +2 -0
- package/dist/components/async-multi-select/async-multi-select.js +48 -7
- package/dist/components/async-multi-select/index.d.ts +63 -0
- package/dist/components/async-multi-select/index.js +2 -0
- package/dist/components/avatar/avatar.js +11 -4
- package/dist/components/avatar/index.d.ts +8 -0
- package/dist/components/avatar/index.js +2 -0
- package/dist/components/avatar-group/avatar-group.js +35 -0
- package/dist/components/avatar-group/index.d.ts +31 -0
- package/dist/components/avatar-group/index.js +2 -0
- package/dist/components/badge/index.d.ts +14 -0
- package/dist/components/badge/index.js +2 -0
- package/dist/components/breadcrumb/index.d.ts +21 -0
- package/dist/components/breadcrumb/index.js +2 -0
- package/dist/components/bubble/bubble.js +18 -0
- package/dist/components/bubble/index.d.ts +19 -0
- package/dist/components/bubble/index.js +2 -0
- package/dist/components/button/button.js +87 -25
- package/dist/components/button/flash-button.js +9 -3
- package/dist/components/button/index.d.ts +56 -0
- package/dist/components/button/index.js +6 -0
- package/dist/components/button-group/index.d.ts +16 -0
- package/dist/components/button-group/index.js +2 -0
- package/dist/components/calendar/calendar.js +5 -5
- package/dist/components/calendar/index.d.ts +11 -0
- package/dist/components/calendar/index.js +2 -0
- package/dist/components/card/index.d.ts +11 -0
- package/dist/components/card/index.js +2 -0
- package/dist/components/card-rail/card-rail.js +50 -0
- package/dist/components/card-rail/index.d.ts +30 -0
- package/dist/components/card-rail/index.js +2 -0
- package/dist/components/cards/collapsible-card.js +5 -2
- package/dist/components/cards/index.d.ts +16200 -0
- package/dist/components/cards/index.js +8 -0
- package/dist/components/cards/section-card.js +133 -8
- package/dist/components/cards/simple-card.js +5 -2
- package/dist/components/carousel/carousel.js +137 -49
- package/dist/components/carousel/index.d.ts +130 -0
- package/dist/components/carousel/index.js +2 -0
- package/dist/components/category-card/category-card.js +111 -0
- package/dist/components/category-card/index.d.ts +55 -0
- package/dist/components/category-card/index.js +2 -0
- package/dist/components/chart/area-chart.js +95 -85
- package/dist/components/chart/bar-chart.js +123 -60
- package/dist/components/chart/chart.js +127 -3
- package/dist/components/chart/composed-chart.js +109 -98
- package/dist/components/chart/donut-chart.js +23 -5
- package/dist/components/chart/index.d.ts +732 -0
- package/dist/components/chart/index.js +9 -0
- package/dist/components/chart/line-chart.js +93 -83
- package/dist/components/chart/treemap-chart.js +71 -58
- package/dist/components/check-badge/check-badge.js +25 -0
- package/dist/components/check-badge/index.d.ts +13 -0
- package/dist/components/check-badge/index.js +2 -0
- package/dist/components/checkbox/index.d.ts +8 -0
- package/dist/components/checkbox/index.js +2 -0
- package/dist/components/choice-card/choice-card.js +99 -0
- package/dist/components/choice-card/index.d.ts +41 -0
- package/dist/components/choice-card/index.js +2 -0
- package/dist/components/circular-progress/circular-progress.js +5 -2
- package/dist/components/circular-progress/index.d.ts +23 -0
- package/dist/components/circular-progress/index.js +2 -0
- package/dist/components/code/index.d.ts +40 -0
- package/dist/components/code/index.js +2 -0
- package/dist/components/code-editor/code-editor.js +9 -3
- package/dist/components/code-editor/index.d.ts +82 -0
- package/dist/components/code-editor/index.js +2 -0
- package/dist/components/collapsible/index.d.ts +42 -0
- package/dist/components/collapsible/index.js +2 -0
- package/dist/components/column-panel/column-panel.js +38 -0
- package/dist/components/column-panel/index.d.ts +37 -0
- package/dist/components/column-panel/index.js +3 -0
- package/dist/components/column-panel/use-panel-flag.js +27 -0
- package/dist/components/combobox/index.d.ts +28 -0
- package/dist/components/combobox/index.js +2 -0
- package/dist/components/confirmation-dialog/confirmation-dialog.js +1 -1
- package/dist/components/confirmation-dialog/index.d.ts +40 -0
- package/dist/components/confirmation-dialog/index.js +3 -0
- package/dist/components/content-container/index.d.ts +16 -0
- package/dist/components/content-container/index.js +2 -0
- package/dist/components/copiable-text/index.d.ts +33 -0
- package/dist/components/copiable-text/index.js +2 -0
- package/dist/components/coverflow/_constants/coverflow-poses.js +23 -0
- package/dist/components/coverflow/_constants/coverflow-shapes.js +23 -0
- package/dist/components/coverflow/_hooks/use-coverflow.js +90 -0
- package/dist/components/coverflow/_utils/ring.js +24 -0
- package/dist/components/coverflow/coverflow.js +198 -0
- package/dist/components/coverflow/index.d.ts +105 -0
- package/dist/components/coverflow/index.js +2 -0
- package/dist/components/data-table/data-table.js +9 -2
- package/dist/components/data-table/index.d.ts +120 -0
- package/dist/components/data-table/index.js +3 -0
- package/dist/components/date-picker/date-picker.js +5 -2
- package/dist/components/date-picker/index.d.ts +50 -0
- package/dist/components/date-picker/index.js +2 -0
- package/dist/components/date-range-picker/date-range-picker.js +11 -2
- package/dist/components/date-range-picker/index.d.ts +100 -0
- package/dist/components/date-range-picker/index.js +3 -0
- package/dist/components/date-time-picker/date-time-picker.js +5 -2
- package/dist/components/date-time-picker/index.d.ts +79 -0
- package/dist/components/date-time-picker/index.js +2 -0
- package/dist/components/device-icon/index.d.ts +17 -0
- package/dist/components/device-icon/index.js +2 -0
- package/dist/components/dialog/index.d.ts +38 -0
- package/dist/components/dialog/index.js +2 -0
- package/dist/components/dropdown-menu/index.d.ts +57 -0
- package/dist/components/dropdown-menu/index.js +2 -0
- package/dist/components/dynamic-list/dynamic-list.js +4 -4
- package/dist/components/dynamic-list/index.d.ts +74 -0
- package/dist/components/dynamic-list/index.js +2 -0
- package/dist/components/error-display/index.d.ts +17 -0
- package/dist/components/error-display/index.js +3 -0
- package/dist/components/expandable-text/expandable-text-overlay.js +78 -0
- package/dist/components/expandable-text/expandable-text.js +73 -0
- package/dist/components/expandable-text/index.d.ts +39 -0
- package/dist/components/expandable-text/index.js +2 -0
- package/dist/components/expandable-text/use-clamped.js +23 -0
- package/dist/components/facet-filters/_hooks/use-filter-group.js +51 -0
- package/dist/components/facet-filters/active-filters.js +31 -0
- package/dist/components/facet-filters/filter-group.js +110 -0
- package/dist/components/facet-filters/filters-panel.js +59 -0
- package/dist/components/facet-filters/filters-pill.js +40 -0
- package/dist/components/facet-filters/index.d.ts +104 -0
- package/dist/components/facet-filters/index.js +6 -0
- package/dist/components/facet-filters/use-filters-collapsed.js +21 -0
- package/dist/components/feature-grid/feature-grid.js +115 -0
- package/dist/components/feature-grid/index.d.ts +53 -0
- package/dist/components/feature-grid/index.js +2 -0
- package/dist/components/file-input/file-input.js +9 -3
- package/dist/components/file-input/index.d.ts +78 -0
- package/dist/components/file-input/index.js +2 -0
- package/dist/components/file-upload/file-upload.js +10 -5
- package/dist/components/file-upload/index.d.ts +38 -0
- package/dist/components/file-upload/index.js +2 -0
- package/dist/components/filters-bar/filters-bar.js +5 -1
- package/dist/components/filters-bar/index.d.ts +26 -0
- package/dist/components/filters-bar/index.js +2 -0
- package/dist/components/flip-card/flip-card.js +147 -0
- package/dist/components/flip-card/index.d.ts +43 -0
- package/dist/components/flip-card/index.js +2 -0
- package/dist/components/floating-window/_hooks/use-drag-move.js +76 -0
- package/dist/components/floating-window/floating-window.js +97 -0
- package/dist/components/floating-window/index.d.ts +45 -0
- package/dist/components/floating-window/index.js +2 -0
- package/dist/components/form/index.d.ts +28 -0
- package/dist/components/form/index.js +2 -0
- package/dist/components/fullscreen-dialog/fullscreen-dialog.js +6 -2
- package/dist/components/fullscreen-dialog/index.d.ts +38 -0
- package/dist/components/fullscreen-dialog/index.js +2 -0
- package/dist/components/horizontal-stepper/horizontal-stepper.js +122 -0
- package/dist/components/horizontal-stepper/index.d.ts +70 -0
- package/dist/components/horizontal-stepper/index.js +2 -0
- package/dist/components/icon-avatar/index.d.ts +9 -0
- package/dist/components/icon-avatar/index.js +2 -0
- package/dist/components/icon-text-action-card/icon-text-action-card.js +9 -5
- package/dist/components/icon-text-action-card/index.d.ts +11 -0
- package/dist/components/icon-text-action-card/index.js +2 -0
- package/dist/components/identicon/identicon.js +33 -0
- package/dist/components/identicon/index.d.ts +26 -0
- package/dist/components/identicon/index.js +2 -0
- package/dist/components/illustration/index.d.ts +37 -0
- package/dist/components/illustration/index.js +3 -0
- package/dist/components/index.d.ts +177 -19529
- package/dist/components/index.js +61 -10
- package/dist/components/input/index.d.ts +15 -0
- package/dist/components/input/index.js +3 -0
- package/dist/components/input-group/index.d.ts +35 -0
- package/dist/components/input-group/index.js +2 -0
- package/dist/components/input-group/input-group.js +41 -0
- package/dist/components/input-otp/index.d.ts +63 -0
- package/dist/components/input-otp/index.js +2 -0
- package/dist/components/key-value-manager/index.d.ts +63 -0
- package/dist/components/key-value-manager/index.js +2 -0
- package/dist/components/key-value-manager/key-value-manager-table.js +7 -5
- package/dist/components/label/index.d.ts +8 -0
- package/dist/components/label/index.js +2 -0
- package/dist/components/link/index.d.ts +33 -0
- package/dist/components/link/index.js +2 -0
- package/dist/components/list/index.d.ts +9 -0
- package/dist/components/list/index.js +3 -0
- package/dist/components/list/list-item.utils.js +1 -1
- package/dist/components/list/list.js +3 -1
- package/dist/components/list-details/index.d.ts +51 -0
- package/dist/components/list-details/index.js +2 -0
- package/dist/components/list-details/list-details.js +5 -2
- package/dist/components/lottie-animation-container/index.d.ts +10 -0
- package/dist/components/lottie-animation-container/index.js +2 -0
- package/dist/components/lottie-animation-container/lottie-animation-container.js +22 -3
- package/dist/components/lottie-animations/index.d.ts +8 -0
- package/dist/components/lottie-animations/index.js +2 -0
- package/dist/components/markdown-content/index.d.ts +32 -0
- package/dist/components/markdown-content/index.js +2 -0
- package/dist/components/media-card/index.d.ts +125 -0
- package/dist/components/media-card/index.js +4 -0
- package/dist/components/media-card/media-card-image.js +59 -0
- package/dist/components/media-card/media-card-reveal.js +76 -0
- package/dist/components/media-card/media-card.classes.js +37 -0
- package/dist/components/media-card/media-card.js +91 -0
- package/dist/components/media-stage/index.d.ts +41 -0
- package/dist/components/media-stage/index.js +2 -0
- package/dist/components/media-stage/media-stage.js +48 -0
- package/dist/components/menu/index.d.ts +14 -0
- package/dist/components/menu/index.js +2 -0
- package/dist/components/message-scroller/_hooks/use-follow-bottom.js +85 -0
- package/dist/components/message-scroller/index.d.ts +29 -0
- package/dist/components/message-scroller/index.js +2 -0
- package/dist/components/message-scroller/message-scroller.js +65 -0
- package/dist/components/mini-bar-chart/index.d.ts +40 -0
- package/dist/components/mini-bar-chart/index.js +2 -0
- package/dist/components/mini-bar-chart/mini-bar-chart.js +93 -0
- package/dist/components/monospace-content/index.d.ts +43 -0
- package/dist/components/monospace-content/index.js +2 -0
- package/dist/components/monospace-content/monospace-content.js +1 -1
- package/dist/components/nav-bar/index.d.ts +148 -0
- package/dist/components/nav-bar/index.js +2 -0
- package/dist/components/nav-bar/nav-bar-details-panel.js +158 -44
- package/dist/components/nav-bar/nav-bar-mobile-menu.js +93 -27
- package/dist/components/nav-bar/nav-bar.js +256 -138
- package/dist/components/nav-bar/use-nav-bar-hover-details.js +80 -0
- package/dist/components/nav-bar/use-nav-bar-overflow.js +5 -5
- package/dist/components/notice-strip/index.d.ts +32 -0
- package/dist/components/notice-strip/index.js +2 -0
- package/dist/components/notice-strip/notice-strip.js +57 -0
- package/dist/components/option-card-group/index.d.ts +50 -0
- package/dist/components/option-card-group/index.js +2 -0
- package/dist/components/option-card-group/option-card-group.js +76 -0
- package/dist/components/overflow-badge-list/index.d.ts +63 -0
- package/dist/components/overflow-badge-list/index.js +2 -0
- package/dist/components/overflow-badge-list/overflow-badge-list.js +78 -19
- package/dist/components/page-banner/index.d.ts +33 -0
- package/dist/components/page-banner/index.js +2 -0
- package/dist/components/page-banner/page-banner.js +56 -0
- package/dist/components/page-container/index.d.ts +20 -0
- package/dist/components/page-container/index.js +3 -0
- package/dist/components/page-container/page-container.js +5 -5
- package/dist/components/pagination/index.d.ts +31 -0
- package/dist/components/pagination/index.js +3 -0
- package/dist/components/popover/index.d.ts +60 -0
- package/dist/components/popover/index.js +3 -0
- package/dist/components/preview-card/index.d.ts +24 -0
- package/dist/components/preview-card/index.js +2 -0
- package/dist/components/progress-bar/index.d.ts +32 -0
- package/dist/components/progress-bar/index.js +2 -0
- package/dist/components/progress-bar/progress-bar.js +22 -6
- package/dist/components/radio-group/index.d.ts +24 -0
- package/dist/components/radio-group/index.js +2 -0
- package/dist/components/rank-numeral/index.d.ts +30 -0
- package/dist/components/rank-numeral/index.js +2 -0
- package/dist/components/rank-numeral/rank-numeral.js +26 -0
- package/dist/components/reaction-button/index.d.ts +32 -0
- package/dist/components/reaction-button/index.js +2 -0
- package/dist/components/reaction-button/reaction-button.js +50 -0
- package/dist/components/readout/index.d.ts +31 -0
- package/dist/components/readout/index.js +2 -0
- package/dist/components/readout/readout.js +63 -0
- package/dist/components/requirement-list/index.d.ts +52 -0
- package/dist/components/requirement-list/index.js +2 -0
- package/dist/components/requirement-list/requirement-list.js +29 -8
- package/dist/components/resizable/index.d.ts +31 -0
- package/dist/components/resizable/index.js +4 -0
- package/dist/components/resizable/resizable-group.js +23 -0
- package/dist/components/resizable/resizable-panel.js +28 -0
- package/dist/components/resizable/resizable-separator.js +24 -0
- package/dist/components/reveal/index.d.ts +23 -0
- package/dist/components/reveal/index.js +2 -0
- package/dist/components/reveal/reveal.js +24 -0
- package/dist/components/scroll-area/index.d.ts +27 -0
- package/dist/components/scroll-area/index.js +2 -0
- package/dist/components/scrollable-sections/index.d.ts +58 -0
- package/dist/components/scrollable-sections/index.js +2 -0
- package/dist/components/scrollable-sections/scrollable-sections.js +11 -3
- package/dist/components/search-box/index.d.ts +32 -0
- package/dist/components/search-box/index.js +2 -0
- package/dist/components/search-box/search-box.js +18 -3
- package/dist/components/search-field-shell.js +1 -1
- package/dist/components/select/index.d.ts +44 -0
- package/dist/components/select/index.js +2 -0
- package/dist/components/selectable-card-list/checkbox-card-list.js +5 -3
- package/dist/components/selectable-card-list/index.d.ts +76 -0
- package/dist/components/selectable-card-list/index.js +2 -0
- package/dist/components/selectable-card-list/radio-card-list.js +12 -6
- package/dist/components/selectable-card-list/selectable-card-list-shared.js +24 -12
- package/dist/components/selectable-card-list/selectable-card-list.js +12 -3
- package/dist/components/separator/index.d.ts +24 -0
- package/dist/components/separator/index.js +2 -0
- package/dist/components/share-menu/index.d.ts +55 -0
- package/dist/components/share-menu/index.js +2 -0
- package/dist/components/share-menu/share-marks.js +31 -0
- package/dist/components/share-menu/share-menu.js +140 -0
- package/dist/components/share-menu/share-urls.js +15 -0
- package/dist/components/sheet/index.d.ts +41 -0
- package/dist/components/sheet/index.js +2 -0
- package/dist/components/showcase-card/index.d.ts +53 -0
- package/dist/components/showcase-card/index.js +2 -0
- package/dist/components/showcase-card/showcase-card.js +75 -0
- package/dist/components/sidebar/index.d.ts +109 -0
- package/dist/components/sidebar/index.js +4 -0
- package/dist/components/sidebar/sidebar.js +56 -40
- package/dist/components/simple-clickable-card/index.d.ts +11 -0
- package/dist/components/simple-clickable-card/index.js +2 -0
- package/dist/components/simple-clickable-card/simple-clickable-card-shared.js +2 -2
- package/dist/components/simple-clickable-card/simple-clickable-card.js +5 -2
- package/dist/components/simple-info-card/index.d.ts +25 -0
- package/dist/components/simple-info-card/index.js +2 -0
- package/dist/components/simple-info-card/simple-info-card.js +6 -3
- package/dist/components/simple-list/index.d.ts +63 -0
- package/dist/components/simple-list/index.js +2 -0
- package/dist/components/simple-list/simple-list.js +3 -1
- package/dist/components/simple-paginated-list/index.d.ts +20 -0
- package/dist/components/simple-paginated-list/index.js +2 -0
- package/dist/components/simplified-date/index.d.ts +18 -0
- package/dist/components/simplified-date/index.js +2 -0
- package/dist/components/skeleton/index.d.ts +5 -0
- package/dist/components/skeleton/index.js +2 -0
- package/dist/components/skeletons/index.d.ts +11 -0
- package/dist/components/skeletons/index.js +2 -0
- package/dist/components/sort-menu/index.d.ts +34 -0
- package/dist/components/sort-menu/index.js +2 -0
- package/dist/components/sort-menu/sort-menu.js +39 -0
- package/dist/components/spinner/index.d.ts +15 -0
- package/dist/components/spinner/index.js +2 -0
- package/dist/components/stat-card/index.d.ts +43 -0
- package/dist/components/stat-card/index.js +2 -0
- package/dist/components/stat-card/stat-card.js +31 -12
- package/dist/components/status-badge/index.d.ts +24 -0
- package/dist/components/status-badge/index.js +2 -0
- package/dist/components/status-badge/status-badge.js +3 -2
- package/dist/components/status-card-list/index.d.ts +24 -0
- package/dist/components/status-card-list/index.js +2 -0
- package/dist/components/status-card-list/status-card-list.js +8 -4
- package/dist/components/step-tabs/index.d.ts +94 -0
- package/dist/components/step-tabs/index.js +2 -0
- package/dist/components/step-tabs/step-tabs.js +202 -0
- package/dist/components/style-scope/index.d.ts +32 -0
- package/dist/components/style-scope/index.js +2 -0
- package/dist/components/style-scope/style-scope.js +49 -0
- package/dist/components/switch/index.d.ts +15 -0
- package/dist/components/switch/index.js +2 -0
- package/dist/components/table/index.d.ts +18 -0
- package/dist/components/table/index.js +2 -0
- package/dist/components/tabs/index.d.ts +103 -0
- package/dist/components/tabs/index.js +2 -0
- package/dist/components/tag/index.d.ts +31 -0
- package/dist/components/tag/index.js +2 -0
- package/dist/components/tag/tag.js +79 -28
- package/dist/components/tag-input/index.d.ts +36 -0
- package/dist/components/tag-input/index.js +2 -0
- package/dist/components/tag-input/tag-input.js +10 -4
- package/dist/components/text-effects/index.d.ts +53 -0
- package/dist/components/text-effects/index.js +6 -0
- package/dist/components/textarea/index.d.ts +16 -0
- package/dist/components/textarea/index.js +2 -0
- package/dist/components/thumbnail-strip/index.d.ts +42 -0
- package/dist/components/thumbnail-strip/index.js +2 -0
- package/dist/components/thumbnail-strip/thumbnail-strip.js +124 -0
- package/dist/components/thumbnail-strip/use-scroll-edges.js +41 -0
- package/dist/components/time-picker/index.d.ts +13 -0
- package/dist/components/time-picker/index.js +2 -0
- package/dist/components/timeline/index.d.ts +39 -0
- package/dist/components/timeline/index.js +2 -0
- package/dist/components/timeline/timeline.js +85 -0
- package/dist/components/toast/index.d.ts +56 -0
- package/dist/components/toast/index.js +2 -0
- package/dist/components/toast/toast.js +42 -32
- package/dist/components/togglable-items-list/index.d.ts +28 -0
- package/dist/components/togglable-items-list/index.js +2 -0
- package/dist/components/toggle-group/index.d.ts +35 -0
- package/dist/components/toggle-group/index.js +2 -0
- package/dist/components/toolbar/index.d.ts +58 -0
- package/dist/components/toolbar/index.js +3 -0
- package/dist/components/toolbar/toolbar-button.js +40 -0
- package/dist/components/toolbar/toolbar.js +56 -0
- package/dist/components/tooltip/index.d.ts +29 -0
- package/dist/components/tooltip/index.js +3 -0
- package/dist/components/tooltip/tooltip.js +12 -2
- package/dist/components/transfer-list/index.d.ts +36 -0
- package/dist/components/transfer-list/index.js +2 -0
- package/dist/components/transfer-list/transfer-list.js +1 -1
- package/dist/components/truncated-line-with-tooltip/index.d.ts +22 -0
- package/dist/components/truncated-line-with-tooltip/index.js +2 -0
- package/dist/components/truncated-line-with-tooltip/truncated-line-with-tooltip.js +26 -8
- package/dist/components/typography/index.d.ts +19 -0
- package/dist/components/typography/index.js +3 -0
- package/dist/components/use-mobile/index.d.ts +3 -0
- package/dist/components/use-mobile/index.js +2 -0
- package/dist/components/user-type-badge/index.d.ts +39 -0
- package/dist/components/user-type-badge/index.js +3 -0
- package/dist/components/user-type-badge/user-type-badge.js +2 -1
- package/dist/components/vertical-stepper/index.d.ts +7 -0
- package/dist/components/vertical-stepper/index.js +2 -0
- package/dist/components/vertical-stepper/vertical-stepper.js +33 -6
- package/dist/components/view-toggle/index.d.ts +38 -0
- package/dist/components/view-toggle/index.js +2 -0
- package/dist/components/view-toggle/view-toggle.js +56 -0
- package/dist/core/animate-ui/components/animate/code.js +83 -9
- package/dist/core/animate-ui/components/animate/tabs.js +234 -19
- package/dist/core/animate-ui/components/animate/tooltip.js +10 -2
- package/dist/core/animate-ui/components/base/preview-card.js +20 -3
- package/dist/core/animate-ui/components/buttons/copy.js +12 -6
- package/dist/core/animate-ui/components/radix/dialog.js +17 -3
- package/dist/core/animate-ui/components/radix/dropdown-menu.js +26 -9
- package/dist/core/animate-ui/components/radix/sheet.js +20 -4
- package/dist/core/animate-ui/components/radix/sidebar.js +9 -9
- package/dist/core/animate-ui/components/radix/toggle-group.js +103 -13
- package/dist/core/animate-ui/components/radix/toggle.js +5 -5
- package/dist/core/animate-ui/primitives/animate/code-block.js +31 -4
- package/dist/core/animate-ui/primitives/animate/shiki-highlighter.js +5 -2
- package/dist/core/animate-ui/primitives/animate/tabs.js +7 -4
- package/dist/core/animate-ui/primitives/animate/tooltip.js +10 -3
- package/dist/core/animate-ui/primitives/base/preview-card.js +2 -2
- package/dist/core/animate-ui/primitives/base/progress.js +1 -1
- package/dist/core/animate-ui/primitives/base/radio.js +3 -3
- package/dist/core/animate-ui/primitives/effects/highlight.js +1 -0
- package/dist/core/animate-ui/primitives/radix/accordion.js +1 -1
- package/dist/core/animate-ui/primitives/radix/dialog.js +6 -3
- package/dist/core/animate-ui/primitives/radix/dropdown-menu.js +2 -2
- package/dist/core/animate-ui/primitives/radix/sheet.js +7 -3
- package/dist/core/animate-ui/primitives/radix/switch.js +2 -2
- package/dist/core/animate-ui/primitives/radix/toggle-group.js +2 -2
- package/dist/core/badge.js +5 -2
- package/dist/core/breadcrumb.js +1 -1
- package/dist/core/button/button.js +8 -8
- package/dist/core/button/craft-button.js +8 -2
- package/dist/core/button.js +17 -7
- package/dist/core/card.js +23 -5
- package/dist/core/combobox/combobox.js +8 -2
- package/dist/core/command.js +3 -3
- package/dist/core/form.js +1 -1
- package/dist/core/hooks/use-nested-layer-press-guard.js +46 -0
- package/dist/core/hooks/use-on-screen.js +33 -0
- package/dist/core/hooks/use-prefers-reduced-motion.js +19 -0
- package/dist/core/hooks/use-scroll-overflow.js +20 -0
- package/dist/core/index.d.ts +30 -5
- package/dist/core/index.js +5 -2
- package/dist/core/input/input-password.js +13 -9
- package/dist/core/input/input.js +38 -12
- package/dist/core/input-otp/input-otp.js +9 -5
- package/dist/core/popover-group.js +48 -0
- package/dist/core/popover-hover.js +127 -0
- package/dist/core/popover.js +75 -6
- package/dist/core/select.js +50 -19
- package/dist/core/table.js +5 -3
- package/dist/core/textarea/textarea.js +11 -3
- package/dist/data-table/index.d.ts +4 -0
- package/dist/data-table/index.js +3 -0
- package/dist/date/index.d.ts +11 -0
- package/dist/date/index.js +7 -0
- package/dist/forms/index.d.ts +4 -0
- package/dist/forms/index.js +2 -0
- package/dist/icon-avatar.props-RYtw2eSW.d.ts +31 -0
- package/dist/icon-text-action-card.props-B2ggncUK.d.ts +53 -0
- package/dist/index.d.ts +169 -15
- package/dist/index.js +63 -10
- package/dist/input-CYI1hhGc.d.ts +38 -0
- package/dist/layouts/index.d.ts +132 -8
- package/dist/layouts/index.js +3 -1
- package/dist/layouts/minimal-workspace-layout/minimal-workspace-layout-context.js +5 -0
- package/dist/layouts/minimal-workspace-layout/minimal-workspace-layout.js +404 -0
- package/dist/layouts/minimal-workspace-layout/rail-logo.js +90 -0
- package/dist/layouts/minimal-workspace-layout/sidebar-trigger.js +42 -0
- package/dist/layouts/shared/account-menu-props.js +21 -0
- package/dist/layouts/shared/footer-branding.js +34 -0
- package/dist/layouts/shared/sidebar-logo.js +59 -0
- package/dist/layouts/workspace-layout/account-menu/account-menu.js +9 -3
- package/dist/layouts/workspace-layout/footer/footer.js +1 -1
- package/dist/layouts/workspace-layout/header/header.js +1 -1
- package/dist/layouts/workspace-layout/workspace-layout.js +28 -80
- package/dist/{list.props-x1j3CbcF.d.ts → list.props-DP_xPTqU.d.ts} +2 -1
- package/dist/markdown/index.d.ts +11 -0
- package/dist/markdown/index.js +5 -0
- package/dist/my-account-menu.props-C7DK71WC.d.ts +67 -0
- package/dist/page-container.props-JutTvKFq.d.ts +48 -0
- package/dist/resizable.props-RxFY5tm_.d.ts +44 -0
- package/dist/section-card-B7c5uc08.d.ts +84 -0
- package/dist/simple-clickable-card.props-BrPCw7CR.d.ts +51 -0
- package/dist/slot-DGErA9zi.d.ts +10 -0
- package/dist/status-badge.props-lKlEOfRt.d.ts +32 -0
- package/dist/style-axes-DSQ2DGc5.d.ts +133 -0
- package/dist/toast/index.d.ts +6 -0
- package/dist/toast/index.js +2 -0
- package/dist/tooltip-C0bYa8a3.d.ts +37 -0
- package/dist/{types-DtUxK-Am.d.ts → types-CkXflqg7.d.ts} +31 -1
- package/dist/utils/cn.js +6 -1
- package/dist/utils/color.js +35 -10
- package/dist/utils/index.d.ts +18 -2
- package/dist/utils/index.js +4 -1
- package/dist/utils/silver-shine.js +16 -1
- package/dist/utils/style-axes.js +227 -0
- package/dist/utils/variant.js +104 -8
- package/dist/utils/view-transition.js +21 -0
- package/dist/variant-D81RhpbR.d.ts +104 -0
- package/dist/vertical-stepper.props-BXYcbW70.d.ts +29 -0
- package/package.json +52 -6
- package/src/styles/colors.css +100 -4
- package/src/styles/globals.css +8 -131
- package/src/styles/style-axes.css +21 -0
- package/src/styles/theme.css +696 -0
- package/dist/app-logo.props-Ct7QBdTd.d.ts +0 -40
- package/dist/popover-ByLD3-Qv.d.ts +0 -204
|
@@ -17,14 +17,19 @@ Use only paths declared under `package.json` → `exports`:
|
|
|
17
17
|
|---------|---------|
|
|
18
18
|
| `@espressif/dashboard-ui-components` | Root barrel: re-exports **components**, **common**, and **layouts**. Use only when the app intentionally pulls from multiple surfaces; otherwise prefer narrower subpaths below. |
|
|
19
19
|
| `@espressif/dashboard-ui-components/components` | Public UI components and their types. |
|
|
20
|
+
| `@espressif/dashboard-ui-components/components/<folder>` | One component folder (`/components/button`, `/components/dialog`, …): the same names and objects `/components` exports for it. **Prefer this.** |
|
|
21
|
+
| `@espressif/dashboard-ui-components/charts` · `/data-table` · `/markdown` · `/date` · `/carousel` · `/forms` · `/animation` · `/toast` | One heavy family (recharts, tanstack, react-markdown + shiki, react-day-picker, embla, react-hook-form, lottie, sonner). |
|
|
20
22
|
| `@espressif/dashboard-ui-components/layouts` | `WorkspaceLayout`, `EntryLayout`, and related layout exports. |
|
|
21
23
|
| `@espressif/dashboard-ui-components/common` | Shared blocks (e.g. `AppLogo`, `ProfileCard`, `FooterCard`). |
|
|
22
24
|
| `@espressif/dashboard-ui-components/utils` | Utilities such as `cn`. |
|
|
23
|
-
| `@espressif/dashboard-ui-components/styles` | Global CSS
|
|
25
|
+
| `@espressif/dashboard-ui-components/styles` | Global CSS: Tailwind + every token + base page styles. |
|
|
26
|
+
| `@espressif/dashboard-ui-components/theme.css` | Tokens only (no `@import "tailwindcss"`, no Preflight, no page styles), for apps that bring their own Tailwind. |
|
|
24
27
|
| `@espressif/dashboard-ui-components/tailwind-preset` | Tailwind v4 preset. |
|
|
25
28
|
|
|
26
29
|
**Do not** import from deep paths that are not in `exports` (they will fail under strict package managers or break without warning). **Do not** treat `@espressif/dashboard-ui-components/core` as a supported app API: it exists in `exports` for technical reasons, but consumers must not import `core` — use composed exports from `/components`.
|
|
27
30
|
|
|
31
|
+
**Import from the narrowest path you can**: `/components/<folder>` for one component, a grouped path for a heavy family, a surface (`/components`, `/layouts`, …) only when importing many. Tests and dev servers evaluate everything an entry reaches. Entries that include Toast (`/toast`, `/components/toast`, `/components`, root) import sonner's CSS from JS; the others do no work at import time.
|
|
32
|
+
|
|
28
33
|
## Import style
|
|
29
34
|
|
|
30
35
|
- Prefer **named imports**: `import { Button, Alert } from '…/components'`.
|
|
@@ -38,6 +43,7 @@ Do **not** invent component or prop names from memory. The authoritative list of
|
|
|
38
43
|
exports and their props is the shipped type declarations:
|
|
39
44
|
|
|
40
45
|
- Components: `node_modules/@espressif/dashboard-ui-components/dist/components/index.d.ts`
|
|
46
|
+
- One component folder: `…/dist/components/<folder>/index.d.ts`; grouped entries: `…/dist/<group>/index.d.ts`
|
|
41
47
|
- Layouts / common / utils: the sibling `dist/<surface>/index.d.ts` files
|
|
42
48
|
- The README "Available Components" table for a human-readable overview
|
|
43
49
|
|
|
@@ -66,8 +72,73 @@ export function Example() {
|
|
|
66
72
|
## Styling and theming
|
|
67
73
|
|
|
68
74
|
- Add the library's styles once in your Tailwind v4 entry CSS: `@import "@espressif/dashboard-ui-components/styles";`. That file already declares the `@source` for the compiled `dist/`, so no extra `content`/`@source` entry is needed.
|
|
69
|
-
- Retheme by redeclaring the CSS custom properties (design tokens) **after** the `@import`, in both `:root` and `.dark
|
|
75
|
+
- Retheme by redeclaring the CSS custom properties (design tokens) **after** the `@import`, in both `:root` and `.dark` (or `[data-theme="dark"]`). Override `--font-sans` / `--font-mono` inside an `@theme` block.
|
|
76
|
+
- Layout heights: use `--espd-shell-header-height`, `--espd-workspace-layout-footer-height` and
|
|
77
|
+
`--espd-workspace-layout-hidden-footer-height`. The old names (`--espd-header-height`,
|
|
78
|
+
`--espd-footer-height`, `--espd-hidden-footer-height`) are deprecated fallbacks: do not use them
|
|
79
|
+
in new code, and when migrating rename an app's overrides and its own reads together.
|
|
80
|
+
- `MinimalWorkspaceLayout` (from `/layouts`) is the header-less alternative to `WorkspaceLayout`
|
|
81
|
+
with the same props: switch by renaming the component. It has no header bar or status footer
|
|
82
|
+
(`footerConfig`, `hideBreadcrumbs`, `sidebarConfig.allowCollapsible` / `variant` do not exist on
|
|
83
|
+
it), starts collapsed (`defaultSidebarOpen` defaults to `false`), and puts `topRightContent`
|
|
84
|
+
(fallback `headerConfig.rightContent`) over the content. Theme it with the
|
|
85
|
+
`--espd-minimal-workspace-layout-*` tokens, not `className` overrides on its parts: the sidebar
|
|
86
|
+
surface defaults to the page background (`-sidebar-background`, `-sidebar-background-expanded`),
|
|
87
|
+
and its border, shadow and row accent are derived from that surface unless `-sidebar-border-color`,
|
|
88
|
+
`-sidebar-elevation` or `-sidebar-accent` are set. Keep `-sidebar-width-collapsed` within 48–56px.
|
|
89
|
+
With `sidebarConfig.hideWhenCollapsed` the collapsed sidebar is hidden instead of a rail: a click
|
|
90
|
+
on the content's left edge peeks it over the content until the pointer leaves it, and
|
|
91
|
+
`MinimalWorkspaceSidebarTrigger` (from `/layouts`, placed in `topRightContent`) opens it inline;
|
|
92
|
+
a peek never reaches `onSidebarOpenChange`. Do not build an edge or trigger in the app. The edge
|
|
93
|
+
strip and the peek shadow are `-edge-color`, `-edge-width` and `-sidebar-overlay-elevation`.
|
|
70
94
|
- The library ships **no fonts**; the app supplies its own typeface via `--font-sans`.
|
|
95
|
+
- Pick `./theme.css` instead of `./styles` only when the app has its own `@import "tailwindcss"` (or legacy CSS a reset would break); then the app styles `body` itself.
|
|
96
|
+
- Dark mode applies under `.dark` **or** `[data-theme="dark"]` on an ancestor; override dark tokens under the selector the app uses. The library has no `prefers-color-scheme` handling.
|
|
97
|
+
- Beyond colour, retheme with the semantic tokens on `:root` (and the style-axis role tokens, next section): `--espd-control-height-sm|md|lg`, `--espd-button-padding-x-sm|md|lg`, `--espd-duration-fast|normal|slow`, `--espd-ring-width`, `--espd-ring-offset`, `--espd-on-solid-foreground` (plus Tailwind's `--radius-*`, `--shadow-*`, `--spacing`). Do not add new token names in app CSS.
|
|
98
|
+
- New variants (e.g. `glow`) are registered, not forked: augment `interface VariantRegistry` in `declare module '@espressif/dashboard-ui-components/components'` (in a file that imports that entry) and call `registerVariant('glow', (color) => ({ container, foreground, description }))` once at start-up. Built-in variants cannot be replaced.
|
|
99
|
+
|
|
100
|
+
## Shape, elevation, border and density (style axes)
|
|
101
|
+
|
|
102
|
+
Change corner radius, shadow, border width or density with the library's axes, not with
|
|
103
|
+
`className` overrides on every component:
|
|
104
|
+
|
|
105
|
+
- **A kind of component, app-wide:** set a **role token** in CSS after the `@import`:
|
|
106
|
+
`--espd-radius-{control|surface|overlay|pill|item}`,
|
|
107
|
+
`--espd-elevation-{control|surface|overlay}`, `--espd-border-width-{control|surface}`.
|
|
108
|
+
Unset means each component keeps its own look. Overlays render in portals, so set overlay
|
|
109
|
+
tokens on `:root`, not on a wrapper.
|
|
110
|
+
- **A subtree, from React:** `<StyleScope radius={{ control: "full" }} elevation={{ surface: "none" }} density="compact">`
|
|
111
|
+
(from `/components/style-scope`). It sets the same tokens on a `display: contents` wrapper.
|
|
112
|
+
- **One component:** the `radius`, `elevation` and `border` props, where the component's
|
|
113
|
+
type declares them (check its `.d.ts`; not every component takes every axis). They affect
|
|
114
|
+
that component only, never the components nested inside it. The date pickers' `radius` is
|
|
115
|
+
the trigger's; their calendar popover takes `popoverRadius` / `popoverElevation`.
|
|
116
|
+
- **Density:** `density="compact" | "default" | "comfortable"` on Table, DataTable, Card, List,
|
|
117
|
+
SimpleList, FiltersBar, Sidebar, DialogContent, SheetContent, or on `StyleScope`. It also sets
|
|
118
|
+
`--espd-gap-field` (FormItem) and `--espd-gap-stack` (DialogContent); for a form, wrap it in
|
|
119
|
+
`StyleScope density` (Form renders no element).
|
|
120
|
+
|
|
121
|
+
Precedence: `className` > instance prop > role token > the component's own default.
|
|
122
|
+
|
|
123
|
+
Things agents get wrong:
|
|
124
|
+
|
|
125
|
+
- An elevation token takes a `box-shadow` value: use `0 0 #0000` for "flat", **not** `none`
|
|
126
|
+
(it would also remove focus rings). The `elevation="none"` prop already does this.
|
|
127
|
+
- Older props still work: `rounded` (Input, InputOTP, FileInput, Tag, date pickers) equals
|
|
128
|
+
`radius="full"`; `noShadow` / `noBorder` (SimpleCard). When both are passed, `radius` /
|
|
129
|
+
`elevation` / `border` win. Prefer the new props in new code.
|
|
130
|
+
- Instance props need the library stylesheet (`./styles` or `./theme.css`).
|
|
131
|
+
- New values are registered, not invented: augment `RadiusRegistry` / `ElevationRegistry` /
|
|
132
|
+
`BorderRegistry` / `DensityRegistry` in `declare module '@espressif/dashboard-ui-components/components'`
|
|
133
|
+
and call `registerStyleValue(axis, name, css)` or `registerDensity(name, tokens)` once at
|
|
134
|
+
start-up. Built-ins cannot be replaced.
|
|
135
|
+
|
|
136
|
+
## Buttons
|
|
137
|
+
|
|
138
|
+
- Use the styled `Button` from `/components` (or `/components/button`). `/core` has an uncoloured base `Button` with the same name: not for apps.
|
|
139
|
+
- `fullWidth` **defaults to `true`**; pass `fullWidth={false}` for an inline button.
|
|
140
|
+
- For a link that looks like a button use `asChild`, never a Button that navigates in `onClick`:
|
|
141
|
+
`<Button asChild startIcon={<Plus />}><Link to="/new">Add</Link></Button>`. With `disabled`/`loading` the link gets `aria-disabled`, `tabIndex={-1}` and its clicks are cancelled.
|
|
71
142
|
|
|
72
143
|
## Optional peer dependencies
|
|
73
144
|
|
|
@@ -80,7 +151,7 @@ Install only when the feature is used:
|
|
|
80
151
|
| `shiki` | `Code` / syntax highlighting |
|
|
81
152
|
| `recharts` | Chart components |
|
|
82
153
|
|
|
83
|
-
Required peers for any usage: `react`, `react-dom`, `tailwindcss` (v4).
|
|
154
|
+
Required peers for any usage: `react`, `react-dom`, `tailwindcss` (v4.1+).
|
|
84
155
|
|
|
85
156
|
Do **not** tell users to install `react-markdown`, `remark-gfm`, or `rehype-slug` for
|
|
86
157
|
`MarkdownContent` — they are regular dependencies of this package and install with it.
|
|
@@ -141,12 +212,112 @@ Things agents get wrong about it:
|
|
|
141
212
|
if that matters.
|
|
142
213
|
- `className` / `style` style the editor box, not the `<textarea>`.
|
|
143
214
|
|
|
215
|
+
## Coverflow, Carousel or CardRail
|
|
216
|
+
|
|
217
|
+
- `Coverflow` (from `/components`): a 3D ring of image cards with a glass reflection and a
|
|
218
|
+
caption node per item, for a showcase of a few pictures (featured projects, boards).
|
|
219
|
+
`Carousel`: plain slides of any content in a strip. `CardRail`: a scrolling row of cards
|
|
220
|
+
that shows several at once.
|
|
221
|
+
- Items are `{ id, name, image?, imageAlt?, caption? }`; `name` is the accessible name.
|
|
222
|
+
Without `onOpen` the front card is a picture, not a button.
|
|
223
|
+
- `renderFace` is drawn **twice** (the card and its reflection): return a picture only —
|
|
224
|
+
nothing focusable, no `id`s. It receives `{ offset, visible }`; render expensive faces only
|
|
225
|
+
while `visible`.
|
|
226
|
+
- It draws no background. The reflection only reads on a dark floor: wrap it in a `.dark`
|
|
227
|
+
scope with `bg-background` (or any dark surface). Size comes from `aspect`
|
|
228
|
+
(`landscape` 4:3, `square`); do not set the stage height through `className`.
|
|
229
|
+
- The reflection fade uses `mask-*` utilities, which need Tailwind **4.1+**.
|
|
230
|
+
|
|
231
|
+
## CategoryCard or SimpleClickableCard
|
|
232
|
+
|
|
233
|
+
- `CategoryCard` (from `/components`): a "browse by kind" card, stacked: icon tile, a count
|
|
234
|
+
(`value`) in the corner, name, one line, a few `tags`. `SimpleClickableCard`: one action in a
|
|
235
|
+
row with a chevron. Prop names match where they mean the same (`icon`, `title`,
|
|
236
|
+
`description`, `color`, `radius`, `onClick`).
|
|
237
|
+
- It sizes itself by its own width (a container query): below 12rem it tightens and drops the
|
|
238
|
+
tags. Do not hide the tags per breakpoint in the app.
|
|
239
|
+
- A filter row passes `selected` (gives `aria-pressed`); a navigating row passes `href` (a real
|
|
240
|
+
link) and leaves `selected` unset. Pass `aria-label` when the name to read is richer than
|
|
241
|
+
the visible text ("Show only Drivers, 65 blocks").
|
|
242
|
+
- Token tints the colour presets lack (the swatches) go in `iconClassName`, which replaces
|
|
243
|
+
`color` (do not pass both).
|
|
244
|
+
|
|
245
|
+
## PopoverGroup — one hover preview across many items
|
|
246
|
+
|
|
247
|
+
- Wrap a grid or row of `Popover openOnHover` items in `PopoverGroup` (from `/components`) so
|
|
248
|
+
only one is open: the first opens after the popover's `openDelay`, another takes over only
|
|
249
|
+
after the pointer rests `switchDelay` (default 350 ms) on it, and reaching the open content
|
|
250
|
+
cancels a pending switch — so a diagonal path to the panel never switches it. Do not build
|
|
251
|
+
hover-intent timers in the app.
|
|
252
|
+
- Give each `Popover` a `value` when the app needs to know which is open; read it from the
|
|
253
|
+
group's `value` / `onValueChange` (a member's own `onOpenChange` does not fire when another
|
|
254
|
+
takes over). A `Popover` with an explicit `open` stays outside the group.
|
|
255
|
+
- Click still pins, Escape and an outside press close, and a hover-opened panel never takes
|
|
256
|
+
focus — the same as a lone `openOnHover` popover.
|
|
257
|
+
|
|
258
|
+
## FlipCard
|
|
259
|
+
|
|
260
|
+
- `FlipCard` (from `/components`): two faces, controlled by `flipped`; each change moves the
|
|
261
|
+
same way, never back. `effect="turn"` (default) turns it over (`axis="x"` a split-flap, `"y"`
|
|
262
|
+
a page); `effect="slide"` slides the showing face out while the next follows it in (`x` down,
|
|
263
|
+
`y` sideways). To show a stream of items in one slot, load the next item into the hidden
|
|
264
|
+
face, then toggle `flipped`.
|
|
265
|
+
- The hidden face is `aria-hidden` and `inert`. Size the card from its parent or `className`;
|
|
266
|
+
the faces fill it (`faceClassName` styles both). Timing (`duration-*`, `ease-*`, `delay-*`)
|
|
267
|
+
goes in `turnClassName`.
|
|
268
|
+
- `onFlipEnd` fires when a turn finishes — at once under reduced motion, where the faces swap
|
|
269
|
+
without turning.
|
|
270
|
+
|
|
271
|
+
## Work areas: Toolbar, resizable panels, floating windows
|
|
272
|
+
|
|
273
|
+
- `Toolbar` (from `/components`) takes `start` / `center` / `end` nodes; fill them with
|
|
274
|
+
`ToolbarButton`s (28px, icon-only: `label` is the accessible name AND the tooltip). Do not
|
|
275
|
+
add arrow-key handling: the toolbar already moves focus between its controls.
|
|
276
|
+
- `ResizableGroup` fills its parent: give the parent a height. Children alternate
|
|
277
|
+
`ResizablePanel` / `ResizableSeparator`; every panel needs an `id`, and `defaultLayout`'s keys
|
|
278
|
+
are those ids (percentages). Persist `onLayoutChanged`, not the live drag. Sizes are
|
|
279
|
+
`PanelSize`: a number is pixels, a unitless string a percentage (`"20"`).
|
|
280
|
+
- A panel that is shown and hidden by a flag is `ColumnPanel` (`open`, `openSize`), not a
|
|
281
|
+
conditional render: it stays mounted (state survives) and goes `inert` when hidden. For your
|
|
282
|
+
own collapsible `ResizablePanel`, pass `usePanelFlag(open, openSize)` as its `panelRef`.
|
|
283
|
+
- `FloatingWindow` does not keep its own position: hold `position` in the app (null = default
|
|
284
|
+
spot) and store what `onMove` hands back. Minimized it renders only its pill.
|
|
285
|
+
- `AnchoredPanel` is non-modal and positioned by a zero-size anchor element the app keeps at
|
|
286
|
+
the point (`anchorRef`); pass `keepOpenFor` for the control that toggles it, or that
|
|
287
|
+
control's own click closes and reopens it.
|
|
288
|
+
- `MessageScroller` scrolls itself: give it a height or a flex parent; do not wrap it in
|
|
289
|
+
another `ScrollArea`. Put messages (`Bubble`s) directly inside.
|
|
290
|
+
|
|
291
|
+
## Catalogue pages: ShowcaseCard, ChoiceCard, facet filters
|
|
292
|
+
|
|
293
|
+
- `ShowcaseCard` opens something; `ChoiceCard` chooses something (a toggle button with
|
|
294
|
+
`aria-pressed`). For a router link pass `open={{ link: (title) => <Link to=…>{title}</Link> }}`,
|
|
295
|
+
not `href` (which reloads the page).
|
|
296
|
+
- The facet filters (`FiltersPanel`, `FiltersPill`, `ActiveFilters`) count nothing and
|
|
297
|
+
translate nothing: the app passes groups with counts, the selection and every label.
|
|
298
|
+
Use `useFiltersCollapsed()` for the panel/pill state and pass
|
|
299
|
+
`animate={!supportsViewTransitions}`.
|
|
300
|
+
|
|
301
|
+
## Chart legends and distribution bars
|
|
302
|
+
|
|
303
|
+
- Every chart takes `legendLayout="inline" | "rows" | "columns"` (default `inline`) with
|
|
304
|
+
`showLegend`. `rows` / `columns` render below the chart: swatch, label, value aligned
|
|
305
|
+
right. `columns` (`legendColumns`, default 2) drops to one column under a 28rem-wide legend;
|
|
306
|
+
do not add media queries for it.
|
|
307
|
+
- `legendValue="value" | "percent" | "both" | "none"`. Cartesian charts show each
|
|
308
|
+
series' **total across `data`**; pass `legendValue="none"` where a sum means nothing
|
|
309
|
+
(e.g. temperatures on a `LineChart`).
|
|
310
|
+
- A single distribution bar is `BarChart` with `layout="vertical" stacked segmented
|
|
311
|
+
hideXAxis hideYAxis`, one data row, and a small plot height such as
|
|
312
|
+
`className="aspect-auto h-3.5"`. `className` sizes the plot only; the list legend adds
|
|
313
|
+
its own height below it.
|
|
314
|
+
|
|
144
315
|
## Bundle size and tooling (what agents should assume)
|
|
145
316
|
|
|
146
|
-
- The published library is **pre-
|
|
317
|
+
- The published library is **pre-built ESM with one module per source file**; production bundlers drop components an app does not import.
|
|
147
318
|
- **Tree-shaking:** Bundlers can often drop **unused named exports**, but anything **statically reachable** from an imported symbol remains — including shared chunks and **eager inlined assets** (e.g. Lottie animations with `AnimatedCard`, SVG strings with `Illustration`, embedded images as data URLs).
|
|
148
319
|
- A **Babel** log such as "deoptimised the styling … exceeds the max of 500KB" on a file under `node_modules/…/dist/` is usually **informational** (Babel compact output for huge files), not a build failure.
|
|
149
|
-
- When suggesting "smaller bundles," recommend **
|
|
320
|
+
- When suggesting "smaller bundles," recommend **the narrowest entry point** (`/components/<folder>`, grouped paths), **optional peers only as needed**, and **avoiding heavy components on critical routes** — not inventing non-exported deep imports.
|
|
150
321
|
|
|
151
322
|
## Removed APIs — do not reintroduce
|
|
152
323
|
|
|
@@ -13,14 +13,19 @@ Use only paths declared under `package.json` → `exports`:
|
|
|
13
13
|
|---------|---------|
|
|
14
14
|
| `@espressif/dashboard-ui-components` | Root barrel: re-exports **components**, **common**, and **layouts**. Use only when the app intentionally pulls from multiple surfaces; otherwise prefer narrower subpaths below. |
|
|
15
15
|
| `@espressif/dashboard-ui-components/components` | Public UI components and their types. |
|
|
16
|
+
| `@espressif/dashboard-ui-components/components/<folder>` | One component folder (`/components/button`, `/components/dialog`, …): the same names and objects `/components` exports for it. **Prefer this.** |
|
|
17
|
+
| `@espressif/dashboard-ui-components/charts` · `/data-table` · `/markdown` · `/date` · `/carousel` · `/forms` · `/animation` · `/toast` | One heavy family (recharts, tanstack, react-markdown + shiki, react-day-picker, embla, react-hook-form, lottie, sonner). |
|
|
16
18
|
| `@espressif/dashboard-ui-components/layouts` | `WorkspaceLayout`, `EntryLayout`, and related layout exports. |
|
|
17
19
|
| `@espressif/dashboard-ui-components/common` | Shared blocks (e.g. `AppLogo`, `ProfileCard`, `FooterCard`). |
|
|
18
20
|
| `@espressif/dashboard-ui-components/utils` | Utilities such as `cn`. |
|
|
19
|
-
| `@espressif/dashboard-ui-components/styles` | Global CSS
|
|
21
|
+
| `@espressif/dashboard-ui-components/styles` | Global CSS: Tailwind + every token + base page styles. |
|
|
22
|
+
| `@espressif/dashboard-ui-components/theme.css` | Tokens only (no `@import "tailwindcss"`, no Preflight, no page styles), for apps that bring their own Tailwind. |
|
|
20
23
|
| `@espressif/dashboard-ui-components/tailwind-preset` | Tailwind v4 preset. |
|
|
21
24
|
|
|
22
25
|
**Do not** import from deep paths that are not in `exports` (they will fail under strict package managers or break without warning). **Do not** treat `@espressif/dashboard-ui-components/core` as a supported app API: it exists in `exports` for technical reasons, but this repo’s policy is that **consumers must not import `core`** — use composed exports from `/components` (see project overview rule).
|
|
23
26
|
|
|
27
|
+
**Import from the narrowest path you can**: `/components/<folder>` for one component, a grouped path for a heavy family, a surface (`/components`, `/layouts`, …) only when importing many. Tests and dev servers evaluate everything an entry reaches. Entries that include Toast (`/toast`, `/components/toast`, `/components`, root) import sonner's CSS from JS; the others do no work at import time.
|
|
28
|
+
|
|
24
29
|
## Import style
|
|
25
30
|
|
|
26
31
|
- Prefer **named imports**: `import { Button, Alert } from '…/components'`.
|
|
@@ -33,6 +38,7 @@ Use only paths declared under `package.json` → `exports`:
|
|
|
33
38
|
Do **not** invent component or prop names from memory. The authoritative list of exports and their props is the shipped type declarations:
|
|
34
39
|
|
|
35
40
|
- Components: `node_modules/@espressif/dashboard-ui-components/dist/components/index.d.ts`
|
|
41
|
+
- One component folder: `…/dist/components/<folder>/index.d.ts`; grouped entries: `…/dist/<group>/index.d.ts`
|
|
36
42
|
- Layouts / common / utils: the sibling `dist/<surface>/index.d.ts` files
|
|
37
43
|
- The README "Available Components" table for a human-readable overview
|
|
38
44
|
|
|
@@ -57,6 +63,16 @@ export function Example() {
|
|
|
57
63
|
}
|
|
58
64
|
```
|
|
59
65
|
|
|
66
|
+
## Styling and theming
|
|
67
|
+
|
|
68
|
+
- Add the library's styles once in your Tailwind v4 entry CSS: `@import "@espressif/dashboard-ui-components/styles";`. It already declares the `@source` for `dist/`.
|
|
69
|
+
- Retheme by redeclaring the CSS custom properties (design tokens) **after** the `@import`, in both `:root` and `.dark` (or `[data-theme="dark"]`). Override `--font-sans` / `--font-mono` inside an `@theme` block.
|
|
70
|
+
- Pick `./theme.css` instead of `./styles` only when the app has its own `@import "tailwindcss"` (or legacy CSS a reset would break); then the app styles `body` itself.
|
|
71
|
+
- Dark mode applies under `.dark` **or** `[data-theme="dark"]` on an ancestor; override dark tokens under the selector the app uses. The library has no `prefers-color-scheme` handling.
|
|
72
|
+
- `MinimalWorkspaceLayout` (from `/layouts`) is the header-less alternative to `WorkspaceLayout` with the same props: switch by renaming the component. It has no header bar or status footer (`footerConfig`, `hideBreadcrumbs`, `sidebarConfig.allowCollapsible` / `variant` do not exist on it), starts collapsed (`defaultSidebarOpen` defaults to `false`), and puts `topRightContent` (fallback `headerConfig.rightContent`) over the content. Theme it with the `--espd-minimal-workspace-layout-*` tokens, not `className` overrides on its parts: the sidebar surface defaults to the page background (`-sidebar-background`, `-sidebar-background-expanded`), and its border, shadow and row accent are derived from that surface unless `-sidebar-border-color`, `-sidebar-elevation` or `-sidebar-accent` are set. Keep `-sidebar-width-collapsed` within 48–56px. With `sidebarConfig.hideWhenCollapsed` the collapsed sidebar is hidden instead of a rail: a click on the content's left edge peeks it over the content until the pointer leaves it, and `MinimalWorkspaceSidebarTrigger` (from `/layouts`, placed in `topRightContent`) opens it inline; a peek never reaches `onSidebarOpenChange`. Do not build an edge or trigger in the app. The edge strip and the peek shadow are `-edge-color`, `-edge-width` and `-sidebar-overlay-elevation`.
|
|
73
|
+
- Beyond colour, retheme with the semantic tokens on `:root` (and the style-axis role tokens, next section): `--espd-control-height-sm|md|lg`, `--espd-button-padding-x-sm|md|lg`, `--espd-duration-fast|normal|slow`, `--espd-ring-width`, `--espd-ring-offset`, `--espd-on-solid-foreground` (plus Tailwind's `--radius-*`, `--shadow-*`, `--spacing`). Do not add new token names in app CSS.
|
|
74
|
+
- New variants (e.g. `glow`) are registered, not forked: augment `interface VariantRegistry` in `declare module '@espressif/dashboard-ui-components/components'` (in a file that imports that entry) and call `registerVariant('glow', (color) => ({ container, foreground, description }))` once at start-up. Built-in variants cannot be replaced.
|
|
75
|
+
|
|
60
76
|
## Removed APIs — do not reintroduce
|
|
61
77
|
|
|
62
78
|
Earlier internal versions of this library are **not** representative of the public package. Do not add these back based on prior knowledge:
|
|
@@ -66,6 +82,49 @@ Earlier internal versions of this library are **not** representative of the publ
|
|
|
66
82
|
|
|
67
83
|
If code references any of the above, it is targeting an old version — update it to the current API rather than re-adding the removed symbols.
|
|
68
84
|
|
|
85
|
+
## Shape, elevation, border and density (style axes)
|
|
86
|
+
|
|
87
|
+
Change corner radius, shadow, border width or density with the library's axes, not with
|
|
88
|
+
`className` overrides on every component:
|
|
89
|
+
|
|
90
|
+
- **A kind of component, app-wide:** set a **role token** in CSS after the `@import`:
|
|
91
|
+
`--espd-radius-{control|surface|overlay|pill|item}`,
|
|
92
|
+
`--espd-elevation-{control|surface|overlay}`, `--espd-border-width-{control|surface}`.
|
|
93
|
+
Unset means each component keeps its own look. Overlays render in portals, so set overlay
|
|
94
|
+
tokens on `:root`, not on a wrapper.
|
|
95
|
+
- **A subtree, from React:** `<StyleScope radius={{ control: "full" }} elevation={{ surface: "none" }} density="compact">`
|
|
96
|
+
(from `/components/style-scope`). It sets the same tokens on a `display: contents` wrapper.
|
|
97
|
+
- **One component:** the `radius`, `elevation` and `border` props, where the component's
|
|
98
|
+
type declares them (check its `.d.ts`; not every component takes every axis). They affect
|
|
99
|
+
that component only, never the components nested inside it. The date pickers' `radius` is
|
|
100
|
+
the trigger's; their calendar popover takes `popoverRadius` / `popoverElevation`.
|
|
101
|
+
- **Density:** `density="compact" | "default" | "comfortable"` on Table, DataTable, Card, List,
|
|
102
|
+
SimpleList, FiltersBar, Sidebar, DialogContent, SheetContent, or on `StyleScope`. It also sets
|
|
103
|
+
`--espd-gap-field` (FormItem) and `--espd-gap-stack` (DialogContent); for a form, wrap it in
|
|
104
|
+
`StyleScope density` (Form renders no element).
|
|
105
|
+
|
|
106
|
+
Precedence: `className` > instance prop > role token > the component's own default.
|
|
107
|
+
|
|
108
|
+
Things agents get wrong:
|
|
109
|
+
|
|
110
|
+
- An elevation token takes a `box-shadow` value: use `0 0 #0000` for "flat", **not** `none`
|
|
111
|
+
(it would also remove focus rings). The `elevation="none"` prop already does this.
|
|
112
|
+
- Older props still work: `rounded` (Input, InputOTP, FileInput, Tag, date pickers) equals
|
|
113
|
+
`radius="full"`; `noShadow` / `noBorder` (SimpleCard). When both are passed, `radius` /
|
|
114
|
+
`elevation` / `border` win. Prefer the new props in new code.
|
|
115
|
+
- Instance props need the library stylesheet (`./styles` or `./theme.css`).
|
|
116
|
+
- New values are registered, not invented: augment `RadiusRegistry` / `ElevationRegistry` /
|
|
117
|
+
`BorderRegistry` / `DensityRegistry` in `declare module '@espressif/dashboard-ui-components/components'`
|
|
118
|
+
and call `registerStyleValue(axis, name, css)` or `registerDensity(name, tokens)` once at
|
|
119
|
+
start-up. Built-ins cannot be replaced.
|
|
120
|
+
|
|
121
|
+
## Buttons
|
|
122
|
+
|
|
123
|
+
- Use the styled `Button` from `/components` (or `/components/button`). `/core` has an uncoloured base `Button` with the same name: not for apps.
|
|
124
|
+
- `fullWidth` **defaults to `true`**; pass `fullWidth={false}` for an inline button.
|
|
125
|
+
- For a link that looks like a button use `asChild`, never a Button that navigates in `onClick`:
|
|
126
|
+
`<Button asChild startIcon={<Plus />}><Link to="/new">Add</Link></Button>`. With `disabled`/`loading` the link gets `aria-disabled`, `tabIndex={-1}` and its clicks are cancelled.
|
|
127
|
+
|
|
69
128
|
## Optional peer dependencies
|
|
70
129
|
|
|
71
130
|
Install only when the feature is used:
|
|
@@ -77,7 +136,7 @@ Install only when the feature is used:
|
|
|
77
136
|
| `shiki` | `Code` / syntax highlighting |
|
|
78
137
|
| `recharts` | Chart components |
|
|
79
138
|
|
|
80
|
-
Required peers for any usage: `react`, `react-dom`, `tailwindcss` (v4 per project docs).
|
|
139
|
+
Required peers for any usage: `react`, `react-dom`, `tailwindcss` (v4.1+ per project docs).
|
|
81
140
|
|
|
82
141
|
Do **not** tell users to install `react-markdown`, `remark-gfm`, or `rehype-slug` for
|
|
83
142
|
`MarkdownContent` — they are regular dependencies of this package and install with it.
|
|
@@ -138,12 +197,112 @@ Things agents get wrong about it:
|
|
|
138
197
|
if that matters.
|
|
139
198
|
- `className` / `style` style the editor box, not the `<textarea>`.
|
|
140
199
|
|
|
200
|
+
## Coverflow, Carousel or CardRail
|
|
201
|
+
|
|
202
|
+
- `Coverflow` (from `/components`): a 3D ring of image cards with a glass reflection and a
|
|
203
|
+
caption node per item, for a showcase of a few pictures (featured projects, boards).
|
|
204
|
+
`Carousel`: plain slides of any content in a strip. `CardRail`: a scrolling row of cards
|
|
205
|
+
that shows several at once.
|
|
206
|
+
- Items are `{ id, name, image?, imageAlt?, caption? }`; `name` is the accessible name.
|
|
207
|
+
Without `onOpen` the front card is a picture, not a button.
|
|
208
|
+
- `renderFace` is drawn **twice** (the card and its reflection): return a picture only —
|
|
209
|
+
nothing focusable, no `id`s. It receives `{ offset, visible }`; render expensive faces only
|
|
210
|
+
while `visible`.
|
|
211
|
+
- It draws no background. The reflection only reads on a dark floor: wrap it in a `.dark`
|
|
212
|
+
scope with `bg-background` (or any dark surface). Size comes from `aspect`
|
|
213
|
+
(`landscape` 4:3, `square`); do not set the stage height through `className`.
|
|
214
|
+
- The reflection fade uses `mask-*` utilities, which need Tailwind **4.1+**.
|
|
215
|
+
|
|
216
|
+
## CategoryCard or SimpleClickableCard
|
|
217
|
+
|
|
218
|
+
- `CategoryCard` (from `/components`): a "browse by kind" card, stacked: icon tile, a count
|
|
219
|
+
(`value`) in the corner, name, one line, a few `tags`. `SimpleClickableCard`: one action in a
|
|
220
|
+
row with a chevron. Prop names match where they mean the same (`icon`, `title`,
|
|
221
|
+
`description`, `color`, `radius`, `onClick`).
|
|
222
|
+
- It sizes itself by its own width (a container query): below 12rem it tightens and drops the
|
|
223
|
+
tags. Do not hide the tags per breakpoint in the app.
|
|
224
|
+
- A filter row passes `selected` (gives `aria-pressed`); a navigating row passes `href` (a real
|
|
225
|
+
link) and leaves `selected` unset. Pass `aria-label` when the name to read is richer than
|
|
226
|
+
the visible text ("Show only Drivers, 65 blocks").
|
|
227
|
+
- Token tints the colour presets lack (the swatches) go in `iconClassName`, which replaces
|
|
228
|
+
`color` (do not pass both).
|
|
229
|
+
|
|
230
|
+
## PopoverGroup — one hover preview across many items
|
|
231
|
+
|
|
232
|
+
- Wrap a grid or row of `Popover openOnHover` items in `PopoverGroup` (from `/components`) so
|
|
233
|
+
only one is open: the first opens after the popover's `openDelay`, another takes over only
|
|
234
|
+
after the pointer rests `switchDelay` (default 350 ms) on it, and reaching the open content
|
|
235
|
+
cancels a pending switch — so a diagonal path to the panel never switches it. Do not build
|
|
236
|
+
hover-intent timers in the app.
|
|
237
|
+
- Give each `Popover` a `value` when the app needs to know which is open; read it from the
|
|
238
|
+
group's `value` / `onValueChange` (a member's own `onOpenChange` does not fire when another
|
|
239
|
+
takes over). A `Popover` with an explicit `open` stays outside the group.
|
|
240
|
+
- Click still pins, Escape and an outside press close, and a hover-opened panel never takes
|
|
241
|
+
focus — the same as a lone `openOnHover` popover.
|
|
242
|
+
|
|
243
|
+
## FlipCard
|
|
244
|
+
|
|
245
|
+
- `FlipCard` (from `/components`): two faces, controlled by `flipped`; each change moves the
|
|
246
|
+
same way, never back. `effect="turn"` (default) turns it over (`axis="x"` a split-flap, `"y"`
|
|
247
|
+
a page); `effect="slide"` slides the showing face out while the next follows it in (`x` down,
|
|
248
|
+
`y` sideways). To show a stream of items in one slot, load the next item into the hidden
|
|
249
|
+
face, then toggle `flipped`.
|
|
250
|
+
- The hidden face is `aria-hidden` and `inert`. Size the card from its parent or `className`;
|
|
251
|
+
the faces fill it (`faceClassName` styles both). Timing (`duration-*`, `ease-*`, `delay-*`)
|
|
252
|
+
goes in `turnClassName`.
|
|
253
|
+
- `onFlipEnd` fires when a turn finishes — at once under reduced motion, where the faces swap
|
|
254
|
+
without turning.
|
|
255
|
+
|
|
256
|
+
## Work areas: Toolbar, resizable panels, floating windows
|
|
257
|
+
|
|
258
|
+
- `Toolbar` (from `/components`) takes `start` / `center` / `end` nodes; fill them with
|
|
259
|
+
`ToolbarButton`s (28px, icon-only: `label` is the accessible name AND the tooltip). Do not
|
|
260
|
+
add arrow-key handling: the toolbar already moves focus between its controls.
|
|
261
|
+
- `ResizableGroup` fills its parent: give the parent a height. Children alternate
|
|
262
|
+
`ResizablePanel` / `ResizableSeparator`; every panel needs an `id`, and `defaultLayout`'s keys
|
|
263
|
+
are those ids (percentages). Persist `onLayoutChanged`, not the live drag. Sizes are
|
|
264
|
+
`PanelSize`: a number is pixels, a unitless string a percentage (`"20"`).
|
|
265
|
+
- A panel that is shown and hidden by a flag is `ColumnPanel` (`open`, `openSize`), not a
|
|
266
|
+
conditional render: it stays mounted (state survives) and goes `inert` when hidden. For your
|
|
267
|
+
own collapsible `ResizablePanel`, pass `usePanelFlag(open, openSize)` as its `panelRef`.
|
|
268
|
+
- `FloatingWindow` does not keep its own position: hold `position` in the app (null = default
|
|
269
|
+
spot) and store what `onMove` hands back. Minimized it renders only its pill.
|
|
270
|
+
- `AnchoredPanel` is non-modal and positioned by a zero-size anchor element the app keeps at
|
|
271
|
+
the point (`anchorRef`); pass `keepOpenFor` for the control that toggles it, or that
|
|
272
|
+
control's own click closes and reopens it.
|
|
273
|
+
- `MessageScroller` scrolls itself: give it a height or a flex parent; do not wrap it in
|
|
274
|
+
another `ScrollArea`. Put messages (`Bubble`s) directly inside.
|
|
275
|
+
|
|
276
|
+
## Catalogue pages: ShowcaseCard, ChoiceCard, facet filters
|
|
277
|
+
|
|
278
|
+
- `ShowcaseCard` opens something; `ChoiceCard` chooses something (a toggle button with
|
|
279
|
+
`aria-pressed`). For a router link pass `open={{ link: (title) => <Link to=…>{title}</Link> }}`,
|
|
280
|
+
not `href` (which reloads the page).
|
|
281
|
+
- The facet filters (`FiltersPanel`, `FiltersPill`, `ActiveFilters`) count nothing and
|
|
282
|
+
translate nothing: the app passes groups with counts, the selection and every label.
|
|
283
|
+
Use `useFiltersCollapsed()` for the panel/pill state and pass
|
|
284
|
+
`animate={!supportsViewTransitions}`.
|
|
285
|
+
|
|
286
|
+
## Chart legends and distribution bars
|
|
287
|
+
|
|
288
|
+
- Every chart takes `legendLayout="inline" | "rows" | "columns"` (default `inline`) with
|
|
289
|
+
`showLegend`. `rows` / `columns` render below the chart: swatch, label, value aligned
|
|
290
|
+
right. `columns` (`legendColumns`, default 2) drops to one column under a 28rem-wide legend;
|
|
291
|
+
do not add media queries for it.
|
|
292
|
+
- `legendValue="value" | "percent" | "both" | "none"`. Cartesian charts show each
|
|
293
|
+
series' **total across `data`**; pass `legendValue="none"` where a sum means nothing
|
|
294
|
+
(e.g. temperatures on a `LineChart`).
|
|
295
|
+
- A single distribution bar is `BarChart` with `layout="vertical" stacked segmented
|
|
296
|
+
hideXAxis hideYAxis`, one data row, and a small plot height such as
|
|
297
|
+
`className="aspect-auto h-3.5"`. `className` sizes the plot only; the list legend adds
|
|
298
|
+
its own height below it.
|
|
299
|
+
|
|
141
300
|
## Bundle size and tooling (what agents should assume)
|
|
142
301
|
|
|
143
|
-
- The published library is **pre-
|
|
302
|
+
- The published library is **pre-built ESM with one module per source file**; production bundlers drop components an app does not import.
|
|
144
303
|
- **Tree-shaking:** Bundlers can often drop **unused named exports**, but anything **statically reachable** from an imported symbol remains — including shared chunks and **eager inlined assets** (e.g. many Lottie animations with `AnimatedCard`, SVG strings with `Illustration`, embedded images where the build uses data URLs).
|
|
145
304
|
- A **Babel** log such as “deoptimised the styling … exceeds the max of 500KB” on a file under `node_modules/…/dist/` is usually **informational** (Babel compact output for huge files), not a signal that the build is invalid.
|
|
146
|
-
- When suggesting “smaller bundles,” recommend **
|
|
305
|
+
- When suggesting “smaller bundles,” recommend **the narrowest entry point** (`/components/<folder>`, grouped paths), **optional peers only as needed**, and **avoiding heavy components on critical routes** — not inventing non-exported deep imports.
|
|
147
306
|
|
|
148
307
|
## Demo vs consumer code
|
|
149
308
|
|