igniteui-webcomponents 7.3.2 → 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 +49 -0
- 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/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.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/{resize-container/themes/resize-container.base.css.js → breadcrumb/themes/breadcrumbs.base.css.js} +2 -2
- 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.js +2 -1
- package/components/calendar/base.js.map +1 -1
- package/components/calendar/calendar.d.ts +2 -3
- package/components/calendar/calendar.js.map +1 -1
- package/components/calendar/days-view/days-view.d.ts +2 -2
- package/components/calendar/days-view/days-view.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/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/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/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/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/date-picker/date-picker.base.d.ts +22 -27
- package/components/date-picker/date-picker.base.js +7 -1
- 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-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.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.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/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/file-input/file-input.d.ts +2 -2
- package/components/file-input/file-input.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/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/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/qr-code/qr-code.d.ts +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-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/splitter/splitter.d.ts +6 -6
- package/components/splitter/splitter.js.map +1 -1
- package/components/textarea/textarea.d.ts +1 -1
- package/components/textarea/textarea.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/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/tooltip.d.ts +34 -13
- package/components/tooltip/tooltip.js +8 -4
- package/components/tooltip/tooltip.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/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 +16280 -19679
- package/igniteui-webcomponents.css-data.json +2 -2
- package/igniteui-webcomponents.html-data.json +1 -1
- package/index.d.ts +2 -0
- 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 +2 -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/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/components/resize-container/themes/resize-container.base.css.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
- /package/components/{resize-container/themes/resize-container.base.css.d.ts → breadcrumb/themes/breadcrumb.base.css.d.ts} +0 -0
|
@@ -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.
|
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"]}
|
|
@@ -5,7 +5,7 @@ import type { Theme, Themes, ThemeVariant, ThemingControllerConfig } from './typ
|
|
|
5
5
|
*
|
|
6
6
|
* It resolves the active theme from one of two sources, in order of priority:
|
|
7
7
|
*
|
|
8
|
-
* 1. **Context** - provided by an ancestor
|
|
8
|
+
* 1. **Context** - provided by an ancestor theme provider component via the Lit context API.
|
|
9
9
|
* 2. **Global** - the application-wide theme set via `configureTheme()`.
|
|
10
10
|
*
|
|
11
11
|
* When a context provider is present, the controller subscribes to its updates
|
|
@@ -15,41 +15,11 @@ import type { Theme, Themes, ThemeVariant, ThemingControllerConfig } from './typ
|
|
|
15
15
|
*
|
|
16
16
|
* Theme styles are applied directly to the host's shadow root via `adoptStyles`
|
|
17
17
|
* every time the active theme or variant changes.
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* Basic usage - typically created via {@link addThemingController}:
|
|
21
|
-
* ```typescript
|
|
22
|
-
* import { addThemingController } from '#theming/theming-controller.js';
|
|
23
|
-
* import { all } from './themes/themes.js';
|
|
24
|
-
*
|
|
25
|
-
* export default class IgcMyComponent extends LitElement {
|
|
26
|
-
* constructor() {
|
|
27
|
-
* super();
|
|
28
|
-
* addThemingController(this, all);
|
|
29
|
-
* }
|
|
30
|
-
* }
|
|
31
|
-
* ```
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* Accessing the current theme and variant at runtime:
|
|
35
|
-
* ```typescript
|
|
36
|
-
* export default class IgcMyComponent extends LitElement {
|
|
37
|
-
* private readonly _themes = addThemingController(this, all);
|
|
38
|
-
*
|
|
39
|
-
* protected override render() {
|
|
40
|
-
* // Conditionally render based on active theme
|
|
41
|
-
* return this._themes.variant === 'dark'
|
|
42
|
-
* ? html`<div class="dark-layout"></div>`
|
|
43
|
-
* : html`<div class="light-layout"></div>`;
|
|
44
|
-
* }
|
|
45
|
-
* }
|
|
46
|
-
* ```
|
|
47
18
|
*/
|
|
48
19
|
declare class ThemingController implements ReactiveController {
|
|
49
20
|
private readonly _host;
|
|
50
21
|
private readonly _themes;
|
|
51
22
|
private readonly _options?;
|
|
52
|
-
private readonly _contextConsumer;
|
|
53
23
|
private _theme;
|
|
54
24
|
private _variant;
|
|
55
25
|
private _themeSource;
|
|
@@ -74,7 +44,7 @@ declare class ThemingController implements ReactiveController {
|
|
|
74
44
|
*
|
|
75
45
|
* This is the preferred way to add theming support to a component. The controller
|
|
76
46
|
* is registered with the host's reactive controller lifecycle and automatically
|
|
77
|
-
* resolves the active theme from an ancestor
|
|
47
|
+
* resolves the active theme from an ancestor theme provider context or
|
|
78
48
|
* falls back to the application-wide theme set via `configureTheme()`.
|
|
79
49
|
*
|
|
80
50
|
* @param host - The Lit element that will host the controller.
|