igniteui-webcomponents 7.3.1 → 7.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +72 -1
- package/animations/easings.d.ts +21 -31
- package/animations/easings.js +21 -34
- package/animations/easings.js.map +1 -1
- package/animations/player.d.ts +8 -16
- package/animations/player.js +5 -8
- package/animations/player.js.map +1 -1
- package/animations/view-transition.d.ts +10 -10
- package/animations/view-transition.js +26 -37
- package/animations/view-transition.js.map +1 -1
- package/components/avatar/themes/avatar.base.css.js +1 -1
- package/components/avatar/themes/avatar.base.css.js.map +1 -1
- package/components/badge/themes/badge.base.css.js +1 -1
- package/components/badge/themes/badge.base.css.js.map +1 -1
- package/components/banner/themes/banner.base.css.js +1 -1
- package/components/banner/themes/banner.base.css.js.map +1 -1
- package/components/banner/themes/shared/banner.indigo.css.js +1 -1
- package/components/banner/themes/shared/banner.indigo.css.js.map +1 -1
- package/components/breadcrumb/breadcrumb.d.ts +74 -0
- package/components/breadcrumb/breadcrumb.js +107 -0
- package/components/breadcrumb/breadcrumb.js.map +1 -0
- package/components/breadcrumb/breadcrumbs.d.ts +60 -0
- package/components/breadcrumb/breadcrumbs.js +50 -0
- package/components/breadcrumb/breadcrumbs.js.map +1 -0
- package/components/breadcrumb/themes/breadcrumb.base.css.d.ts +1 -0
- package/components/breadcrumb/themes/breadcrumb.base.css.js +3 -0
- package/components/breadcrumb/themes/breadcrumb.base.css.js.map +1 -0
- package/components/breadcrumb/themes/breadcrumbs.base.css.d.ts +1 -0
- package/components/breadcrumb/themes/breadcrumbs.base.css.js +3 -0
- package/components/breadcrumb/themes/breadcrumbs.base.css.js.map +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.bootstrap.css.d.ts +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.bootstrap.css.js +3 -0
- package/components/breadcrumb/themes/dark/breadcrumb.bootstrap.css.js.map +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.fluent.css.d.ts +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.fluent.css.js +3 -0
- package/components/breadcrumb/themes/dark/breadcrumb.fluent.css.js.map +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.indigo.css.d.ts +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.indigo.css.js +3 -0
- package/components/breadcrumb/themes/dark/breadcrumb.indigo.css.js.map +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.material.css.d.ts +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.material.css.js +3 -0
- package/components/breadcrumb/themes/dark/breadcrumb.material.css.js.map +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.bootstrap.css.d.ts +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.bootstrap.css.js +3 -0
- package/components/breadcrumb/themes/light/breadcrumb.bootstrap.css.js.map +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.fluent.css.d.ts +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.fluent.css.js +3 -0
- package/components/breadcrumb/themes/light/breadcrumb.fluent.css.js.map +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.indigo.css.d.ts +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.indigo.css.js +3 -0
- package/components/breadcrumb/themes/light/breadcrumb.indigo.css.js.map +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.material.css.d.ts +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.material.css.js +3 -0
- package/components/breadcrumb/themes/light/breadcrumb.material.css.js.map +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.shared.css.d.ts +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.shared.css.js +3 -0
- package/components/breadcrumb/themes/light/breadcrumb.shared.css.js.map +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.bootstrap.css.d.ts +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.bootstrap.css.js +3 -0
- package/components/breadcrumb/themes/shared/breadcrumb.bootstrap.css.js.map +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.common.css.d.ts +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.common.css.js +3 -0
- package/components/breadcrumb/themes/shared/breadcrumb.common.css.js.map +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.fluent.css.d.ts +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.fluent.css.js +3 -0
- package/components/breadcrumb/themes/shared/breadcrumb.fluent.css.js.map +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.indigo.css.d.ts +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.indigo.css.js +3 -0
- package/components/breadcrumb/themes/shared/breadcrumb.indigo.css.js.map +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.material.css.d.ts +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.material.css.js +3 -0
- package/components/breadcrumb/themes/shared/breadcrumb.material.css.js.map +1 -0
- package/components/breadcrumb/themes/themes.d.ts +2 -0
- package/components/breadcrumb/themes/themes.js +50 -0
- package/components/breadcrumb/themes/themes.js.map +1 -0
- package/components/button/button.d.ts +0 -2
- package/components/button/button.js.map +1 -1
- package/components/button-group/button-group.d.ts +42 -12
- package/components/button-group/button-group.js +82 -34
- package/components/button-group/button-group.js.map +1 -1
- package/components/button-group/toggle-button.d.ts +6 -1
- package/components/button-group/toggle-button.js +28 -2
- package/components/button-group/toggle-button.js.map +1 -1
- package/components/calendar/base.d.ts +7 -2
- package/components/calendar/base.js +10 -4
- package/components/calendar/base.js.map +1 -1
- package/components/calendar/calendar.d.ts +6 -3
- package/components/calendar/calendar.js +41 -14
- package/components/calendar/calendar.js.map +1 -1
- package/components/calendar/days-view/days-view.d.ts +5 -8
- package/components/calendar/days-view/days-view.js +7 -16
- package/components/calendar/days-view/days-view.js.map +1 -1
- package/components/calendar/helpers.d.ts +13 -0
- package/components/calendar/helpers.js +15 -0
- package/components/calendar/helpers.js.map +1 -1
- package/components/calendar/themes/calendar.base.css.js +1 -1
- package/components/calendar/themes/calendar.base.css.js.map +1 -1
- package/components/calendar/themes/days-view.base.css.js +1 -1
- package/components/calendar/themes/days-view.base.css.js.map +1 -1
- package/components/calendar/themes/shared/bootstrap/calendar.bootstrap.css.js +1 -1
- package/components/calendar/themes/shared/bootstrap/calendar.bootstrap.css.js.map +1 -1
- package/components/calendar/themes/shared/bootstrap/days-view.bootstrap.css.js +1 -1
- package/components/calendar/themes/shared/bootstrap/days-view.bootstrap.css.js.map +1 -1
- package/components/calendar/themes/shared/fluent/days-view.fluent.css.js +1 -1
- package/components/calendar/themes/shared/fluent/days-view.fluent.css.js.map +1 -1
- package/components/calendar/themes/shared/indigo/calendar.indigo.css.js +1 -1
- package/components/calendar/themes/shared/indigo/calendar.indigo.css.js.map +1 -1
- package/components/calendar/themes/shared/indigo/days-view.indigo.css.js +1 -1
- package/components/calendar/themes/shared/indigo/days-view.indigo.css.js.map +1 -1
- package/components/calendar/themes/shared/material/days-view.material.css.js +1 -1
- package/components/calendar/themes/shared/material/days-view.material.css.js.map +1 -1
- package/components/calendar/themes/year-month-view.base.css.js +1 -1
- package/components/calendar/themes/year-month-view.base.css.js.map +1 -1
- package/components/card/themes/container.base.css.js +1 -1
- package/components/card/themes/container.base.css.js.map +1 -1
- package/components/carousel/carousel-indicator.js +1 -0
- package/components/carousel/carousel-indicator.js.map +1 -1
- package/components/carousel/carousel-slide.d.ts +1 -1
- package/components/carousel/carousel-slide.js.map +1 -1
- package/components/carousel/carousel.d.ts +3 -3
- package/components/carousel/carousel.js.map +1 -1
- package/components/carousel/themes/carousel.base.css.js +1 -1
- package/components/carousel/themes/carousel.base.css.js.map +1 -1
- package/components/carousel/themes/shared/carousel.indigo.css.js +1 -1
- package/components/carousel/themes/shared/carousel.indigo.css.js.map +1 -1
- package/components/chat/chat-input.d.ts +1 -2
- package/components/chat/chat-input.js +1 -1
- package/components/chat/chat-input.js.map +1 -1
- package/components/chat/chat-state.d.ts +8 -9
- package/components/chat/chat-state.js.map +1 -1
- package/components/chat/chat.d.ts +1 -3
- package/components/chat/chat.js +2 -2
- package/components/chat/chat.js.map +1 -1
- package/components/chat/message-attachments.d.ts +6 -15
- package/components/chat/message-attachments.js.map +1 -1
- package/components/chat/themes/chat.base.css.js +1 -1
- package/components/chat/themes/chat.base.css.js.map +1 -1
- package/components/chat/themes/message.base.css.js +1 -1
- package/components/chat/themes/message.base.css.js.map +1 -1
- package/components/chat/utils.d.ts +0 -1
- package/components/chat/utils.js +1 -1
- package/components/chat/utils.js.map +1 -1
- package/components/checkbox/checkbox-base.d.ts +1 -1
- package/components/checkbox/checkbox.js +1 -1
- package/components/checkbox/checkbox.js.map +1 -1
- package/components/checkbox/themes/checkbox.base.css.js +1 -1
- package/components/checkbox/themes/checkbox.base.css.js.map +1 -1
- package/components/checkbox/themes/shared/checkbox/checkbox.bootstrap.css.js +1 -1
- package/components/checkbox/themes/shared/checkbox/checkbox.bootstrap.css.js.map +1 -1
- package/components/checkbox/themes/shared/checkbox/checkbox.fluent.css.js +1 -1
- package/components/checkbox/themes/shared/checkbox/checkbox.fluent.css.js.map +1 -1
- package/components/checkbox/themes/shared/switch/switch.bootstrap.css.js +1 -1
- package/components/checkbox/themes/shared/switch/switch.bootstrap.css.js.map +1 -1
- package/components/checkbox/themes/shared/switch/switch.fluent.css.js +1 -1
- package/components/checkbox/themes/shared/switch/switch.fluent.css.js.map +1 -1
- package/components/checkbox/themes/shared/switch/switch.indigo.css.js +1 -1
- package/components/checkbox/themes/shared/switch/switch.indigo.css.js.map +1 -1
- package/components/checkbox/themes/shared/switch/switch.material.css.js +1 -1
- package/components/checkbox/themes/shared/switch/switch.material.css.js.map +1 -1
- package/components/checkbox/themes/switch.base.css.js +1 -1
- package/components/checkbox/themes/switch.base.css.js.map +1 -1
- package/components/chip/chip.d.ts +2 -2
- package/components/chip/chip.js.map +1 -1
- package/components/color-picker/color-picker.d.ts +35 -34
- package/components/color-picker/color-picker.js +9 -4
- package/components/color-picker/color-picker.js.map +1 -1
- package/components/color-picker/common.d.ts +0 -2
- package/components/color-picker/common.js +2 -2
- package/components/color-picker/common.js.map +1 -1
- package/components/color-picker/converters.js.map +1 -1
- package/components/color-picker/picker-canvas.js.map +1 -1
- package/components/color-picker/themes/color-picker.base.css.js +1 -1
- package/components/color-picker/themes/color-picker.base.css.js.map +1 -1
- package/components/combo/combo.d.ts +18 -20
- package/components/combo/combo.js +8 -2
- package/components/combo/combo.js.map +1 -1
- package/components/combo/controllers/data.d.ts +7 -10
- package/components/combo/controllers/data.js.map +1 -1
- package/components/combo/themes/combo-item.base.css.js +1 -1
- package/components/combo/themes/combo-item.base.css.js.map +1 -1
- package/components/combo/themes/combo.base.css.js +1 -1
- package/components/combo/themes/combo.base.css.js.map +1 -1
- package/components/combo/themes/shared/combo.bootstrap.css.js +1 -1
- package/components/combo/themes/shared/combo.bootstrap.css.js.map +1 -1
- package/components/date-picker/date-picker.base.d.ts +33 -29
- package/components/date-picker/date-picker.base.js +15 -4
- package/components/date-picker/date-picker.base.js.map +1 -1
- package/components/date-picker/date-picker.d.ts +1 -1
- package/components/date-picker/date-picker.js +5 -3
- package/components/date-picker/date-picker.js.map +1 -1
- package/components/date-picker/themes/date-picker.base.css.js +1 -1
- package/components/date-picker/themes/date-picker.base.css.js.map +1 -1
- package/components/date-range-picker/date-range-input.d.ts +0 -2
- package/components/date-range-picker/date-range-input.js +0 -6
- package/components/date-range-picker/date-range-input.js.map +1 -1
- package/components/date-range-picker/date-range-picker.base.css.js +1 -1
- package/components/date-range-picker/date-range-picker.base.css.js.map +1 -1
- package/components/date-range-picker/date-range-picker.d.ts +22 -31
- package/components/date-range-picker/date-range-picker.js +7 -7
- package/components/date-range-picker/date-range-picker.js.map +1 -1
- package/components/date-range-picker/i18n.d.ts +21 -0
- package/components/date-range-picker/i18n.js +10 -0
- package/components/date-range-picker/i18n.js.map +1 -0
- package/components/date-range-picker/predefined-ranges-area.base.css.js +1 -1
- package/components/date-range-picker/predefined-ranges-area.base.css.js.map +1 -1
- package/components/date-range-picker/predefined-ranges-area.d.ts +3 -3
- package/components/date-range-picker/predefined-ranges-area.js +2 -5
- package/components/date-range-picker/predefined-ranges-area.js.map +1 -1
- package/components/date-range-picker/validators.d.ts +0 -4
- package/components/date-range-picker/validators.js +4 -4
- package/components/date-range-picker/validators.js.map +1 -1
- package/components/date-time-input/date-time-input.base.d.ts +39 -37
- package/components/date-time-input/date-time-input.base.js +6 -0
- package/components/date-time-input/date-time-input.base.js.map +1 -1
- package/components/date-time-input/date-time-input.d.ts +1 -11
- package/components/date-time-input/date-time-input.js +0 -6
- package/components/date-time-input/date-time-input.js.map +1 -1
- package/components/date-time-input/datetime-mask-parser.d.ts +0 -10
- package/components/date-time-input/datetime-mask-parser.js +1 -1
- package/components/date-time-input/datetime-mask-parser.js.map +1 -1
- package/components/dialog/dialog.js.map +1 -1
- package/components/divider/themes/divider.base.css.js +1 -1
- package/components/divider/themes/divider.base.css.js.map +1 -1
- package/components/dropdown/dropdown-group.d.ts +2 -10
- package/components/dropdown/dropdown-group.js +2 -27
- package/components/dropdown/dropdown-group.js.map +1 -1
- package/components/dropdown/dropdown.d.ts +17 -23
- package/components/dropdown/dropdown.js +5 -17
- package/components/dropdown/dropdown.js.map +1 -1
- package/components/dropdown/themes/dropdown-item.base.css.js +1 -1
- package/components/dropdown/themes/dropdown-item.base.css.js.map +1 -1
- package/components/dropdown/themes/dropdown.base.css.js +1 -1
- package/components/dropdown/themes/dropdown.base.css.js.map +1 -1
- package/components/file-input/file-input.d.ts +2 -2
- package/components/file-input/file-input.js.map +1 -1
- package/components/file-input/themes/file-input.base.css.js +1 -1
- package/components/file-input/themes/file-input.base.css.js.map +1 -1
- package/components/file-input/themes/shared/file-input.bootstrap.css.js +1 -1
- package/components/file-input/themes/shared/file-input.bootstrap.css.js.map +1 -1
- package/components/icon/icon.d.ts +1 -1
- package/components/icon/icon.registry.d.ts +6 -6
- package/components/icon/icon.registry.js.map +1 -1
- package/components/input/input.d.ts +3 -3
- package/components/input/input.js.map +1 -1
- package/components/input/themes/shared/input.indigo.css.js +1 -1
- package/components/input/themes/shared/input.indigo.css.js.map +1 -1
- package/components/input/themes/shared/input.material.css.js +1 -1
- package/components/input/themes/shared/input.material.css.js.map +1 -1
- package/components/list/themes/item.base.css.js +1 -1
- package/components/list/themes/item.base.css.js.map +1 -1
- package/components/mask-input/mask-history.d.ts +22 -18
- package/components/mask-input/mask-history.js.map +1 -1
- package/components/mask-input/mask-input.d.ts +1 -1
- package/components/mask-input/mask-parser.d.ts +11 -13
- package/components/mask-input/mask-parser.js.map +1 -1
- package/components/nav-drawer/themes/item.base.css.js +1 -1
- package/components/nav-drawer/themes/item.base.css.js.map +1 -1
- package/components/popover/popover.d.ts +45 -34
- package/components/popover/popover.js +54 -122
- package/components/popover/popover.js.map +1 -1
- package/components/popover/position/arrow.d.ts +19 -0
- package/components/popover/position/arrow.js +33 -0
- package/components/popover/position/arrow.js.map +1 -0
- package/components/popover/position/floating.d.ts +40 -0
- package/components/popover/position/floating.js +146 -0
- package/components/popover/position/floating.js.map +1 -0
- package/components/popover/position/native.d.ts +45 -0
- package/components/popover/position/native.js +158 -0
- package/components/popover/position/native.js.map +1 -0
- package/components/popover/position/strategy.d.ts +37 -0
- package/components/popover/position/strategy.js +21 -0
- package/components/popover/position/strategy.js.map +1 -0
- package/components/popover/position/types.d.ts +26 -0
- package/components/popover/position/types.js +15 -0
- package/components/popover/position/types.js.map +1 -0
- package/components/popover/themes/light/popover.base.css.js +1 -1
- package/components/popover/themes/light/popover.base.css.js.map +1 -1
- package/components/progress/circular-progress.d.ts +0 -5
- package/components/progress/circular-progress.js.map +1 -1
- package/components/progress/themes/linear/linear.progress.base.css.js +1 -1
- package/components/progress/themes/linear/linear.progress.base.css.js.map +1 -1
- package/components/progress/themes/linear/shared/linear.progress.bootstrap.css.d.ts +1 -0
- package/components/progress/themes/linear/shared/linear.progress.bootstrap.css.js +3 -0
- package/components/progress/themes/linear/shared/linear.progress.bootstrap.css.js.map +1 -0
- package/components/progress/themes/linear/themes.js +3 -2
- package/components/progress/themes/linear/themes.js.map +1 -1
- package/components/qr-code/qr-code.d.ts +29 -2
- package/components/qr-code/qr-code.js +56 -13
- package/components/qr-code/qr-code.js.map +1 -1
- package/components/qr-code/renderer/export.d.ts +28 -0
- package/components/qr-code/renderer/export.js +120 -0
- package/components/qr-code/renderer/export.js.map +1 -0
- package/components/qr-code/types.d.ts +26 -0
- package/components/qr-code/types.js.map +1 -1
- package/components/radio/radio.d.ts +4 -4
- package/components/radio/radio.js +17 -14
- package/components/radio/radio.js.map +1 -1
- package/components/radio/themes/radio.base.css.js +1 -1
- package/components/radio/themes/radio.base.css.js.map +1 -1
- package/components/radio/themes/shared/radio.bootstrap.css.js +1 -1
- package/components/radio/themes/shared/radio.bootstrap.css.js.map +1 -1
- package/components/radio/themes/shared/radio.indigo.css.js +1 -1
- package/components/radio/themes/shared/radio.indigo.css.js.map +1 -1
- package/components/radio-group/radio-group.js.map +1 -1
- package/components/rating/rating.d.ts +6 -6
- package/components/rating/rating.js.map +1 -1
- package/components/select/select-group.d.ts +5 -10
- package/components/select/select-group.js +10 -34
- package/components/select/select-group.js.map +1 -1
- package/components/select/select.d.ts +12 -20
- package/components/select/select.js +4 -14
- package/components/select/select.js.map +1 -1
- package/components/select/themes/select.base.css.js +1 -1
- package/components/select/themes/select.base.css.js.map +1 -1
- package/components/select/themes/shared/select.bootstrap.css.js +1 -1
- package/components/select/themes/shared/select.bootstrap.css.js.map +1 -1
- package/components/slider/themes/shared/slider.material.css.js +1 -1
- package/components/slider/themes/shared/slider.material.css.js.map +1 -1
- package/components/slider/themes/slider.base.css.js +1 -1
- package/components/slider/themes/slider.base.css.js.map +1 -1
- package/components/snackbar/themes/snackbar.base.css.js +1 -1
- package/components/snackbar/themes/snackbar.base.css.js.map +1 -1
- package/components/splitter/splitter.d.ts +6 -6
- package/components/splitter/splitter.js.map +1 -1
- package/components/splitter/themes/splitter.base.css.js +1 -1
- package/components/splitter/themes/splitter.base.css.js.map +1 -1
- package/components/stepper/themes/step/step.base.css.js +1 -1
- package/components/stepper/themes/step/step.base.css.js.map +1 -1
- package/components/tabs/themes/shared/tab/tab.bootstrap.css.js +1 -1
- package/components/tabs/themes/shared/tab/tab.bootstrap.css.js.map +1 -1
- package/components/tabs/themes/shared/tab/tab.fluent.css.js +1 -1
- package/components/tabs/themes/shared/tab/tab.fluent.css.js.map +1 -1
- package/components/tabs/themes/shared/tab/tab.indigo.css.js +1 -1
- package/components/tabs/themes/shared/tab/tab.indigo.css.js.map +1 -1
- package/components/tabs/themes/shared/tab/tab.material.css.js +1 -1
- package/components/tabs/themes/shared/tab/tab.material.css.js.map +1 -1
- package/components/tabs/themes/shared/tabs/tabs.fluent.css.js +1 -1
- package/components/tabs/themes/shared/tabs/tabs.fluent.css.js.map +1 -1
- package/components/tabs/themes/shared/tabs/tabs.indigo.css.js +1 -1
- package/components/tabs/themes/shared/tabs/tabs.indigo.css.js.map +1 -1
- package/components/tabs/themes/shared/tabs/tabs.material.css.js +1 -1
- package/components/tabs/themes/shared/tabs/tabs.material.css.js.map +1 -1
- package/components/tabs/themes/tab.base.css.js +1 -1
- package/components/tabs/themes/tab.base.css.js.map +1 -1
- package/components/textarea/textarea.d.ts +1 -1
- package/components/textarea/textarea.js.map +1 -1
- package/components/textarea/themes/shared/textarea.bootstrap.css.js +1 -1
- package/components/textarea/themes/shared/textarea.bootstrap.css.js.map +1 -1
- package/components/textarea/themes/shared/textarea.common.css.js +1 -1
- package/components/textarea/themes/shared/textarea.common.css.js.map +1 -1
- package/components/textarea/themes/shared/textarea.fluent.css.js +1 -1
- package/components/textarea/themes/shared/textarea.fluent.css.js.map +1 -1
- package/components/textarea/themes/shared/textarea.indigo.css.js +1 -1
- package/components/textarea/themes/shared/textarea.indigo.css.js.map +1 -1
- package/components/textarea/themes/shared/textarea.material.css.js +1 -1
- package/components/textarea/themes/shared/textarea.material.css.js.map +1 -1
- package/components/tile-manager/themes/tile.base.css.js +1 -1
- package/components/tile-manager/themes/tile.base.css.js.map +1 -1
- package/components/tile-manager/tile-manager.d.ts +6 -7
- package/components/tile-manager/tile-manager.js.map +1 -1
- package/components/tile-manager/tile.d.ts +3 -3
- package/components/tile-manager/tile.js.map +1 -1
- package/components/toast/themes/toast.base.css.js +1 -1
- package/components/toast/themes/toast.base.css.js.map +1 -1
- package/components/toast/toast.d.ts +0 -2
- package/components/toast/toast.js.map +1 -1
- package/components/tooltip/controller.js.map +1 -1
- package/components/tooltip/service.js +4 -5
- package/components/tooltip/service.js.map +1 -1
- package/components/tooltip/themes/tooltip.base.css.js +1 -1
- package/components/tooltip/themes/tooltip.base.css.js.map +1 -1
- package/components/tooltip/tooltip.d.ts +34 -13
- package/components/tooltip/tooltip.js +8 -4
- package/components/tooltip/tooltip.js.map +1 -1
- package/components/tree/themes/item.base.css.js +1 -1
- package/components/tree/themes/item.base.css.js.map +1 -1
- package/components/tree/tree-item.d.ts +6 -6
- package/components/tree/tree-item.js.map +1 -1
- package/components/tree/tree.navigation.d.ts +5 -6
- package/components/tree/tree.navigation.js.map +1 -1
- package/components/tree/tree.selection.js.map +1 -1
- package/components/types.d.ts +1 -1
- package/components/types.js.map +1 -1
- package/components/validation-container/themes/validator.base.css.js +1 -1
- package/components/validation-container/themes/validator.base.css.js.map +1 -1
- package/components/validation-container/validation-container.d.ts +10 -12
- package/components/validation-container/validation-container.js +14 -17
- package/components/validation-container/validation-container.js.map +1 -1
- package/components/virtualization/engine.d.ts +5 -5
- package/components/virtualization/engine.js.map +1 -1
- package/components/virtualization/virtualization.d.ts +61 -63
- package/components/virtualization/virtualization.js +6 -5
- package/components/virtualization/virtualization.js.map +1 -1
- package/custom-elements.json +16769 -19698
- package/igniteui-webcomponents.css-data.json +2 -2
- package/igniteui-webcomponents.html-data.json +1 -1
- package/index.d.ts +3 -1
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/internals/abort-handler.d.ts +13 -25
- package/internals/abort-handler.js +4 -6
- package/internals/abort-handler.js.map +1 -1
- package/internals/context.d.ts +13 -7
- package/internals/context.js +2 -1
- package/internals/context.js.map +1 -1
- package/internals/controllers/adopt-styles.d.ts +19 -20
- package/internals/controllers/adopt-styles.js +3 -8
- package/internals/controllers/adopt-styles.js.map +1 -1
- package/internals/controllers/aria-projection.d.ts +56 -55
- package/internals/controllers/aria-projection.js +14 -15
- package/internals/controllers/aria-projection.js.map +1 -1
- package/internals/controllers/async-consumer.js.map +1 -1
- package/internals/controllers/command.d.ts +15 -30
- package/internals/controllers/command.js +2 -7
- package/internals/controllers/command.js.map +1 -1
- package/internals/controllers/context-provider.d.ts +7 -13
- package/internals/controllers/context-provider.js.map +1 -1
- package/internals/controllers/focus-ring.d.ts +10 -30
- package/internals/controllers/focus-ring.js +6 -12
- package/internals/controllers/focus-ring.js.map +1 -1
- package/internals/controllers/fullscreen.d.ts +7 -23
- package/internals/controllers/fullscreen.js +3 -9
- package/internals/controllers/fullscreen.js.map +1 -1
- package/internals/controllers/gestures.d.ts +10 -29
- package/internals/controllers/gestures.js +1 -3
- package/internals/controllers/gestures.js.map +1 -1
- package/internals/controllers/group.d.ts +13 -30
- package/internals/controllers/group.js.map +1 -1
- package/internals/controllers/host-listeners.d.ts +28 -0
- package/internals/controllers/host-listeners.js +27 -0
- package/internals/controllers/host-listeners.js.map +1 -0
- package/internals/controllers/id-resolver.d.ts +8 -9
- package/internals/controllers/id-resolver.js +6 -14
- package/internals/controllers/id-resolver.js.map +1 -1
- package/internals/controllers/internals.d.ts +53 -104
- package/internals/controllers/internals.js +40 -13
- package/internals/controllers/internals.js.map +1 -1
- package/internals/controllers/key-bindings.d.ts +61 -158
- package/internals/controllers/key-bindings.js +68 -67
- package/internals/controllers/key-bindings.js.map +1 -1
- package/internals/controllers/keys.d.ts +32 -0
- package/internals/controllers/keys.js +20 -0
- package/internals/controllers/keys.js.map +1 -0
- package/internals/controllers/mutation-observer.d.ts +14 -37
- package/internals/controllers/mutation-observer.js +1 -1
- package/internals/controllers/mutation-observer.js.map +1 -1
- package/internals/controllers/resize-observer.d.ts +9 -19
- package/internals/controllers/resize-observer.js.map +1 -1
- package/internals/controllers/root-click.d.ts +11 -42
- package/internals/controllers/root-click.js +4 -6
- package/internals/controllers/root-click.js.map +1 -1
- package/internals/controllers/roving-focus.d.ts +16 -35
- package/internals/controllers/roving-focus.js.map +1 -1
- package/internals/controllers/slot.d.ts +25 -54
- package/internals/controllers/slot.js +6 -6
- package/internals/controllers/slot.js.map +1 -1
- package/internals/controllers/toggle.d.ts +44 -48
- package/internals/controllers/toggle.js.map +1 -1
- package/internals/date/compare.js.map +1 -1
- package/internals/date/converters.d.ts +10 -7
- package/internals/date/converters.js.map +1 -1
- package/internals/date/model.d.ts +9 -16
- package/internals/date/model.js +22 -25
- package/internals/date/model.js.map +1 -1
- package/internals/decorators/blazorAdditionalDependencies.d.ts +4 -2
- package/internals/decorators/blazorAdditionalDependencies.js.map +1 -1
- package/internals/decorators/blazorDeepImport.d.ts +1 -3
- package/internals/decorators/blazorDeepImport.js.map +1 -1
- package/internals/decorators/blazorInclude.d.ts +3 -2
- package/internals/decorators/blazorInclude.js.map +1 -1
- package/internals/decorators/blazorIndirectRender.d.ts +1 -3
- package/internals/decorators/blazorIndirectRender.js.map +1 -1
- package/internals/decorators/blazorSuppressComponent.d.ts +1 -3
- package/internals/decorators/blazorSuppressComponent.js.map +1 -1
- package/internals/decorators/coerced-property.d.ts +14 -20
- package/internals/decorators/coerced-property.js.map +1 -1
- package/internals/decorators/shadow-options.d.ts +2 -5
- package/internals/decorators/shadow-options.js.map +1 -1
- package/internals/definitions/defineAllComponents.js +6 -0
- package/internals/definitions/defineAllComponents.js.map +1 -1
- package/internals/directives/drag.d.ts +51 -81
- package/internals/directives/drag.js +27 -89
- package/internals/directives/drag.js.map +1 -1
- package/internals/directives/pointer-operation.d.ts +75 -0
- package/internals/directives/pointer-operation.js +92 -0
- package/internals/directives/pointer-operation.js.map +1 -0
- package/internals/directives/resize.d.ts +36 -64
- package/internals/directives/resize.js +18 -85
- package/internals/directives/resize.js.map +1 -1
- package/internals/i18n/EN/calendar.resources.d.ts +8 -2
- package/internals/i18n/EN/calendar.resources.js +2 -2
- package/internals/i18n/EN/calendar.resources.js.map +1 -1
- package/internals/i18n/EN/chat.resources.d.ts +8 -2
- package/internals/i18n/EN/chat.resources.js +3 -10
- package/internals/i18n/EN/chat.resources.js.map +1 -1
- package/internals/i18n/EN/date-picker.resources.d.ts +6 -4
- package/internals/i18n/EN/date-picker.resources.js +1 -7
- package/internals/i18n/EN/date-picker.resources.js.map +1 -1
- package/internals/i18n/EN/date-range-picker.resources.d.ts +9 -2
- package/internals/i18n/EN/date-range-picker.resources.js +2 -2
- package/internals/i18n/EN/date-range-picker.resources.js.map +1 -1
- package/internals/i18n/i18n-controller.d.ts +44 -46
- package/internals/i18n/i18n-controller.js +46 -33
- package/internals/i18n/i18n-controller.js.map +1 -1
- package/internals/i18n/utils.d.ts +9 -4
- package/internals/i18n/utils.js +4 -27
- package/internals/i18n/utils.js.map +1 -1
- package/internals/mixins/alert.d.ts +10 -25
- package/internals/mixins/alert.js.map +1 -1
- package/internals/mixins/combo-box.d.ts +21 -11
- package/internals/mixins/combo-box.js +16 -22
- package/internals/mixins/combo-box.js.map +1 -1
- package/internals/mixins/event-emitter.js +9 -11
- package/internals/mixins/event-emitter.js.map +1 -1
- package/internals/mixins/forms/associated-required.d.ts +4 -4
- package/internals/mixins/forms/associated-required.js.map +1 -1
- package/internals/mixins/forms/associated.d.ts +4 -2
- package/internals/mixins/forms/associated.js +8 -19
- package/internals/mixins/forms/associated.js.map +1 -1
- package/internals/mixins/forms/form-transformers.js.map +1 -1
- package/internals/mixins/forms/types.d.ts +24 -80
- package/internals/mixins/forms/types.js.map +1 -1
- package/internals/mixins/group.d.ts +18 -0
- package/internals/mixins/group.js +37 -0
- package/internals/mixins/group.js.map +1 -0
- package/internals/mixins/i18n.d.ts +10 -16
- package/internals/mixins/i18n.js.map +1 -1
- package/internals/mixins/mask-behavior.d.ts +8 -22
- package/internals/mixins/mask-behavior.js +1 -2
- package/internals/mixins/mask-behavior.js.map +1 -1
- package/internals/mixins/option.d.ts +1 -2
- package/internals/mixins/option.js +2 -1
- package/internals/mixins/option.js.map +1 -1
- package/internals/part-map.d.ts +4 -2
- package/internals/part-map.js +1 -1
- package/internals/part-map.js.map +1 -1
- package/internals/templates/input-shell.d.ts +8 -17
- package/internals/templates/input-shell.js +4 -1
- package/internals/templates/input-shell.js.map +1 -1
- package/internals/templates/masked-input.d.ts +7 -8
- package/internals/templates/masked-input.js.map +1 -1
- package/internals/templates/slotted-icon.d.ts +7 -12
- package/internals/templates/slotted-icon.js.map +1 -1
- package/internals/templates/toggle-shell.d.ts +6 -7
- package/internals/templates/toggle-shell.js.map +1 -1
- package/internals/timing.d.ts +5 -14
- package/internals/timing.js.map +1 -1
- package/internals/utils/arrays.d.ts +21 -21
- package/internals/utils/arrays.js +14 -0
- package/internals/utils/arrays.js.map +1 -1
- package/internals/utils/dom.d.ts +51 -39
- package/internals/utils/dom.js +1 -2
- package/internals/utils/dom.js.map +1 -1
- package/internals/utils/events.d.ts +29 -16
- package/internals/utils/events.js +9 -1
- package/internals/utils/events.js.map +1 -1
- package/internals/utils/lit.d.ts +5 -2
- package/internals/utils/lit.js.map +1 -1
- package/internals/utils/math.d.ts +8 -6
- package/internals/utils/math.js.map +1 -1
- package/internals/utils/objects.d.ts +3 -20
- package/internals/utils/objects.js +1 -39
- package/internals/utils/objects.js.map +1 -1
- package/internals/utils/strings.d.ts +9 -11
- package/internals/utils/strings.js.map +1 -1
- package/internals/utils/types.d.ts +16 -3
- package/internals/utils/types.js +3 -0
- package/internals/utils/types.js.map +1 -1
- package/internals/validators.d.ts +9 -8
- package/internals/validators.js +12 -6
- package/internals/validators.js.map +1 -1
- package/package.json +1 -1
- package/skills/README.md +3 -0
- package/skills/igniteui-wc-figma-to-app/SKILL.md +907 -0
- package/skills/igniteui-wc-figma-to-app/references/asset-extraction.md +363 -0
- package/skills/igniteui-wc-figma-to-app/references/design-token-bridge.md +407 -0
- package/skills/igniteui-wc-figma-to-app/references/figma-component-map.md +325 -0
- package/skills/igniteui-wc-figma-to-app/references/mcp-setup.md +409 -0
- package/skills/igniteui-wc-figma-to-app/references/validation-patterns.md +376 -0
- package/skills/igniteui-wc-generate-from-image-design/references/gotchas.md +21 -0
- package/skills/igniteui-wc-integrate-with-framework/SKILL.md +4 -3
- package/skills/igniteui-wc-integrate-with-framework/references/vanilla-js.md +14 -0
- package/skills/igniteui-wc-migrate-grid-lite-to-premium/SKILL.md +12 -2
- package/theming/config.d.ts +14 -5
- package/theming/config.js +38 -18
- package/theming/config.js.map +1 -1
- package/theming/context.d.ts +1 -23
- package/theming/context.js.map +1 -1
- package/theming/theming-controller.d.ts +2 -32
- package/theming/theming-controller.js +15 -21
- package/theming/theming-controller.js.map +1 -1
- package/theming/theming-event.d.ts +0 -7
- package/theming/theming-event.js +0 -13
- package/theming/theming-event.js.map +1 -1
- package/theming/types.d.ts +1 -8
- package/theming/types.js.map +1 -1
- package/web-types.json +3 -3
- package/animations/presets/slide/index.d.ts +0 -3
- package/animations/presets/slide/index.js +0 -16
- package/animations/presets/slide/index.js.map +0 -1
- package/internals/controllers/root-scroll.d.ts +0 -31
- package/internals/controllers/root-scroll.js +0 -71
- package/internals/controllers/root-scroll.js.map +0 -1
- package/theming/utils.d.ts +0 -11
- package/theming/utils.js +0 -20
- package/theming/utils.js.map +0 -1
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
# Playwright Visual Validation Patterns — Web Components
|
|
2
|
+
|
|
3
|
+
> **Part of the [`igniteui-wc-figma-to-app`](../SKILL.md) skill.**
|
|
4
|
+
>
|
|
5
|
+
> Use this file in Phase 5 for the measurement-driven validation loop. Read it in full
|
|
6
|
+
> before calling any Playwright tool.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Core Philosophy
|
|
11
|
+
|
|
12
|
+
**Measure, don't eyeball.** The goal is not visual regression (did this change since last
|
|
13
|
+
week?) but design fidelity (does this match the Figma spec?). Screenshots give you the
|
|
14
|
+
gestalt; `playwright_browser_evaluate` gives you the numbers; numbers drive corrections.
|
|
15
|
+
|
|
16
|
+
**The Web Components twist:** almost everything you want to measure lives inside a shadow
|
|
17
|
+
root. `document.querySelector('igc-card .title')` returns `null` — not because the element
|
|
18
|
+
is missing, but because the selector cannot cross the boundary. Every snippet below is
|
|
19
|
+
shadow-aware. Use them instead of writing ad-hoc selectors.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Phase 5 Tool Sequence
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
1. playwright_browser_navigate → open the app at the target route
|
|
27
|
+
2. playwright_browser_console_messages → catch startup/registration errors
|
|
28
|
+
3. playwright_browser_resize → match the Figma artboard dimensions
|
|
29
|
+
4. playwright_browser_navigate → re-navigate after resize (required)
|
|
30
|
+
5. playwright_browser_evaluate → registration + theme audit (fail fast)
|
|
31
|
+
6. playwright_browser_take_screenshot → capture the full viewport
|
|
32
|
+
7. [Visual comparison] → against the Phase 1c reference, section by section
|
|
33
|
+
8. playwright_browser_evaluate → measure EVERY section in the Phase 1g Surfaces table
|
|
34
|
+
9. [Surfaces audit] → assert background, radius, padding, border
|
|
35
|
+
10. [Action controls audit] → count and name every control, shadow roots included
|
|
36
|
+
11. [Input variant audit] → check `outlined` against the Phase 1d variant
|
|
37
|
+
12. [Classify mismatches] → severity table
|
|
38
|
+
13. [Apply fixes] → edit source files
|
|
39
|
+
14. playwright_browser_navigate → reload after fixes
|
|
40
|
+
15. Repeat 6–14 until no Critical/Major issues remain
|
|
41
|
+
16. Do NOT advance to the next artboard until all checks pass on this one
|
|
42
|
+
17. playwright_browser_snapshot → final accessibility check
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Known Pitfalls
|
|
48
|
+
|
|
49
|
+
### 1. Viewport reset after resize
|
|
50
|
+
|
|
51
|
+
After `playwright_browser_resize`, the browser may navigate itself to `about:blank`, and
|
|
52
|
+
subsequent screenshots and measurements come back empty.
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
playwright_browser_resize({ width: 1440, height: 900 })
|
|
56
|
+
playwright_browser_navigate({ url: "http://localhost:5173/dashboard" })
|
|
57
|
+
// NOW safe to screenshot and measure
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 2. `playwright_browser_evaluate` uses `function`, not `script`
|
|
61
|
+
|
|
62
|
+
Passing `script` fails with *"Invalid input: expected string, received undefined"*.
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
// WRONG
|
|
66
|
+
playwright_browser_evaluate({ script: "return document.title;" })
|
|
67
|
+
|
|
68
|
+
// CORRECT
|
|
69
|
+
playwright_browser_evaluate({ function: "() => document.title" })
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 3. Measuring before the components have upgraded
|
|
73
|
+
|
|
74
|
+
Custom elements upgrade asynchronously, and Lit renders on a microtask. Measuring too early
|
|
75
|
+
returns pre-upgrade box metrics (often `height: 0`). Wait for definition and render:
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
playwright_browser_evaluate({
|
|
79
|
+
function: "async () => { const tags = [...new Set([...document.querySelectorAll('*')].map(e => e.tagName.toLowerCase()).filter(t => t.startsWith('igc-')))]; await Promise.all(tags.map(t => customElements.whenDefined(t))); const els = [...document.querySelectorAll('*')].filter(e => e.tagName.startsWith('IGC-')); await Promise.all(els.map(e => e.updateComplete).filter(Boolean)); await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r))); return { upgraded: tags.length }; }"
|
|
80
|
+
})
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 4. An unregistered element fails silently
|
|
84
|
+
|
|
85
|
+
A missing `defineComponents(...)` produces **no console error** — the tag renders as an
|
|
86
|
+
empty inline box. Run the registration audit before blaming CSS.
|
|
87
|
+
|
|
88
|
+
### 5. Dev server must be running
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
playwright_browser_navigate({ url: "http://localhost:5173" })
|
|
92
|
+
playwright_browser_console_messages()
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
`ERR_CONNECTION_REFUSED` or a blank page means the Vite dev server is not running — ask the
|
|
96
|
+
user to run `npm start`. Note the port: Vite defaults to **5173**.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## The Deep-Query Helper
|
|
101
|
+
|
|
102
|
+
Every measurement snippet below assumes this helper. It walks shadow roots, so a selector
|
|
103
|
+
like `igc-card >>> [part="header"]` resolves.
|
|
104
|
+
|
|
105
|
+
```javascript
|
|
106
|
+
// Paste as the first statements of any evaluate() function.
|
|
107
|
+
const deepQuery = (path, root = document) =>
|
|
108
|
+
path.split('>>>').map(s => s.trim()).reduce(
|
|
109
|
+
(node, sel) => node && (node.shadowRoot || node).querySelector(sel),
|
|
110
|
+
root
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
const deepQueryAll = (sel, root = document) => {
|
|
114
|
+
const out = [];
|
|
115
|
+
const walk = (node) => {
|
|
116
|
+
if (!node) return;
|
|
117
|
+
out.push(...node.querySelectorAll(sel));
|
|
118
|
+
node.querySelectorAll('*').forEach(el => el.shadowRoot && walk(el.shadowRoot));
|
|
119
|
+
};
|
|
120
|
+
walk(root);
|
|
121
|
+
return out;
|
|
122
|
+
};
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Prefer measuring the **host element** (`igc-card`) for box metrics — width, height,
|
|
126
|
+
position, margin — and pierce only for internals that the design calls out (header height,
|
|
127
|
+
row padding). When you must pierce, target documented `::part(...)` names from `get_doc`,
|
|
128
|
+
never internal class names.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Reusable Measurement Snippets
|
|
133
|
+
|
|
134
|
+
All snippets use the `function` parameter.
|
|
135
|
+
|
|
136
|
+
### Registration + theme audit (run first, every page)
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
playwright_browser_evaluate({
|
|
140
|
+
function: "() => { const tags = [...new Set(deepQueryAll('*').map(e => e.tagName.toLowerCase()).filter(t => t.startsWith('igc-')))]; const undefinedTags = tags.filter(t => !customElements.get(t)); const s = getComputedStyle(document.documentElement); return { tags, undefinedTags, theme: s.getPropertyValue('--ig-theme').trim(), variant: s.getPropertyValue('--ig-theme-variant').trim(), primary500: s.getPropertyValue('--ig-primary-500').trim(), surface500: s.getPropertyValue('--ig-surface-500').trim(), fontFamily: s.getPropertyValue('--ig-font-family').trim() }; }"
|
|
141
|
+
})
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Assert: `undefinedTags` is empty; `theme` and `variant` match the design system and variant
|
|
145
|
+
resolved in Phase 3. An empty `theme` means no theme CSS is loaded — components silently
|
|
146
|
+
fall back to `bootstrap` / `light`.
|
|
147
|
+
|
|
148
|
+
### Measure a single element (shadow-aware)
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
playwright_browser_evaluate({
|
|
152
|
+
function: "() => { const deepQuery = (path, root = document) => path.split('>>>').map(s => s.trim()).reduce((n, sel) => n && (n.shadowRoot || n).querySelector(sel), root); const el = deepQuery('<YOUR_SELECTOR_PATH>'); if (!el) return { error: 'element not found' }; const s = getComputedStyle(el); const r = el.getBoundingClientRect(); return { fontSize: s.fontSize, fontWeight: s.fontWeight, lineHeight: s.lineHeight, color: s.color, backgroundColor: s.backgroundColor, padding: s.padding, margin: s.margin, gap: s.gap, borderRadius: s.borderRadius, border: s.border, boxShadow: s.boxShadow, width: Math.round(r.width), height: Math.round(r.height), top: Math.round(r.top), left: Math.round(r.left) }; }"
|
|
153
|
+
})
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
> A host element with `display: inline` (the Lit default) reports a misleading box. If width
|
|
157
|
+
> or height look wrong, check for a missing `:host { display: block }` before chasing padding.
|
|
158
|
+
|
|
159
|
+
### Surfaces audit (mandatory — every page, every Phase 1g surface)
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
playwright_browser_evaluate({
|
|
163
|
+
function: "() => { const sections = { /* fill from the Phase 1g Surfaces table */ sectionA: '.section-a', sectionB: '.section-b' }; const deepQuery = (path, root = document) => path.split('>>>').map(s => s.trim()).reduce((n, sel) => n && (n.shadowRoot || n).querySelector(sel), root); const out = {}; for (const [key, sel] of Object.entries(sections)) { const el = deepQuery(sel); if (!el) { out[key] = 'NOT FOUND'; continue; } const s = getComputedStyle(el); const r = el.getBoundingClientRect(); out[key] = { bg: s.backgroundColor, radius: s.borderRadius, padding: s.padding, border: s.border, shadow: s.boxShadow, w: Math.round(r.width), h: Math.round(r.height) }; } return out; }"
|
|
164
|
+
})
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Assert for each entry:**
|
|
168
|
+
|
|
169
|
+
- Figma surface has a background → `bg !== 'rgba(0, 0, 0, 0)'`
|
|
170
|
+
- Figma section floats on the page background → `bg === 'rgba(0, 0, 0, 0)'` (do not over-surface)
|
|
171
|
+
- `radius`, `padding`, `border`, `shadow` match the Phase 1g values
|
|
172
|
+
- children shown inside the card in Figma are inside the card's bounding rect in the DOM
|
|
173
|
+
|
|
174
|
+
### Action controls audit (mandatory, every page)
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
playwright_browser_evaluate({
|
|
178
|
+
function: "() => { const out = []; const walk = (root) => { root.querySelectorAll('igc-button, igc-icon-button, button, [role=button]').forEach(b => { if (b.tagName === 'BUTTON' && b.getRootNode().host?.matches('igc-button, igc-icon-button')) return; out.push((b.textContent || '').trim().replace(/\\s+/g, ' ') || b.getAttribute('aria-label') || b.getAttribute('name') || '(unlabeled)'); }); root.querySelectorAll('*').forEach(el => el.shadowRoot && walk(el.shadowRoot)); }; walk(document); return { count: out.length, controls: out }; }"
|
|
179
|
+
})
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Compare against the Phase 1d inventory. Any control not in the design context output is
|
|
183
|
+
fabricated and must be removed. `(unlabeled)` entries are also an accessibility failure —
|
|
184
|
+
icon-only buttons need `aria-label`.
|
|
185
|
+
|
|
186
|
+
### Input variant audit (every page with form controls)
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
playwright_browser_evaluate({
|
|
190
|
+
function: "() => { const tags = ['igc-input','igc-textarea','igc-mask-input','igc-date-time-input','igc-file-input','igc-select','igc-combo','igc-date-picker','igc-date-range-picker']; const out = {}; tags.forEach(t => { const els = deepQueryAll(t); if (els.length) out[t] = { count: els.length, outlined: els.filter(e => e.hasAttribute('outlined')).length }; }); return out; }"
|
|
191
|
+
})
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Compare against the variant detected in Phase 1d. If the design uses border-style inputs
|
|
195
|
+
everywhere, every control should report `outlined === count`.
|
|
196
|
+
|
|
197
|
+
### Property-binding audit (collection-bound charts, grids, combos)
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
playwright_browser_evaluate({
|
|
201
|
+
function: "() => { const defs = [ ['igc-category-chart', ['dataSource', 'data']], ['igc-data-chart', ['dataSource', 'data']], ['igc-pie-chart', ['dataSource', 'data']], ['igc-doughnut-chart', ['dataSource', 'data']], ['igc-financial-chart', ['dataSource', 'data']], ['igc-sparkline', ['dataSource', 'data']], ['igc-treemap', ['dataSource', 'data']], ['igc-funnel-chart', ['dataSource', 'data']], ['igc-grid', ['data']], ['igc-grid-lite', ['data']], ['igc-combo', ['data']] ]; const out = {}; defs.forEach(([tag, dataProps]) => { deepQueryAll(tag).forEach((el, i) => { const dataProp = dataProps.find(prop => Array.isArray(el[prop])); const brushProps = ['brushes', 'outlines'].filter(prop => Array.isArray(el[prop])); out[tag + '#' + i] = { dataLength: dataProp ? el[dataProp].length : null, brushCollections: brushProps.length ? Object.fromEntries(brushProps.map(prop => [prop, el[prop]])) : null, height: Math.round(el.getBoundingClientRect().height) }; }); }); return out; }"
|
|
202
|
+
})
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
`dataLength: null` means the collection was set as an attribute (or not at all) instead of
|
|
206
|
+
as a property. `brushCollections: null` on a chart means none of its documented
|
|
207
|
+
`brushes` / `outlines` arrays were assigned, so it is still using the default palette instead
|
|
208
|
+
of the Figma series colors. `height: 0` means the element or its grid track has no height.
|
|
209
|
+
Use this audit for the collection-bound host tags in the selected plan; gauges and maps need
|
|
210
|
+
their own host-specific validation once you know which properties the chosen component binds.
|
|
211
|
+
|
|
212
|
+
### Measure the gap between two elements
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
playwright_browser_evaluate({
|
|
216
|
+
function: "() => { const a = document.querySelector('<SELECTOR_A>'); const b = document.querySelector('<SELECTOR_B>'); if (!a || !b) return { error: 'one or both elements not found' }; const ra = a.getBoundingClientRect(); const rb = b.getBoundingClientRect(); return { gapBetween: Math.round(rb.top - ra.bottom), aHeight: Math.round(ra.height), bTop: Math.round(rb.top) }; }"
|
|
217
|
+
})
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Measure typography scale
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
playwright_browser_evaluate({
|
|
224
|
+
function: "() => { const sels = ['h1','h2','h3','p','.subtitle','.caption']; const out = {}; sels.forEach(sel => { const el = document.querySelector(sel); if (el) { const s = getComputedStyle(el); out[sel] = { fontSize: s.fontSize, fontWeight: s.fontWeight, lineHeight: s.lineHeight, fontFamily: s.fontFamily }; } }); return out; }"
|
|
225
|
+
})
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Measure grid layout proportions
|
|
229
|
+
|
|
230
|
+
```
|
|
231
|
+
playwright_browser_evaluate({
|
|
232
|
+
function: "() => { const el = document.querySelector('<LAYOUT_CONTAINER>'); if (!el) return { error: 'layout container not found' }; const s = getComputedStyle(el); return { display: s.display, gridTemplateColumns: s.gridTemplateColumns, gridTemplateRows: s.gridTemplateRows, gap: s.gap, width: Math.round(el.getBoundingClientRect().width) }; }"
|
|
233
|
+
})
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Inspect a component's parts (when a token override is not landing)
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
playwright_browser_evaluate({
|
|
240
|
+
function: "() => { const host = document.querySelector('<igc-tag>'); if (!host || !host.shadowRoot) return { error: 'host or shadow root not found' }; return [...host.shadowRoot.querySelectorAll('[part]')].map(el => ({ part: el.getAttribute('part'), bg: getComputedStyle(el).backgroundColor, color: getComputedStyle(el).color })); }"
|
|
241
|
+
})
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Use the reported `part` names — they are the supported styling surface when a design token
|
|
245
|
+
does not exist for a detail the design requires.
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Mismatch Severity Classification
|
|
250
|
+
|
|
251
|
+
| Severity | Category | Decision rule | Action |
|
|
252
|
+
| ------------ | -------------------------- | ----------------------------------------------------------- | --------------------------- |
|
|
253
|
+
| **Critical** | Missing element | Present in Figma, absent from DOM | Auto-fix |
|
|
254
|
+
| **Critical** | Unregistered component | Tag present but `customElements.get()` is undefined | Auto-fix (add registration) |
|
|
255
|
+
| **Critical** | Broken layout | Overlapping elements, content outside bounds, zero-height | Auto-fix |
|
|
256
|
+
| **Critical** | Wrong design system active | `--ig-theme` does not match the Phase 3 resolution | Auto-fix (theme import) |
|
|
257
|
+
| **Major** | Wrong component | Figma shows a combo, code has a select | Auto-fix |
|
|
258
|
+
| **Major** | Wrong variant | `variant="flat"` when the design shows contained | Auto-fix |
|
|
259
|
+
| **Major** | Collection not bound | `data` / `dataSource` / `brushes` set as an attribute | Auto-fix |
|
|
260
|
+
| **Minor** | Spacing off by > 4px | `gap: 24px` measured, Figma shows `16px` | Auto-fix if a single property |
|
|
261
|
+
| **Minor** | Font size wrong by > 2px | `16px` measured, Figma shows `14px` | Auto-fix |
|
|
262
|
+
| **Cosmetic** | Color shade | `rgb(50,50,50)` vs `#333333` (perceptually identical) | Report only |
|
|
263
|
+
| **Cosmetic** | Spacing off by ≤ 4px | Rounding or sub-pixel difference | Report only |
|
|
264
|
+
|
|
265
|
+
### Mismatch report format
|
|
266
|
+
|
|
267
|
+
```
|
|
268
|
+
ISSUE: <concise description of the mismatch>
|
|
269
|
+
LOCATION: <component/section in the view>
|
|
270
|
+
FIGMA: <value from the design context>
|
|
271
|
+
RENDERED: <value measured by Playwright>
|
|
272
|
+
SEVERITY: <Critical | Major | Minor | Cosmetic>
|
|
273
|
+
FIX: <specific, one-line code change>
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
Example:
|
|
277
|
+
|
|
278
|
+
```
|
|
279
|
+
ISSUE: Card surface is transparent
|
|
280
|
+
LOCATION: igc-card in the "Budget Categories" section
|
|
281
|
+
FIGMA: background = #222222 (Surfaces table row 1)
|
|
282
|
+
RENDERED: backgroundColor = rgba(0, 0, 0, 0)
|
|
283
|
+
SEVERITY: Critical
|
|
284
|
+
FIX: create_component_theme("card", tokens: { background: "var(--ig-surface-100)" })
|
|
285
|
+
and apply the generated block — do not set background on a wrapper div.
|
|
286
|
+
|
|
287
|
+
ISSUE: Chart series colors are the default palette
|
|
288
|
+
LOCATION: igc-category-chart in the "Spending" panel
|
|
289
|
+
FIGMA: series = #9DE772, #6DB1FF
|
|
290
|
+
RENDERED: brushes = null
|
|
291
|
+
SEVERITY: Major
|
|
292
|
+
FIX: chart.brushes = ['#9DE772', '#6DB1FF'] assigned as a property after validating
|
|
293
|
+
with get_chart_series_colors({ customBrushes: [...] }).
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## Section-by-Section Comparison Checklist
|
|
299
|
+
|
|
300
|
+
| Section | What to check |
|
|
301
|
+
| -------------------- | ------------------------------------------------------------------------------------------------------------------------ |
|
|
302
|
+
| Top navigation | Height, background, slotted `start`/`end` content alignment, action icon positions |
|
|
303
|
+
| Sidebar / nav drawer | Width (`--menu-full-width`), `position="relative"` vs modal, item spacing, icon + label alignment, selected state |
|
|
304
|
+
| Page header | Typography size and weight, breadcrumb spacing, action button prominence |
|
|
305
|
+
| Data grid | Column widths (at least one fluid), header background, row height, cell padding, grid theme CSS actually loaded |
|
|
306
|
+
| Cards / panels | **Background** (must not be `rgba(0,0,0,0)` when Figma shows a surface), border, radius, shadow, padding |
|
|
307
|
+
| Surface containers | Every entry in the Phase 1g Surfaces table; children enclosed within the card's bounding rect |
|
|
308
|
+
| Form fields | `outlined` presence matching the Phase 1d variant; label placement; helper text slot |
|
|
309
|
+
| Action controls | Count and names vs the Phase 1d inventory; `aria-label` on icon-only buttons |
|
|
310
|
+
| Buttons | `variant` (flat/outlined/contained/fab), color, typography, padding |
|
|
311
|
+
| Charts | Chart type, **series colors** (explicit `brushes`), marker visibility, legend placement, non-zero height |
|
|
312
|
+
| Lists | Slot usage (`start`/`title`/`subtitle`/`end`), item height, divider treatment |
|
|
313
|
+
| Footer / paginator | Alignment, spacing, font size |
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## Accessibility Snapshot Checks
|
|
318
|
+
|
|
319
|
+
After `playwright_browser_snapshot()`, verify:
|
|
320
|
+
|
|
321
|
+
| Check | What to look for |
|
|
322
|
+
| --------------------- | ------------------------------------------------------------------------ |
|
|
323
|
+
| Heading hierarchy | `h1` → `h2` → `h3` without skipping levels |
|
|
324
|
+
| Button labels | Every button has text or `aria-label` — icon-only buttons especially |
|
|
325
|
+
| Input labels | Inputs use the `label` attribute or an associated `<label>` |
|
|
326
|
+
| Navigation landmark | `<nav>` or `role="navigation"` wraps the main navigation |
|
|
327
|
+
| Main content landmark | `<main>` or `role="main"` wraps the primary content region |
|
|
328
|
+
| Image alt text | Meaningful `<img>` elements have non-empty `alt` |
|
|
329
|
+
| Drawer labelling | `igc-nav-drawer` has a `label` when more than one nav landmark exists |
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## Common Fix Patterns
|
|
334
|
+
|
|
335
|
+
### Style correction — in order of preference
|
|
336
|
+
|
|
337
|
+
1. **Component design token** — `get_component_design_tokens` → `create_component_theme`
|
|
338
|
+
2. **Documented `::part(...)`** — for details with no token
|
|
339
|
+
3. **Slotted content you own** — style it in your own CSS
|
|
340
|
+
4. Never internal class names; never attempts to reach into a shadow root from page CSS
|
|
341
|
+
|
|
342
|
+
### Density and spacing
|
|
343
|
+
|
|
344
|
+
```
|
|
345
|
+
set_size({ component: "calendar", size: "small", platform: "webcomponents" })
|
|
346
|
+
set_spacing({ component: "calendar", spacing: 0.75, platform: "webcomponents" })
|
|
347
|
+
set_size({ scope: ".compact-toolbar", size: "small", platform: "webcomponents" })
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
Or directly:
|
|
351
|
+
|
|
352
|
+
```css
|
|
353
|
+
igc-calendar {
|
|
354
|
+
--ig-size: var(--ig-size-small);
|
|
355
|
+
--ig-spacing: 0.75;
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
Choose the multiplier by visual judgment — never by mapping a Figma pixel value.
|
|
360
|
+
|
|
361
|
+
### Color correction
|
|
362
|
+
|
|
363
|
+
```css
|
|
364
|
+
/* never a raw hex once a palette exists */
|
|
365
|
+
background: var(--ig-primary-500);
|
|
366
|
+
color: var(--ig-primary-500-contrast);
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
Use `get_color({ color: "primary", variant: "500", contrast: true })` when unsure of the
|
|
370
|
+
exact variable name.
|
|
371
|
+
|
|
372
|
+
### Missing element
|
|
373
|
+
|
|
374
|
+
If an element is in Figma but absent from the DOM, check in this order: registration
|
|
375
|
+
(`customElements.get`) → import path → the slot name it should occupy → then go back to
|
|
376
|
+
Phase 2 and re-read the component doc. A wrong slot name renders nothing and reports nothing.
|
|
@@ -134,6 +134,27 @@ For core UI component theming, prefer `create_component_theme` and apply the ret
|
|
|
134
134
|
### Grid theming is package-specific
|
|
135
135
|
`igniteui-grid-lite` and the premium grid packages do not map to Angular's `igx-grid__*` internal class structure. Use `get_component_design_tokens("grid")`, the exact grid package docs, and exposed tokens or parts for the package present in the workspace.
|
|
136
136
|
|
|
137
|
+
### `igniteui-webcomponents-grids` theme must be injected into the shadow root
|
|
138
|
+
|
|
139
|
+
A bare CSS import (`import '...material.css'`) lands in the document head and selector rules outside a Shadow root never reach inside it. When the grid is rendered inside a Shadow root, the theme must be injected there too — it targets the grid's internal structure and elements. Without it, internal grid elements render with broken dimensions; checkboxes can expand to 1,100 px wide and collapse the entire grid UI.
|
|
140
|
+
|
|
141
|
+
Import the theme as an inline string (requires bundler support for `?inline`, e.g. Vite) and inject it as a `<style>` tag inside the shadow root. The exact approach depends on the framework — for a LitElement component, render it at the top of `render()`:
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
import { html } from 'lit';
|
|
145
|
+
import gridTheme from 'igniteui-webcomponents-grids/grids/themes/light/material.css?inline';
|
|
146
|
+
|
|
147
|
+
// LitElement example — adapt to your Shadow DOM approach (Stencil, FAST, vanilla attachShadow, etc.)
|
|
148
|
+
render() {
|
|
149
|
+
return html`
|
|
150
|
+
<style>${gridTheme}</style>
|
|
151
|
+
<igc-grid ...></igc-grid>
|
|
152
|
+
`;
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Apply the same `?inline` + `<style>` approach for dark or other theme variants.
|
|
157
|
+
|
|
137
158
|
### Read luminance warnings from palette generation
|
|
138
159
|
If palette generation returns a luminance warning for a generated surface, do not ignore it. If the design needs multiple surface depths, use `create_custom_palette` or define semantic CSS variables such as `--surface-1` and `--surface-2` in the main stylesheet instead of relying on a single generated surface color.
|
|
139
160
|
|
|
@@ -96,7 +96,8 @@ Before loading a reference, identify the target framework from the project conte
|
|
|
96
96
|
- No major framework found in `package.json`
|
|
97
97
|
- Plain `.html` files reference a `<script type="module">`
|
|
98
98
|
- Entry point is a plain `.js` or `.ts` file with no framework imports
|
|
99
|
-
-
|
|
99
|
+
- `package.json` contains "lit" — start with the vanilla JS reference; if using Shadow DOM, follow the Shadow root theming note for grids
|
|
100
|
+
- User explicitly asks for vanilla JS, HTML, or LitElement integration
|
|
100
101
|
|
|
101
102
|
→ **Load:** [vanilla-js.md](./references/vanilla-js.md)
|
|
102
103
|
|
|
@@ -106,7 +107,7 @@ Before loading a reference, identify the target framework from the project conte
|
|
|
106
107
|
|
|
107
108
|
Ask the user directly:
|
|
108
109
|
|
|
109
|
-
> "What framework or platform are you using? (React, Angular, Vue 3,
|
|
110
|
+
> "What framework or platform are you using? (React, Angular, Vue 3, Vanilla JS / HTML, or LitElement)"
|
|
110
111
|
|
|
111
112
|
Then load the matching reference from the options above.
|
|
112
113
|
|
|
@@ -119,7 +120,7 @@ Then load the matching reference from the options above.
|
|
|
119
120
|
| React | [react.md](./references/react.md) |
|
|
120
121
|
| Angular | [angular.md](./references/angular.md) |
|
|
121
122
|
| Vue 3 | [vue.md](./references/vue.md) |
|
|
122
|
-
| Vanilla JS / HTML | [vanilla-js.md](./references/vanilla-js.md) |
|
|
123
|
+
| Vanilla JS / HTML / LitElement | [vanilla-js.md](./references/vanilla-js.md) |
|
|
123
124
|
|
|
124
125
|
Each reference covers:
|
|
125
126
|
|
|
@@ -113,6 +113,20 @@ document.body.innerHTML = '<igc-button>Click</igc-button>';
|
|
|
113
113
|
|
|
114
114
|
Ensure you import a theme CSS file in your entry point. Without it, components render unstyled.
|
|
115
115
|
|
|
116
|
+
**`igniteui-webcomponents-grids` inside a Shadow root:** A bare `import '...css'` lands in the document head and never reaches inside a Shadow root — the grid's internal structure and elements receive no styles and render with incorrect dimensions. Import the theme as an inline string and inject it as a `<style>` tag inside the shadow root (requires bundler support for `?inline`, e.g. Vite). For a LitElement component:
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
import { html } from 'lit';
|
|
120
|
+
import gridTheme from 'igniteui-webcomponents-grids/grids/themes/light/material.css?inline';
|
|
121
|
+
|
|
122
|
+
render() {
|
|
123
|
+
return html`
|
|
124
|
+
<style>${gridTheme}</style>
|
|
125
|
+
<igc-grid ...></igc-grid>
|
|
126
|
+
`;
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
116
130
|
## Next Steps
|
|
117
131
|
|
|
118
132
|
- [Optimize bundle size](../../igniteui-wc-optimize-bundle-size/SKILL.md) — import only the components you use
|
|
@@ -108,11 +108,21 @@ import {
|
|
|
108
108
|
IgcNoopFilteringStrategy,
|
|
109
109
|
} from 'igniteui-webcomponents-grids';
|
|
110
110
|
|
|
111
|
-
// Theme
|
|
111
|
+
// Theme — import as an inline string so it can be injected into the shadow root (requires bundler support for ?inline, e.g. Vite)
|
|
112
112
|
// Available: light|dark x bootstrap|material|fluent|indigo
|
|
113
|
-
import 'igniteui-webcomponents-grids/grids/themes/light/
|
|
113
|
+
import gridTheme from 'igniteui-webcomponents-grids/grids/themes/light/material.css?inline';
|
|
114
114
|
```
|
|
115
115
|
|
|
116
|
+
> **Grid inside a Shadow root — required step:** A bare CSS import lands in the document head and never reaches inside a Shadow root — the grid's internal structure and elements get no styles. Inject the theme as a `<style>` tag inside the shadow root. For a LitElement component, at the top of `render()`:
|
|
117
|
+
> ```typescript
|
|
118
|
+
> render() {
|
|
119
|
+
> return html`
|
|
120
|
+
> <style>${gridTheme}</style>
|
|
121
|
+
> <igc-grid ...></igc-grid>
|
|
122
|
+
> `;
|
|
123
|
+
> }
|
|
124
|
+
> ```
|
|
125
|
+
|
|
116
126
|
## Step 3 - Update HTML Tags
|
|
117
127
|
|
|
118
128
|
| Grid Lite | Premium Grid |
|
package/theming/config.d.ts
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
|
+
import { type ChangeThemeEventDetail } from './theming-event.js';
|
|
1
2
|
import type { Theme, ThemeVariant } from './types.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Relays "igc-change-theme" events from `window` to the theming controllers.
|
|
5
|
+
* It also syncs the module state from the event detail, so an event from another
|
|
6
|
+
* copy of the library changes the theme here too.
|
|
7
|
+
*/
|
|
8
|
+
declare class ThemeChangedEmitter extends EventTarget {
|
|
9
|
+
constructor();
|
|
10
|
+
/** @internal */
|
|
11
|
+
handleEvent({ detail }: CustomEvent<ChangeThemeEventDetail>): void;
|
|
12
|
+
}
|
|
13
|
+
export declare const _themeChangedEmitter: ThemeChangedEmitter;
|
|
14
|
+
export declare function getTheme(): ChangeThemeEventDetail;
|
|
7
15
|
/**
|
|
8
16
|
* Allows the global configuration of the active theme.
|
|
9
17
|
*
|
|
@@ -15,3 +23,4 @@ export declare function setTheme(value: Theme, variant: ThemeVariant): void;
|
|
|
15
23
|
* ```
|
|
16
24
|
*/
|
|
17
25
|
export declare function configureTheme(t: Theme, v?: ThemeVariant): void;
|
|
26
|
+
export {};
|
package/theming/config.js
CHANGED
|
@@ -1,37 +1,57 @@
|
|
|
1
1
|
import { isServer } from 'lit';
|
|
2
|
-
import { CHANGE_THEME_EVENT, } from './theming-event.js';
|
|
3
|
-
|
|
2
|
+
import { CHANGE_THEME_EVENT, CHANGED_THEME_EVENT, } from './theming-event.js';
|
|
3
|
+
const THEMES = new Set(['bootstrap', 'material', 'indigo', 'fluent']);
|
|
4
|
+
const THEME_VARIANTS = new Set(['light', 'dark']);
|
|
4
5
|
let theme;
|
|
5
6
|
let themeVariant;
|
|
6
|
-
function
|
|
7
|
-
|
|
8
|
-
globalThis.dispatchEvent(new CustomEvent(CHANGE_THEME_EVENT, { detail }));
|
|
9
|
-
}
|
|
7
|
+
function isOfTypeTheme(value) {
|
|
8
|
+
return THEMES.has(value);
|
|
10
9
|
}
|
|
11
|
-
function
|
|
12
|
-
return
|
|
10
|
+
function isOfTypeThemeVariant(value) {
|
|
11
|
+
return THEME_VARIANTS.has(value);
|
|
13
12
|
}
|
|
14
|
-
function
|
|
15
|
-
|
|
13
|
+
function setTheme(value, variant) {
|
|
14
|
+
theme = value;
|
|
15
|
+
themeVariant = variant;
|
|
16
16
|
}
|
|
17
|
+
class ThemeChangedEmitter extends EventTarget {
|
|
18
|
+
constructor() {
|
|
19
|
+
super();
|
|
20
|
+
if (!isServer) {
|
|
21
|
+
globalThis.addEventListener(CHANGE_THEME_EVENT, this);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
handleEvent({ detail }) {
|
|
25
|
+
if (isOfTypeTheme(detail?.theme) &&
|
|
26
|
+
isOfTypeThemeVariant(detail?.themeVariant)) {
|
|
27
|
+
setTheme(detail.theme, detail.themeVariant);
|
|
28
|
+
this.dispatchEvent(new CustomEvent(CHANGED_THEME_EVENT));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export const _themeChangedEmitter = new ThemeChangedEmitter();
|
|
17
33
|
export function getTheme() {
|
|
18
34
|
if (!(theme && themeVariant)) {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
35
|
+
const rootStyles = isServer
|
|
36
|
+
? undefined
|
|
37
|
+
: getComputedStyle(document.documentElement);
|
|
38
|
+
const foundTheme = rootStyles?.getPropertyValue('--ig-theme').trim();
|
|
39
|
+
const foundVariant = rootStyles
|
|
40
|
+
?.getPropertyValue('--ig-theme-variant')
|
|
41
|
+
.trim();
|
|
22
42
|
theme = isOfTypeTheme(foundTheme) ? foundTheme : 'bootstrap';
|
|
23
43
|
themeVariant = isOfTypeThemeVariant(foundVariant) ? foundVariant : 'light';
|
|
24
44
|
}
|
|
25
45
|
return { theme, themeVariant };
|
|
26
46
|
}
|
|
27
|
-
export function setTheme(value, variant) {
|
|
28
|
-
theme = value;
|
|
29
|
-
themeVariant = variant;
|
|
30
|
-
}
|
|
31
47
|
export function configureTheme(t, v = 'light') {
|
|
32
48
|
if (isOfTypeTheme(t) && isOfTypeThemeVariant(v)) {
|
|
33
49
|
setTheme(t, v);
|
|
34
|
-
|
|
50
|
+
if (!isServer) {
|
|
51
|
+
globalThis.dispatchEvent(new CustomEvent(CHANGE_THEME_EVENT, {
|
|
52
|
+
detail: { theme, themeVariant },
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
35
55
|
}
|
|
36
56
|
}
|
|
37
57
|
//# sourceMappingURL=config.js.map
|
package/theming/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/theming/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,EACL,kBAAkB,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/theming/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAU,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC/E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAE3D,IAAI,KAAY,CAAC;AACjB,IAAI,YAA0B,CAAC;AAE/B,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAY,EAAE,OAAqB;IACnD,KAAK,GAAG,KAAK,CAAC;IACd,YAAY,GAAG,OAAO,CAAC;AACzB,CAAC;AAOD,MAAM,mBAAoB,SAAQ,WAAW;IAC3C;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,UAAU,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAGM,WAAW,CAAC,EAAE,MAAM,EAAuC;QAChE,IACE,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC;YAC5B,oBAAoB,CAAC,MAAM,EAAE,YAAY,CAAC,EAC1C,CAAC;YACD,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;YAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,mBAAmB,EAAE,CAAC;AAE9D,MAAM,UAAU,QAAQ;IACtB,IAAI,CAAC,CAAC,KAAK,IAAI,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,QAAQ;YACzB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,UAAU,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;QACrE,MAAM,YAAY,GAAG,UAAU;YAC7B,EAAE,gBAAgB,CAAC,oBAAoB,CAAC;aACvC,IAAI,EAAE,CAAC;QAEV,KAAK,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;QAC7D,YAAY,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7E,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AACjC,CAAC;AAYD,MAAM,UAAU,cAAc,CAAC,CAAQ,EAAE,IAAkB,OAAO;IAChE,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;QAEhD,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEf,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,UAAU,CAAC,aAAa,CACtB,IAAI,WAAW,CAAC,kBAAkB,EAAE;gBAClC,MAAM,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE;aAChC,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { isServer } from 'lit';\nimport {\n CHANGE_THEME_EVENT,\n CHANGED_THEME_EVENT,\n type ChangeThemeEventDetail,\n} from './theming-event.js';\nimport type { Theme, ThemeVariant } from './types.js';\n\nconst THEMES = new Set<unknown>(['bootstrap', 'material', 'indigo', 'fluent']);\nconst THEME_VARIANTS = new Set<unknown>(['light', 'dark']);\n\nlet theme: Theme;\nlet themeVariant: ThemeVariant;\n\nfunction isOfTypeTheme(value: unknown): value is Theme {\n return THEMES.has(value);\n}\n\nfunction isOfTypeThemeVariant(value: unknown): value is ThemeVariant {\n return THEME_VARIANTS.has(value);\n}\n\nfunction setTheme(value: Theme, variant: ThemeVariant): void {\n theme = value;\n themeVariant = variant;\n}\n\n/**\n * Relays \"igc-change-theme\" events from `window` to the theming controllers.\n * It also syncs the module state from the event detail, so an event from another\n * copy of the library changes the theme here too.\n */\nclass ThemeChangedEmitter extends EventTarget {\n constructor() {\n super();\n if (!isServer) {\n globalThis.addEventListener(CHANGE_THEME_EVENT, this);\n }\n }\n\n /** @internal */\n public handleEvent({ detail }: CustomEvent<ChangeThemeEventDetail>): void {\n if (\n isOfTypeTheme(detail?.theme) &&\n isOfTypeThemeVariant(detail?.themeVariant)\n ) {\n setTheme(detail.theme, detail.themeVariant);\n this.dispatchEvent(new CustomEvent(CHANGED_THEME_EVENT));\n }\n }\n}\n\nexport const _themeChangedEmitter = new ThemeChangedEmitter();\n\nexport function getTheme(): ChangeThemeEventDetail {\n if (!(theme && themeVariant)) {\n const rootStyles = isServer\n ? undefined\n : getComputedStyle(document.documentElement);\n const foundTheme = rootStyles?.getPropertyValue('--ig-theme').trim();\n const foundVariant = rootStyles\n ?.getPropertyValue('--ig-theme-variant')\n .trim();\n\n theme = isOfTypeTheme(foundTheme) ? foundTheme : 'bootstrap';\n themeVariant = isOfTypeThemeVariant(foundVariant) ? foundVariant : 'light';\n }\n\n return { theme, themeVariant };\n}\n\n/**\n * Allows the global configuration of the active theme.\n *\n * Usage:\n * ```ts\n * import { configureTheme } from 'igniteui-webcomponents';\n *\n * configureTheme('material', 'light');\n * ```\n */\nexport function configureTheme(t: Theme, v: ThemeVariant = 'light'): void {\n if (isOfTypeTheme(t) && isOfTypeThemeVariant(v)) {\n // Also set by the emitter's window listener, but that listener does not exist on the server.\n setTheme(t, v);\n\n if (!isServer) {\n globalThis.dispatchEvent(\n new CustomEvent(CHANGE_THEME_EVENT, {\n detail: { theme, themeVariant },\n })\n );\n }\n }\n}\n"]}
|
package/theming/context.d.ts
CHANGED
|
@@ -7,29 +7,7 @@ export interface ThemeContext {
|
|
|
7
7
|
variant: ThemeVariant;
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* Components can consume this context to receive theme information from a theme provider
|
|
13
|
-
* instead of relying on global theming events.
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```ts
|
|
17
|
-
* // In a component
|
|
18
|
-
* import { ContextConsumer } from '@lit/context';
|
|
19
|
-
* import { themeContext } from './context.js';
|
|
20
|
-
*
|
|
21
|
-
* class MyComponent extends LitElement {
|
|
22
|
-
* private _themeConsumer = new ContextConsumer(this, {
|
|
23
|
-
* context: themeContext,
|
|
24
|
-
* subscribe: true
|
|
25
|
-
* });
|
|
26
|
-
*
|
|
27
|
-
* render() {
|
|
28
|
-
* const theme = this._themeConsumer.value;
|
|
29
|
-
* // ...
|
|
30
|
-
* }
|
|
31
|
-
* }
|
|
32
|
-
* ```
|
|
10
|
+
* Theme context provided by the theme provider component and consumed by the theming controller.
|
|
33
11
|
*/
|
|
34
12
|
export declare const themeContext: {
|
|
35
13
|
__context__: ThemeContext;
|
package/theming/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/theming/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/theming/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAc7C,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAe,kBAAkB,CAAC,CAAC","sourcesContent":["import { createContext } from '@lit/context';\nimport type { Theme, ThemeVariant } from './types.js';\n\n/**\n * The theme context value.\n */\nexport interface ThemeContext {\n theme: Theme;\n variant: ThemeVariant;\n}\n\n/**\n * Theme context provided by the theme provider component and consumed by the theming controller.\n */\nexport const themeContext = createContext<ThemeContext>('ig-theme-context');\n"]}
|