ngwr 14.8.0 → 14.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -332
- package/alert/styles/_index.scss +10 -0
- package/avatar/styles/_index.scss +18 -7
- package/badge/styles/_index.scss +7 -0
- package/badge/styles/_tag.scss +7 -1
- package/button/styles/_index.scss +6 -0
- package/cascader/styles/_rules.scss +1 -1
- package/checkbox/styles/_index.scss +4 -0
- package/command-palette/styles/_index.scss +1 -1
- package/divider/styles/_index.scss +2 -0
- package/editor/styles/_index.scss +441 -0
- package/fesm2022/ngwr-action-sheet-testing.mjs.map +1 -1
- package/fesm2022/ngwr-action-sheet.mjs +3 -3
- package/fesm2022/ngwr-action-sheet.mjs.map +1 -1
- package/fesm2022/ngwr-affix.mjs +3 -3
- package/fesm2022/ngwr-affix.mjs.map +1 -1
- package/fesm2022/ngwr-alert.mjs +3 -3
- package/fesm2022/ngwr-alert.mjs.map +1 -1
- package/fesm2022/ngwr-anchor.mjs +3 -3
- package/fesm2022/ngwr-anchor.mjs.map +1 -1
- package/fesm2022/ngwr-aurora.mjs +3 -3
- package/fesm2022/ngwr-aurora.mjs.map +1 -1
- package/fesm2022/ngwr-avatar.mjs +3 -3
- package/fesm2022/ngwr-avatar.mjs.map +1 -1
- package/fesm2022/ngwr-back-top.mjs +3 -3
- package/fesm2022/ngwr-back-top.mjs.map +1 -1
- package/fesm2022/ngwr-badge.mjs +28 -13
- package/fesm2022/ngwr-badge.mjs.map +1 -1
- package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-bar-chart.mjs +3 -3
- package/fesm2022/ngwr-bar-chart.mjs.map +1 -1
- package/fesm2022/ngwr-blur-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-blur-text.mjs +3 -3
- package/fesm2022/ngwr-blur-text.mjs.map +1 -1
- package/fesm2022/ngwr-border-glow-testing.mjs.map +1 -1
- package/fesm2022/ngwr-border-glow.mjs +3 -3
- package/fesm2022/ngwr-border-glow.mjs.map +1 -1
- package/fesm2022/ngwr-breadcrumbs.mjs +6 -6
- package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
- package/fesm2022/ngwr-burger.mjs +3 -3
- package/fesm2022/ngwr-burger.mjs.map +1 -1
- package/fesm2022/ngwr-button-testing.mjs.map +1 -1
- package/fesm2022/ngwr-button.mjs +6 -6
- package/fesm2022/ngwr-button.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-heatmap-testing.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-heatmap.mjs +3 -3
- package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
- package/fesm2022/ngwr-calendar.mjs +3 -3
- package/fesm2022/ngwr-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-card.mjs +9 -9
- package/fesm2022/ngwr-card.mjs.map +1 -1
- package/fesm2022/ngwr-carousel-testing.mjs.map +1 -1
- package/fesm2022/ngwr-carousel.mjs +6 -6
- package/fesm2022/ngwr-carousel.mjs.map +1 -1
- package/fesm2022/ngwr-cascader-testing.mjs.map +1 -1
- package/fesm2022/ngwr-cascader.mjs +4 -4
- package/fesm2022/ngwr-cascader.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox-testing.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox.mjs +6 -6
- package/fesm2022/ngwr-checkbox.mjs.map +1 -1
- package/fesm2022/ngwr-circular-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-circular-text.mjs +3 -3
- package/fesm2022/ngwr-circular-text.mjs.map +1 -1
- package/fesm2022/ngwr-click-spark.mjs +3 -3
- package/fesm2022/ngwr-click-spark.mjs.map +1 -1
- package/fesm2022/ngwr-clipboard.mjs +3 -3
- package/fesm2022/ngwr-clipboard.mjs.map +1 -1
- package/fesm2022/ngwr-collapse-testing.mjs.map +1 -1
- package/fesm2022/ngwr-collapse.mjs +9 -9
- package/fesm2022/ngwr-collapse.mjs.map +1 -1
- package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
- package/fesm2022/ngwr-color-picker.mjs +6 -6
- package/fesm2022/ngwr-color-picker.mjs.map +1 -1
- package/fesm2022/ngwr-command-palette-testing.mjs.map +1 -1
- package/fesm2022/ngwr-command-palette.mjs +3 -3
- package/fesm2022/ngwr-command-palette.mjs.map +1 -1
- package/fesm2022/ngwr-compare.mjs +3 -3
- package/fesm2022/ngwr-compare.mjs.map +1 -1
- package/fesm2022/ngwr-confetti.mjs +3 -3
- package/fesm2022/ngwr-confetti.mjs.map +1 -1
- package/fesm2022/ngwr-config.mjs.map +1 -1
- package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -1
- package/fesm2022/ngwr-context-menu.mjs +12 -12
- package/fesm2022/ngwr-context-menu.mjs.map +1 -1
- package/fesm2022/ngwr-cookie.mjs +3 -3
- package/fesm2022/ngwr-cookie.mjs.map +1 -1
- package/fesm2022/ngwr-counter.mjs +6 -6
- package/fesm2022/ngwr-counter.mjs.map +1 -1
- package/fesm2022/ngwr-date-adapters-fns.mjs +3 -3
- package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -1
- package/fesm2022/ngwr-date-adapters-luxon.mjs +3 -3
- package/fesm2022/ngwr-date-adapters-luxon.mjs.map +1 -1
- package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
- package/fesm2022/ngwr-date-picker.mjs +21 -21
- package/fesm2022/ngwr-date-picker.mjs.map +1 -1
- package/fesm2022/ngwr-date.mjs +3 -3
- package/fesm2022/ngwr-date.mjs.map +1 -1
- package/fesm2022/ngwr-decrypt-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-decrypt-text.mjs +3 -3
- package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
- package/fesm2022/ngwr-density.mjs +6 -6
- package/fesm2022/ngwr-density.mjs.map +1 -1
- package/fesm2022/ngwr-descriptions.mjs +6 -6
- package/fesm2022/ngwr-descriptions.mjs.map +1 -1
- package/fesm2022/ngwr-dialog-testing.mjs.map +1 -1
- package/fesm2022/ngwr-dialog.mjs +15 -15
- package/fesm2022/ngwr-dialog.mjs.map +1 -1
- package/fesm2022/ngwr-directives.mjs +12 -12
- package/fesm2022/ngwr-directives.mjs.map +1 -1
- package/fesm2022/ngwr-divider.mjs +3 -3
- package/fesm2022/ngwr-divider.mjs.map +1 -1
- package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-donut-chart.mjs +3 -3
- package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
- package/fesm2022/ngwr-drag-drop.mjs +6 -6
- package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
- package/fesm2022/ngwr-drawer-testing.mjs.map +1 -1
- package/fesm2022/ngwr-drawer.mjs +18 -18
- package/fesm2022/ngwr-drawer.mjs.map +1 -1
- package/fesm2022/ngwr-dropdown-testing.mjs.map +1 -1
- package/fesm2022/ngwr-dropdown.mjs +9 -9
- package/fesm2022/ngwr-dropdown.mjs.map +1 -1
- package/fesm2022/ngwr-editor-testing.mjs +568 -0
- package/fesm2022/ngwr-editor-testing.mjs.map +1 -0
- package/fesm2022/ngwr-editor.mjs +2601 -0
- package/fesm2022/ngwr-editor.mjs.map +1 -0
- package/fesm2022/ngwr-empty.mjs +3 -3
- package/fesm2022/ngwr-empty.mjs.map +1 -1
- package/fesm2022/ngwr-event-calendar-testing.mjs.map +1 -1
- package/fesm2022/ngwr-event-calendar.mjs +6 -6
- package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-falling-text.mjs +3 -3
- package/fesm2022/ngwr-falling-text.mjs.map +1 -1
- package/fesm2022/ngwr-file-upload-testing.mjs.map +1 -1
- package/fesm2022/ngwr-file-upload.mjs +3 -3
- package/fesm2022/ngwr-file-upload.mjs.map +1 -1
- package/fesm2022/ngwr-form-testing.mjs.map +1 -1
- package/fesm2022/ngwr-form.mjs +9 -9
- package/fesm2022/ngwr-form.mjs.map +1 -1
- package/fesm2022/ngwr-fuzzy-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-fuzzy-text.mjs +3 -3
- package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
- package/fesm2022/ngwr-gauge-testing.mjs.map +1 -1
- package/fesm2022/ngwr-gauge.mjs +3 -3
- package/fesm2022/ngwr-gauge.mjs.map +1 -1
- package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-glitch-text.mjs +3 -3
- package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
- package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-gradient-text.mjs +3 -3
- package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
- package/fesm2022/ngwr-graph-testing.mjs.map +1 -1
- package/fesm2022/ngwr-graph.mjs +6 -6
- package/fesm2022/ngwr-graph.mjs.map +1 -1
- package/fesm2022/ngwr-hotkey.mjs +6 -6
- package/fesm2022/ngwr-hotkey.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ar.mjs +29 -0
- package/fesm2022/ngwr-i18n-ar.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-cs.mjs +29 -0
- package/fesm2022/ngwr-i18n-cs.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-de.mjs +29 -0
- package/fesm2022/ngwr-i18n-de.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-en.mjs +34 -0
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-es.mjs +29 -0
- package/fesm2022/ngwr-i18n-es.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-fr.mjs +29 -0
- package/fesm2022/ngwr-i18n-fr.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-he.mjs +29 -0
- package/fesm2022/ngwr-i18n-he.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-hi.mjs +29 -0
- package/fesm2022/ngwr-i18n-hi.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-id.mjs +29 -0
- package/fesm2022/ngwr-i18n-id.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-it.mjs +29 -0
- package/fesm2022/ngwr-i18n-it.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ja.mjs +29 -0
- package/fesm2022/ngwr-i18n-ja.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ko.mjs +29 -0
- package/fesm2022/ngwr-i18n-ko.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-nl.mjs +29 -0
- package/fesm2022/ngwr-i18n-nl.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-pl.mjs +29 -0
- package/fesm2022/ngwr-i18n-pl.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-pt.mjs +29 -0
- package/fesm2022/ngwr-i18n-pt.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ru.mjs +29 -0
- package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-sv.mjs +29 -0
- package/fesm2022/ngwr-i18n-sv.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-tr.mjs +29 -0
- package/fesm2022/ngwr-i18n-tr.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-uk.mjs +29 -0
- package/fesm2022/ngwr-i18n-uk.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-vi.mjs +29 -0
- package/fesm2022/ngwr-i18n-vi.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-zh-TW.mjs +29 -0
- package/fesm2022/ngwr-i18n-zh-TW.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-zh.mjs +29 -0
- package/fesm2022/ngwr-i18n-zh.mjs.map +1 -1
- package/fesm2022/ngwr-i18n.mjs +9 -9
- package/fesm2022/ngwr-i18n.mjs.map +1 -1
- package/fesm2022/ngwr-icon-adapters-feather.mjs.map +1 -1
- package/fesm2022/ngwr-icon-adapters-lucide.mjs.map +1 -1
- package/fesm2022/ngwr-icon.mjs +6 -6
- package/fesm2022/ngwr-icon.mjs.map +1 -1
- package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -1
- package/fesm2022/ngwr-image-cropper.mjs +3 -3
- package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
- package/fesm2022/ngwr-input-number-testing.mjs.map +1 -1
- package/fesm2022/ngwr-input-number.mjs +3 -3
- package/fesm2022/ngwr-input-number.mjs.map +1 -1
- package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -1
- package/fesm2022/ngwr-input-otp.mjs +3 -3
- package/fesm2022/ngwr-input-otp.mjs.map +1 -1
- package/fesm2022/ngwr-input-testing.mjs.map +1 -1
- package/fesm2022/ngwr-input.mjs +15 -15
- package/fesm2022/ngwr-input.mjs.map +1 -1
- package/fesm2022/ngwr-keyboard.mjs +3 -3
- package/fesm2022/ngwr-keyboard.mjs.map +1 -1
- package/fesm2022/ngwr-knob-testing.mjs.map +1 -1
- package/fesm2022/ngwr-knob.mjs +3 -3
- package/fesm2022/ngwr-knob.mjs.map +1 -1
- package/fesm2022/ngwr-layout.mjs +15 -15
- package/fesm2022/ngwr-layout.mjs.map +1 -1
- package/fesm2022/ngwr-lightbox-testing.mjs.map +1 -1
- package/fesm2022/ngwr-lightbox.mjs +3 -3
- package/fesm2022/ngwr-lightbox.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart.mjs +3 -3
- package/fesm2022/ngwr-line-chart.mjs.map +1 -1
- package/fesm2022/ngwr-list.mjs +6 -6
- package/fesm2022/ngwr-list.mjs.map +1 -1
- package/fesm2022/ngwr-loading-bar-router.mjs.map +1 -1
- package/fesm2022/ngwr-loading-bar.mjs +6 -6
- package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
- package/fesm2022/ngwr-markdown-testing.mjs.map +1 -1
- package/fesm2022/ngwr-markdown.mjs +798 -17
- package/fesm2022/ngwr-markdown.mjs.map +1 -1
- package/fesm2022/ngwr-marquee-testing.mjs.map +1 -1
- package/fesm2022/ngwr-marquee.mjs +3 -3
- package/fesm2022/ngwr-marquee.mjs.map +1 -1
- package/fesm2022/ngwr-media.mjs +3 -3
- package/fesm2022/ngwr-media.mjs.map +1 -1
- package/fesm2022/ngwr-mention-testing.mjs.map +1 -1
- package/fesm2022/ngwr-mention.mjs +6 -6
- package/fesm2022/ngwr-mention.mjs.map +1 -1
- package/fesm2022/ngwr-meta.mjs +6 -6
- package/fesm2022/ngwr-meta.mjs.map +1 -1
- package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -1
- package/fesm2022/ngwr-meter-group.mjs +3 -3
- package/fesm2022/ngwr-meter-group.mjs.map +1 -1
- package/fesm2022/ngwr-overlay.mjs +6 -6
- package/fesm2022/ngwr-overlay.mjs.map +1 -1
- package/fesm2022/ngwr-page-header.mjs +3 -3
- package/fesm2022/ngwr-page-header.mjs.map +1 -1
- package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
- package/fesm2022/ngwr-pagination.mjs +3 -3
- package/fesm2022/ngwr-pagination.mjs.map +1 -1
- package/fesm2022/ngwr-pipes.mjs +21 -21
- package/fesm2022/ngwr-pipes.mjs.map +1 -1
- package/fesm2022/ngwr-platform.mjs +9 -9
- package/fesm2022/ngwr-platform.mjs.map +1 -1
- package/fesm2022/ngwr-popconfirm-testing.mjs.map +1 -1
- package/fesm2022/ngwr-popconfirm.mjs +6 -6
- package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
- package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
- package/fesm2022/ngwr-popover.mjs +12 -12
- package/fesm2022/ngwr-popover.mjs.map +1 -1
- package/fesm2022/ngwr-progress.mjs +3 -3
- package/fesm2022/ngwr-progress.mjs.map +1 -1
- package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
- package/fesm2022/ngwr-pull-to-refresh.mjs.map +1 -1
- package/fesm2022/ngwr-qr.mjs +3 -3
- package/fesm2022/ngwr-qr.mjs.map +1 -1
- package/fesm2022/ngwr-radio-testing.mjs.map +1 -1
- package/fesm2022/ngwr-radio.mjs +6 -6
- package/fesm2022/ngwr-radio.mjs.map +1 -1
- package/fesm2022/ngwr-rating-testing.mjs.map +1 -1
- package/fesm2022/ngwr-rating.mjs +3 -3
- package/fesm2022/ngwr-rating.mjs.map +1 -1
- package/fesm2022/ngwr-result.mjs +12 -12
- package/fesm2022/ngwr-result.mjs.map +1 -1
- package/fesm2022/ngwr-rotating-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-rotating-text.mjs +3 -3
- package/fesm2022/ngwr-rotating-text.mjs.map +1 -1
- package/fesm2022/ngwr-schema-form.mjs +3 -3
- package/fesm2022/ngwr-schema-form.mjs.map +1 -1
- package/fesm2022/ngwr-scroll.mjs +3 -3
- package/fesm2022/ngwr-scroll.mjs.map +1 -1
- package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
- package/fesm2022/ngwr-segmented.mjs +3 -3
- package/fesm2022/ngwr-segmented.mjs.map +1 -1
- package/fesm2022/ngwr-select-testing.mjs.map +1 -1
- package/fesm2022/ngwr-select.mjs +12 -12
- package/fesm2022/ngwr-select.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text.mjs +6 -6
- package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
- package/fesm2022/ngwr-sidebar.mjs +3 -3
- package/fesm2022/ngwr-sidebar.mjs.map +1 -1
- package/fesm2022/ngwr-skeleton.mjs +3 -3
- package/fesm2022/ngwr-skeleton.mjs.map +1 -1
- package/fesm2022/ngwr-slider-testing.mjs.map +1 -1
- package/fesm2022/ngwr-slider.mjs +3 -3
- package/fesm2022/ngwr-slider.mjs.map +1 -1
- package/fesm2022/ngwr-sparkline-testing.mjs.map +1 -1
- package/fesm2022/ngwr-sparkline.mjs +3 -3
- package/fesm2022/ngwr-sparkline.mjs.map +1 -1
- package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -1
- package/fesm2022/ngwr-speed-dial.mjs +3 -3
- package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
- package/fesm2022/ngwr-spinner.mjs +3 -3
- package/fesm2022/ngwr-spinner.mjs.map +1 -1
- package/fesm2022/ngwr-splash-cursor-testing.mjs.map +1 -1
- package/fesm2022/ngwr-splash-cursor.mjs +3 -3
- package/fesm2022/ngwr-splash-cursor.mjs.map +1 -1
- package/fesm2022/ngwr-split-text-testing.mjs.map +1 -1
- package/fesm2022/ngwr-split-text.mjs +3 -3
- package/fesm2022/ngwr-split-text.mjs.map +1 -1
- package/fesm2022/ngwr-splitter-testing.mjs.map +1 -1
- package/fesm2022/ngwr-splitter.mjs +3 -3
- package/fesm2022/ngwr-splitter.mjs.map +1 -1
- package/fesm2022/ngwr-spotlight-card-testing.mjs.map +1 -1
- package/fesm2022/ngwr-spotlight-card.mjs +6 -6
- package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
- package/fesm2022/ngwr-squircle.mjs +6 -6
- package/fesm2022/ngwr-squircle.mjs.map +1 -1
- package/fesm2022/ngwr-star-border-testing.mjs.map +1 -1
- package/fesm2022/ngwr-star-border.mjs +3 -3
- package/fesm2022/ngwr-star-border.mjs.map +1 -1
- package/fesm2022/ngwr-statistic.mjs +9 -9
- package/fesm2022/ngwr-statistic.mjs.map +1 -1
- package/fesm2022/ngwr-stepper-testing.mjs.map +1 -1
- package/fesm2022/ngwr-stepper.mjs +6 -6
- package/fesm2022/ngwr-stepper.mjs.map +1 -1
- package/fesm2022/ngwr-storage.mjs +3 -3
- package/fesm2022/ngwr-storage.mjs.map +1 -1
- package/fesm2022/ngwr-switch-testing.mjs.map +1 -1
- package/fesm2022/ngwr-switch.mjs +3 -3
- package/fesm2022/ngwr-switch.mjs.map +1 -1
- package/fesm2022/ngwr-table-testing.mjs.map +1 -1
- package/fesm2022/ngwr-table.mjs +18 -18
- package/fesm2022/ngwr-table.mjs.map +1 -1
- package/fesm2022/ngwr-tabs-router.mjs +3 -3
- package/fesm2022/ngwr-tabs-router.mjs.map +1 -1
- package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tabs.mjs +6 -6
- package/fesm2022/ngwr-tabs.mjs.map +1 -1
- package/fesm2022/ngwr-textarea-testing.mjs.map +1 -1
- package/fesm2022/ngwr-textarea.mjs +3 -3
- package/fesm2022/ngwr-textarea.mjs.map +1 -1
- package/fesm2022/ngwr-theme.mjs +3 -3
- package/fesm2022/ngwr-theme.mjs.map +1 -1
- package/fesm2022/ngwr-tilt-card-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tilt-card.mjs +6 -6
- package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
- package/fesm2022/ngwr-timeline.mjs +6 -6
- package/fesm2022/ngwr-timeline.mjs.map +1 -1
- package/fesm2022/ngwr-toast-testing.mjs.map +1 -1
- package/fesm2022/ngwr-toast.mjs +9 -9
- package/fesm2022/ngwr-toast.mjs.map +1 -1
- package/fesm2022/ngwr-toolbar.mjs +3 -3
- package/fesm2022/ngwr-toolbar.mjs.map +1 -1
- package/fesm2022/ngwr-tour-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tour.mjs +6 -6
- package/fesm2022/ngwr-tour.mjs.map +1 -1
- package/fesm2022/ngwr-transfer-testing.mjs.map +1 -1
- package/fesm2022/ngwr-transfer.mjs +3 -3
- package/fesm2022/ngwr-transfer.mjs.map +1 -1
- package/fesm2022/ngwr-tree-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tree.mjs +3 -3
- package/fesm2022/ngwr-tree.mjs.map +1 -1
- package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -1
- package/fesm2022/ngwr-typewriter.mjs +3 -3
- package/fesm2022/ngwr-typewriter.mjs.map +1 -1
- package/fesm2022/ngwr-typography.mjs +7 -3
- package/fesm2022/ngwr-typography.mjs.map +1 -1
- package/fesm2022/ngwr-utils.mjs.map +1 -1
- package/fesm2022/ngwr-validators.mjs.map +1 -1
- package/fesm2022/ngwr-version.mjs +1 -1
- package/fesm2022/ngwr-version.mjs.map +1 -1
- package/fesm2022/ngwr-virtual-scroll.mjs +3 -3
- package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
- package/fesm2022/ngwr-waves-testing.mjs.map +1 -1
- package/fesm2022/ngwr-waves.mjs +3 -3
- package/fesm2022/ngwr-waves.mjs.map +1 -1
- package/fesm2022/ngwr-window-testing.mjs.map +1 -1
- package/fesm2022/ngwr-window.mjs +12 -12
- package/fesm2022/ngwr-window.mjs.map +1 -1
- package/form/styles/_index.scss +5 -0
- package/i18n/ar.json +29 -0
- package/i18n/cs.json +29 -0
- package/i18n/de.json +29 -0
- package/i18n/en.json +29 -0
- package/i18n/es.json +29 -0
- package/i18n/fr.json +29 -0
- package/i18n/he.json +29 -0
- package/i18n/hi.json +29 -0
- package/i18n/id.json +29 -0
- package/i18n/it.json +29 -0
- package/i18n/ja.json +29 -0
- package/i18n/ko.json +29 -0
- package/i18n/nl.json +29 -0
- package/i18n/pl.json +29 -0
- package/i18n/pt.json +29 -0
- package/i18n/ru.json +29 -0
- package/i18n/sv.json +29 -0
- package/i18n/tr.json +29 -0
- package/i18n/uk.json +29 -0
- package/i18n/vi.json +29 -0
- package/i18n/zh-TW.json +29 -0
- package/i18n/zh.json +29 -0
- package/input/styles/_index.scss +5 -1
- package/input-otp/styles/_index.scss +5 -5
- package/llms-full.txt +11 -1
- package/llms.txt +188 -132
- package/mcp/providers.js +2 -2
- package/mcp/server.js +1 -1
- package/overlay/styles/_arrow.scss +3 -0
- package/package.json +43 -2
- package/progress/styles/_index.scss +4 -0
- package/radio/styles/_index.scss +4 -1
- package/schematics/use/symbol-map.json +1 -0
- package/select/styles/_index.scss +3 -3
- package/sidebar/styles/_index.scss +10 -0
- package/skeleton/styles/_index.scss +3 -0
- package/skills/ngwr/SKILL.md +5 -5
- package/skills/ngwr/references/catalog.md +2 -0
- package/skills/ngwr/references/setup.md +3 -3
- package/styles.scss +1 -0
- package/table/styles/_index.scss +7 -0
- package/textarea/styles/_index.scss +12 -3
- package/theme/styles/_colors.scss +39 -13
- package/theme/styles/_contrast.scss +9 -7
- package/toast/styles/_index.scss +4 -0
- package/tree/styles/_index.scss +1 -1
- package/types/ngwr-badge.d.ts +22 -7
- package/types/ngwr-config.d.ts +12 -0
- package/types/ngwr-editor-testing.d.ts +378 -0
- package/types/ngwr-editor.d.ts +449 -0
- package/types/ngwr-markdown.d.ts +61 -2
- package/types/ngwr-typography.d.ts +4 -0
- package/types/ngwr-version.d.ts +1 -1
- package/typography/styles/_index.scss +16 -0
package/README.md
CHANGED
|
@@ -1,32 +1,19 @@
|
|
|
1
|
-
# <a href="https://ngwr.dev"><img src="https://ngwr.dev/images/logo.svg" alt="ngwr" height="
|
|
1
|
+
# <a href="https://ngwr.dev"><img src="https://ngwr.dev/images/logo.svg" alt="ngwr" height="32"></a>
|
|
2
|
+
|
|
3
|
+
Signals-first UI components for Angular.
|
|
2
4
|
|
|
3
5
|
[](https://ngwr.dev)
|
|
4
|
-
[](https://www.npmjs.com/package/ngwr)
|
|
5
7
|
[](https://www.npmjs.com/package/ngwr)
|
|
6
8
|
[](https://github.com/thekhegay/ngwr/actions/workflows/ci.yml)
|
|
7
9
|
[](https://codecov.io/gh/thekhegay/ngwr)
|
|
8
10
|
[](https://github.com/thekhegay/ngwr/blob/main/LICENSE)
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
Re-derive before editing the number. -->
|
|
16
|
-
|
|
17
|
-
**NGWR is an Angular UI library that binds straight to Signal Forms.** Nineteen
|
|
18
|
-
value controls implement `FormValueControl` / `FormCheckboxControl` themselves,
|
|
19
|
-
so `[formField]` writes the component's own `value` / `checked` model — there
|
|
20
|
-
is not one `ControlValueAccessor` in the library. Zoneless by construction, not
|
|
21
|
-
zoneless-compatible: signal inputs, signal state, `afterNextRender()` for DOM
|
|
22
|
-
work, and no `@NgModule` or `@Input()` decorator anywhere in the source. 227
|
|
23
|
-
tree-shakable entry points, on `@angular/cdk` for overlay, portal and a11y
|
|
24
|
-
primitives.
|
|
25
|
-
|
|
26
|
-
**[Try it in the browser](https://ngwr.dev/start/playground)** — no install.
|
|
27
|
-
**[How it compares](https://ngwr.dev/start/comparison)** — what the other
|
|
28
|
-
Angular UI libraries do about Signal Forms today, counted rather than asserted.
|
|
29
|
-
**[Docs and live demos](https://ngwr.dev)**.
|
|
12
|
+
[Documentation](https://ngwr.dev) · [Getting started](https://ngwr.dev/start/installation) · [Playground](https://ngwr.dev/start/playground) · [Why ngwr](https://ngwr.dev/start/comparison) · [Changelog](https://github.com/thekhegay/ngwr/blob/main/CHANGELOG.md)
|
|
13
|
+
|
|
14
|
+
ngwr's form controls implement `FormValueControl` and `FormCheckboxControl`
|
|
15
|
+
from Signal Forms directly. `[formField]` binds to each component's own `value`
|
|
16
|
+
or `checked` model, and the library contains no `ControlValueAccessor`.
|
|
30
17
|
|
|
31
18
|
```ts
|
|
32
19
|
import { Component, signal } from '@angular/core';
|
|
@@ -49,9 +36,6 @@ import { WrInput } from 'ngwr/input';
|
|
|
49
36
|
export class SignupCard {
|
|
50
37
|
private readonly model = signal({ email: '', agree: false });
|
|
51
38
|
|
|
52
|
-
// `[formField]` binds to the control's own `value` / `checked` model, and
|
|
53
|
-
// `<wr-form-field>` resolves the error copy from the i18n catalog — so
|
|
54
|
-
// neither an accessor nor a `<wr-form-error>` has to be written by hand.
|
|
55
39
|
readonly signup = form(this.model, path => {
|
|
56
40
|
required(path.email);
|
|
57
41
|
email(path.email);
|
|
@@ -59,104 +43,39 @@ export class SignupCard {
|
|
|
59
43
|
}
|
|
60
44
|
```
|
|
61
45
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
directives — `required`, `minlength`, `maxlength`, `pattern` or `email` on an ngwr
|
|
66
|
-
control is silently ignored and the form submits — so put validators on the
|
|
67
|
-
`FormControl`. It also ignores `updateOn`, and a `{ emitEvent: false }` write needs
|
|
68
|
-
`markForCheck()`; the [forms guide](https://ngwr.dev/guides/forms) has the detail.
|
|
69
|
-
Every control is also usable standalone through its two-way `[(value)]` /
|
|
70
|
-
`[(checked)]` model.
|
|
71
|
-
|
|
72
|
-
> **Status:** active development. v14 is the current major line (Angular 22 peer).
|
|
73
|
-
> Upgrading? `ng update ngwr@14` rewrites v14's six renames and reports the
|
|
74
|
-
> changes no codemod should guess at — the
|
|
75
|
-
> [migration guide](https://ngwr.dev/start/migration) walks every step.
|
|
76
|
-
> [Open an issue](https://github.com/thekhegay/ngwr/issues/new)
|
|
77
|
-
> if something breaks or feels wrong.
|
|
78
|
-
|
|
79
|
-
## Requirements
|
|
80
|
-
|
|
81
|
-
**The ranges live in one place: `peerDependencies` in the package's own
|
|
82
|
-
manifest.** Read them with `npm info ngwr peerDependencies`, or on the npm page,
|
|
83
|
-
or in `node_modules/ngwr/package.json` once installed. They are not copied here,
|
|
84
|
-
because a copy is only ever correct until the next release — this table listed
|
|
85
|
-
an icon package as a peer for a while after the library had stopped declaring
|
|
86
|
-
one.
|
|
87
|
-
|
|
88
|
-
What the manifest will not tell you is the SHAPE, so that is what this section
|
|
89
|
-
is for. Angular, its CDK and rxjs are required. `@angular/router` is optional
|
|
90
|
-
because only a handful of entry points import it. The two date libraries are
|
|
91
|
-
optional and you pick at most one, whichever `provideWrDateAdapter()` you use.
|
|
92
|
-
**Icon sets are not peers at all** — every adapter takes the icon data as an
|
|
93
|
-
argument, so ngwr never imports lucide, feather or any other set; install
|
|
94
|
-
whichever you like, or none, and register raw SVG with `svgIcon()`.
|
|
95
|
-
|
|
96
|
-
ngwr declares no `engines` field and no TypeScript peer of its own, because it
|
|
97
|
-
ships pre-compiled bundles and `.d.ts` files: the Node and TypeScript versions
|
|
98
|
-
that bind are the ones your Angular names. Contributing to this repo is
|
|
99
|
-
narrower, and those ranges live in the root `package.json` too — `engines`,
|
|
100
|
-
`devEngines` and `packageManager`, with `.nvmrc` naming the version CI runs.
|
|
101
|
-
|
|
102
|
-
**The floor is real; the missing ceiling promises nothing.** ngwr ships
|
|
103
|
-
partially compiled, and the floor is enforced by the bundles rather than by the
|
|
104
|
-
range — but by a minority of them, which is why the failure is confusing when it
|
|
105
|
-
arrives. Of 654 declarations, **25 record `minVersion: "22.0.0"`** (the service
|
|
106
|
-
declarations, across 22 files); the rest are older shapes an old linker reads
|
|
107
|
-
fine. So the install succeeds — every package manager treats an unmet peer as a
|
|
108
|
-
warning — and `ng build` then dies inside one `fesm2022` bundle with a message
|
|
109
|
-
that names no version at all. Read the peer warning at install time. Above the
|
|
110
|
-
floor, an open-ended range only means your package manager will not stop you
|
|
111
|
-
installing next to an Angular this release was never built against.
|
|
46
|
+
`<wr-form-field>` shows the validation messages itself, so there is no error
|
|
47
|
+
markup to write. Template-driven and reactive forms bind too, with limits the
|
|
48
|
+
[forms guide](https://ngwr.dev/guides/forms) lists.
|
|
112
49
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
50
|
+
## Features
|
|
51
|
+
|
|
52
|
+
- Standalone, signal-based components that work zoneless and render on the
|
|
53
|
+
server.
|
|
54
|
+
- One import path per component (`ngwr/button`, `ngwr/select`). The only
|
|
55
|
+
runtime dependency is `tslib`.
|
|
56
|
+
- [Theming](https://ngwr.dev/guides/theming) through `--wr-*` CSS custom
|
|
57
|
+
properties, with light and dark modes.
|
|
58
|
+
- Keyboard and screen reader support based on the WAI-ARIA patterns.
|
|
59
|
+
- Translatable built-in labels and right-to-left layouts.
|
|
60
|
+
- Angular CDK [test harnesses](https://ngwr.dev/guides/testing) for the form
|
|
61
|
+
controls and overlays.
|
|
116
62
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
release. It exists because the opposite shipped: 12.2.0 was a minor carrying a
|
|
125
|
-
`BREAKING CHANGES` section, and `^12.1.0` picked it up silently. So a caret
|
|
126
|
-
range on a major is a safe range now. It was not then. What the guard cannot see
|
|
127
|
-
is a break nobody labelled as one — it reads commit metadata, which is what
|
|
128
|
-
commitlint on every commit and PR title gives it to read.
|
|
129
|
-
|
|
130
|
-
Public API is three surfaces, and all three move only in a major: the exported
|
|
131
|
-
TypeScript, the `.wr-*` BEM class names (components ship
|
|
132
|
-
`ViewEncapsulation.None`), and the `--wr-*` custom properties. Anything marked
|
|
133
|
-
`@internal` is not API, and the marker survives into the shipped types —
|
|
134
|
-
`grep -rn "@internal" node_modules/ngwr/types` is the whole check. A few helpers
|
|
135
|
-
are exported, unmarked and undocumented; treat those as unsupported until a page
|
|
136
|
-
describes them, and open an issue naming the one you need.
|
|
137
|
-
|
|
138
|
-
Two lines are supported at a time: the current major in full, the one before it
|
|
139
|
-
for mechanical security fixes only, and that second row ends when the next major
|
|
140
|
-
ships. Read it against the cadence rather than a calendar — eight majors shipped
|
|
141
|
-
between 2026-06-12 (v7.0.0) and 2026-09-04 (v14.0.0). Table, targets and the
|
|
142
|
-
private reporting route: [SECURITY.md](SECURITY.md). Full policy, with the
|
|
143
|
-
commands to check every claim in it against the installed package:
|
|
144
|
-
<https://ngwr.dev/start/versioning>.
|
|
145
|
-
|
|
146
|
-
## Install
|
|
147
|
-
|
|
148
|
-
The schematic does the whole Install + Styles section for you — it installs
|
|
149
|
-
ngwr and its peers, appends `@use 'ngwr';` to your global stylesheet, and
|
|
150
|
-
prints a provider snippet tailored to your answers (date adapter, density,
|
|
151
|
-
theme) to paste into bootstrap:
|
|
152
|
-
|
|
153
|
-
```shell
|
|
63
|
+
Browse the [components](https://ngwr.dev/reference/components) and
|
|
64
|
+
[animations](https://ngwr.dev/animations) with live demos. Directives, pipes,
|
|
65
|
+
services and validators are in the [reference](https://ngwr.dev/reference).
|
|
66
|
+
|
|
67
|
+
## Installation
|
|
68
|
+
|
|
69
|
+
```sh
|
|
154
70
|
ng add ngwr
|
|
155
71
|
```
|
|
156
72
|
|
|
157
|
-
|
|
73
|
+
The schematic asks a few questions, adds `@use 'ngwr';` to your global Sass
|
|
74
|
+
stylesheet and prints the providers to add to your app.
|
|
158
75
|
|
|
159
|
-
|
|
76
|
+
Or install the packages yourself:
|
|
77
|
+
|
|
78
|
+
```sh
|
|
160
79
|
pnpm add ngwr @angular/cdk
|
|
161
80
|
# or
|
|
162
81
|
npm install ngwr @angular/cdk
|
|
@@ -164,257 +83,72 @@ npm install ngwr @angular/cdk
|
|
|
164
83
|
yarn add ngwr @angular/cdk
|
|
165
84
|
```
|
|
166
85
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
`@angular/router` is optional, and since v14 nothing pulls it in unless you ask:
|
|
170
|
-
a `<wr-tab routerLink>` needs `WrTabsRouting` from `ngwr/tabs/router` on the
|
|
171
|
-
strip, and `<wr-loading-bar>` follows navigation only once you add
|
|
172
|
-
`provideWrLoadingBarRouter()` from `ngwr/loading-bar/router`. Both used to be
|
|
173
|
-
automatic, which cost every app 66–76 kB of router whether it routed or not.
|
|
174
|
-
A stock `ng new` app already ships forms and router, so
|
|
175
|
-
`@angular/cdk` is the only one you have to add — which is why it is on the
|
|
176
|
-
install lines above. Add an icon set and a date library only if you use them —
|
|
177
|
-
`lucide` (or `feather-icons`) for the icon adapters, and `date-fns` or `luxon`
|
|
178
|
-
for the calendar / date-picker, which otherwise runs on a built-in native
|
|
179
|
-
`Date` adapter. The Quick start below registers a lucide icon, so it needs
|
|
180
|
-
`lucide`:
|
|
181
|
-
|
|
182
|
-
```shell
|
|
183
|
-
pnpm add lucide
|
|
184
|
-
```
|
|
86
|
+
The optional packages (a date library, an icon set, ProseMirror for the editor)
|
|
87
|
+
are listed in the [installation guide](https://ngwr.dev/start/installation).
|
|
185
88
|
|
|
186
89
|
## Styles
|
|
187
90
|
|
|
188
|
-
The fastest way — pull in everything (theme tokens + all component styles):
|
|
189
|
-
|
|
190
91
|
```scss
|
|
191
92
|
// styles.scss
|
|
192
93
|
@use 'ngwr';
|
|
193
94
|
```
|
|
194
95
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
`ng new` warns at before any of your own code. For anything you intend to keep,
|
|
198
|
-
opt in per component below and the sheet stays proportional to what you actually
|
|
199
|
-
render.
|
|
200
|
-
|
|
201
|
-
Prefer to opt in per-component? Each component has its own SCSS entry that pulls
|
|
202
|
-
in the theme automatically:
|
|
96
|
+
This loads the theme and the styles of every component. To keep the stylesheet
|
|
97
|
+
small, load only the components you use. Each entry brings the theme with it:
|
|
203
98
|
|
|
204
99
|
```scss
|
|
205
|
-
@use 'ngwr/
|
|
206
|
-
@use 'ngwr/button';
|
|
100
|
+
@use 'ngwr/form';
|
|
207
101
|
@use 'ngwr/input';
|
|
208
102
|
@use 'ngwr/checkbox';
|
|
209
103
|
```
|
|
210
104
|
|
|
211
|
-
|
|
105
|
+
Utilities are opt-in and are not part of `@use 'ngwr'`:
|
|
212
106
|
|
|
213
107
|
```scss
|
|
214
108
|
@use 'ngwr/reset'; // box-sizing, body margin, sane defaults
|
|
215
109
|
@use 'ngwr/grid'; // .grid, .container, .col-*
|
|
216
|
-
@use 'ngwr/animations'; // .wr-animate
|
|
217
|
-
@use 'ngwr/typography-utilities'; // .wr-text-*, .wr-font-*
|
|
218
|
-
@use 'ngwr/breakpoints' as bp; //
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
`ngwr/typography-utilities` is the utility-class sheet — not `ngwr/typography`,
|
|
222
|
-
which is the larger `wrTypography` component entry.
|
|
223
|
-
|
|
224
|
-
### What you may style, and what may move
|
|
225
|
-
|
|
226
|
-
Components render with `ViewEncapsulation.None`, so their `.wr-*` BEM classes and
|
|
227
|
-
their `--wr-*` custom properties are reachable — and both are treated as public
|
|
228
|
-
API: renaming one is a breaking change carrying a migration note. The DOM *shape*
|
|
229
|
-
is not. Which element holds which class, how deeply they nest, whether a wrapper
|
|
230
|
-
exists — all of that may move in a minor. A rule keyed on one class survives a
|
|
231
|
-
rename; a descendant selector that encodes a structure
|
|
232
|
-
(`.wr-select__trigger > span > svg`) does not. And a surviving rule is not a
|
|
233
|
-
winning one: 27 components ship their own stylesheet, which Angular emits after
|
|
234
|
-
your linked `styles.css`, so a single-class override loses to it at equal
|
|
235
|
-
specificity — reach for their `--wr-*` token instead. See
|
|
236
|
-
[Theming](https://ngwr.dev/guides/theming) for the full statement and the list.
|
|
237
|
-
|
|
238
|
-
## Quick start
|
|
239
|
-
|
|
240
|
-
```ts
|
|
241
|
-
// main.ts
|
|
242
|
-
import { bootstrapApplication } from '@angular/platform-browser';
|
|
243
|
-
import { provideWrOverlay } from 'ngwr/overlay';
|
|
244
|
-
|
|
245
|
-
import { AppComponent } from './app/app.component';
|
|
246
|
-
|
|
247
|
-
bootstrapApplication(AppComponent, {
|
|
248
|
-
providers: [
|
|
249
|
-
provideWrOverlay(), // isolated overlay container
|
|
250
|
-
],
|
|
251
|
-
});
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
```ts
|
|
255
|
-
// app.component.ts
|
|
256
|
-
import { Component, signal } from '@angular/core';
|
|
257
|
-
import { FormsModule } from '@angular/forms';
|
|
258
|
-
import { Check } from 'lucide';
|
|
259
|
-
import { WrButton } from 'ngwr/button';
|
|
260
|
-
import { provideWrIcons } from 'ngwr/icon';
|
|
261
|
-
import { lucideIcons } from 'ngwr/icon/adapters/lucide';
|
|
262
|
-
import { WrInput } from 'ngwr/input';
|
|
263
|
-
|
|
264
|
-
@Component({
|
|
265
|
-
selector: 'app-root',
|
|
266
|
-
imports: [FormsModule, WrButton, WrInput],
|
|
267
|
-
providers: [provideWrIcons(lucideIcons({ checkmark: Check }))], // tree-shaken icons
|
|
268
|
-
template: `
|
|
269
|
-
<input wrInput [(ngModel)]="name" placeholder="Your name" />
|
|
270
|
-
<button wr-btn color="primary" icon="checkmark" (click)="greet()">Hello</button>
|
|
271
|
-
`,
|
|
272
|
-
})
|
|
273
|
-
export class AppComponent {
|
|
274
|
-
readonly name = signal('');
|
|
275
|
-
greet(): void {
|
|
276
|
-
console.log('Hi', this.name());
|
|
277
|
-
}
|
|
278
|
-
}
|
|
110
|
+
@use 'ngwr/animations'; // .wr-animate-* classes
|
|
111
|
+
@use 'ngwr/typography-utilities'; // .wr-text-*, .wr-font-* classes
|
|
112
|
+
@use 'ngwr/breakpoints' as bp; // Sass mixins only, no CSS output
|
|
279
113
|
```
|
|
280
114
|
|
|
281
|
-
|
|
282
|
-
through — no `ControlValueAccessor` anywhere in the chain:
|
|
283
|
-
|
|
284
|
-
```ts
|
|
285
|
-
// profile-form.ts
|
|
286
|
-
import { Component, signal } from '@angular/core';
|
|
287
|
-
import { FormField, form } from '@angular/forms/signals';
|
|
288
|
-
import { WrCheckbox } from 'ngwr/checkbox';
|
|
289
|
-
import { WrInput } from 'ngwr/input';
|
|
115
|
+
## Upgrading
|
|
290
116
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
imports: [FormField, WrCheckbox, WrInput],
|
|
294
|
-
template: `
|
|
295
|
-
<input wrInput [formField]="profile.name" placeholder="Your name" />
|
|
296
|
-
<wr-checkbox [formField]="profile.agree">I agree</wr-checkbox>
|
|
297
|
-
`,
|
|
298
|
-
})
|
|
299
|
-
export class ProfileForm {
|
|
300
|
-
readonly model = signal({ name: '', agree: false });
|
|
301
|
-
readonly profile = form(this.model); // FieldTree — profile.name, profile.agree
|
|
302
|
-
}
|
|
117
|
+
```sh
|
|
118
|
+
ng update ngwr
|
|
303
119
|
```
|
|
304
120
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
> A few share a package: `form-field` ships from `ngwr/form`, `button-group` from
|
|
310
|
-
> `ngwr/button`, and `qr` is the subpath behind the `qrcode` docs page.
|
|
311
|
-
|
|
312
|
-
### Components
|
|
313
|
-
|
|
314
|
-
**Form** — [calendar](https://ngwr.dev/reference/components/calendar), [cascader](https://ngwr.dev/reference/components/cascader), [checkbox](https://ngwr.dev/reference/components/checkbox), [color-picker](https://ngwr.dev/reference/components/color-picker), [date-picker](https://ngwr.dev/reference/components/date-picker), [file-upload](https://ngwr.dev/reference/components/file-upload), [form](https://ngwr.dev/reference/components/form), [form-field](https://ngwr.dev/reference/components/form-field), [input](https://ngwr.dev/reference/components/input), [input-number](https://ngwr.dev/reference/components/input-number), [input-otp](https://ngwr.dev/reference/components/input-otp), [knob](https://ngwr.dev/reference/components/knob), [mention](https://ngwr.dev/reference/components/mention), [radio](https://ngwr.dev/reference/components/radio), [rating](https://ngwr.dev/reference/components/rating), [schema-form](https://ngwr.dev/reference/components/schema-form), [segmented](https://ngwr.dev/reference/components/segmented), [select](https://ngwr.dev/reference/components/select), [slider](https://ngwr.dev/reference/components/slider), [switch](https://ngwr.dev/reference/components/switch), [textarea](https://ngwr.dev/reference/components/textarea), [transfer](https://ngwr.dev/reference/components/transfer).
|
|
315
|
-
|
|
316
|
-
**Buttons** — [button](https://ngwr.dev/reference/components/button), [button-group](https://ngwr.dev/reference/components/button-group), [speed-dial](https://ngwr.dev/reference/components/speed-dial).
|
|
317
|
-
|
|
318
|
-
**Data** — [drag-drop](https://ngwr.dev/reference/components/drag-drop), [event-calendar](https://ngwr.dev/reference/components/event-calendar), [graph](https://ngwr.dev/reference/components/graph), [pagination](https://ngwr.dev/reference/components/pagination), [pull-to-refresh](https://ngwr.dev/reference/components/pull-to-refresh), [table](https://ngwr.dev/reference/components/table), [tree](https://ngwr.dev/reference/components/tree), [virtual-scroll](https://ngwr.dev/reference/components/virtual-scroll).
|
|
319
|
-
|
|
320
|
-
**Feedback** — [alert](https://ngwr.dev/reference/components/alert), [empty](https://ngwr.dev/reference/components/empty), [progress](https://ngwr.dev/reference/components/progress), [result](https://ngwr.dev/reference/components/result), [skeleton](https://ngwr.dev/reference/components/skeleton), [spinner](https://ngwr.dev/reference/components/spinner).
|
|
321
|
-
|
|
322
|
-
**Display** — [avatar](https://ngwr.dev/reference/components/avatar), [badge](https://ngwr.dev/reference/components/badge) (incl. `wr-tag`), [compare](https://ngwr.dev/reference/components/compare), [counter](https://ngwr.dev/reference/components/counter), [descriptions](https://ngwr.dev/reference/components/descriptions), [divider](https://ngwr.dev/reference/components/divider), [image-cropper](https://ngwr.dev/reference/components/image-cropper), [keyboard](https://ngwr.dev/reference/components/keyboard), [lightbox](https://ngwr.dev/reference/components/lightbox), [markdown](https://ngwr.dev/reference/components/markdown), [qr](https://ngwr.dev/reference/components/qrcode), [statistic](https://ngwr.dev/reference/components/statistic), [timeline](https://ngwr.dev/reference/components/timeline).
|
|
323
|
-
|
|
324
|
-
**Layout** — [card](https://ngwr.dev/reference/components/card), [carousel](https://ngwr.dev/reference/components/carousel), [collapse](https://ngwr.dev/reference/components/collapse), [layout](https://ngwr.dev/reference/components/layout), [list](https://ngwr.dev/reference/components/list), [page-header](https://ngwr.dev/reference/components/page-header), [splitter](https://ngwr.dev/reference/components/splitter), [toolbar](https://ngwr.dev/reference/components/toolbar).
|
|
325
|
-
|
|
326
|
-
**Navigation** — [anchor](https://ngwr.dev/reference/components/anchor), [back-top](https://ngwr.dev/reference/components/back-top), [breadcrumbs](https://ngwr.dev/reference/components/breadcrumbs), [burger](https://ngwr.dev/reference/components/burger), [dropdown](https://ngwr.dev/reference/components/dropdown), [sidebar](https://ngwr.dev/reference/components/sidebar), [stepper](https://ngwr.dev/reference/components/stepper), [tabs](https://ngwr.dev/reference/components/tabs).
|
|
327
|
-
|
|
328
|
-
**Overlays** — [action-sheet](https://ngwr.dev/reference/components/action-sheet), [command-palette](https://ngwr.dev/reference/components/command-palette), [context-menu](https://ngwr.dev/reference/components/context-menu), [dialog](https://ngwr.dev/reference/components/dialog), [drawer](https://ngwr.dev/reference/components/drawer), [popconfirm](https://ngwr.dev/reference/components/popconfirm), [popover](https://ngwr.dev/reference/components/popover), [toast](https://ngwr.dev/reference/components/toast), [window](https://ngwr.dev/reference/components/window).
|
|
329
|
-
|
|
330
|
-
**Charts** — [bar-chart](https://ngwr.dev/reference/components/bar-chart), [calendar-heatmap](https://ngwr.dev/reference/components/calendar-heatmap), [donut-chart](https://ngwr.dev/reference/components/donut-chart), [gauge](https://ngwr.dev/reference/components/gauge), [line-chart](https://ngwr.dev/reference/components/line-chart), [meter-group](https://ngwr.dev/reference/components/meter-group), [sparkline](https://ngwr.dev/reference/components/sparkline).
|
|
331
|
-
|
|
332
|
-
Plus [icon](https://ngwr.dev/reference/components/icon), the experimental [squircle](https://ngwr.dev/reference/components/squircle), and the [typography](https://ngwr.dev/reference/directives/typography) directive.
|
|
333
|
-
|
|
334
|
-
### Animations
|
|
335
|
-
|
|
336
|
-
Animated UI effects. Mix of in-house components + ports of [reactbits.dev](https://www.reactbits.dev) — each port carries a credit chip on its docs page. Defaults are theme-aware (light + dark), and every component in **this section** honors `prefers-reduced-motion` — the one exception is `spotlight-card`, whose highlight only tracks the pointer. The scope of that sentence is the thing to read carefully: it says nothing about the rest of the catalog, and until v13 it was inviting a reader to over-generalise. The always-on chrome — the spinner and skeleton that animate on essentially every page, plus the enter animations on dialog, drawer, dropdown, popconfirm, toast, lightbox and the responsive bottom sheet — had no guard at all. It has one now, in the theme layer (`theme/styles/_motion.scss`) rather than per component, so the set is reviewable in one place.
|
|
337
|
-
|
|
338
|
-
[aurora](https://ngwr.dev/animations/aurora), [blur-text](https://ngwr.dev/animations/blur-text), [border-glow](https://ngwr.dev/animations/border-glow), [circular-text](https://ngwr.dev/animations/circular-text), [click-spark](https://ngwr.dev/animations/click-spark), [confetti](https://ngwr.dev/animations/confetti), [decrypt-text](https://ngwr.dev/animations/decrypt-text), [falling-text](https://ngwr.dev/animations/falling-text), [fuzzy-text](https://ngwr.dev/animations/fuzzy-text), [glitch-text](https://ngwr.dev/animations/glitch-text), [gradient-text](https://ngwr.dev/animations/gradient-text), [marquee](https://ngwr.dev/animations/marquee), [rotating-text](https://ngwr.dev/animations/rotating-text), [shiny-text](https://ngwr.dev/animations/shiny-text), [splash-cursor](https://ngwr.dev/animations/splash-cursor), [split-text](https://ngwr.dev/animations/split-text), [spotlight-card](https://ngwr.dev/animations/spotlight-card), [star-border](https://ngwr.dev/animations/star-border), [tilt-card](https://ngwr.dev/animations/tilt-card), [typewriter](https://ngwr.dev/animations/typewriter), [waves](https://ngwr.dev/animations/waves).
|
|
121
|
+
This installs the latest version and runs its migrations. The
|
|
122
|
+
[migration guide](https://ngwr.dev/start/migration) describes the changes in
|
|
123
|
+
each major. The Angular badge shows the lowest Angular version ngwr needs.
|
|
124
|
+
[Versioning](https://ngwr.dev/start/versioning) explains the support policy.
|
|
339
125
|
|
|
340
|
-
|
|
126
|
+
## AI agents
|
|
341
127
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
[autofocus](https://ngwr.dev/reference/directives/autofocus), [autosize](https://ngwr.dev/reference/directives/autosize), [click-outside](https://ngwr.dev/reference/directives/click-outside), [copy-to-clipboard](https://ngwr.dev/reference/directives/copy-to-clipboard). [affix](https://ngwr.dev/reference/directives/affix) ships as its own entry (`ngwr/affix`).
|
|
345
|
-
|
|
346
|
-
### Pipes — `ngwr/pipes`
|
|
347
|
-
|
|
348
|
-
[wrBytes](https://ngwr.dev/reference/pipes/wr-bytes), [wrDate](https://ngwr.dev/reference/pipes/wr-date), [wrMark](https://ngwr.dev/reference/pipes/wr-mark), [wrNumber](https://ngwr.dev/reference/pipes/wr-number), [wrPlural](https://ngwr.dev/reference/pipes/wr-plural), [wrRange](https://ngwr.dev/reference/pipes/wr-range), [wrTruncate](https://ngwr.dev/reference/pipes/wr-truncate).
|
|
349
|
-
|
|
350
|
-
### Services
|
|
351
|
-
|
|
352
|
-
[clipboard](https://ngwr.dev/reference/services/clipboard), [cookie](https://ngwr.dev/reference/services/cookie), [density](https://ngwr.dev/reference/services/density), [hotkey](https://ngwr.dev/reference/services/hotkey), [loading-bar](https://ngwr.dev/reference/services/loading-bar), [media](https://ngwr.dev/reference/services/media), [meta](https://ngwr.dev/reference/services/meta), [platform](https://ngwr.dev/reference/services/platform), [scroll](https://ngwr.dev/reference/services/scroll), [storage](https://ngwr.dev/reference/services/storage), [theme](https://ngwr.dev/reference/services/theme), [tour](https://ngwr.dev/reference/services/tour), [i18n](https://ngwr.dev/reference/services/i18n).
|
|
353
|
-
|
|
354
|
-
### Validators — `ngwr/validators`
|
|
355
|
-
|
|
356
|
-
Bundled `ValidatorFn`s composing cleanly with Angular's built-in `Validators`: `cardNumber` (Luhn), `cvc`, `hexColor`, `iban` (mod-97), `match` (sibling control), `matchFields` (group-level), `maxDate`, `minDate`, `noWhitespace`, `oneOf`, `url`. See [docs](https://ngwr.dev/reference/validators).
|
|
357
|
-
|
|
358
|
-
### Utils — `ngwr/utils`
|
|
359
|
-
|
|
360
|
-
Math (`clamp`, `round`), coercion (`numAttr`), css helpers (`resolveCssSize`, `getRootFontSize`), ids (`randomId`), type guards (`isDefined`, `isNonEmptyArray`, `isObservable`), keyboard helpers (`KEYS`, `hasModifier`, `isPrintableKey`), functional primitives (`noop`, `badgeLog`, `debounce`, `throttle`), focus management (`getFocusableElements`, `trapFocus`). See [docs](https://ngwr.dev/reference/utils) for the full list. Shared shapes (`Maybe`, `SafeAny`, `WrColor`, …) are documented under [Interfaces](https://ngwr.dev/reference/interfaces).
|
|
361
|
-
|
|
362
|
-
### Core
|
|
363
|
-
|
|
364
|
-
- [Color](https://ngwr.dev/guides/tokens/colors) — design tokens and palette.
|
|
365
|
-
- [Grid](https://ngwr.dev/guides/grid) — opt-in 12-column layout.
|
|
366
|
-
- [Overlay](https://ngwr.dev/guides/overlay) — isolated CDK overlay container, `provideWrOverlay()`.
|
|
367
|
-
- [Mobile & responsive](https://ngwr.dev/guides/mobile) — responsive overlays, touch targets & density, swipe gestures, safe-area insets, container-query layouts.
|
|
368
|
-
- [Typography](https://ngwr.dev/guides/typography) — `wrTypography` directive: headings, paragraphs, lists, links, code.
|
|
369
|
-
- [Icons](https://ngwr.dev/icons) — `ngwr/icon` registry. Use `svgIcon()` for any set that ships raw SVG files (Tabler, Phosphor, Heroicons, Iconoir, Radix, Bootstrap, or your designer's own), plus thin adapters for Lucide (`ngwr/icon/adapters/lucide`) and Feather (`ngwr/icon/adapters/feather`), whose packages don't ship SVGs.
|
|
370
|
-
- **Date adapters** — `ngwr/date` (native `Date`, no extra package), `ngwr/date/adapters/fns`, `ngwr/date/adapters/luxon`. Wire one with `provideWrDateAdapter()` — plus `{ adapter: WrDateFnsAdapter }` / `{ adapter: WrLuxonAdapter }` for the library-backed ones — to power calendar + every mode of date-picker.
|
|
371
|
-
- **Component defaults** — `ngwr/config`. `provideWrConfig({ button: { size: 'sm' } })` sets what a component falls back to when a template says nothing; a bound value always wins, and a bound `false` beats a configured `true`, so a config never has to be escaped. [Reference](https://ngwr.dev/start/configuration).
|
|
372
|
-
|
|
373
|
-
## Highlights
|
|
374
|
-
|
|
375
|
-
- **Standalone & signals-first.** Every component is standalone and uses `input()` / `model()` / `output()` / `signal()` / `computed()`. Zoneless-ready.
|
|
376
|
-
- **Signal Forms native.** Nineteen value controls implement `FormValueControl` / `FormCheckboxControl`, so `[formField]` binds straight through — there is no `ControlValueAccessor` in the library at all. `[(ngModel)]` and reactive forms keep working through Angular's bridge, and every control also works standalone via `[(value)]` / `[(checked)]`.
|
|
377
|
-
- **CDK-powered.** Overlays, portals, and a11y come from `@angular/cdk`. We add `provideWrOverlay()` so NGWR overlays never collide with other CDK consumers (Material, NG-ZORRO, etc.).
|
|
378
|
-
- **Mobile & responsive.** Overlays collapse to bottom-sheets on small screens (`provideWrResponsiveOverlays()`), touch targets grow to ≥44px on coarse pointers, a `touch` density preset enlarges the nine control families that read the multipliers, and drawer / lightbox / toast / carousel respond to swipe gestures. Fixed surfaces respect `env(safe-area-inset-*)`, and layout components (`descriptions`, `stepper`, `page-header`, `toolbar`, `pagination`, `table`) reflow to their container via container queries. [Guide](https://ngwr.dev/guides/mobile).
|
|
379
|
-
- **Table, batteries included.** `wr-table` covers column pinning / resizing / drag-reorder, row selection, expandable rows, grouping, tree rows (`childrenKey` — the forest flattens into the same `<tbody>`, so pinning and cell templates keep working at every depth, and the table announces a `treegrid`), summary rows, CSV export (`exportCsv()`, dependency-free RFC 4180) and a virtualized body — all opt-in inputs on the one component. Excel (`.xlsx`) export is deliberately not shipped: it would mean a third-party dependency.
|
|
380
|
-
- **Tree-shakable.** 227 separate ng-packagr entry points — import only what you use. Per-component FESM bundles are small: a median of ~4 KB gzipped, the heaviest (`ngwr/markdown`) ~23 KB. Every runtime bundle together gzips to ~690 KB — the 71 `ngwr/<name>/testing` harnesses aside, since they never reach an app bundle — but real apps pull a handful of entries. The only runtime dependency is `tslib`.
|
|
381
|
-
- **Modular SCSS.** Component styles are scoped through CSS custom properties. Theme tokens live in `ngwr/theme`; utilities (`grid`, `reset`) and the breakpoints SCSS API are opt-in.
|
|
382
|
-
- **Tree-shaken icons.** `provideWrIcons(lucideIcons({ plus: Plus }))` registers only the icons you actually import. Dev-mode validation warns about unregistered icons.
|
|
383
|
-
- **Reactbits ports, dependency-free.** All animation ports are reimplemented with vanilla DOM + Web Animations API / `IntersectionObserver` / `requestAnimationFrame` / raw WebGL — no GSAP, no `motion/react`, no `matter-js`, no `ogl`.
|
|
384
|
-
- **Motion respects the OS.** Every animation component short-circuits to its final state under `prefers-reduced-motion`, except `spotlight-card`, which animates nothing on its own — its highlight follows the cursor.
|
|
385
|
-
- **Legible to agents.** Every docs page also serves as markdown at the same URL plus `.md` — [reference/components/select.md](https://ngwr.dev/reference/components/select.md) is that page's prose, code samples and API tables without the site chrome. The whole catalog is at [llms-full.txt](https://ngwr.dev/llms-full.txt), a quick-ref at [llms.txt](https://ngwr.dev/llms.txt).
|
|
386
|
-
|
|
387
|
-
### MCP server
|
|
388
|
-
|
|
389
|
-
The package ships `ngwr-mcp`, a zero-dependency MCP server that makes those files askable: `search_ngwr` (find an entry point by what you need), `get_ngwr_component`, `get_ngwr_api` (a class's inputs / models / outputs / methods, read out of the shipped `.d.ts`) and `get_ngwr_setup` (the install, `ng g ngwr:use` and provider commands — returned as text; it never runs them). It adds no second copy of the catalog: it reads only files inside its own installed package, makes no network requests, and runs no commands.
|
|
128
|
+
ngwr ships `ngwr-mcp`, an MCP server that lets coding agents search the catalog
|
|
129
|
+
and read component APIs. Add it to your client:
|
|
390
130
|
|
|
391
131
|
```json
|
|
392
132
|
{
|
|
393
133
|
"mcpServers": {
|
|
394
|
-
"ngwr": { "command": "npx", "args": ["-y", "ngwr-mcp"] }
|
|
134
|
+
"ngwr": { "command": "npx", "args": ["-y", "-p", "ngwr", "ngwr-mcp"] }
|
|
395
135
|
}
|
|
396
136
|
}
|
|
397
137
|
```
|
|
398
138
|
|
|
399
|
-
|
|
139
|
+
The [MCP guide](https://ngwr.dev/guides/mcp) covers each client. Agents without
|
|
140
|
+
MCP can use the [agent skill](https://ngwr.dev/guides/agent-skill),
|
|
141
|
+
[llms.txt](https://ngwr.dev/llms.txt), or any docs page as markdown by adding
|
|
142
|
+
`.md` to its URL.
|
|
400
143
|
|
|
401
144
|
## Contributing
|
|
402
145
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
pnpm test # ng test lib (vitest)
|
|
409
|
-
pnpm build:lib # ng build lib + ai assets + dist assets + i18n json + schematics + mcp server
|
|
410
|
-
pnpm build:showcase # ai assets + showcase build + sitemap + markdown twins
|
|
411
|
-
pnpm lint # ng lint + eslint scripts + stylelint + colour parity + rtl + registry + tokens
|
|
412
|
-
```
|
|
413
|
-
|
|
414
|
-
## Authors
|
|
415
|
-
|
|
416
|
-
- [Roman Khegay](https://github.com/thekhegay) — code, design
|
|
146
|
+
Bug reports go to [issues](https://github.com/thekhegay/ngwr/issues/new/choose)
|
|
147
|
+
and questions to [Discussions](https://github.com/thekhegay/ngwr/discussions).
|
|
148
|
+
Read [CONTRIBUTING.md](https://github.com/thekhegay/ngwr/blob/main/CONTRIBUTING.md)
|
|
149
|
+
before opening a pull request, and report security issues privately as
|
|
150
|
+
[SECURITY.md](https://github.com/thekhegay/ngwr/blob/main/SECURITY.md) describes.
|
|
417
151
|
|
|
418
152
|
## License
|
|
419
153
|
|
|
420
|
-
[MIT](
|
|
154
|
+
[MIT](https://github.com/thekhegay/ngwr/blob/main/LICENSE) © [Roman Khegay](https://github.com/thekhegay)
|
package/alert/styles/_index.scss
CHANGED
|
@@ -121,6 +121,10 @@ $alert-colors: (
|
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
+
// color-ok: each type draws its OWN glyph in alert.html — a check in a broken
|
|
125
|
+
// circle, a triangle, an octagon, an `i` — so these hooks only ink a
|
|
126
|
+
// silhouette that already differs. `[icon]="false"` or an `iconName` hands
|
|
127
|
+
// that channel to the author, whose title then has to name the state.
|
|
124
128
|
@each $variant, $color in $alert-colors {
|
|
125
129
|
&--#{$variant} {
|
|
126
130
|
--wr-alert-bg: var(--wr-color-#{$color}-soft);
|
|
@@ -130,6 +134,9 @@ $alert-colors: (
|
|
|
130
134
|
}
|
|
131
135
|
|
|
132
136
|
// Neutral — muted gray chip, reusing the `medium` soft tokens.
|
|
137
|
+
// color-ok: its own glyph in alert.html, a bar in a circle, is what tells it
|
|
138
|
+
// from `danger` — the two paints sit on tints 1.036:1 apart, which is a hue
|
|
139
|
+
// difference and little else (measured in the template's comment).
|
|
133
140
|
&--neutral {
|
|
134
141
|
--wr-alert-bg: var(--wr-color-medium-soft);
|
|
135
142
|
--wr-alert-title: var(--wr-color-on-surface);
|
|
@@ -143,6 +150,9 @@ $alert-colors: (
|
|
|
143
150
|
|
|
144
151
|
// Offline — inverse chip. Auto-flips via the theme tokens: dark bg +
|
|
145
152
|
// light text in light theme; light bg + dark text in dark theme.
|
|
153
|
+
// color-ok: its own glyph in alert.html, a slashed circle — and the inverted
|
|
154
|
+
// chip is a LIGHTNESS change, an `on-surface` fill under `surface` text, the
|
|
155
|
+
// far end of the scale from every other type's pale tint.
|
|
146
156
|
&--offline {
|
|
147
157
|
--wr-alert-bg: var(--wr-color-on-surface);
|
|
148
158
|
--wr-alert-title: var(--wr-color-surface);
|
|
@@ -73,10 +73,12 @@
|
|
|
73
73
|
// the host's font. Shrinking only the wrapper's text sat the letters on the
|
|
74
74
|
// baseline of the bigger strut, about 4px below centre in a 16px circle.
|
|
75
75
|
//
|
|
76
|
-
// Only while something is projected,
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
//
|
|
76
|
+
// Only while something is projected, which is when there is text to size.
|
|
77
|
+
// The one thing an empty avatar draws is the loading spinner, and the cap
|
|
78
|
+
// cannot reach it either way: it is 40% of the box rather than `em` (the
|
|
79
|
+
// `__spin` rule below), and it is hidden whenever something is projected. A
|
|
80
|
+
// size the host did not publish leaves the `var()` unresolved, and the
|
|
81
|
+
// declaration falls back to inheriting.
|
|
80
82
|
//
|
|
81
83
|
// `:where()` around the WHOLE selector leaves it no specificity, so any
|
|
82
84
|
// unlayered `font-size` rule a consumer writes for the avatar — a type, class
|
|
@@ -128,10 +130,19 @@
|
|
|
128
130
|
transition: opacity var(--wr-transition-base);
|
|
129
131
|
}
|
|
130
132
|
|
|
131
|
-
|
|
133
|
+
// Doubled with `.wr-spinner` on purpose. A lone `.wr-avatar__spin` ties with
|
|
134
|
+
// the spinner's own `.wr-spinner { color: inherit; --wr-spinner-size: 1.25em }`,
|
|
135
|
+
// and the combined `@use 'ngwr'` sheet forwards the spinner after the avatar,
|
|
136
|
+
// so the spinner won both: measured, every avatar drew a 19px spinner in the
|
|
137
|
+
// inherited ink (17.85:1 light, 15.73:1 dark) — 59% of a 32px box and 20% of
|
|
138
|
+
// a 96px one — and the colour and size written here never painted once.
|
|
139
|
+
// Specificity, not order, so it holds for an app that `@use`s the two entry
|
|
140
|
+
// points in either order.
|
|
141
|
+
&__spin.wr-spinner {
|
|
132
142
|
position: absolute;
|
|
133
|
-
//
|
|
134
|
-
//
|
|
143
|
+
// A loading indicator is a status GRAPHIC, which 1.4.11 holds to 3:1: the
|
|
144
|
+
// muted role is 5.35:1 light and 7.64:1 dark on the surface it sits over.
|
|
145
|
+
// Not the faint tier, which is 2.43:1 in light.
|
|
135
146
|
color: var(--wr-color-on-surface-muted);
|
|
136
147
|
--wr-spinner-size: 40%;
|
|
137
148
|
}
|
package/badge/styles/_index.scss
CHANGED
|
@@ -72,6 +72,11 @@
|
|
|
72
72
|
|
|
73
73
|
// Colors
|
|
74
74
|
|
|
75
|
+
// color-ok: a badge's colour is decoration or category, never the state —
|
|
76
|
+
// the LABEL carries that. Six of the nine intents share one lightness
|
|
77
|
+
// (`success` against `danger` is 1.004:1), so a badge whose words do not name
|
|
78
|
+
// the state tells a reader without hue nothing, and no palette can fix that
|
|
79
|
+
// without giving up the white labels the intents were tuned for.
|
|
75
80
|
@each $name in theme.$colors {
|
|
76
81
|
&--#{$name} {
|
|
77
82
|
background-color: var(--wr-color-#{$name});
|
|
@@ -110,6 +115,8 @@
|
|
|
110
115
|
background-color: transparent;
|
|
111
116
|
box-shadow: inset 0 0 0 1px currentcolor;
|
|
112
117
|
|
|
118
|
+
// color-ok: the decision the filled loop above records — decoration or
|
|
119
|
+
// category, with the label carrying the state.
|
|
113
120
|
@each $name in theme.$colors {
|
|
114
121
|
&.wr-badge--#{$name} {
|
|
115
122
|
color: var(--wr-color-#{$name}-ink);
|
package/badge/styles/_tag.scss
CHANGED
|
@@ -68,6 +68,12 @@
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
// Colored variants
|
|
71
|
+
// color-ok: a tag's colour is decoration or category — the label carries the
|
|
72
|
+
// state (`Failed`, not a red `Build`), because six of the nine intents share
|
|
73
|
+
// one lightness and `success` against `danger` is 1.004:1. When a tag has to
|
|
74
|
+
// stand for a status on its own, its `icon` input is the channel. Nothing is
|
|
75
|
+
// drawn per intent by default: tags are categories too, and a check on
|
|
76
|
+
// `Standalone` would say something false.
|
|
71
77
|
@each $name in theme.$colors {
|
|
72
78
|
&--#{$name} {
|
|
73
79
|
--wr-tag-color: var(--wr-color-#{$name}-contrast);
|
|
@@ -100,7 +106,7 @@
|
|
|
100
106
|
// `--wr-color-outline`, which is already this component's default border.
|
|
101
107
|
// color-ok: every outlined tag already draws a border — this only gives the
|
|
102
108
|
// one intent that cannot tint one a literal colour. Telling two INTENTS
|
|
103
|
-
// apart
|
|
109
|
+
// apart is the label's job, as the marker above the loop says.
|
|
104
110
|
&--light.wr-tag--outlined {
|
|
105
111
|
--wr-tag-border: var(--wr-color-outline);
|
|
106
112
|
}
|
|
@@ -197,6 +197,10 @@
|
|
|
197
197
|
}
|
|
198
198
|
|
|
199
199
|
// Color variants
|
|
200
|
+
// color-ok: a button's intent is emphasis, not a state — the label names the
|
|
201
|
+
// action and the intent only ranks it against its neighbours. A destructive
|
|
202
|
+
// button says `Delete`; a red `OK` is the author's colour-only cue, and no
|
|
203
|
+
// rule here can supply the word.
|
|
200
204
|
@each $name in theme.$colors {
|
|
201
205
|
&--#{$name} {
|
|
202
206
|
--wr-btn-color: var(--wr-color-#{$name}-contrast);
|
|
@@ -271,6 +275,8 @@
|
|
|
271
275
|
// borders. On hover/focus the segment raises its own border (z-index above
|
|
272
276
|
// neighbours), which would otherwise double-paint that edge — so drop the
|
|
273
277
|
// seam there and let the raised border own it cleanly.
|
|
278
|
+
// color-ok: not an intent cue — the seam is the same 20% black hairline for
|
|
279
|
+
// all nine; the loop only picks WHICH segments are solid enough to need it.
|
|
274
280
|
@each $name in theme.$colors {
|
|
275
281
|
> .wr-btn--#{$name}:not(.wr-btn--outlined):not(:last-child) {
|
|
276
282
|
// `box-shadow` offsets are physical by spec — there is no logical form to
|