ngwr 14.3.1 → 14.5.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 +4 -4
- package/avatar/styles/_index.scss +4 -2
- package/badge/styles/_index.scss +4 -1
- package/badge/styles/_tag.scss +3 -0
- package/cascader/styles/_rules.scss +3 -0
- package/command-palette/styles/_index.scss +23 -0
- package/context-menu/styles/_index.scss +13 -1
- package/fesm2022/ngwr-action-sheet.mjs +3 -3
- package/fesm2022/ngwr-affix.mjs +17 -4
- package/fesm2022/ngwr-affix.mjs.map +1 -1
- package/fesm2022/ngwr-alert.mjs +4 -4
- package/fesm2022/ngwr-alert.mjs.map +1 -1
- package/fesm2022/ngwr-anchor.mjs +3 -3
- package/fesm2022/ngwr-aurora.mjs +3 -3
- package/fesm2022/ngwr-avatar.mjs +3 -3
- package/fesm2022/ngwr-back-top.mjs +3 -3
- package/fesm2022/ngwr-badge.mjs +6 -6
- package/fesm2022/ngwr-bar-chart-testing.mjs +18 -2
- package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-bar-chart.mjs +3 -3
- package/fesm2022/ngwr-blur-text.mjs +3 -3
- package/fesm2022/ngwr-border-glow.mjs +3 -3
- package/fesm2022/ngwr-breadcrumbs.mjs +7 -7
- package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
- package/fesm2022/ngwr-burger.mjs +3 -3
- package/fesm2022/ngwr-button.mjs +6 -6
- package/fesm2022/ngwr-calendar-heatmap-testing.mjs +12 -9
- package/fesm2022/ngwr-calendar-heatmap-testing.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-heatmap.mjs +35 -7
- package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
- package/fesm2022/ngwr-calendar.mjs +32 -4
- package/fesm2022/ngwr-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-card.mjs +9 -9
- package/fesm2022/ngwr-carousel.mjs +6 -6
- package/fesm2022/ngwr-cascader-testing.mjs +87 -17
- package/fesm2022/ngwr-cascader-testing.mjs.map +1 -1
- package/fesm2022/ngwr-cascader.mjs +76 -5
- package/fesm2022/ngwr-cascader.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox-testing.mjs +13 -2
- package/fesm2022/ngwr-checkbox-testing.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox.mjs +42 -7
- package/fesm2022/ngwr-checkbox.mjs.map +1 -1
- package/fesm2022/ngwr-circular-text.mjs +3 -3
- package/fesm2022/ngwr-click-spark.mjs +3 -3
- package/fesm2022/ngwr-clipboard.mjs +3 -3
- package/fesm2022/ngwr-collapse.mjs +9 -9
- package/fesm2022/ngwr-color-picker.mjs +24 -8
- package/fesm2022/ngwr-color-picker.mjs.map +1 -1
- package/fesm2022/ngwr-command-palette.mjs +16 -3
- package/fesm2022/ngwr-command-palette.mjs.map +1 -1
- package/fesm2022/ngwr-compare.mjs +3 -3
- package/fesm2022/ngwr-confetti.mjs +3 -3
- package/fesm2022/ngwr-context-menu.mjs +47 -15
- package/fesm2022/ngwr-context-menu.mjs.map +1 -1
- package/fesm2022/ngwr-cookie.mjs +3 -3
- package/fesm2022/ngwr-counter.mjs +6 -6
- package/fesm2022/ngwr-date-adapters-fns.mjs +3 -3
- package/fesm2022/ngwr-date-adapters-luxon.mjs +3 -3
- package/fesm2022/ngwr-date-picker.mjs +111 -28
- package/fesm2022/ngwr-date-picker.mjs.map +1 -1
- package/fesm2022/ngwr-date.mjs +3 -3
- package/fesm2022/ngwr-decrypt-text.mjs +3 -3
- package/fesm2022/ngwr-density.mjs +6 -6
- package/fesm2022/ngwr-descriptions.mjs +6 -6
- package/fesm2022/ngwr-dialog.mjs +27 -16
- package/fesm2022/ngwr-dialog.mjs.map +1 -1
- package/fesm2022/ngwr-directives.mjs +12 -12
- package/fesm2022/ngwr-divider.mjs +3 -3
- package/fesm2022/ngwr-donut-chart-testing.mjs +18 -2
- package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-donut-chart.mjs +4 -4
- package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
- package/fesm2022/ngwr-drag-drop.mjs +7 -7
- package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
- package/fesm2022/ngwr-drawer.mjs +66 -20
- package/fesm2022/ngwr-drawer.mjs.map +1 -1
- package/fesm2022/ngwr-dropdown.mjs +54 -16
- package/fesm2022/ngwr-dropdown.mjs.map +1 -1
- package/fesm2022/ngwr-empty.mjs +3 -3
- package/fesm2022/ngwr-event-calendar.mjs +6 -6
- package/fesm2022/ngwr-falling-text.mjs +3 -3
- package/fesm2022/ngwr-file-upload.mjs +18 -5
- package/fesm2022/ngwr-file-upload.mjs.map +1 -1
- package/fesm2022/ngwr-form.mjs +66 -14
- package/fesm2022/ngwr-form.mjs.map +1 -1
- package/fesm2022/ngwr-fuzzy-text.mjs +3 -3
- package/fesm2022/ngwr-gauge-testing.mjs +16 -2
- package/fesm2022/ngwr-gauge-testing.mjs.map +1 -1
- package/fesm2022/ngwr-gauge.mjs +3 -3
- package/fesm2022/ngwr-glitch-text.mjs +3 -3
- package/fesm2022/ngwr-gradient-text.mjs +3 -3
- package/fesm2022/ngwr-graph-testing.mjs +243 -0
- package/fesm2022/ngwr-graph-testing.mjs.map +1 -0
- package/fesm2022/ngwr-graph.mjs +1112 -0
- package/fesm2022/ngwr-graph.mjs.map +1 -0
- package/fesm2022/ngwr-hotkey.mjs +6 -6
- package/fesm2022/ngwr-i18n-ar.mjs +7 -0
- package/fesm2022/ngwr-i18n-ar.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-cs.mjs +7 -0
- package/fesm2022/ngwr-i18n-cs.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-de.mjs +7 -0
- package/fesm2022/ngwr-i18n-de.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-en.mjs +23 -2
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-es.mjs +7 -0
- package/fesm2022/ngwr-i18n-es.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-fr.mjs +7 -0
- package/fesm2022/ngwr-i18n-fr.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-he.mjs +7 -0
- package/fesm2022/ngwr-i18n-he.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-hi.mjs +7 -0
- package/fesm2022/ngwr-i18n-hi.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-id.mjs +7 -0
- package/fesm2022/ngwr-i18n-id.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-it.mjs +7 -0
- package/fesm2022/ngwr-i18n-it.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ja.mjs +7 -0
- package/fesm2022/ngwr-i18n-ja.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ko.mjs +7 -0
- package/fesm2022/ngwr-i18n-ko.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-nl.mjs +7 -0
- package/fesm2022/ngwr-i18n-nl.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-pl.mjs +7 -0
- package/fesm2022/ngwr-i18n-pl.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-pt.mjs +7 -0
- package/fesm2022/ngwr-i18n-pt.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ru.mjs +7 -0
- package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-sv.mjs +7 -0
- package/fesm2022/ngwr-i18n-sv.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-tr.mjs +7 -0
- package/fesm2022/ngwr-i18n-tr.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-uk.mjs +7 -0
- package/fesm2022/ngwr-i18n-uk.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-vi.mjs +7 -0
- package/fesm2022/ngwr-i18n-vi.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-zh-TW.mjs +7 -0
- package/fesm2022/ngwr-i18n-zh-TW.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-zh.mjs +7 -0
- package/fesm2022/ngwr-i18n-zh.mjs.map +1 -1
- package/fesm2022/ngwr-i18n.mjs +9 -9
- package/fesm2022/ngwr-icon.mjs +6 -6
- package/fesm2022/ngwr-image-cropper.mjs +3 -3
- package/fesm2022/ngwr-input-number.mjs +15 -6
- package/fesm2022/ngwr-input-number.mjs.map +1 -1
- package/fesm2022/ngwr-input-otp.mjs +38 -6
- package/fesm2022/ngwr-input-otp.mjs.map +1 -1
- package/fesm2022/ngwr-input.mjs +15 -15
- package/fesm2022/ngwr-keyboard.mjs +3 -3
- package/fesm2022/ngwr-knob-testing.mjs +11 -3
- package/fesm2022/ngwr-knob-testing.mjs.map +1 -1
- package/fesm2022/ngwr-knob.mjs +19 -4
- package/fesm2022/ngwr-knob.mjs.map +1 -1
- package/fesm2022/ngwr-layout.mjs +15 -15
- package/fesm2022/ngwr-lightbox.mjs +27 -6
- package/fesm2022/ngwr-lightbox.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart-testing.mjs +18 -2
- package/fesm2022/ngwr-line-chart-testing.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart.mjs +22 -4
- package/fesm2022/ngwr-line-chart.mjs.map +1 -1
- package/fesm2022/ngwr-list.mjs +7 -7
- package/fesm2022/ngwr-list.mjs.map +1 -1
- package/fesm2022/ngwr-loading-bar.mjs +6 -6
- package/fesm2022/ngwr-markdown.mjs +6 -6
- package/fesm2022/ngwr-marquee.mjs +3 -3
- package/fesm2022/ngwr-media.mjs +3 -3
- package/fesm2022/ngwr-mention.mjs +24 -8
- package/fesm2022/ngwr-mention.mjs.map +1 -1
- package/fesm2022/ngwr-meta.mjs +6 -6
- package/fesm2022/ngwr-meter-group.mjs +3 -3
- package/fesm2022/ngwr-overlay.mjs +125 -10
- package/fesm2022/ngwr-overlay.mjs.map +1 -1
- package/fesm2022/ngwr-page-header.mjs +3 -3
- package/fesm2022/ngwr-pagination.mjs +33 -6
- package/fesm2022/ngwr-pagination.mjs.map +1 -1
- package/fesm2022/ngwr-pipes.mjs +21 -21
- package/fesm2022/ngwr-platform.mjs +9 -9
- package/fesm2022/ngwr-popconfirm.mjs +25 -9
- package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
- package/fesm2022/ngwr-popover-testing.mjs +22 -5
- package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
- package/fesm2022/ngwr-popover.mjs +243 -37
- package/fesm2022/ngwr-popover.mjs.map +1 -1
- package/fesm2022/ngwr-progress.mjs +3 -3
- package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
- package/fesm2022/ngwr-qr.mjs +3 -3
- package/fesm2022/ngwr-radio.mjs +6 -6
- package/fesm2022/ngwr-rating-testing.mjs +12 -3
- package/fesm2022/ngwr-rating-testing.mjs.map +1 -1
- package/fesm2022/ngwr-rating.mjs +19 -4
- package/fesm2022/ngwr-rating.mjs.map +1 -1
- package/fesm2022/ngwr-result.mjs +13 -13
- package/fesm2022/ngwr-result.mjs.map +1 -1
- package/fesm2022/ngwr-rotating-text.mjs +3 -3
- package/fesm2022/ngwr-schema-form.mjs +3 -3
- package/fesm2022/ngwr-scroll.mjs +3 -3
- package/fesm2022/ngwr-segmented.mjs +37 -4
- package/fesm2022/ngwr-segmented.mjs.map +1 -1
- package/fesm2022/ngwr-select.mjs +24 -10
- package/fesm2022/ngwr-select.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text.mjs +6 -6
- package/fesm2022/ngwr-sidebar.mjs +3 -3
- package/fesm2022/ngwr-skeleton.mjs +3 -3
- package/fesm2022/ngwr-slider.mjs +18 -5
- package/fesm2022/ngwr-slider.mjs.map +1 -1
- package/fesm2022/ngwr-sparkline.mjs +3 -3
- package/fesm2022/ngwr-speed-dial.mjs +3 -3
- package/fesm2022/ngwr-spinner.mjs +3 -3
- package/fesm2022/ngwr-splash-cursor.mjs +3 -3
- package/fesm2022/ngwr-split-text.mjs +3 -3
- package/fesm2022/ngwr-splitter.mjs +3 -3
- package/fesm2022/ngwr-spotlight-card.mjs +6 -6
- package/fesm2022/ngwr-squircle.mjs +28 -9
- package/fesm2022/ngwr-squircle.mjs.map +1 -1
- package/fesm2022/ngwr-star-border.mjs +3 -3
- package/fesm2022/ngwr-statistic.mjs +20 -13
- package/fesm2022/ngwr-statistic.mjs.map +1 -1
- package/fesm2022/ngwr-stepper.mjs +6 -6
- package/fesm2022/ngwr-storage.mjs +3 -3
- package/fesm2022/ngwr-switch.mjs +3 -3
- package/fesm2022/ngwr-table.mjs +18 -18
- package/fesm2022/ngwr-tabs-router.mjs +3 -3
- package/fesm2022/ngwr-tabs.mjs +6 -6
- package/fesm2022/ngwr-textarea.mjs +3 -3
- package/fesm2022/ngwr-theme.mjs +3 -3
- package/fesm2022/ngwr-tilt-card.mjs +6 -6
- package/fesm2022/ngwr-timeline.mjs +6 -6
- package/fesm2022/ngwr-toast.mjs +29 -12
- package/fesm2022/ngwr-toast.mjs.map +1 -1
- package/fesm2022/ngwr-toolbar.mjs +3 -3
- package/fesm2022/ngwr-tour.mjs +26 -12
- package/fesm2022/ngwr-tour.mjs.map +1 -1
- package/fesm2022/ngwr-transfer.mjs +88 -11
- package/fesm2022/ngwr-transfer.mjs.map +1 -1
- package/fesm2022/ngwr-tree-testing.mjs +24 -0
- package/fesm2022/ngwr-tree-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tree.mjs +81 -9
- package/fesm2022/ngwr-tree.mjs.map +1 -1
- package/fesm2022/ngwr-typewriter.mjs +3 -3
- package/fesm2022/ngwr-typography.mjs +3 -3
- 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-waves.mjs +3 -3
- package/fesm2022/ngwr-window.mjs +30 -13
- package/fesm2022/ngwr-window.mjs.map +1 -1
- package/form/styles/_index.scss +63 -0
- package/graph/styles/_index.scss +113 -0
- package/i18n/ar.json +9 -2
- package/i18n/cs.json +9 -2
- package/i18n/de.json +9 -2
- package/i18n/en.json +11 -4
- package/i18n/es.json +9 -2
- package/i18n/fr.json +9 -2
- package/i18n/he.json +9 -2
- package/i18n/hi.json +9 -2
- package/i18n/id.json +9 -2
- package/i18n/it.json +9 -2
- package/i18n/ja.json +9 -2
- package/i18n/ko.json +9 -2
- package/i18n/nl.json +9 -2
- package/i18n/pl.json +9 -2
- package/i18n/pt.json +9 -2
- package/i18n/ru.json +9 -2
- package/i18n/sv.json +9 -2
- package/i18n/tr.json +9 -2
- package/i18n/uk.json +9 -2
- package/i18n/vi.json +9 -2
- package/i18n/zh-TW.json +9 -2
- package/i18n/zh.json +9 -2
- package/input-otp/styles/_index.scss +5 -1
- package/line-chart/styles/_index.scss +5 -3
- package/llms-full.txt +13 -3
- package/llms.txt +8 -6
- package/markdown/styles/_index.scss +4 -1
- package/mention/styles/_index.scss +22 -1
- package/package.json +10 -1
- package/radio/styles/_index.scss +3 -0
- package/result/styles/_index.scss +12 -0
- package/schematics/migrations/v14/index.js +6 -3
- package/schematics/migrations.json +1 -1
- package/schematics/ng-add/index.js +34 -5
- package/schematics/use/symbol-map.json +2 -0
- package/segmented/styles/_index.scss +12 -1
- package/select/styles/_index.scss +20 -1
- package/skills/ngwr/SKILL.md +1 -1
- package/skills/ngwr/references/catalog.md +2 -0
- package/statistic/styles/_index.scss +4 -0
- package/stepper/styles/_index.scss +36 -0
- package/styles.scss +1 -0
- package/switch/styles/_index.scss +3 -0
- package/table/styles/_index.scss +12 -0
- package/tabs/styles/_index.scss +4 -1
- package/textarea/styles/_index.scss +6 -1
- package/theme/styles/_colors.scss +11 -0
- package/theme/styles/_contrast.scss +136 -0
- package/theme/styles/_focus.scss +7 -0
- package/theme/styles/_index.scss +1 -0
- package/theme/styles/_mixins.scss +15 -8
- package/timeline/styles/_index.scss +28 -1
- package/toast/styles/_index.scss +11 -0
- package/tree/styles/_index.scss +27 -1
- package/types/ngwr-badge.d.ts +1 -1
- package/types/ngwr-bar-chart-testing.d.ts +11 -1
- package/types/ngwr-button.d.ts +1 -1
- package/types/ngwr-calendar-heatmap-testing.d.ts +10 -5
- package/types/ngwr-calendar-heatmap.d.ts +22 -0
- package/types/ngwr-calendar.d.ts +21 -0
- package/types/ngwr-cascader-testing.d.ts +74 -17
- package/types/ngwr-cascader.d.ts +35 -0
- package/types/ngwr-checkbox-testing.d.ts +12 -1
- package/types/ngwr-checkbox.d.ts +10 -0
- package/types/ngwr-clipboard.d.ts +1 -1
- package/types/ngwr-color-picker.d.ts +8 -0
- package/types/ngwr-confetti.d.ts +1 -1
- package/types/ngwr-context-menu.d.ts +10 -0
- package/types/ngwr-cookie.d.ts +1 -1
- package/types/ngwr-date-adapters-fns.d.ts +1 -1
- package/types/ngwr-date-adapters-luxon.d.ts +1 -1
- package/types/ngwr-date-picker.d.ts +16 -0
- package/types/ngwr-date.d.ts +9 -3
- package/types/ngwr-density.d.ts +1 -1
- package/types/ngwr-dialog.d.ts +2 -1
- package/types/ngwr-donut-chart-testing.d.ts +11 -1
- package/types/ngwr-drawer.d.ts +29 -1
- package/types/ngwr-dropdown.d.ts +25 -0
- package/types/ngwr-file-upload.d.ts +11 -0
- package/types/ngwr-form.d.ts +25 -0
- package/types/ngwr-gauge-testing.d.ts +9 -1
- package/types/ngwr-graph-testing.d.ts +190 -0
- package/types/ngwr-graph.d.ts +203 -0
- package/types/ngwr-hotkey.d.ts +1 -1
- package/types/ngwr-i18n.d.ts +1 -1
- package/types/ngwr-input-number.d.ts +12 -2
- package/types/ngwr-input-otp.d.ts +12 -0
- package/types/ngwr-knob-testing.d.ts +11 -3
- package/types/ngwr-knob.d.ts +13 -0
- package/types/ngwr-lightbox.d.ts +15 -0
- package/types/ngwr-line-chart-testing.d.ts +11 -1
- package/types/ngwr-line-chart.d.ts +18 -0
- package/types/ngwr-loading-bar.d.ts +1 -1
- package/types/ngwr-markdown.d.ts +1 -1
- package/types/ngwr-media.d.ts +1 -1
- package/types/ngwr-mention.d.ts +7 -0
- package/types/ngwr-meta.d.ts +1 -1
- package/types/ngwr-overlay.d.ts +64 -6
- package/types/ngwr-pagination.d.ts +16 -0
- package/types/ngwr-platform.d.ts +3 -3
- package/types/ngwr-popconfirm.d.ts +1 -0
- package/types/ngwr-popover-testing.d.ts +22 -5
- package/types/ngwr-popover.d.ts +44 -8
- package/types/ngwr-rating-testing.d.ts +12 -3
- package/types/ngwr-rating.d.ts +13 -0
- package/types/ngwr-scroll.d.ts +1 -1
- package/types/ngwr-segmented.d.ts +16 -0
- package/types/ngwr-select.d.ts +7 -0
- package/types/ngwr-squircle.d.ts +22 -3
- package/types/ngwr-statistic.d.ts +0 -1
- package/types/ngwr-storage.d.ts +1 -1
- package/types/ngwr-theme.d.ts +1 -1
- package/types/ngwr-toast.d.ts +3 -1
- package/types/ngwr-tour.d.ts +7 -1
- package/types/ngwr-transfer.d.ts +52 -0
- package/types/ngwr-tree-testing.d.ts +20 -0
- package/types/ngwr-tree.d.ts +43 -1
- package/types/ngwr-version.d.ts +1 -1
- package/types/ngwr-window.d.ts +2 -1
- package/typography/styles/_index.scss +26 -4
|
@@ -100,6 +100,9 @@
|
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
+
// color-ok: opening attaches the panel and flips the chevron 180deg, so the
|
|
104
|
+
// state is a thing appearing and a glyph rotating; this only tints the edge
|
|
105
|
+
// underneath both.
|
|
103
106
|
&--open &__trigger {
|
|
104
107
|
border-color: var(--wr-color-primary);
|
|
105
108
|
box-shadow: 0 0 0 3px rgba(var(--wr-color-primary-rgb), 0.15);
|
|
@@ -454,12 +457,28 @@
|
|
|
454
457
|
overflow: hidden;
|
|
455
458
|
white-space: nowrap;
|
|
456
459
|
text-overflow: ellipsis;
|
|
460
|
+
// Positioning context for the `--active` cursor bar below.
|
|
461
|
+
position: relative;
|
|
457
462
|
}
|
|
458
463
|
|
|
459
464
|
// Keyboard cursor highlight — the virtualized list is navigated by
|
|
460
|
-
// aria-activedescendant, so the
|
|
465
|
+
// aria-activedescendant, so real focus never lands on the row and the tint
|
|
466
|
+
// is all there was. `--wr-color-hover` is translucent and lands within about
|
|
467
|
+
// 1.1:1 of the panel behind it, which is the same grey to a reader who
|
|
468
|
+
// cannot separate hue — and it is the declaration `:hover` uses, so the row
|
|
469
|
+
// the arrows reached and a row under the mouse were indistinguishable. The
|
|
470
|
+
// bar is the channel; the tint stays as reinforcement.
|
|
461
471
|
.wr-option--active {
|
|
462
472
|
background: var(--wr-color-hover);
|
|
473
|
+
|
|
474
|
+
&::before {
|
|
475
|
+
content: '';
|
|
476
|
+
position: absolute;
|
|
477
|
+
inset-block: 0;
|
|
478
|
+
inset-inline-start: 0;
|
|
479
|
+
width: 2px;
|
|
480
|
+
background: var(--wr-color-primary);
|
|
481
|
+
}
|
|
463
482
|
}
|
|
464
483
|
}
|
|
465
484
|
|
package/skills/ngwr/SKILL.md
CHANGED
|
@@ -5,7 +5,7 @@ description: Build Angular UIs with the ngwr component library (standalone, sign
|
|
|
5
5
|
|
|
6
6
|
# ngwr
|
|
7
7
|
|
|
8
|
-
An Angular 22 UI library:
|
|
8
|
+
An Angular 22 UI library: 227 tree-shakable entry points, 113 of them shipping a selector.
|
|
9
9
|
Standalone, signals-first, zoneless, `ViewEncapsulation.None`. One runtime
|
|
10
10
|
dependency (`tslib`).
|
|
11
11
|
|
|
@@ -89,6 +89,8 @@ root barrel for components.
|
|
|
89
89
|
| `ngwr/glitch-text/testing` | `import { WrGlitchTextHarness } from 'ngwr/glitch-text/testing'` | — |
|
|
90
90
|
| `ngwr/gradient-text` | `import { WrGradientText } from 'ngwr/gradient-text'` | `wr-gradient-text` |
|
|
91
91
|
| `ngwr/gradient-text/testing` | `import { WrGradientTextHarness } from 'ngwr/gradient-text/testing'` | — |
|
|
92
|
+
| `ngwr/graph` | `import { WrGraph } from 'ngwr/graph'` | `ng-template[wrGraphNode]` `wr-graph` |
|
|
93
|
+
| `ngwr/graph/testing` | `import { WrGraphHarness } from 'ngwr/graph/testing'` | — |
|
|
92
94
|
| `ngwr/hotkey` | `import { WrHotkey } from 'ngwr/hotkey'` | `[wrHotkey]` |
|
|
93
95
|
| `ngwr/i18n` | `import { WrI18n } from 'ngwr/i18n'` | `[wrT]` |
|
|
94
96
|
| `ngwr/i18n/ar` | `import { wrAr } from 'ngwr/i18n/ar'` | — |
|
|
@@ -39,10 +39,14 @@
|
|
|
39
39
|
font-weight: var(--wr-font-weight-semibold);
|
|
40
40
|
font-variant-numeric: tabular-nums;
|
|
41
41
|
|
|
42
|
+
// color-ok: direction is DRAWN — statistic.html gives up and down two
|
|
43
|
+
// different triangle paths (apex up `M5 1 L9 8 L1 8 Z`, apex down
|
|
44
|
+
// `M5 9 L9 2 L1 2 Z`), and the value reads +12.4% against -0.4%.
|
|
42
45
|
&--up {
|
|
43
46
|
color: var(--wr-color-success-ink);
|
|
44
47
|
}
|
|
45
48
|
|
|
49
|
+
// color-ok: see `--up` above — the two triangles point opposite ways.
|
|
46
50
|
&--down {
|
|
47
51
|
color: var(--wr-color-danger-ink);
|
|
48
52
|
}
|
|
@@ -136,12 +136,43 @@ $header-padding-block: 0.25rem;
|
|
|
136
136
|
color var(--wr-transition-base);
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
+
// The current step is the one state here with no glyph of its own: completed
|
|
140
|
+
// swaps the numeral for a tick, pending and unreachable keep the numeral, and
|
|
141
|
+
// active kept the numeral too — so it was a tinted circle beside a white one,
|
|
142
|
+
// 1.17:1, which is the same circle to a reader who cannot separate hue. The
|
|
143
|
+
// ring DOUBLES against the base rule's 1.5px, which is a weight rather than a
|
|
144
|
+
// colour and survives both greyscale and forced-colors.
|
|
139
145
|
&__header--active &__indicator {
|
|
146
|
+
border-width: 3px;
|
|
140
147
|
border-color: var(--wr-color-primary);
|
|
141
148
|
color: var(--wr-color-primary-ink);
|
|
142
149
|
background: var(--wr-color-primary-soft);
|
|
143
150
|
}
|
|
144
151
|
|
|
152
|
+
// A step `linear` has not opened yet renders a DISABLED button that looked
|
|
153
|
+
// exactly like an available one. `--reachable` was bound in the template,
|
|
154
|
+
// asserted by a spec and read by the harness, and styled by nothing at all,
|
|
155
|
+
// so the only cue was `cursor: not-allowed` — which needs a pointer, and a
|
|
156
|
+
// touch device has none.
|
|
157
|
+
//
|
|
158
|
+
// The cue is the border STYLE, deliberately: `linear` refuses rather than
|
|
159
|
+
// greys, so dimming would contradict the contract, and a tint would be
|
|
160
|
+
// invisible to a reader who cannot separate hue.
|
|
161
|
+
//
|
|
162
|
+
// `--completed` is excluded because a completed circle is FILLED with
|
|
163
|
+
// `--wr-color-primary` and rings itself in the same colour, so dashes there
|
|
164
|
+
// would be dashes against their own fill — invisible, and pointless besides,
|
|
165
|
+
// since a step already carrying a tick does not need to be told it is shut.
|
|
166
|
+
// The rule does cover a step its own `disabled` input closed, in a stepper
|
|
167
|
+
// that is not `linear` at all: `isReachable` fails on `disabled` first
|
|
168
|
+
// (stepper.ts:126), and "you cannot go here" is the same news either way.
|
|
169
|
+
&__header:not(.wr-stepper__header--reachable):not(.wr-stepper__header--completed) &__indicator {
|
|
170
|
+
border-style: dashed;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// color-ok: a completed step swaps its numeral for a TICK (stepper.html:19),
|
|
174
|
+
// so the glyph already differs from every other state; this only fills the
|
|
175
|
+
// disc behind it.
|
|
145
176
|
&__header--completed &__indicator {
|
|
146
177
|
background: var(--wr-color-primary);
|
|
147
178
|
border-color: var(--wr-color-primary);
|
|
@@ -173,6 +204,8 @@ $header-padding-block: 0.25rem;
|
|
|
173
204
|
margin-block-start: calc((var(--wr-stepper-indicator-size) - #{$label-line-height}) / 2);
|
|
174
205
|
}
|
|
175
206
|
|
|
207
|
+
// color-ok: the label follows the indicator beside it, which carries the
|
|
208
|
+
// state in its doubled ring — this is the same news, re-inked.
|
|
176
209
|
&__header--active &__label {
|
|
177
210
|
color: var(--wr-color-primary-ink);
|
|
178
211
|
}
|
|
@@ -225,6 +258,9 @@ $header-padding-block: 0.25rem;
|
|
|
225
258
|
flex: 0 0 auto;
|
|
226
259
|
}
|
|
227
260
|
|
|
261
|
+
// color-ok: filled against unfilled is 3.29:1 in LIGHTNESS — primary #3969e2
|
|
262
|
+
// against the connector's default `--wr-color-outline` #cbd5e1 — so the trail
|
|
263
|
+
// of finished steps reads as a darker line, not merely a bluer one.
|
|
228
264
|
&__header--completed + &__header &__connector,
|
|
229
265
|
&__header--completed &__connector {
|
|
230
266
|
background: var(--wr-color-primary);
|
package/styles.scss
CHANGED
|
@@ -84,6 +84,9 @@
|
|
|
84
84
|
--wr-switch-line-height: var(--wr-control-line-height-lg);
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
// color-ok: the knob TRAVELS — the nested `.wr-switch__thumb` rule moves
|
|
88
|
+
// `inset-inline-start` from one end of the track to the other. Position is
|
|
89
|
+
// the channel; the track colour follows it.
|
|
87
90
|
&--checked {
|
|
88
91
|
--wr-switch-bg: var(--wr-switch-bg-checked);
|
|
89
92
|
|
package/table/styles/_index.scss
CHANGED
|
@@ -213,6 +213,9 @@
|
|
|
213
213
|
vertical-align: middle;
|
|
214
214
|
}
|
|
215
215
|
|
|
216
|
+
// color-ok: the tick is the channel — a selected row's own `__td--select`
|
|
217
|
+
// cell holds a `<wr-checkbox>` bound to the same predicate as this class,
|
|
218
|
+
// and its mark appears. The tint is the reinforcement, not the signal.
|
|
216
219
|
&__tr--selected,
|
|
217
220
|
&__tr--selected:hover {
|
|
218
221
|
background: var(--wr-color-primary-soft);
|
|
@@ -220,6 +223,9 @@
|
|
|
220
223
|
|
|
221
224
|
// Pinned cells paint their own opaque background, so re-apply the selection
|
|
222
225
|
// tint over it (same technique as the row-hover rule above).
|
|
226
|
+
// color-ok: the pinned cells repaint the row tint they sit in, and the row
|
|
227
|
+
// itself is marked by the selection checkbox in its `__td--select` cell —
|
|
228
|
+
// these follow that, they do not carry the state.
|
|
223
229
|
&__tr--selected &__td--pin-left,
|
|
224
230
|
&__tr--selected &__td--pin-right,
|
|
225
231
|
&__tr--selected:hover &__td--pin-left,
|
|
@@ -758,6 +764,9 @@
|
|
|
758
764
|
display: inline-flex;
|
|
759
765
|
color: var(--wr-color-on-surface-muted);
|
|
760
766
|
|
|
767
|
+
// color-ok: the same `selectedCount() > 0` renders the `__count` numeral
|
|
768
|
+
// pill beside the funnel (table-filter.html:17) — a number appears where
|
|
769
|
+
// there was none.
|
|
761
770
|
&--active {
|
|
762
771
|
color: var(--wr-color-primary);
|
|
763
772
|
}
|
|
@@ -850,6 +859,9 @@
|
|
|
850
859
|
transition: var(--wr-transition-base);
|
|
851
860
|
}
|
|
852
861
|
|
|
862
|
+
// color-ok: the tick APPEARS. The base `&__check` holds the same SVG at
|
|
863
|
+
// `color: transparent` (line 851), so this is a glyph arriving rather than
|
|
864
|
+
// a hue swapped.
|
|
853
865
|
&__item--selected &__check {
|
|
854
866
|
background: var(--wr-color-primary);
|
|
855
867
|
border-color: var(--wr-color-primary);
|
package/tabs/styles/_index.scss
CHANGED
|
@@ -106,7 +106,10 @@
|
|
|
106
106
|
color: var(--wr-tabs-color-hover);
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
// color-ok: the base tab already reserves `border-bottom: 2px solid
|
|
110
|
+
// transparent` (line 98), so colouring it paints an underline that no
|
|
111
|
+
// inactive tab carries — a mark appearing, not a hue swapped.
|
|
112
|
+
&--active {
|
|
110
113
|
color: var(--wr-tabs-color-active);
|
|
111
114
|
border-bottom-color: var(--wr-tabs-indicator);
|
|
112
115
|
}
|
|
@@ -103,7 +103,12 @@
|
|
|
103
103
|
inset-inline-end: 0.25rem;
|
|
104
104
|
bottom: 0.25rem;
|
|
105
105
|
display: inline-flex;
|
|
106
|
-
|
|
106
|
+
// NOT `--wr-color-text-faint`, which is where this sat and measured 2.43:1
|
|
107
|
+
// in light. A resize grip is an interactive affordance, so WCAG 1.4.11 asks
|
|
108
|
+
// 3:1 of it — the faint tier is documented as "decorative by design", and
|
|
109
|
+
// this is not decorative. The full-strength role is 5.35:1 light and 7.64:1
|
|
110
|
+
// dark. No gate reports this: axe ships no non-text-contrast rule.
|
|
111
|
+
color: var(--wr-color-on-surface-muted);
|
|
107
112
|
touch-action: none;
|
|
108
113
|
transition: color var(--wr-transition-base);
|
|
109
114
|
|
|
@@ -221,6 +221,17 @@ $contrast-light: #ffffff !default;
|
|
|
221
221
|
// most softening that still clears it (4.81), which leaves this token barely
|
|
222
222
|
// distinguishable from the flat role it wraps.
|
|
223
223
|
--wr-color-text-muted: rgba(var(--wr-color-muted-text-rgb), 0.95);
|
|
224
|
+
// unused-ok: the library paints with nothing at this strength any more, and
|
|
225
|
+
// that is the finding rather than an oversight. It had exactly three
|
|
226
|
+
// consumers — the OTP placeholder, the textarea resize grip and the avatar
|
|
227
|
+
// spinner — and all three were FAILING: 2.43:1 in light, against 4.5:1 for
|
|
228
|
+
// placeholder text and 3:1 for an interactive affordance and a status
|
|
229
|
+
// indicator. "Decorative by design" was true of the token and not of any of
|
|
230
|
+
// the three, so they moved to `-text-muted` and `-on-surface-muted`. The tier
|
|
231
|
+
// stays published because a custom property is public API and a consumer may
|
|
232
|
+
// have genuinely decorative text; the library, it turns out, has none. Note
|
|
233
|
+
// that no gate reports the shortfall: axe has no non-text-contrast rule, and
|
|
234
|
+
// `check:contrast` gates on route counts.
|
|
224
235
|
--wr-color-text-faint: rgba(var(--wr-color-muted-text-rgb), 0.6);
|
|
225
236
|
|
|
226
237
|
// Semantic role aliases over the flipping neutrals — prefer these in new code
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// `prefers-contrast: more` for the whole token layer.
|
|
2
|
+
//
|
|
3
|
+
// Why this lives in one file, next to `_motion.scss` and for the same reason:
|
|
4
|
+
// the thing being answered is a request the USER made of the operating system,
|
|
5
|
+
// about the page as a whole, and a component cannot answer it on its own. Every
|
|
6
|
+
// declaration below is a token, so a component that reads the tokens — which is
|
|
7
|
+
// all of them — comes along without being edited.
|
|
8
|
+
//
|
|
9
|
+
// What "more contrast" is being read to mean here, since the media query says
|
|
10
|
+
// nothing about how much: **AAA where the role is text (7:1), and the WCAG
|
|
11
|
+
// 1.4.11 bar where the role is a boundary (3:1)**. Those are the two numbers
|
|
12
|
+
// the default palette deliberately does not meet, each for a recorded reason.
|
|
13
|
+
//
|
|
14
|
+
// THE DE-EMPHASIS TIER IS WHAT HIGH CONTRAST SPENDS. `--wr-color-text-faint`
|
|
15
|
+
// and `--wr-color-text-muted` are the muted ink at 0.6 and 0.95 alpha, and
|
|
16
|
+
// under this query both go to 1.0 and collapse onto the deepened role. That is
|
|
17
|
+
// not a shortcut: 7:1 is UNREACHABLE at any alpha in the light theme, because
|
|
18
|
+
// the base itself only reaches 5.35:1 — the alpha is not the lever, the base
|
|
19
|
+
// is. Keeping a visibly fainter tier at 7:1 would need a base of `#353c46`,
|
|
20
|
+
// which measures 11.13:1 on its own and is no longer a muted role at all. A
|
|
21
|
+
// reader who asked for more contrast is asking for the tiers to close up.
|
|
22
|
+
//
|
|
23
|
+
// A LIVE DEFECT THIS EXPOSED, and it is not fixed here. At the default 0.6,
|
|
24
|
+
// `text-faint` measures **2.43:1** in light and 3.46:1 in dark, and its three
|
|
25
|
+
// consumers are an `input-otp` `::placeholder` (text, 1.4.3) plus the textarea
|
|
26
|
+
// resize grip and the avatar spinner (graphics, 1.4.11 → 3:1). All three fail
|
|
27
|
+
// today, in the DEFAULT theme, where `_colors.scss` calls them "decorative by
|
|
28
|
+
// design" — a resize affordance and a loading indicator are not decorative.
|
|
29
|
+
// High contrast repairs them incidentally; the default still needs a decision.
|
|
30
|
+
//
|
|
31
|
+
// TWO BLOCKS, NOT ONE, and this is the part that would silently half-work. A
|
|
32
|
+
// `@media { :root { … } }` resolves its `var()` references against the element
|
|
33
|
+
// it declares on, so a single `:root` block freezes LIGHT values into any
|
|
34
|
+
// subtree-scoped `[data-theme='dark']`. The dark half has to be declared on the
|
|
35
|
+
// dark selector itself.
|
|
36
|
+
//
|
|
37
|
+
// Every figure in the comments below is WCAG relative-luminance arithmetic on
|
|
38
|
+
// solid colours, which reproduces what axe measures. Figures involving an alpha
|
|
39
|
+
// composite are marked as such — those carry ±0.05 and the browser is the
|
|
40
|
+
// authority. `pnpm check:contrast --contrast=more` is that authority.
|
|
41
|
+
|
|
42
|
+
@use 'sass:map';
|
|
43
|
+
@use 'colors';
|
|
44
|
+
@use 'dark';
|
|
45
|
+
|
|
46
|
+
/// The `-ink` shares under high contrast.
|
|
47
|
+
///
|
|
48
|
+
/// `-ink` is text by definition, so the target moves from the default 5.0:1 to
|
|
49
|
+
/// AAA 7:1 — measured, as the default shares are, against the intent's own
|
|
50
|
+
/// `-soft` tint rather than the plain canvas, because the tint is the darker of
|
|
51
|
+
/// the two backgrounds `-ink` is documented for and therefore the binding one.
|
|
52
|
+
///
|
|
53
|
+
/// Each share is the MOST saturated value that still reaches 7:1 in BOTH
|
|
54
|
+
/// themes, so the binding theme decides it. Dark binds for six of the seven;
|
|
55
|
+
/// `warning` is the exception and binds on light, where white cannot reach it
|
|
56
|
+
/// at any tone worth shipping.
|
|
57
|
+
$ink-mix-more: (
|
|
58
|
+
primary: 53%,
|
|
59
|
+
secondary: 47%,
|
|
60
|
+
success: 55%,
|
|
61
|
+
warning: 36%,
|
|
62
|
+
danger: 53%,
|
|
63
|
+
info: 54%,
|
|
64
|
+
medium: 57%,
|
|
65
|
+
) !default;
|
|
66
|
+
|
|
67
|
+
@media (prefers-contrast: more) {
|
|
68
|
+
:root {
|
|
69
|
+
// 8.16:1 on the page, 7.07:1 on `#ebeff4` — the lightest surface the
|
|
70
|
+
// library paints, and the reference the rest of the theme layer solves
|
|
71
|
+
// against. The default `#5f6c7d` reaches 5.35 and 4.63 respectively.
|
|
72
|
+
--wr-color-muted-text: #47505d;
|
|
73
|
+
--wr-color-muted-text-rgb: 71, 80, 93;
|
|
74
|
+
|
|
75
|
+
// The de-emphasis tier closes up — see the note at the top of this file.
|
|
76
|
+
--wr-color-text-muted: rgba(var(--wr-color-muted-text-rgb), 1);
|
|
77
|
+
// unused-ok: the library paints with nothing at the faint strength any
|
|
78
|
+
// more — see the note at its declaration in `_colors.scss`. The override
|
|
79
|
+
// stays so a CONSUMER using the tier is carried into high contrast too.
|
|
80
|
+
--wr-color-text-faint: rgba(var(--wr-color-muted-text-rgb), 1);
|
|
81
|
+
|
|
82
|
+
// 3.47:1 on the page and 3.00:1 on `#ebeff4`, against the default
|
|
83
|
+
// `#cbd5e1`'s 1.48:1. This is the value AGENTS.md already records as the
|
|
84
|
+
// honest one, and the reason it is not the default is recorded there too:
|
|
85
|
+
// the token carries 103 declarations, only 15 of which are control
|
|
86
|
+
// boundaries that 1.4.11 reaches, and darkening all 103 was refused on how
|
|
87
|
+
// it looks. Under an explicit request for more contrast that trade flips —
|
|
88
|
+
// the reader has said which side they want.
|
|
89
|
+
--wr-color-outline: #718cad;
|
|
90
|
+
--wr-color-outline-rgb: 113, 140, 173;
|
|
91
|
+
|
|
92
|
+
@each $name, $share in $ink-mix-more {
|
|
93
|
+
--wr-color-#{$name}-ink: color-mix(in srgb, var(--wr-color-#{$name}) #{$share}, var(--wr-color-dark));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
#{dark.dark-selector()} {
|
|
98
|
+
// 8.30:1 on the dark canvas. Dark needed far less than light — the default
|
|
99
|
+
// `#9aa6b8` already reaches 7.64 there and only misses on `fill-strong`,
|
|
100
|
+
// the harshest surface the library paints, which this closes.
|
|
101
|
+
--wr-color-muted-text: #a2adbe;
|
|
102
|
+
--wr-color-muted-text-rgb: 162, 173, 190;
|
|
103
|
+
|
|
104
|
+
--wr-color-text-muted: rgba(var(--wr-color-muted-text-rgb), 1);
|
|
105
|
+
// unused-ok: the library paints with nothing at the faint strength any
|
|
106
|
+
// more — see the note at its declaration in `_colors.scss`. The override
|
|
107
|
+
// stays so a CONSUMER using the tier is carried into high contrast too.
|
|
108
|
+
--wr-color-text-faint: rgba(var(--wr-color-muted-text-rgb), 1);
|
|
109
|
+
|
|
110
|
+
// 3.56:1 on the dark canvas, against the default `#262f44`'s 1.41:1.
|
|
111
|
+
--wr-color-outline: #566b9b;
|
|
112
|
+
--wr-color-outline-rgb: 86, 107, 155;
|
|
113
|
+
|
|
114
|
+
@each $name, $share in $ink-mix-more {
|
|
115
|
+
--wr-color-#{$name}-ink: color-mix(in srgb, var(--wr-color-#{$name}) #{$share}, var(--wr-color-dark));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Adding a tenth intent to `$base-colors` without a share here would leave it
|
|
121
|
+
// on its default ink under high contrast — a silent hole rather than a build
|
|
122
|
+
// error, which is the failure this repo keeps finding in its own claims. So the
|
|
123
|
+
// two lists are held together at COMPILE time.
|
|
124
|
+
//
|
|
125
|
+
// `light` and `dark` are excluded on both sides for the reason `_colors.scss`
|
|
126
|
+
// records: `light` is a surface tone with no darkening that stays recognisable
|
|
127
|
+
// AND readable, and `dark` already IS the ink.
|
|
128
|
+
@each $name, $seed in colors.$base-colors {
|
|
129
|
+
@if $name != 'light' and $name != 'dark' {
|
|
130
|
+
@if not map.has-key($ink-mix-more, $name) {
|
|
131
|
+
@error 'No high-contrast ink share for intent `#{$name}`. Add one to ' +
|
|
132
|
+
'`$ink-mix-more` in theme/styles/_contrast.scss, derived at 7:1 against ' +
|
|
133
|
+
'that intent\'s own `-soft` tint in whichever theme binds.';
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
package/theme/styles/_focus.scss
CHANGED
|
@@ -164,3 +164,10 @@
|
|
|
164
164
|
.wr-alert__close:focus-visible {
|
|
165
165
|
@include focus-ring;
|
|
166
166
|
}
|
|
167
|
+
|
|
168
|
+
// Graph viewport — the scroller is the graph's one tab stop, so a keyboard user
|
|
169
|
+
// scrolling it needs to see where focus is. Safe as an OUTSET ring: the outline
|
|
170
|
+
// sits outside the scroller's own box, and `.wr-graph` sets no `overflow`.
|
|
171
|
+
.wr-graph__viewport:focus-visible {
|
|
172
|
+
@include focus-ring;
|
|
173
|
+
}
|
package/theme/styles/_index.scss
CHANGED
|
@@ -5,15 +5,22 @@
|
|
|
5
5
|
// .thing { @include wr.smooth-br(0.625rem); }
|
|
6
6
|
|
|
7
7
|
/// Smooth border-radius — opts into the native `corner-shape: squircle`
|
|
8
|
-
///
|
|
9
|
-
///
|
|
8
|
+
/// when the browser supports it, and falls back to a plain
|
|
9
|
+
/// `border-radius` when it does not.
|
|
10
10
|
///
|
|
11
|
-
/// **
|
|
12
|
-
///
|
|
13
|
-
///
|
|
14
|
-
///
|
|
15
|
-
///
|
|
16
|
-
///
|
|
11
|
+
/// **This is the one place that describes the support picture, on
|
|
12
|
+
/// purpose.** Six files used to name a Chrome version in a comment, all
|
|
13
|
+
/// six naming the wrong one — the property shipped four releases before
|
|
14
|
+
/// the number they quoted. A version in a comment is a claim nobody
|
|
15
|
+
/// re-checks, so the comments elsewhere now say "where supported" and
|
|
16
|
+
/// point here.
|
|
17
|
+
///
|
|
18
|
+
/// Where it stands: Chromium has shipped it since 139, WebKit has it in
|
|
19
|
+
/// Technology Preview, Gecko does not have it yet. That is why the
|
|
20
|
+
/// `@supports` guard below is the contract rather than a courtesy — a
|
|
21
|
+
/// browser without the property gets the rounded corner it would have
|
|
22
|
+
/// had anyway, and nothing an app relies on changes. There is no state
|
|
23
|
+
/// in which a consumer has to do something about this.
|
|
17
24
|
///
|
|
18
25
|
/// `corner-shape: squircle` renders a continuous-curvature corner (iOS /
|
|
19
26
|
/// macOS style) instead of a circular arc. The squircle reads as
|
|
@@ -40,21 +40,48 @@
|
|
|
40
40
|
z-index: 1;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
// Each intent gets a SILHOUETTE, because the dot is an empty 12px span with
|
|
44
|
+
// no glyph and nothing beside it that names the state: `title` and `time` are
|
|
45
|
+
// both optional, so an item written as `<wr-timeline-item color="danger">`
|
|
46
|
+
// may carry no text of its own at all. Colour cannot do the work here —
|
|
47
|
+
// success, danger and medium sit within 1.006:1 of each other in dark and
|
|
48
|
+
// 1.006:1 in light, and success against danger is 1.004:1.
|
|
49
|
+
//
|
|
50
|
+
// The shapes follow the vocabulary the library already uses: a triangle is a
|
|
51
|
+
// warning in `wr-alert` and `wr-result`, so it is a warning here. The base
|
|
52
|
+
// dot stays a plain circle on purpose — it means "no intent given", and the
|
|
53
|
+
// quietest shape is the right one for it.
|
|
43
54
|
&--success &__dot {
|
|
55
|
+
// A filled block: finished.
|
|
56
|
+
border-radius: 2px;
|
|
44
57
|
background: var(--wr-color-success);
|
|
45
58
|
}
|
|
46
59
|
|
|
47
60
|
&--warning &__dot {
|
|
61
|
+
clip-path: polygon(50% 0%, 100% 100%, 0% 100%);
|
|
62
|
+
border-radius: 0;
|
|
48
63
|
background: var(--wr-color-warning);
|
|
49
64
|
}
|
|
50
65
|
|
|
51
66
|
&--danger &__dot {
|
|
67
|
+
// A diamond — the loudest silhouette at this size, and unmistakable
|
|
68
|
+
// against the square and the triangle above it.
|
|
69
|
+
rotate: 45deg;
|
|
70
|
+
border-radius: 2px;
|
|
52
71
|
background: var(--wr-color-danger);
|
|
53
72
|
}
|
|
54
73
|
|
|
74
|
+
// color-ok: `background: transparent` plus an inset ring makes this dot
|
|
75
|
+
// HOLLOW — a silhouette, like the three above it. Both declarations happen
|
|
76
|
+
// to be colour-valued, which is the one shape this gate cannot read.
|
|
55
77
|
&--medium &__dot {
|
|
78
|
+
// Hollow, which reads as the quiet one. The second shadow keeps the 2px
|
|
79
|
+
// surface halo every dot carries, so the ring does not swallow it.
|
|
56
80
|
// The `color="medium"` INTENT, not the muted-text role — keep the literal.
|
|
57
|
-
background:
|
|
81
|
+
background: transparent;
|
|
82
|
+
box-shadow:
|
|
83
|
+
inset 0 0 0 2px var(--wr-color-medium),
|
|
84
|
+
0 0 0 2px var(--wr-color-surface);
|
|
58
85
|
}
|
|
59
86
|
|
|
60
87
|
&__body {
|
package/toast/styles/_index.scss
CHANGED
|
@@ -155,6 +155,17 @@ $toast-colors: (
|
|
|
155
155
|
animation: wr-toast-in 0.18s ease-out;
|
|
156
156
|
overflow: hidden;
|
|
157
157
|
|
|
158
|
+
// The status glyph. Sized off the title's line box so it reads as part of the
|
|
159
|
+
// first line rather than floating above it, and inked with the accent the
|
|
160
|
+
// type already carries — the SHAPE is the channel, the colour reinforces it.
|
|
161
|
+
&__icon {
|
|
162
|
+
flex: 0 0 auto;
|
|
163
|
+
width: 1.125rem;
|
|
164
|
+
height: 1.125rem;
|
|
165
|
+
margin-block-start: 0.0625rem;
|
|
166
|
+
color: var(--wr-toast-accent);
|
|
167
|
+
}
|
|
168
|
+
|
|
158
169
|
&__body {
|
|
159
170
|
flex: 1 1 auto;
|
|
160
171
|
min-width: 0;
|
package/tree/styles/_index.scss
CHANGED
|
@@ -24,6 +24,9 @@
|
|
|
24
24
|
cursor: pointer;
|
|
25
25
|
user-select: none;
|
|
26
26
|
outline: 0;
|
|
27
|
+
// Positioning context for the `--active` cursor bar below. Nothing inside
|
|
28
|
+
// a row is absolutely positioned, so this establishes one for that alone.
|
|
29
|
+
position: relative;
|
|
27
30
|
transition:
|
|
28
31
|
background var(--wr-transition-base),
|
|
29
32
|
color var(--wr-transition-base);
|
|
@@ -32,8 +35,13 @@
|
|
|
32
35
|
background: var(--wr-color-hover);
|
|
33
36
|
}
|
|
34
37
|
|
|
38
|
+
// A selected row had nothing but the tint, and `wr-tree` — unlike its
|
|
39
|
+
// sibling data view `wr-table` — ships NO checkbox mode, so in
|
|
40
|
+
// `selectionMode="multiple"` any number of rows were marked by a 1.17:1
|
|
41
|
+
// wash and nothing else. The weight is what a reader without hue has.
|
|
35
42
|
&--selected {
|
|
36
43
|
background: var(--wr-color-primary-soft);
|
|
44
|
+
font-weight: var(--wr-font-weight-medium);
|
|
37
45
|
// Text on the `-soft` tint: `-ink`. Bare measured 4.19:1 light / 3.63:1 dark.
|
|
38
46
|
color: var(--wr-color-primary-ink);
|
|
39
47
|
}
|
|
@@ -50,9 +58,24 @@
|
|
|
50
58
|
}
|
|
51
59
|
|
|
52
60
|
// Active-descendant cursor when virtualized — focus lives on the list
|
|
53
|
-
// container, so the "current" row
|
|
61
|
+
// container, so the "current" row cannot use the focus ring.
|
|
62
|
+
//
|
|
63
|
+
// The tint alone was the byte-identical declaration `:hover` uses above,
|
|
64
|
+
// which made the keyboard cursor indistinguishable from a mouse resting on
|
|
65
|
+
// another row. The bar is what separates them, and it is a shape rather
|
|
66
|
+
// than a colour so a selected row (also a tint) stays distinct too.
|
|
54
67
|
&--active {
|
|
55
68
|
background: var(--wr-color-hover);
|
|
69
|
+
|
|
70
|
+
&::before {
|
|
71
|
+
content: '';
|
|
72
|
+
position: absolute;
|
|
73
|
+
inset-block: 0;
|
|
74
|
+
inset-inline-start: 0;
|
|
75
|
+
width: 2px;
|
|
76
|
+
border-radius: inherit;
|
|
77
|
+
background: var(--wr-color-primary);
|
|
78
|
+
}
|
|
56
79
|
}
|
|
57
80
|
}
|
|
58
81
|
|
|
@@ -205,6 +228,9 @@
|
|
|
205
228
|
}
|
|
206
229
|
}
|
|
207
230
|
|
|
231
|
+
// color-ok: opening attaches the panel and flips the chevron 180deg, so the
|
|
232
|
+
// state is a thing appearing and a glyph rotating; this only tints the edge
|
|
233
|
+
// underneath both.
|
|
208
234
|
&--open &__trigger {
|
|
209
235
|
border-color: var(--wr-color-primary);
|
|
210
236
|
box-shadow: 0 0 0 3px rgba(var(--wr-color-primary-rgb), 0.15);
|
package/types/ngwr-badge.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ import * as _angular_core from '@angular/core';
|
|
|
12
12
|
* - `rounded` (default) — small radius, matches the rest of the form vocabulary.
|
|
13
13
|
* - `pill` — fully rounded ends; common for count chips and status pills.
|
|
14
14
|
* - `squircle` — iOS-style continuous-curvature corners via the
|
|
15
|
-
* `corner-shape: squircle` CSS spec (
|
|
15
|
+
* `corner-shape: squircle` CSS spec (where supported, falls back to a
|
|
16
16
|
* plain rounded corner elsewhere).
|
|
17
17
|
*/
|
|
18
18
|
type WrBadgeShape = 'rounded' | 'pill' | 'squircle';
|
|
@@ -77,7 +77,17 @@ declare class WrBarChartHarness extends ComponentHarness {
|
|
|
77
77
|
getBarCount(): Promise<number>;
|
|
78
78
|
/** Whether the values are printed above the bars (`showValues`). */
|
|
79
79
|
hasValues(): Promise<boolean>;
|
|
80
|
-
/**
|
|
80
|
+
/**
|
|
81
|
+
* The plot's height in pixels, read off the `style` ATTRIBUTE.
|
|
82
|
+
*
|
|
83
|
+
* NOT `getCssValue()`, which is `getComputedStyle()` — the same rule this
|
|
84
|
+
* file's class note already states and this method alone broke. A computed
|
|
85
|
+
* read answers from the LAID-OUT box, so it agrees with the inline value in
|
|
86
|
+
* jsdom (which lays nothing out and echoes the declaration) and disagrees in a
|
|
87
|
+
* browser, where sub-pixel rounding turns a declared 240 into 239.5. A harness
|
|
88
|
+
* that answers differently in the two places it runs is worse than one that
|
|
89
|
+
* refuses.
|
|
90
|
+
*/
|
|
81
91
|
getPlotHeight(): Promise<number>;
|
|
82
92
|
}
|
|
83
93
|
|
package/types/ngwr-button.d.ts
CHANGED
|
@@ -24,7 +24,7 @@ type WrButtonSize = 'sm' | 'md' | 'lg';
|
|
|
24
24
|
* - `rounded` (default) — small radius, matches the rest of the form vocabulary.
|
|
25
25
|
* - `pill` — fully rounded ends; ideal for solitary CTAs.
|
|
26
26
|
* - `squircle` — iOS-style continuous-curvature corners via the
|
|
27
|
-
* `corner-shape: squircle` CSS spec (
|
|
27
|
+
* `corner-shape: squircle` CSS spec (where supported, falls back to a
|
|
28
28
|
* plain rounded corner elsewhere). For a deterministic
|
|
29
29
|
* clip-path-based squircle that works across browsers, wrap the
|
|
30
30
|
* button in `[wrSquircle]` instead.
|
|
@@ -36,9 +36,14 @@ interface WrCalendarHeatmapCell {
|
|
|
36
36
|
*
|
|
37
37
|
* **Every square is `aria-hidden`, and that is the design.** The grid is one
|
|
38
38
|
* `role="img"` with a name; a year of individually announced days would be unusable
|
|
39
|
-
* with a screen reader. What each square carries instead is
|
|
40
|
-
*
|
|
41
|
-
*
|
|
39
|
+
* with a screen reader. What each square carries instead is `data-date` and
|
|
40
|
+
* `data-value`, which is what {@link getCells} reads.
|
|
41
|
+
*
|
|
42
|
+
* NOT the `title`, which it used to parse. The tooltip is human-facing text now
|
|
43
|
+
* — the date formatted for the reader's locale, the count through
|
|
44
|
+
* `Intl.NumberFormat`, and the sentence composed in the catalog — so parsing it
|
|
45
|
+
* would have made every assertion here depend on the locale the suite happens to
|
|
46
|
+
* run under, and on wording a translator is free to change.
|
|
42
47
|
*
|
|
43
48
|
* **Four of the seven weekday labels are blank on purpose**: seven do not fit beside
|
|
44
49
|
* a grid this dense. {@link getWeekdayLabels} returns them as they are, empties
|
|
@@ -61,8 +66,8 @@ declare class WrCalendarHeatmapHarness extends ComponentHarness {
|
|
|
61
66
|
/**
|
|
62
67
|
* Every square, from its tooltip and its grid placement.
|
|
63
68
|
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
69
|
+
* Read from `data-date` / `data-value`, which the component writes for exactly
|
|
70
|
+
* this. Everything else about a square is colour.
|
|
66
71
|
*/
|
|
67
72
|
getCells(): Promise<WrCalendarHeatmapCell[]>;
|
|
68
73
|
/** The value a given ISO date's square reports, or `null` when that day is not drawn. */
|