ngwr 13.0.1 → 14.0.1
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 +69 -13
- package/aurora/aurora.scss +1 -1
- package/aurora/styles/_dark.scss +21 -0
- package/aurora/styles/_index.scss +11 -30
- package/aurora/styles/_rules.scss +25 -0
- package/border-glow/styles/_dark.scss +46 -0
- package/border-glow/styles/_index.scss +5 -0
- package/border-glow/styles/_rules.scss +0 -31
- package/button/styles/_index.scss +16 -0
- package/color-picker/styles/_index.scss +43 -5
- package/event-calendar/styles/_index.scss +15 -0
- package/fesm2022/ngwr-action-sheet.mjs +3 -3
- package/fesm2022/ngwr-affix.mjs +3 -3
- package/fesm2022/ngwr-alert.mjs +7 -7
- package/fesm2022/ngwr-alert.mjs.map +1 -1
- package/fesm2022/ngwr-anchor.mjs +3 -3
- package/fesm2022/ngwr-aurora.mjs +4 -4
- package/fesm2022/ngwr-aurora.mjs.map +1 -1
- package/fesm2022/ngwr-avatar.mjs +3 -3
- package/fesm2022/ngwr-back-top.mjs +14 -4
- package/fesm2022/ngwr-back-top.mjs.map +1 -1
- package/fesm2022/ngwr-badge.mjs +6 -6
- package/fesm2022/ngwr-bar-chart.mjs +3 -3
- package/fesm2022/ngwr-blur-text.mjs +16 -5
- package/fesm2022/ngwr-blur-text.mjs.map +1 -1
- package/fesm2022/ngwr-border-glow.mjs +4 -4
- package/fesm2022/ngwr-border-glow.mjs.map +1 -1
- 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 +88 -10
- package/fesm2022/ngwr-button.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-heatmap.mjs +3 -3
- package/fesm2022/ngwr-calendar-testing.mjs +15 -0
- package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
- package/fesm2022/ngwr-calendar.mjs +53 -7
- 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.mjs +4 -4
- package/fesm2022/ngwr-cascader.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox.mjs +6 -6
- package/fesm2022/ngwr-circular-text.mjs +23 -4
- package/fesm2022/ngwr-circular-text.mjs.map +1 -1
- 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-collapse.mjs.map +1 -1
- package/fesm2022/ngwr-color-picker-testing.mjs +23 -7
- package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
- package/fesm2022/ngwr-color-picker.mjs +93 -14
- package/fesm2022/ngwr-color-picker.mjs.map +1 -1
- package/fesm2022/ngwr-command-palette.mjs +29 -5
- 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 +18 -12
- 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 +104 -36
- package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -1
- package/fesm2022/ngwr-date-adapters-luxon.mjs +3 -3
- package/fesm2022/ngwr-date-picker-testing.mjs +10 -2
- package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
- package/fesm2022/ngwr-date-picker.mjs +118 -28
- package/fesm2022/ngwr-date-picker.mjs.map +1 -1
- package/fesm2022/ngwr-date.mjs +483 -82
- package/fesm2022/ngwr-date.mjs.map +1 -1
- 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 +15 -15
- package/fesm2022/ngwr-directives.mjs +12 -12
- package/fesm2022/ngwr-divider.mjs +3 -3
- package/fesm2022/ngwr-donut-chart.mjs +3 -3
- package/fesm2022/ngwr-drag-drop.mjs +37 -9
- package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
- package/fesm2022/ngwr-drawer.mjs +18 -18
- package/fesm2022/ngwr-dropdown.mjs +29 -12
- package/fesm2022/ngwr-dropdown.mjs.map +1 -1
- package/fesm2022/ngwr-empty.mjs +3 -3
- 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.mjs +3 -3
- package/fesm2022/ngwr-file-upload.mjs +55 -15
- package/fesm2022/ngwr-file-upload.mjs.map +1 -1
- package/fesm2022/ngwr-form-testing.mjs +13 -7
- package/fesm2022/ngwr-form-testing.mjs.map +1 -1
- package/fesm2022/ngwr-form.mjs +44 -25
- package/fesm2022/ngwr-form.mjs.map +1 -1
- package/fesm2022/ngwr-fuzzy-text.mjs +3 -3
- 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-hotkey.mjs +6 -6
- package/fesm2022/ngwr-i18n-en.mjs +63 -1
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ru.mjs +28 -1
- package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
- package/fesm2022/ngwr-i18n.mjs +159 -31
- package/fesm2022/ngwr-i18n.mjs.map +1 -1
- package/fesm2022/ngwr-icon.mjs +6 -6
- package/fesm2022/ngwr-image-cropper.mjs +3 -3
- package/fesm2022/ngwr-input-number.mjs +5 -5
- package/fesm2022/ngwr-input-number.mjs.map +1 -1
- package/fesm2022/ngwr-input-otp.mjs +23 -5
- package/fesm2022/ngwr-input-otp.mjs.map +1 -1
- package/fesm2022/ngwr-input.mjs +37 -26
- package/fesm2022/ngwr-input.mjs.map +1 -1
- package/fesm2022/ngwr-keyboard.mjs +3 -3
- package/fesm2022/ngwr-knob-testing.mjs.map +1 -1
- package/fesm2022/ngwr-knob.mjs +22 -4
- package/fesm2022/ngwr-knob.mjs.map +1 -1
- package/fesm2022/ngwr-layout.mjs +15 -15
- package/fesm2022/ngwr-lightbox.mjs +4 -4
- package/fesm2022/ngwr-lightbox.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart.mjs +3 -3
- package/fesm2022/ngwr-list.mjs +7 -7
- package/fesm2022/ngwr-list.mjs.map +1 -1
- package/fesm2022/ngwr-loading-bar-router.mjs +73 -0
- package/fesm2022/ngwr-loading-bar-router.mjs.map +1 -0
- package/fesm2022/ngwr-loading-bar.mjs +27 -38
- package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
- 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 +109 -19
- 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 +6 -6
- package/fesm2022/ngwr-page-header.mjs +3 -3
- package/fesm2022/ngwr-pagination-testing.mjs +11 -10
- package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
- package/fesm2022/ngwr-pagination.mjs +67 -32
- 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 +7 -6
- package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
- package/fesm2022/ngwr-popover.mjs +7 -6
- 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.mjs +48 -22
- package/fesm2022/ngwr-rating.mjs.map +1 -1
- package/fesm2022/ngwr-result.mjs +12 -12
- package/fesm2022/ngwr-rotating-text.mjs +3 -3
- package/fesm2022/ngwr-scroll.mjs +3 -3
- package/fesm2022/ngwr-segmented.mjs +12 -8
- package/fesm2022/ngwr-segmented.mjs.map +1 -1
- package/fesm2022/ngwr-select.mjs +217 -59
- package/fesm2022/ngwr-select.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text.mjs +7 -7
- package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
- package/fesm2022/ngwr-sidebar.mjs +3 -3
- package/fesm2022/ngwr-skeleton.mjs +3 -3
- package/fesm2022/ngwr-slider.mjs +12 -8
- 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-testing.mjs.map +1 -1
- package/fesm2022/ngwr-splitter.mjs +3 -3
- package/fesm2022/ngwr-spotlight-card.mjs +7 -7
- package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
- package/fesm2022/ngwr-squircle.mjs +7 -6
- package/fesm2022/ngwr-squircle.mjs.map +1 -1
- package/fesm2022/ngwr-star-border.mjs +4 -4
- package/fesm2022/ngwr-star-border.mjs.map +1 -1
- package/fesm2022/ngwr-statistic.mjs +44 -13
- package/fesm2022/ngwr-statistic.mjs.map +1 -1
- package/fesm2022/ngwr-stepper.mjs +6 -6
- package/fesm2022/ngwr-storage.mjs +11 -3
- package/fesm2022/ngwr-storage.mjs.map +1 -1
- package/fesm2022/ngwr-switch.mjs +3 -3
- package/fesm2022/ngwr-table.mjs +51 -28
- package/fesm2022/ngwr-table.mjs.map +1 -1
- package/fesm2022/ngwr-tabs-router.mjs +158 -0
- package/fesm2022/ngwr-tabs-router.mjs.map +1 -0
- package/fesm2022/ngwr-tabs-testing.mjs +13 -11
- package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
- package/fesm2022/ngwr-tabs.mjs +104 -16
- package/fesm2022/ngwr-tabs.mjs.map +1 -1
- package/fesm2022/ngwr-textarea.mjs +46 -6
- package/fesm2022/ngwr-textarea.mjs.map +1 -1
- package/fesm2022/ngwr-theme.mjs +90 -4
- package/fesm2022/ngwr-theme.mjs.map +1 -1
- package/fesm2022/ngwr-tilt-card.mjs +7 -7
- package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
- package/fesm2022/ngwr-timeline.mjs +6 -6
- package/fesm2022/ngwr-toast.mjs +116 -11
- package/fesm2022/ngwr-toast.mjs.map +1 -1
- package/fesm2022/ngwr-toolbar.mjs +3 -3
- package/fesm2022/ngwr-tour.mjs +6 -6
- package/fesm2022/ngwr-tour.mjs.map +1 -1
- package/fesm2022/ngwr-transfer.mjs +4 -4
- package/fesm2022/ngwr-transfer.mjs.map +1 -1
- package/fesm2022/ngwr-tree.mjs +35 -12
- 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-utils.mjs +37 -1
- package/fesm2022/ngwr-utils.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-waves.mjs +4 -4
- package/fesm2022/ngwr-waves.mjs.map +1 -1
- package/fesm2022/ngwr-window-testing.mjs +10 -2
- package/fesm2022/ngwr-window-testing.mjs.map +1 -1
- package/fesm2022/ngwr-window.mjs +15 -15
- package/fesm2022/ngwr-window.mjs.map +1 -1
- package/i18n/en.json +33 -6
- package/i18n/ru.json +33 -6
- package/llms-full.txt +29 -20
- package/llms.txt +127 -25
- package/mcp/catalog.js +3 -3
- package/mcp/providers.js +11 -0
- package/package.json +9 -1
- package/schematics/migrations/v13/index.js +101 -0
- package/schematics/migrations/v14/index.js +422 -0
- package/schematics/migrations.json +10 -0
- package/schematics/page/templates.js +1 -1
- package/schematics/use/symbol-map.json +1 -0
- package/shiny-text/styles/_dark.scss +20 -0
- package/shiny-text/styles/_index.scss +5 -0
- package/shiny-text/styles/_rules.scss +0 -4
- package/skills/ngwr/SKILL.md +4 -1
- package/skills/ngwr/references/catalog.md +2 -0
- package/skills/ngwr/references/setup.md +4 -0
- package/spotlight-card/styles/_dark.scss +21 -0
- package/spotlight-card/styles/_index.scss +5 -0
- package/spotlight-card/styles/_rules.scss +0 -6
- package/star-border/styles/_dark.scss +21 -0
- package/star-border/styles/_index.scss +5 -0
- package/star-border/styles/_rules.scss +0 -5
- package/stepper/styles/_index.scss +19 -1
- package/textarea/styles/_index.scss +14 -6
- package/theme/styles/_colors.scss +102 -0
- package/theme/styles/_focus.scss +31 -1
- package/tilt-card/styles/_dark.scss +21 -0
- package/tilt-card/styles/_index.scss +5 -0
- package/tilt-card/styles/_rules.scss +0 -5
- package/toast/styles/_index.scss +12 -4
- package/types/ngwr-alert.d.ts +3 -3
- package/types/ngwr-blur-text.d.ts +8 -0
- package/types/ngwr-button.d.ts +45 -2
- package/types/ngwr-calendar-testing.d.ts +21 -4
- package/types/ngwr-calendar.d.ts +37 -0
- package/types/ngwr-circular-text.d.ts +9 -0
- package/types/ngwr-collapse.d.ts +19 -15
- package/types/ngwr-color-picker-testing.d.ts +10 -4
- package/types/ngwr-color-picker.d.ts +70 -2
- package/types/ngwr-command-palette.d.ts +14 -0
- package/types/ngwr-context-menu.d.ts +1 -1
- package/types/ngwr-date-adapters-fns.d.ts +71 -29
- package/types/ngwr-date-picker-testing.d.ts +206 -185
- package/types/ngwr-date-picker.d.ts +7 -0
- package/types/ngwr-date.d.ts +143 -13
- package/types/ngwr-drag-drop.d.ts +19 -0
- package/types/ngwr-dropdown.d.ts +18 -2
- package/types/ngwr-event-calendar-testing.d.ts +12 -9
- package/types/ngwr-file-upload.d.ts +31 -3
- package/types/ngwr-form-testing.d.ts +13 -7
- package/types/ngwr-form.d.ts +47 -12
- package/types/ngwr-i18n.d.ts +89 -7
- package/types/ngwr-input-number.d.ts +1 -1
- package/types/ngwr-input-otp.d.ts +3 -0
- package/types/ngwr-input.d.ts +13 -5
- package/types/ngwr-knob-testing.d.ts +8 -4
- package/types/ngwr-knob.d.ts +18 -0
- package/types/ngwr-loading-bar-router.d.ts +35 -0
- package/types/ngwr-loading-bar.d.ts +19 -9
- package/types/ngwr-mention.d.ts +13 -0
- package/types/ngwr-pagination-testing.d.ts +11 -10
- package/types/ngwr-pagination.d.ts +39 -10
- package/types/ngwr-popconfirm.d.ts +1 -1
- package/types/ngwr-popover.d.ts +1 -1
- package/types/ngwr-rating.d.ts +25 -4
- package/types/ngwr-segmented.d.ts +1 -0
- package/types/ngwr-select.d.ts +110 -19
- package/types/ngwr-slider.d.ts +1 -0
- package/types/ngwr-splitter-testing.d.ts +9 -4
- package/types/ngwr-squircle.d.ts +1 -1
- package/types/ngwr-statistic.d.ts +22 -2
- package/types/ngwr-storage.d.ts +39 -1
- package/types/ngwr-table.d.ts +24 -5
- package/types/ngwr-tabs-router.d.ts +67 -0
- package/types/ngwr-tabs-testing.d.ts +12 -10
- package/types/ngwr-tabs.d.ts +103 -6
- package/types/ngwr-textarea.d.ts +29 -0
- package/types/ngwr-theme.d.ts +92 -2
- package/types/ngwr-toast.d.ts +53 -0
- package/types/ngwr-tree.d.ts +10 -2
- package/types/ngwr-utils.d.ts +33 -1
- package/types/ngwr-version.d.ts +1 -1
- package/types/ngwr-window-testing.d.ts +11 -3
- package/types/ngwr-window.d.ts +11 -4
- package/waves/styles/_dark.scss +19 -0
- package/waves/styles/_index.scss +5 -0
- package/waves/styles/_rules.scss +0 -3
- package/window/styles/_index.scss +1 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Dark theme: `--wr-color-on-surface-rgb` already flips to a light
|
|
2
|
+
// value, so the default tint becomes a light beam on the navy surface — nudge
|
|
3
|
+
// the alpha up a touch so it reads as bright as the classic spotlight.
|
|
4
|
+
//
|
|
5
|
+
// Keyed on `theme.dark-selector()`, never on a literal `[data-theme='dark']`.
|
|
6
|
+
// The attribute is renameable — `@use 'ngwr' with ($theme-attribute: '…')`
|
|
7
|
+
// alongside `provideWrTheme({ attribute: '…' })` — and a hand-written literal
|
|
8
|
+
// misses the rename in both directions: this block stops firing under the
|
|
9
|
+
// configured name, and it keeps firing under `data-theme`, which is the
|
|
10
|
+
// attribute a foreign design system owns and the rename exists to escape.
|
|
11
|
+
//
|
|
12
|
+
// It lives outside the `styleUrl` closure for the same reason. A component
|
|
13
|
+
// stylesheet is compiled when the LIBRARY is built, where `$theme-attribute` can
|
|
14
|
+
// only ever be the default, and Angular appends that copy after the app's linked
|
|
15
|
+
// sheet — so an inlined literal would not merely be dead, it would outrank the
|
|
16
|
+
// correctly-named rule beside it.
|
|
17
|
+
@use '../../theme/styles' as theme;
|
|
18
|
+
|
|
19
|
+
#{theme.dark-selector()} .wr-spotlight-card {
|
|
20
|
+
--wr-spotlight-color: rgba(var(--wr-color-on-surface-rgb), 0.22);
|
|
21
|
+
}
|
|
@@ -11,5 +11,10 @@
|
|
|
11
11
|
// box-sizing reset into the compiled component styles, which ng-packagr then
|
|
12
12
|
// embeds in the FESM bundle as a string. `spotlight-card.scss` forwards `_rules`
|
|
13
13
|
// instead, so it carries this component's own CSS and nothing else.
|
|
14
|
+
//
|
|
15
|
+
// `_dark` is loaded from HERE for a second reason: its selector is built out of
|
|
16
|
+
// `$theme-attribute`, which only a stylesheet compiled by the consuming app can
|
|
17
|
+
// configure, so a copy inside the bundle could only ever carry the default name.
|
|
14
18
|
@use '../../theme/styles';
|
|
15
19
|
@forward 'rules';
|
|
20
|
+
@forward 'dark';
|
|
@@ -39,9 +39,3 @@
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
// Dark mode: `--wr-color-on-surface-rgb` already flips to a light value, so the
|
|
43
|
-
// default tint above becomes a light beam on the navy surface — nudge the
|
|
44
|
-
// alpha up a touch so it reads as bright as the classic spotlight.
|
|
45
|
-
[data-theme='dark'] .wr-spotlight-card {
|
|
46
|
-
--wr-spotlight-color: rgba(var(--wr-color-on-surface-rgb), 0.22);
|
|
47
|
-
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Dark theme.
|
|
2
|
+
//
|
|
3
|
+
// Keyed on `theme.dark-selector()`, never on a literal `[data-theme='dark']`.
|
|
4
|
+
// The attribute is renameable — `@use 'ngwr' with ($theme-attribute: '…')`
|
|
5
|
+
// alongside `provideWrTheme({ attribute: '…' })` — and a hand-written literal
|
|
6
|
+
// misses the rename in both directions: this block stops firing under the
|
|
7
|
+
// configured name, and it keeps firing under `data-theme`, which is the
|
|
8
|
+
// attribute a foreign design system owns and the rename exists to escape.
|
|
9
|
+
//
|
|
10
|
+
// It lives outside the `styleUrl` closure for the same reason. A component
|
|
11
|
+
// stylesheet is compiled when the LIBRARY is built, where `$theme-attribute` can
|
|
12
|
+
// only ever be the default, and Angular appends that copy after the app's linked
|
|
13
|
+
// sheet — so an inlined literal would not merely be dead, it would outrank the
|
|
14
|
+
// correctly-named rule beside it.
|
|
15
|
+
@use '../../theme/styles' as theme;
|
|
16
|
+
|
|
17
|
+
#{theme.dark-selector()} .wr-star-border {
|
|
18
|
+
--wr-star-border-color: #ffffff;
|
|
19
|
+
--wr-star-border-stop: 10%;
|
|
20
|
+
--wr-star-border-opacity: 0.7;
|
|
21
|
+
}
|
|
@@ -11,5 +11,10 @@
|
|
|
11
11
|
// box-sizing reset into the compiled component styles, which ng-packagr then
|
|
12
12
|
// embeds in the FESM bundle as a string. `star-border.scss` forwards `_rules`
|
|
13
13
|
// instead, so it carries this component's own CSS and nothing else.
|
|
14
|
+
//
|
|
15
|
+
// `_dark` is loaded from HERE for a second reason: its selector is built out of
|
|
16
|
+
// `$theme-attribute`, which only a stylesheet compiled by the consuming app can
|
|
17
|
+
// configure, so a copy inside the bundle could only ever carry the default name.
|
|
14
18
|
@use '../../theme/styles';
|
|
15
19
|
@forward 'rules';
|
|
20
|
+
@forward 'dark';
|
|
@@ -95,7 +95,17 @@ $header-padding-block: 0.25rem;
|
|
|
95
95
|
color: var(--wr-color-on-surface);
|
|
96
96
|
cursor: pointer;
|
|
97
97
|
text-align: start;
|
|
98
|
-
flex: 0 0 auto
|
|
98
|
+
// Shrinkable, with a floor of nothing. `flex: 0 0 auto` froze the button at
|
|
99
|
+
// its max-content width, so the `<li>`'s own `min-width: 0` bought nothing:
|
|
100
|
+
// the row shrank and the button overflowed it. English hid this — the defect
|
|
101
|
+
// needs a label the row cannot fit, which is what a translation is. Measured
|
|
102
|
+
// in Chromium at a 375px viewport, three steps: `Übersichtsdarstellung /
|
|
103
|
+
// Grundeinstellungen / Rechnungsstellung` pushed the DOCUMENT to 423px, so
|
|
104
|
+
// the whole page scrolled sideways and the last label ran off the screen; the
|
|
105
|
+
// Finnish and Japanese sets did the same by 16px. A horizontal stepper is a
|
|
106
|
+
// full-width row of unbounded strings — it has to be able to give.
|
|
107
|
+
flex: 0 1 auto;
|
|
108
|
+
min-width: 0;
|
|
99
109
|
|
|
100
110
|
&:disabled {
|
|
101
111
|
cursor: not-allowed;
|
|
@@ -145,6 +155,14 @@ $header-padding-block: 0.25rem;
|
|
|
145
155
|
font-size: var(--wr-text-sm);
|
|
146
156
|
font-weight: 500;
|
|
147
157
|
line-height: $label-line-height;
|
|
158
|
+
// The other half of the shrink above: a flex item's automatic minimum size
|
|
159
|
+
// is its min-content width, and for a German compound noun that IS the whole
|
|
160
|
+
// word, so the button would shrink and the label would not. `break-word`
|
|
161
|
+
// only splits a word that cannot fit a line of its own, so nothing changes
|
|
162
|
+
// until the row is genuinely too narrow — and nothing changes at all in
|
|
163
|
+
// English or above 768px, measured.
|
|
164
|
+
min-width: 0;
|
|
165
|
+
overflow-wrap: break-word;
|
|
148
166
|
// Centre the label's FIRST LINE on the indicator, now that both are anchored
|
|
149
167
|
// to the button's block start. Half the difference between the circle and one
|
|
150
168
|
// line box — derived, not typed, because `--wr-stepper-indicator-size` is a
|
|
@@ -94,12 +94,13 @@
|
|
|
94
94
|
// cursor follow the `resize` direction.
|
|
95
95
|
&__resize {
|
|
96
96
|
position: absolute;
|
|
97
|
-
//
|
|
98
|
-
// `
|
|
99
|
-
//
|
|
100
|
-
//
|
|
101
|
-
//
|
|
102
|
-
|
|
97
|
+
// Logical now, and the drag maths moved with it: `onResize` reads
|
|
98
|
+
// `Directionality` and negates the `clientX` delta under `dir="rtl"`, because
|
|
99
|
+
// a block-level box is anchored at its inline START and grows toward its
|
|
100
|
+
// inline END — physically right in LTR, physically left in RTL. The grip has
|
|
101
|
+
// to sit on the corner the box actually extends toward, so the two halves
|
|
102
|
+
// must be changed together or not at all.
|
|
103
|
+
inset-inline-end: 0.25rem;
|
|
103
104
|
bottom: 0.25rem;
|
|
104
105
|
display: inline-flex;
|
|
105
106
|
color: var(--wr-color-text-faint);
|
|
@@ -113,7 +114,14 @@
|
|
|
113
114
|
cursor: ew-resize;
|
|
114
115
|
}
|
|
115
116
|
&--both {
|
|
117
|
+
// The diagonal cursor names two physical corners, so it is the one cue here
|
|
118
|
+
// that has no logical spelling: at the bottom-LEFT corner an RTL field grows
|
|
119
|
+
// along the north-east / south-west diagonal instead.
|
|
116
120
|
cursor: nwse-resize;
|
|
121
|
+
|
|
122
|
+
[dir='rtl'] & {
|
|
123
|
+
cursor: nesw-resize;
|
|
124
|
+
}
|
|
117
125
|
}
|
|
118
126
|
|
|
119
127
|
.wr-icon__svg {
|
|
@@ -8,6 +8,38 @@
|
|
|
8
8
|
// @use 'ngwr/theme/styles/colors' with (
|
|
9
9
|
// $base-colors: (primary: #...)
|
|
10
10
|
// );
|
|
11
|
+
//
|
|
12
|
+
// **This is the LIGHT palette, and configuring it does not reach the dark
|
|
13
|
+
// theme.** `_dark.scss` re-tunes the intents by hand for the dark canvas and
|
|
14
|
+
// hard-codes what it lands on, so an app that seeds an indigo `primary` here
|
|
15
|
+
// gets indigo in light and the shipped `#3567ff` in dark, with nothing said
|
|
16
|
+
// about it — which is exactly how it reads as a bug rather than a boundary.
|
|
17
|
+
//
|
|
18
|
+
// It is a boundary, and the deriving is what could not be shipped. The dark
|
|
19
|
+
// intents are not the light ones lightened: `success` and `danger` are moved
|
|
20
|
+
// 33% and 21% to clear the black/white flip point on a dark ground, `warning`
|
|
21
|
+
// is deliberately left alone because white cannot reach it at any tone worth
|
|
22
|
+
// shipping, and `primary` is deepened until its label can go white — a
|
|
23
|
+
// direction no formula would take on its own. A `color.scale()` applied to an
|
|
24
|
+
// arbitrary seed reproduces none of that; what it reproduces is the class of
|
|
25
|
+
// failure the hand-tuning exists to prevent, silently, in the theme where
|
|
26
|
+
// nobody looks first. Deriving the dark palette from the seed would trade a
|
|
27
|
+
// visible wrong colour for an invisible failing contrast ratio, and that is
|
|
28
|
+
// the worse of the two.
|
|
29
|
+
//
|
|
30
|
+
// So carry a rebrand across yourself, with the same arithmetic the light
|
|
31
|
+
// palette uses. `rebrand()` below is that arithmetic:
|
|
32
|
+
//
|
|
33
|
+
// @use 'ngwr/theme' as theme;
|
|
34
|
+
//
|
|
35
|
+
// @include theme.dark {
|
|
36
|
+
// @include theme.rebrand((primary: #818cf8));
|
|
37
|
+
// }
|
|
38
|
+
//
|
|
39
|
+
// Pick the dark seed for the dark canvas rather than reusing the light one, and
|
|
40
|
+
// measure it — `pnpm check:contrast` in this repo, axe or any contrast checker
|
|
41
|
+
// in yours. `contrast()` is exported for the same reason: it tells you which
|
|
42
|
+
// label a candidate fill will get before you ship it.
|
|
11
43
|
|
|
12
44
|
// Five intents are deliberately deeper than their "brand" tone, and the reason is
|
|
13
45
|
// arithmetic rather than taste. `_contrast()` picks whichever of black / white
|
|
@@ -319,6 +351,76 @@ $contrast-light: #ffffff !default;
|
|
|
319
351
|
--wr-color-dark-ink: var(--wr-color-dark);
|
|
320
352
|
}
|
|
321
353
|
|
|
354
|
+
/// Re-emit an intent's WHOLE token set on the current selector, from one seed.
|
|
355
|
+
///
|
|
356
|
+
/// `$colors` is a map of intent name to base colour, keyed by the same nine
|
|
357
|
+
/// names as `$base-colors`. Anything else is an `@error`: a typo would otherwise
|
|
358
|
+
/// emit a family of `--wr-color-brnad-*` properties that resolve for nothing.
|
|
359
|
+
///
|
|
360
|
+
/// **This is the supported way to recolour a SUBTREE, and hand-writing the three
|
|
361
|
+
/// obvious properties is not.** Setting `--wr-color-primary`, its `-rgb` and its
|
|
362
|
+
/// `-contrast` on a `.marketing` wrapper looks like it should be enough, and the
|
|
363
|
+
/// guide used to say so. It is not, for two separate reasons, and each hits a
|
|
364
|
+
/// different half of the set:
|
|
365
|
+
///
|
|
366
|
+
/// - `-dark`, `-darker`, `-light` and `-lighter` are `color.adjust()` — Sass
|
|
367
|
+
/// arithmetic, resolved when the stylesheet is COMPILED. No runtime value can
|
|
368
|
+
/// feed them, so a pink subtree kept a blue `:hover`, which is `-dark`.
|
|
369
|
+
/// - `-soft`, `-soft-border`, `-soft-contrast`, `-active` and `-ink` are written
|
|
370
|
+
/// in terms of `var()`, which is the mechanism that lets them re-derive — but
|
|
371
|
+
/// a custom property's references are substituted ON THE ELEMENT THAT DECLARES
|
|
372
|
+
/// IT, and these are declared at `:root`. What inherits into the subtree is
|
|
373
|
+
/// the substituted literal, so an outlined button inside a pink section drew a
|
|
374
|
+
/// pink border around blue text: `-ink` had been frozen two levels up. It is
|
|
375
|
+
/// the same trap `derived()` documents for a scoped dark block, arriving by a
|
|
376
|
+
/// different door.
|
|
377
|
+
///
|
|
378
|
+
/// So the mixin does both halves: it recomputes the four shades and the contrast
|
|
379
|
+
/// pick in Sass, then re-includes `derived()` so every composed token resolves
|
|
380
|
+
/// against the bases on THIS element.
|
|
381
|
+
///
|
|
382
|
+
/// ```scss
|
|
383
|
+
/// @use 'ngwr/theme' as theme;
|
|
384
|
+
///
|
|
385
|
+
/// .marketing {
|
|
386
|
+
/// @include theme.rebrand((primary: #be123c));
|
|
387
|
+
/// }
|
|
388
|
+
/// ```
|
|
389
|
+
///
|
|
390
|
+
/// It is compile-time, so the seed has to be known when the app's stylesheet is
|
|
391
|
+
/// built. For a colour chosen at runtime — a tenant, a builder, a preset picked
|
|
392
|
+
/// from a registry — reach for `wrThemeTokens()` from `ngwr/theme` instead; it
|
|
393
|
+
/// is the same recipe in TypeScript.
|
|
394
|
+
///
|
|
395
|
+
/// The dark theme needs the same treatment and does not get it for free: see the
|
|
396
|
+
/// note on `$base-colors` for why compile-time configuration is light-only, and
|
|
397
|
+
/// wrap this in `theme.dark` to carry a rebrand across.
|
|
398
|
+
@mixin rebrand($colors) {
|
|
399
|
+
@each $name, $base in $colors {
|
|
400
|
+
@if not map.has-key($base-colors, $name) {
|
|
401
|
+
@error 'rebrand(): unknown intent `#{$name}`. Expected one of: #{map.keys($base-colors)}.';
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
--wr-color-#{$name}: #{$base};
|
|
405
|
+
--wr-color-#{$name}-rgb: #{_rgb-channels($base)};
|
|
406
|
+
--wr-color-#{$name}-contrast: #{_contrast($base)};
|
|
407
|
+
--wr-color-#{$name}-dark: #{color.adjust($base, $lightness: -5%)};
|
|
408
|
+
--wr-color-#{$name}-darker: #{color.adjust($base, $lightness: -10%)};
|
|
409
|
+
// unused-ok: `-light` and `-lighter`, for the reason their `:root` twins
|
|
410
|
+
// carry — hover and active DEEPEN an intent, so the catalog reads `-dark` /
|
|
411
|
+
// `-darker` and never these two, and a shade set with holes in it is worse
|
|
412
|
+
// than one half of which is for consumers. They are here rather than only
|
|
413
|
+
// there because a rebrand has to emit the SAME set the `:root` loop does: a
|
|
414
|
+
// subtree that redefines four shades out of six leaves a consumer's own
|
|
415
|
+
// `var(--wr-color-primary-lighter)` on the page palette, which is the
|
|
416
|
+
// half-recoloured subtree this mixin exists to end.
|
|
417
|
+
--wr-color-#{$name}-light: #{color.adjust($base, $lightness: 5%)};
|
|
418
|
+
--wr-color-#{$name}-lighter: #{color.adjust($base, $lightness: 10%)};
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
@include derived;
|
|
422
|
+
}
|
|
423
|
+
|
|
322
424
|
:root {
|
|
323
425
|
// Declared here so the light token set also claims the light UA scheme.
|
|
324
426
|
// Without it the browser fell back to the OS preference, and an app running
|
package/theme/styles/_focus.scss
CHANGED
|
@@ -18,6 +18,35 @@
|
|
|
18
18
|
box-shadow: 0 0 0 var(--wr-focus-ring-offset) var(--wr-focus-ring-halo);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
// Button — `wr-btn`, `button[wr-btn]` and `a[wr-btn]` all carry `.wr-btn` on the
|
|
22
|
+
// element that takes focus, so one rule covers all three forms, and with them
|
|
23
|
+
// every control BUILT out of a button: the pagination page cells and its prev /
|
|
24
|
+
// next arrows are `<wr-btn>` elements with a `.wr-pagination__*` class beside
|
|
25
|
+
// this one.
|
|
26
|
+
//
|
|
27
|
+
// It was missing until v14.1, and the button is the widest hole that could have
|
|
28
|
+
// been left: `--wr-focus-ring-*` is documented as "retheme the ring once and
|
|
29
|
+
// every control follows", and rethemed the ring on nine components while the
|
|
30
|
+
// most-used control in the catalog kept the UA outline — which no token
|
|
31
|
+
// reaches, does not honour `--wr-focus-ring-width`, and renders differently in
|
|
32
|
+
// every browser. The rule sits here rather than in `button/styles` because this
|
|
33
|
+
// file IS the ring's home; a second hand-rolled copy is what the mixin exists to
|
|
34
|
+
// prevent.
|
|
35
|
+
//
|
|
36
|
+
// Safe as an OUTSET ring: `.wr-btn` sets no `overflow`, and the one place
|
|
37
|
+
// buttons are packed edge to edge — `.wr-btn-group` — already raises the focused
|
|
38
|
+
// segment with `z-index: 1`, so the ring paints over its neighbours instead of
|
|
39
|
+
// under them.
|
|
40
|
+
.wr-btn:focus-visible {
|
|
41
|
+
@include focus-ring;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Table column-sort control — a bare `<button>` inside `.wr-table__th-inner`,
|
|
45
|
+
// with no focus style of its own.
|
|
46
|
+
.wr-table__sort-btn:focus-visible {
|
|
47
|
+
@include focus-ring;
|
|
48
|
+
}
|
|
49
|
+
|
|
21
50
|
// Tabs — `.wr-tabs__strip` is `overflow-y: hidden` (to suppress a stray
|
|
22
51
|
// vertical scrollbar) and its box is exactly the tab's height, so an outset
|
|
23
52
|
// ring loses both horizontal strokes and renders as two disconnected bars.
|
|
@@ -102,7 +131,8 @@
|
|
|
102
131
|
@include focus-ring;
|
|
103
132
|
}
|
|
104
133
|
|
|
105
|
-
// Pagination ellipsis is non-interactive; page buttons
|
|
134
|
+
// Pagination ellipsis is non-interactive; page buttons take the `.wr-btn` rule
|
|
135
|
+
// at the top of this file, since that is what they are.
|
|
106
136
|
|
|
107
137
|
// Dropdown menu items
|
|
108
138
|
.wr-dropdown-item:focus-visible {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Dark theme.
|
|
2
|
+
//
|
|
3
|
+
// Keyed on `theme.dark-selector()`, never on a literal `[data-theme='dark']`.
|
|
4
|
+
// The attribute is renameable — `@use 'ngwr' with ($theme-attribute: '…')`
|
|
5
|
+
// alongside `provideWrTheme({ attribute: '…' })` — and a hand-written literal
|
|
6
|
+
// misses the rename in both directions: this block stops firing under the
|
|
7
|
+
// configured name, and it keeps firing under `data-theme`, which is the
|
|
8
|
+
// attribute a foreign design system owns and the rename exists to escape.
|
|
9
|
+
//
|
|
10
|
+
// It lives outside the `styleUrl` closure for the same reason. A component
|
|
11
|
+
// stylesheet is compiled when the LIBRARY is built, where `$theme-attribute` can
|
|
12
|
+
// only ever be the default, and Angular appends that copy after the app's linked
|
|
13
|
+
// sheet — so an inlined literal would not merely be dead, it would outrank the
|
|
14
|
+
// correctly-named rule beside it.
|
|
15
|
+
@use '../../theme/styles' as theme;
|
|
16
|
+
|
|
17
|
+
#{theme.dark-selector()} .wr-tilt-glare {
|
|
18
|
+
--wr-tilt-glare-color: rgb(255 255 255 / 25%);
|
|
19
|
+
|
|
20
|
+
mix-blend-mode: overlay;
|
|
21
|
+
}
|
|
@@ -11,5 +11,10 @@
|
|
|
11
11
|
// box-sizing reset into the compiled component styles, which ng-packagr then
|
|
12
12
|
// embeds in the FESM bundle as a string. `tilt-card.scss` forwards `_rules`
|
|
13
13
|
// instead, so it carries this component's own CSS and nothing else.
|
|
14
|
+
//
|
|
15
|
+
// `_dark` is loaded from HERE for a second reason: its selector is built out of
|
|
16
|
+
// `$theme-attribute`, which only a stylesheet compiled by the consuming app can
|
|
17
|
+
// configure, so a copy inside the bundle could only ever carry the default name.
|
|
14
18
|
@use '../../theme/styles';
|
|
15
19
|
@forward 'rules';
|
|
20
|
+
@forward 'dark';
|
package/toast/styles/_index.scss
CHANGED
|
@@ -209,14 +209,22 @@ $toast-colors: (
|
|
|
209
209
|
inset-inline-start: 0;
|
|
210
210
|
height: 2px;
|
|
211
211
|
width: 100%;
|
|
212
|
-
// `transform-origin` has no logical keyword
|
|
213
|
-
// `scaleX
|
|
214
|
-
// direction-aware rule
|
|
215
|
-
//
|
|
212
|
+
// `transform-origin` has no logical keyword and the drain is a physical
|
|
213
|
+
// `scaleX`, so the anchor cannot be renamed into a logical property — it has
|
|
214
|
+
// to be swapped by a direction-aware rule. The bar drains toward the reader's
|
|
215
|
+
// end, which means it stays anchored at the reader's START: physically left
|
|
216
|
+
// in LTR, physically right in RTL. Leaving it at `left` in both pinned the
|
|
217
|
+
// remaining time to the side an RTL reader's eye leaves from.
|
|
218
|
+
// rtl-ok: origin is one half of a physical scaleX pair, mirrored below
|
|
216
219
|
transform-origin: left;
|
|
217
220
|
background: var(--wr-toast-accent);
|
|
218
221
|
animation: wr-toast-progress linear forwards;
|
|
219
222
|
animation-duration: var(--wr-toast-duration, 4000ms);
|
|
223
|
+
|
|
224
|
+
[dir='rtl'] & {
|
|
225
|
+
// rtl-ok: the mirrored half of the pair above
|
|
226
|
+
transform-origin: right;
|
|
227
|
+
}
|
|
220
228
|
}
|
|
221
229
|
|
|
222
230
|
&:hover &__progress {
|
package/types/ngwr-alert.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ type WrAlertType = 'info' | 'success' | 'warning' | 'danger' | 'neutral' | 'offl
|
|
|
17
17
|
* @example
|
|
18
18
|
* ```html
|
|
19
19
|
* <wr-alert title="Saved" message="Your changes are live." type="success" />
|
|
20
|
-
* <wr-alert title="Failed" type="danger"
|
|
20
|
+
* <wr-alert title="Failed" type="danger" closable (closed)="onClose()" />
|
|
21
21
|
* ```
|
|
22
22
|
*
|
|
23
23
|
* @see https://ngwr.dev/reference/components/alert
|
|
@@ -62,7 +62,7 @@ declare class WrAlert {
|
|
|
62
62
|
*
|
|
63
63
|
* @default false
|
|
64
64
|
*/
|
|
65
|
-
readonly
|
|
65
|
+
readonly closable: _angular_core.InputSignalWithTransform<boolean, any>;
|
|
66
66
|
/**
|
|
67
67
|
* Emitted when the user dismisses the alert via the close button.
|
|
68
68
|
*/
|
|
@@ -74,7 +74,7 @@ declare class WrAlert {
|
|
|
74
74
|
protected readonly liveLevel: _angular_core.Signal<"assertive" | "polite" | null>;
|
|
75
75
|
protected onClose(): void;
|
|
76
76
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrAlert, never>;
|
|
77
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrAlert, "wr-alert", never, { "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "
|
|
77
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrAlert, "wr-alert", never, { "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
export { WrAlert };
|
|
@@ -67,6 +67,14 @@ declare class WrBlurText {
|
|
|
67
67
|
* watching the same host and all of them able to fire `animate()`.
|
|
68
68
|
*/
|
|
69
69
|
private observer;
|
|
70
|
+
/**
|
|
71
|
+
* The effect below reaches `startObserver()` through a `queueMicrotask`, so
|
|
72
|
+
* the component can be destroyed between the two. The destroy hook runs first
|
|
73
|
+
* and disconnects whatever exists at that moment — then the continuation
|
|
74
|
+
* builds a FRESH observer on a host Angular has already detached, and nothing
|
|
75
|
+
* is left to disconnect it. Same hazard, and same flag, as `wr-split-text`.
|
|
76
|
+
*/
|
|
77
|
+
private destroyed;
|
|
70
78
|
constructor();
|
|
71
79
|
private startObserver;
|
|
72
80
|
private animate;
|
package/types/ngwr-button.d.ts
CHANGED
|
@@ -65,6 +65,16 @@ type WrButtonIconPosition = 'start' | 'end';
|
|
|
65
65
|
* every child — child `[shape]` inputs are ignored so the group reads as
|
|
66
66
|
* one coherent control.
|
|
67
67
|
*
|
|
68
|
+
* **Inside a `<form>`, use the native form.** `<wr-btn>` is a custom element
|
|
69
|
+
* carrying `role="button"`, and no custom element submits a form — the platform
|
|
70
|
+
* submits for `<button>`, `<input type="submit">` and `<input type="image">`
|
|
71
|
+
* and nothing else. That is why there is no `type` input: it would look like it
|
|
72
|
+
* worked. Implicit submission (Enter in a text field) does not reach it either.
|
|
73
|
+
*
|
|
74
|
+
* ```html
|
|
75
|
+
* <button wr-btn type="submit" color="primary">Save</button>
|
|
76
|
+
* ```
|
|
77
|
+
*
|
|
68
78
|
* @see https://ngwr.dev/reference/components/button
|
|
69
79
|
*/
|
|
70
80
|
declare class WrButton {
|
|
@@ -117,7 +127,7 @@ declare class WrButton {
|
|
|
117
127
|
*
|
|
118
128
|
* @default true
|
|
119
129
|
*/
|
|
120
|
-
readonly
|
|
130
|
+
readonly disabledWhenLoading: _angular_core.InputSignalWithTransform<boolean, any>;
|
|
121
131
|
private readonly group;
|
|
122
132
|
/** The size, or the app-wide default, or `md`. @see useConfigValue */
|
|
123
133
|
protected readonly resolvedSize: _angular_core.Signal<WrButtonSize>;
|
|
@@ -162,9 +172,42 @@ declare class WrButton {
|
|
|
162
172
|
* `pointer-events: none`.
|
|
163
173
|
*/
|
|
164
174
|
protected onHostKeydown(event: KeyboardEvent): void;
|
|
175
|
+
private readonly injector;
|
|
176
|
+
/**
|
|
177
|
+
* Whether this button is the one the caret was on, so it can be handed back
|
|
178
|
+
* the focus that goes missing while it is off.
|
|
179
|
+
*
|
|
180
|
+
* A control that becomes `disabled` while focused stops being a focusable
|
|
181
|
+
* area, and the browser runs the unfocusing steps: nothing else is nominated,
|
|
182
|
+
* so the caret lands on `<body>`. With `disabledWhenLoading` on by default
|
|
183
|
+
* that happens on EVERY async button — a keyboard user presses Enter on
|
|
184
|
+
* "Save" and the next Tab restarts from the top of the document, while a
|
|
185
|
+
* screen-reader user is told neither that the wait began nor that it ended,
|
|
186
|
+
* because the element they were on has left the a11y tree. The `<wr-btn>`
|
|
187
|
+
* element form loses its `tabindex` instead of gaining `disabled` and is
|
|
188
|
+
* unfocused for the same reason.
|
|
189
|
+
*
|
|
190
|
+
* Deliberately NOT keyed on reading `activeElement` when `isOff()` flips: an
|
|
191
|
+
* effect in this component's own view runs AFTER the parent has applied this
|
|
192
|
+
* directive's host bindings, so by then the attribute has landed and the
|
|
193
|
+
* browser has already moved the caret — the read would answer `<body>` on
|
|
194
|
+
* every real browser and the button on jsdom, which is the worst of both.
|
|
195
|
+
*
|
|
196
|
+
* The flag is written by the focus listeners instead, and a `blur` fired
|
|
197
|
+
* WHILE off keeps it set rather than clearing it: that blur is the browser
|
|
198
|
+
* taking the caret away, not the user leaving. A browser that fires no blur
|
|
199
|
+
* on disable at all is covered too — the flag simply stays as `focus` left it,
|
|
200
|
+
* and the `<body>` test below is what decides whether the focus is orphaned.
|
|
201
|
+
*/
|
|
202
|
+
private hadFocus;
|
|
203
|
+
/** @internal Host `focus` — see `hadFocus`. */
|
|
204
|
+
protected onHostFocus(): void;
|
|
205
|
+
/** @internal Host `blur` — see `hadFocus`. */
|
|
206
|
+
protected onHostBlur(): void;
|
|
207
|
+
constructor();
|
|
165
208
|
protected readonly classes: _angular_core.Signal<string>;
|
|
166
209
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrButton, never>;
|
|
167
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrButton, "wr-btn, button[wr-btn], a[wr-btn]", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconPosition": { "alias": "iconPosition"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "outlined": { "alias": "outlined"; "required": false; "isSignal": true; }; "block": { "alias": "block"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "
|
|
210
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrButton, "wr-btn, button[wr-btn], a[wr-btn]", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconPosition": { "alias": "iconPosition"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "outlined": { "alias": "outlined"; "required": false; "isSignal": true; }; "block": { "alias": "block"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "disabledWhenLoading": { "alias": "disabledWhenLoading"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
168
211
|
}
|
|
169
212
|
|
|
170
213
|
/**
|
|
@@ -8,6 +8,12 @@ import { WrCalendarMode } from 'ngwr/calendar';
|
|
|
8
8
|
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
/**
|
|
12
|
+
* An arrow key, by the direction a user would say out loud — the parameter type
|
|
13
|
+
* of `WrCalendarHarness.pressArrow`, exported so a consumer's own test helper can
|
|
14
|
+
* name what it forwards.
|
|
15
|
+
*/
|
|
16
|
+
type WrCalendarArrowKey = 'left' | 'right' | 'up' | 'down';
|
|
11
17
|
/** Which of the three sub-views the calendar is showing. */
|
|
12
18
|
type WrCalendarView = 'day' | 'month' | 'year';
|
|
13
19
|
/** One month or year chip, as the picker views render them. */
|
|
@@ -82,6 +88,19 @@ declare class WrCalendarDayHarness extends ComponentHarness {
|
|
|
82
88
|
getText(): Promise<string>;
|
|
83
89
|
/** The day number as a number, for mapping a list of cells to dates. */
|
|
84
90
|
getDayOfMonth(): Promise<number>;
|
|
91
|
+
/**
|
|
92
|
+
* What a screen reader announces for this cell — "Thursday, January 15, 2026".
|
|
93
|
+
*
|
|
94
|
+
* A SECOND question from {@link getText}, and the reason this method exists:
|
|
95
|
+
* until v14 the cell had no name at all, so the two answers were "15" and
|
|
96
|
+
* nothing. A spec that reads only the drawn number passes on a grid that
|
|
97
|
+
* announces bare integers with no month, year or weekday anywhere in it.
|
|
98
|
+
*
|
|
99
|
+
* The string is `calendar.dayLabel` interpolated with the adapter's
|
|
100
|
+
* `longDate`, so it moves with the locale AND with the adapter — assert
|
|
101
|
+
* against the pair your spec provides, not against an English literal.
|
|
102
|
+
*/
|
|
103
|
+
getAccessibleName(): Promise<string | null>;
|
|
85
104
|
/** `'gridcell'` — the cell is a button, and the grid semantics are what a spec should assert. */
|
|
86
105
|
getRole(): Promise<string | null>;
|
|
87
106
|
/** Whether this day is (one end of) the current selection. */
|
|
@@ -122,8 +141,6 @@ declare class WrCalendarDayHarness extends ComponentHarness {
|
|
|
122
141
|
* found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
|
|
123
142
|
*/
|
|
124
143
|
|
|
125
|
-
/** The arrow keys, by the direction a user would say out loud. */
|
|
126
|
-
type Arrow = 'left' | 'right' | 'up' | 'down';
|
|
127
144
|
/**
|
|
128
145
|
* Test harness for `<wr-calendar>` — the standalone month grid, and the one
|
|
129
146
|
* `<wr-date-picker>` puts in an overlay.
|
|
@@ -244,7 +261,7 @@ declare class WrCalendarHarness extends ComponentHarness {
|
|
|
244
261
|
* having managed to focus a cell. Under `dir="rtl"` the horizontal pair mirrors:
|
|
245
262
|
* ArrowRight goes back a day, because the grid itself is mirrored.
|
|
246
263
|
*/
|
|
247
|
-
pressArrow(arrow:
|
|
264
|
+
pressArrow(arrow: WrCalendarArrowKey): Promise<void>;
|
|
248
265
|
/** Press Home — the first day of the roving cell's week, not of the month. */
|
|
249
266
|
pressHome(): Promise<void>;
|
|
250
267
|
/** Press End — the last day of the roving cell's week. */
|
|
@@ -274,4 +291,4 @@ declare class WrCalendarHarness extends ComponentHarness {
|
|
|
274
291
|
}
|
|
275
292
|
|
|
276
293
|
export { WrCalendarDayHarness, WrCalendarHarness };
|
|
277
|
-
export type { WrCalendarChip, WrCalendarDayHarnessFilters, WrCalendarHarnessFilters, WrCalendarView };
|
|
294
|
+
export type { WrCalendarArrowKey, WrCalendarChip, WrCalendarDayHarnessFilters, WrCalendarHarnessFilters, WrCalendarView };
|
package/types/ngwr-calendar.d.ts
CHANGED
|
@@ -104,7 +104,44 @@ declare class WrCalendar {
|
|
|
104
104
|
protected readonly monthsView: _angular_core.Signal<readonly string[]>;
|
|
105
105
|
/** 12-year window centered on the floor-aligned decade containing `viewDate`. */
|
|
106
106
|
protected readonly yearsView: _angular_core.Signal<readonly number[]>;
|
|
107
|
+
/**
|
|
108
|
+
* The header above the grid.
|
|
109
|
+
*
|
|
110
|
+
* Both templated strings used to be assembled here: `${month} ${year}` and
|
|
111
|
+
* `${first} – ${last}`. That is English word order with an English separator
|
|
112
|
+
* baked into TypeScript, and no catalog could move either — ja-JP writes
|
|
113
|
+
* 2026年3月, which is not a translation of any word in `March 2026` but a
|
|
114
|
+
* different arrangement of the same two values. So the arrangement is the
|
|
115
|
+
* translatable unit, and `calendar.header` / `calendar.yearRange` are it.
|
|
116
|
+
*/
|
|
107
117
|
protected readonly headerLabel: _angular_core.Signal<string>;
|
|
118
|
+
private readonly headerText;
|
|
119
|
+
private readonly yearRangeText;
|
|
120
|
+
private readonly dayLabelText;
|
|
121
|
+
/**
|
|
122
|
+
* Long weekday names for the cell names.
|
|
123
|
+
*
|
|
124
|
+
* `getDayOfWeekNames` returns them in COLUMN order — index 0 is
|
|
125
|
+
* `getFirstDayOfWeek()`, not Sunday — which is what the header strip wants and
|
|
126
|
+
* what a `getDayOfWeek()` result (0 = Sunday) must be rotated into. Indexing
|
|
127
|
+
* it directly reads Monday's name for a Sunday in every locale that starts its
|
|
128
|
+
* week on Monday, which is most of them.
|
|
129
|
+
*/
|
|
130
|
+
private readonly longWeekdays;
|
|
131
|
+
/**
|
|
132
|
+
* A day cell's accessible name — "Sunday, March 15, 2026".
|
|
133
|
+
*
|
|
134
|
+
* The cell had none. Its only content is the day NUMBER, and `role="gridcell"`
|
|
135
|
+
* does not inherit a name from the grid's header or from the column header
|
|
136
|
+
* above it, so every date in the month announced as a bare number: the month,
|
|
137
|
+
* the year and the weekday were all on screen and none of them reachable.
|
|
138
|
+
*
|
|
139
|
+
* `{{date}}` is the adapter's `longDate`, so its field order, its separators
|
|
140
|
+
* and its digits are `Intl`'s — the catalog decides only where the weekday
|
|
141
|
+
* goes. Building it from `getMonthNames('long')` instead would have hard-coded
|
|
142
|
+
* the nominative month, which Russian and Finnish inflect inside a date.
|
|
143
|
+
*/
|
|
144
|
+
protected dayLabel(date: Date): string;
|
|
108
145
|
/** 6×7 day grid covering the current month plus spillover. */
|
|
109
146
|
protected readonly weeks: _angular_core.Signal<readonly (readonly Date[])[]>;
|
|
110
147
|
/**
|
|
@@ -33,6 +33,15 @@ declare class WrCircularText {
|
|
|
33
33
|
private readonly platform;
|
|
34
34
|
private rotation;
|
|
35
35
|
private hovered;
|
|
36
|
+
/**
|
|
37
|
+
* The effect below reaches `startOrSwap()` through a `queueMicrotask`, so the
|
|
38
|
+
* ring can be destroyed between the two. Without this flag the continuation
|
|
39
|
+
* then starts an infinite Web Animation on a host Angular has already
|
|
40
|
+
* detached — and an animation keeps its target alive, so the whole `#spin`
|
|
41
|
+
* subtree is retained for the life of the page. Same hazard, and same flag, as
|
|
42
|
+
* `wr-split-text` and `wr-fuzzy-text`.
|
|
43
|
+
*/
|
|
44
|
+
private destroyed;
|
|
36
45
|
/** Active spin duration in seconds — base, or hover-modified. */
|
|
37
46
|
private effectiveDuration;
|
|
38
47
|
constructor();
|