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,907 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: igniteui-wc-figma-to-app
|
|
3
|
+
description: Translate Figma app screens designed with the Indigo.Design UI Kits into production Ignite UI for Web Components applications. The Indigo.Design UI Kits are Figma component libraries available in four design-system variants — Material, Fluent, Bootstrap, and Indigo — each with light and dark themes. Designers build their own app frames in Figma using these kit libraries, and every kit component instance maps to an Ignite UI Web Components control. The active kit variant also determines the design system used in the app theme. Uses the Figma MCP for design data, the Ignite UI CLI MCP for component docs, the Ignite UI Theming MCP for palette and component-level styling, and the Playwright MCP for visual validation against the original Figma design. Triggers on "implement this Figma design", "build from Figma", "translate Figma to Web Components", "implement this artboard", "generate app from Figma", or when a Figma URL is shared with implementation intent in an Ignite UI Web Components context.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Ignite UI for Web Components — Figma to App
|
|
8
|
+
|
|
9
|
+
Translate Figma app screens built with the **Indigo.Design UI Kits** into production
|
|
10
|
+
Web Components applications. Designers create their own frames in Figma using the
|
|
11
|
+
Indigo.Design component libraries as shared libraries — these kits come in four
|
|
12
|
+
design-system variants (**Material**, **Fluent**, **Bootstrap**, **Indigo**) with light
|
|
13
|
+
and dark themes each. Every component instance in the design maps to an Ignite UI Web
|
|
14
|
+
Components control, and the active kit variant directly determines which design system
|
|
15
|
+
to configure in the app theme.
|
|
16
|
+
|
|
17
|
+
This skill orchestrates four MCP servers: **Figma** (design data), **Ignite UI CLI**
|
|
18
|
+
(component docs), **Ignite UI Theming** (styles), and **Playwright** (visual validation).
|
|
19
|
+
|
|
20
|
+
> **Web Components ≠ Angular.** The kits are shared across frameworks, but the
|
|
21
|
+
> implementation is not: tags are `igc-*`, components must be registered with
|
|
22
|
+
> `defineComponents(...)`, theming is **CSS-custom-property-first** (Sass optional),
|
|
23
|
+
> and every component renders in **shadow DOM** — which changes how you style and how
|
|
24
|
+
> you measure. These differences are called out in each phase.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Required Workflow
|
|
29
|
+
|
|
30
|
+
Complete all phases in order — do not skip phases or generate component code from
|
|
31
|
+
memory. Every tag name, attribute, slot, and import path must come from `get_doc` /
|
|
32
|
+
`get_api_reference` results, or from the reference files of the sibling
|
|
33
|
+
`igniteui-wc-choose-components` skill — never guessed.
|
|
34
|
+
|
|
35
|
+
Read [references/figma-component-map.md](references/figma-component-map.md) before Phase 2.
|
|
36
|
+
Read [references/design-token-bridge.md](references/design-token-bridge.md) before Phase 3.
|
|
37
|
+
Read [references/asset-extraction.md](references/asset-extraction.md) before Phase 1h.
|
|
38
|
+
Read [references/validation-patterns.md](references/validation-patterns.md) before Phase 5.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Phase 0 — Prerequisites
|
|
43
|
+
|
|
44
|
+
> **Tool naming:** this skill writes MCP tool names as `<server>_<tool>` (e.g.
|
|
45
|
+
> `figma_get_metadata`, `theming_create_theme`). The exact name depends on the client —
|
|
46
|
+
> Claude Code exposes them as `mcp__<server>__<tool>` (e.g. `mcp__figma__get_metadata`).
|
|
47
|
+
> Match by the tool's base name on whatever server is connected.
|
|
48
|
+
|
|
49
|
+
### 0a: Verify All Four MCP Servers
|
|
50
|
+
|
|
51
|
+
Run these checks **silently** in parallel. Each verification call is a no-op if the
|
|
52
|
+
server is not connected; do not surface raw errors to the user at this point.
|
|
53
|
+
|
|
54
|
+
| Server | Verification call | Success signal |
|
|
55
|
+
| --------------------- | ------------------------------------------------------ | ----------------------------------- |
|
|
56
|
+
| **Figma** | `figma_get_metadata` (see 0c for the call shape) | Returns page list or node XML |
|
|
57
|
+
| **Ignite UI CLI** | `list_components` with `framework: "webcomponents"` | Returns component list |
|
|
58
|
+
| **Ignite UI Theming** | `theming_detect_platform` | Returns `webcomponents` platform |
|
|
59
|
+
| **Playwright** | `playwright_browser_navigate` to `about:blank` | Navigates without error |
|
|
60
|
+
|
|
61
|
+
If **any server fails**, stop and guide the user through setup **for that server only**
|
|
62
|
+
before continuing. For `igniteui-cli` and `igniteui-theming`, the fastest path is
|
|
63
|
+
`npx -y igniteui-cli ai-config`, which configures both. Full setup instructions for all
|
|
64
|
+
servers are in [references/mcp-setup.md](references/mcp-setup.md). Newly configured MCP
|
|
65
|
+
servers require an editor/session reload before their tools appear.
|
|
66
|
+
|
|
67
|
+
### 0b: Detect or Scaffold a Web Components Project
|
|
68
|
+
|
|
69
|
+
Check whether the current working directory contains a valid Web Components + Ignite UI
|
|
70
|
+
project:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
1. Does package.json exist?
|
|
74
|
+
2. Does it list "igniteui-webcomponents" OR "@infragistics/igniteui-webcomponents" in dependencies?
|
|
75
|
+
3. Is there a src/ directory with an entry module (src/index.ts, src/main.ts, or similar)?
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**If a valid project is found:**
|
|
79
|
+
|
|
80
|
+
- Note the package layout: `igniteui-webcomponents` (open source / trial) or
|
|
81
|
+
`@infragistics/igniteui-webcomponents` (licensed). The same split applies to the
|
|
82
|
+
commercial packages — `igniteui-webcomponents-grids`, `igniteui-webcomponents-charts`,
|
|
83
|
+
`igniteui-webcomponents-core`, `igniteui-dockmanager`.
|
|
84
|
+
- Note the host setup: plain Lit/vanilla app, or a framework wrapper (React/Angular/Vue).
|
|
85
|
+
If a wrapper is in play, registration and event binding follow
|
|
86
|
+
[`igniteui-wc-integrate-with-framework`](../igniteui-wc-integrate-with-framework/SKILL.md),
|
|
87
|
+
not the raw `defineComponents` pattern.
|
|
88
|
+
- Note whether **Sass** is configured (a `.scss` entry file, `sass` in `devDependencies`,
|
|
89
|
+
or a bundler Sass plugin). This decides the Phase 3 output format — CSS or Sass.
|
|
90
|
+
- **Check the MCP configuration for all four required server entries** — `figma`,
|
|
91
|
+
`igniteui-cli`, `igniteui-theming`, and `playwright` (in `.vscode/mcp.json` or the
|
|
92
|
+
client's equivalent). If `igniteui-cli` or `igniteui-theming` is missing, run
|
|
93
|
+
`npx -y igniteui-cli ai-config` from the project root — it configures both servers and
|
|
94
|
+
copies the Agent Skills, preserving existing entries. Add missing `figma` and
|
|
95
|
+
`playwright` entries from [references/mcp-setup.md](references/mcp-setup.md).
|
|
96
|
+
Projects scaffolded with `npx igniteui-cli new` already have `igniteui-cli` **and**
|
|
97
|
+
`igniteui-theming` wired; they typically lack `figma` and `playwright`. A reload is
|
|
98
|
+
required before newly configured servers' tools appear.
|
|
99
|
+
- Inform the user: "Found existing Ignite UI Web Components project. Proceeding with the
|
|
100
|
+
Figma workflow."
|
|
101
|
+
|
|
102
|
+
**If no valid project is found:**
|
|
103
|
+
Present this message and wait for the user's choice:
|
|
104
|
+
|
|
105
|
+
> "No Ignite UI Web Components project found in the current directory. Would you like me
|
|
106
|
+
> to scaffold a new one using the Ignite UI CLI before implementing the Figma design?
|
|
107
|
+
>
|
|
108
|
+
> `npx -y igniteui-cli new` creates a Vite + Lit + TypeScript project pre-configured with
|
|
109
|
+
> `igniteui-webcomponents`, a theme already wired in `styles.css`, and the Ignite UI CLI
|
|
110
|
+
> and Theming MCP servers auto-wired into `.vscode/mcp.json`. No global install required.
|
|
111
|
+
>
|
|
112
|
+
> Alternatively, point me at an existing project directory."
|
|
113
|
+
|
|
114
|
+
If the user confirms scaffolding:
|
|
115
|
+
|
|
116
|
+
1. Ask for a project name. If the user has already shared a Figma URL, suggest a name
|
|
117
|
+
derived from the Figma file name; otherwise prompt.
|
|
118
|
+
|
|
119
|
+
2. Choose the project template based on the artboard structure. Because Phase 1 has not
|
|
120
|
+
run yet, use the lightest signal available:
|
|
121
|
+
|
|
122
|
+
| Signal | Template to use |
|
|
123
|
+
| -------------------------------------------------------------------- | ----------------------------------------------- |
|
|
124
|
+
| User mentions a persistent sidebar or multiple routed views | `side-nav` |
|
|
125
|
+
| User mentions an icon-rail / collapsible sidebar | `side-nav-mini` |
|
|
126
|
+
| No strong signal — default | `empty` (routing + home page; easiest to extend) |
|
|
127
|
+
|
|
128
|
+
3. Create the project:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
npx -y igniteui-cli new <project-name> --framework=webcomponents --type=igc-ts --template=<empty|side-nav|side-nav-mini>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
This produces a standard Vite workspace and additionally:
|
|
135
|
+
- Installs and configures `igniteui-webcomponents` and `lit`
|
|
136
|
+
- Wires `@vaadin/router` routing in `src/app/app-routing.ts`
|
|
137
|
+
- Generates `.vscode/mcp.json` with the `igniteui-cli` **and** `igniteui-theming`
|
|
138
|
+
MCP server entries already set
|
|
139
|
+
- Copies static assets from `src/assets` via `vite-plugin-static-copy`
|
|
140
|
+
|
|
141
|
+
4. `cd <project-name>`
|
|
142
|
+
|
|
143
|
+
5. Open the auto-generated `.vscode/mcp.json` and **append** the Figma and Playwright
|
|
144
|
+
server entries from `references/mcp-setup.md`. The `igniteui-cli` and
|
|
145
|
+
`igniteui-theming` entries are already present — do not duplicate them.
|
|
146
|
+
|
|
147
|
+
6. Confirm the project starts cleanly:
|
|
148
|
+
```bash
|
|
149
|
+
npm start # vite --open, default http://localhost:5173
|
|
150
|
+
```
|
|
151
|
+
Then continue to Phase 1.
|
|
152
|
+
|
|
153
|
+
### 0c: Determine Which Figma MCP Variant Is Connected
|
|
154
|
+
|
|
155
|
+
Two Figma MCP variants exist and they are driven differently. Establish which one you
|
|
156
|
+
have **before** Phase 1, because it decides whether you can navigate artboards yourself.
|
|
157
|
+
|
|
158
|
+
| Variant | Signal | How you drive it |
|
|
159
|
+
| --------------------------- | ----------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
|
|
160
|
+
| **Remote / addressable** | `get_design_context` / `get_metadata` require `fileKey` + `nodeId` | Pass `fileKey` and `nodeId` explicitly. You can iterate artboards without the user. |
|
|
161
|
+
| **Desktop / session-bound** | Tools take no required params and act on the current selection | Ask the user to click each frame in Figma before every call. Any `nodeId` is ignored. |
|
|
162
|
+
|
|
163
|
+
Check the tool signature of `figma_get_metadata`. If `fileKey` is required, you have the
|
|
164
|
+
addressable variant — **prefer it**, and ask the user once for the file URL:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
https://figma.com/design/:fileKey/:fileName?node-id=1-2 → fileKey = ":fileKey", nodeId = "1:2"
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Every Figma call below shows the addressable form. When only the session-bound variant is
|
|
171
|
+
available, drop `fileKey`/`nodeId` and insert this step before each call:
|
|
172
|
+
|
|
173
|
+
> *"In Figma, please click the **[Artboard Name]** frame to select it, then confirm."*
|
|
174
|
+
|
|
175
|
+
Wait for confirmation before calling. Never batch session-bound calls.
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Phase 1 — Figma Design Exploration
|
|
180
|
+
|
|
181
|
+
**Goal:** understand the full design structure and capture all data needed for
|
|
182
|
+
implementation and validation before writing any code.
|
|
183
|
+
|
|
184
|
+
> **Rate-limit awareness:** Figma MCP calls count against plan quotas
|
|
185
|
+
> (indicative, subject to change — verify against the user's current Figma plan:
|
|
186
|
+
> Starter **6 calls/month**, Organization 200/day, Enterprise 600/day).
|
|
187
|
+
>
|
|
188
|
+
> Estimated call budget for a 5-artboard design:
|
|
189
|
+
> `figma_get_metadata` ×2 + `figma_get_screenshot` ×5 + `figma_get_design_context` ×5 + `figma_get_variable_defs` ×1 + `figma_get_code_connect_map` ×5 = **~18 calls**.
|
|
190
|
+
> **Starter plan users will exceed their monthly quota in a single session.** Strategies:
|
|
191
|
+
> 1. Call `figma_get_variable_defs` only **once** for the root page (variables are file-scoped, not artboard-scoped).
|
|
192
|
+
> 2. `figma_get_design_context` already returns a screenshot — do not also call
|
|
193
|
+
> `figma_get_screenshot` for the same node unless you need a larger `maxDimension`.
|
|
194
|
+
> 3. For large files, consider implementing one artboard per monthly budget cycle.
|
|
195
|
+
|
|
196
|
+
### 1a: Discover Pages and Artboards
|
|
197
|
+
|
|
198
|
+
Call `figma_get_metadata` with the `fileKey` and no `nodeId` — it returns the top-level
|
|
199
|
+
page list. Then call it again per relevant page (`nodeId` = page id, e.g. `0:1`) to get
|
|
200
|
+
the artboard tree with node IDs, names, positions, and sizes.
|
|
201
|
+
|
|
202
|
+
Record each target artboard's **width and height** — Phase 5 resizes the browser to them.
|
|
203
|
+
|
|
204
|
+
### 1b: Select Target Artboards
|
|
205
|
+
|
|
206
|
+
If there are multiple pages or artboards, show the user a list:
|
|
207
|
+
|
|
208
|
+
> "I found these artboards in your Figma file:
|
|
209
|
+
>
|
|
210
|
+
> - Page 1: [list artboard names + node IDs]
|
|
211
|
+
> - Page 2: [list artboard names + node IDs]
|
|
212
|
+
>
|
|
213
|
+
> Which artboards should I implement? (You can say 'all' or list specific names.)"
|
|
214
|
+
|
|
215
|
+
Wait for confirmation before proceeding.
|
|
216
|
+
|
|
217
|
+
### 1c: Capture Reference Screenshots
|
|
218
|
+
|
|
219
|
+
For each target artboard:
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
figma_get_screenshot({ fileKey: "<fileKey>", nodeId: "<artboardId>", maxDimension: 2048 })
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
The response returns a short-lived URL plus a `curl` command, and metadata with both the
|
|
226
|
+
rendered size and the node's natural size. **Download each screenshot to disk** (e.g.
|
|
227
|
+
`.figma-reference/<artboard-name>.png`) — the URL expires, and Phase 5 compares against
|
|
228
|
+
these files. Record `{ artboardName, nodeId, file, width, height }`.
|
|
229
|
+
|
|
230
|
+
After all artboards are captured, confirm the count:
|
|
231
|
+
> *"I have N reference screenshots: [list artboard names]. Proceeding to design context extraction."*
|
|
232
|
+
|
|
233
|
+
> Never skip this step. The screenshots are your ground truth for Phase 5 validation.
|
|
234
|
+
|
|
235
|
+
### 1d: Extract Design Context
|
|
236
|
+
|
|
237
|
+
> **Output format:** `figma_get_design_context` returns **React + Tailwind CSS reference
|
|
238
|
+
> code**, not structured Web Components metadata. Do **not** copy that code into the
|
|
239
|
+
> project. Read the JSX to extract the information below. Asset URLs in the response are
|
|
240
|
+
> short-lived — see Phase 1h and `references/asset-extraction.md`.
|
|
241
|
+
|
|
242
|
+
For **each** target artboard:
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
figma_get_design_context({
|
|
246
|
+
fileKey: "<fileKey>",
|
|
247
|
+
nodeId: "<artboardId>"
|
|
248
|
+
})
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
From the React+Tailwind output, extract:
|
|
252
|
+
|
|
253
|
+
- **Component layer names** (`data-name` attributes in the JSX) — match against
|
|
254
|
+
`references/figma-component-map.md`
|
|
255
|
+
- **Layout structure** — `flex`, `grid`, `gap-*`, `p-*`, `w-*`, `h-*` classes on containers
|
|
256
|
+
- **Typography** — `font-['...']`, `text-[...]`, weight classes
|
|
257
|
+
- **Surface colors** — `bg-[#XXXXXX]` on container `<div>` elements that wrap major
|
|
258
|
+
sections (these become plain `<div>` wrappers in the view, not Ignite UI components)
|
|
259
|
+
- **Border / roundness** — `rounded-[...]`, `border`, `border-[...]` on containers and cards
|
|
260
|
+
- **Input variant indicators** — hidden zero-size nodes (`size-[0.5px]`) whose `data-name`
|
|
261
|
+
contains a component type (e.g. `"Date Picker Type"`, `"Combo Input"`). These are the
|
|
262
|
+
Indigo.Design kit's **variant indicator nodes**; their name encodes which input variant
|
|
263
|
+
(border/line/box) is active. See the input-variant note in Phase 4 — Web Components
|
|
264
|
+
expose this as the boolean `outlined` attribute, not a three-way type.
|
|
265
|
+
- **Chart series colors** — for any chart layer, note the fill colors on its series paths
|
|
266
|
+
- **Action controls** — list every button, icon button, and toolbar action visible in the
|
|
267
|
+
artboard; this is your authoritative inventory — do not add actions not present in the design
|
|
268
|
+
- **Active kit variant** — look for library component references whose source file name
|
|
269
|
+
contains "Material", "Fluent", "Bootstrap", or "Indigo". If not found here, defer to
|
|
270
|
+
Phase 1e variable names and [references/design-token-bridge.md](references/design-token-bridge.md).
|
|
271
|
+
|
|
272
|
+
Record all surface containers in the **Surfaces Spec** (Table B in Phase 1g).
|
|
273
|
+
|
|
274
|
+
### 1e: Extract Design Tokens
|
|
275
|
+
|
|
276
|
+
> Figma variables are **file-scoped**, not artboard-scoped. Call once for the root page
|
|
277
|
+
> node — not once per artboard.
|
|
278
|
+
|
|
279
|
+
```
|
|
280
|
+
figma_get_variable_defs({ fileKey: "<fileKey>", nodeId: "<pageId>" })
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
The response maps variable names to values, e.g.:
|
|
284
|
+
|
|
285
|
+
```
|
|
286
|
+
"color/primary/500": "#6200EE"
|
|
287
|
+
"color/surface": "#FFFFFF"
|
|
288
|
+
"typography/body/font-family": "Roboto"
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
Use `references/design-token-bridge.md` to map color and typography variables to Ignite UI
|
|
292
|
+
theming inputs in Phase 3. Do **not** attempt to map Figma spacing or sizing values — see
|
|
293
|
+
`references/design-token-bridge.md § Spacing, Sizing, and Roundness` for why.
|
|
294
|
+
|
|
295
|
+
### 1f: Check for Existing Code Connect Mappings
|
|
296
|
+
|
|
297
|
+
```
|
|
298
|
+
figma_get_code_connect_map({ fileKey: "<fileKey>", nodeId: "<artboardId>" })
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
If mappings exist, they confirm which components correspond to which Figma nodes — use
|
|
302
|
+
them to validate or augment your Phase 2 component mapping.
|
|
303
|
+
|
|
304
|
+
### 1g: Build the Decomposition Table
|
|
305
|
+
|
|
306
|
+
Before writing any code, produce **two tables** for **each artboard**.
|
|
307
|
+
|
|
308
|
+
#### Table A — Ignite UI Components
|
|
309
|
+
|
|
310
|
+
| Figma Layer Name | Visual Role | Ignite UI Tag / Class | Package | Design Tokens Used | Data Type |
|
|
311
|
+
| -------------------------- | ------------------ | -------------------------------------- | ------------------------ | ------------------- | --------------- |
|
|
312
|
+
| _e.g._ `_NavBar` | Top navigation bar | `<igc-navbar>` / `IgcNavbarComponent` | `igniteui-webcomponents` | `color/primary/500` | n/a |
|
|
313
|
+
| _e.g._ `_Grid/Default` | Data table | `<igc-grid>` / `IgcGridComponent` | `igniteui-webcomponents-grids` | `color/surface` | Tabular records |
|
|
314
|
+
| _e.g._ `_Button/Contained` | Primary CTA | `<igc-button variant="contained">` | `igniteui-webcomponents` | `color/primary/500` | n/a |
|
|
315
|
+
|
|
316
|
+
The **Package** column is not optional in Web Components: general UI, grids, charts, and
|
|
317
|
+
dock manager ship as separate packages with trial and `@infragistics` licensed variants.
|
|
318
|
+
|
|
319
|
+
Fall back to plain semantic HTML only when no Ignite UI component can match the layer
|
|
320
|
+
after consulting `references/figma-component-map.md`. Document the reason inline.
|
|
321
|
+
|
|
322
|
+
#### Table B — Layout Surfaces
|
|
323
|
+
|
|
324
|
+
Record every **non-`igc-*` container** that carries visual properties (background color,
|
|
325
|
+
border, padding, shadow). These are plain `<div>` wrappers in the view — not Ignite UI
|
|
326
|
+
components — but they are critical to visual fidelity. Populate this table from the
|
|
327
|
+
`bg-[...]`, `rounded-[...]`, `border`, `p-[...]`, and `shadow-[...]` classes observed on
|
|
328
|
+
container divs in the Phase 1d output.
|
|
329
|
+
|
|
330
|
+
| Figma Frame / Container Name | Background | Border-Radius | Padding | Border | Shadow | Encloses (child sections) |
|
|
331
|
+
| ---------------------------- | ---------- | ------------- | ------- | ------ | ------ | ------------------------- |
|
|
332
|
+
| _e.g._ `Budget Categories` | `#222222` | `4px` | `24px` | none | none | Categories list, Add button |
|
|
333
|
+
| _e.g._ `Friend Card` | `#222222` | `8px` | `24px 16px` | `1px solid #333` | none | Avatar, name, phone, email, buttons |
|
|
334
|
+
|
|
335
|
+
> **Rule:** if a section sits on a surface in Figma (its container has a non-transparent
|
|
336
|
+
> background), it **must** have that background in the implementation. If a section floats
|
|
337
|
+
> on the page background (transparent), do **not** add a surface wrapper. Always derive
|
|
338
|
+
> surface structure from the design context of the specific artboard being implemented.
|
|
339
|
+
|
|
340
|
+
Present both tables to the user for review before proceeding.
|
|
341
|
+
|
|
342
|
+
### 1h: Extract Image Assets
|
|
343
|
+
|
|
344
|
+
Read [references/asset-extraction.md](references/asset-extraction.md) in full before
|
|
345
|
+
running any extraction.
|
|
346
|
+
|
|
347
|
+
**Zero-placeholder policy:** every image visible in the Figma design must be extracted and
|
|
348
|
+
committed to the project's assets directory before Phase 4. Gradient placeholders are not
|
|
349
|
+
acceptable.
|
|
350
|
+
|
|
351
|
+
From the decomposition tables, identify every layer that is a **static image asset**
|
|
352
|
+
(photo, background, logo, custom icon, illustration) rather than an Ignite UI component.
|
|
353
|
+
Do **not** extract Indigo.Design UI Kit component instances, and do not extract icons that
|
|
354
|
+
`igc-icon` can render from a registered collection.
|
|
355
|
+
|
|
356
|
+
**Use the four-tier decision tree from `asset-extraction.md`:**
|
|
357
|
+
|
|
358
|
+
| Tier | Method | When to use |
|
|
359
|
+
| ---- | ------ | ----------- |
|
|
360
|
+
| **1** | REST API `/v1/files/:key/images` (Method A) or `/v1/images/:key` (Method B) | File key available — always the highest fidelity |
|
|
361
|
+
| **2** | Download the asset URLs returned by `figma_get_design_context` with `curl` | File key unavailable; URLs still live |
|
|
362
|
+
| **3** | `figma_get_screenshot` per node | No file key, no asset URLs |
|
|
363
|
+
| **4** | CSS gradient/color placeholder with a `// TODO` comment | Only for confirmed pure-color fills — never as a shortcut |
|
|
364
|
+
|
|
365
|
+
Save assets under the project's static directory — `src/assets/images/` and
|
|
366
|
+
`src/assets/icons/` in a CLI-scaffolded Vite project (copied to the build output by
|
|
367
|
+
`vite-plugin-static-copy`); `public/` in a stock Vite app. Match whatever the project
|
|
368
|
+
already uses.
|
|
369
|
+
|
|
370
|
+
Build a concise asset manifest (see `asset-extraction.md § Build an Asset Manifest`) so
|
|
371
|
+
the implementation phase uses consistent paths.
|
|
372
|
+
|
|
373
|
+
If you used Tier 2 or Tier 3 for any asset, tell the user which ones need re-export once
|
|
374
|
+
the file key becomes available.
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## Phase 2 — Component Discovery (Ignite UI CLI MCP)
|
|
379
|
+
|
|
380
|
+
**Goal:** look up exact tags, attributes, slots, events, and registration requirements for
|
|
381
|
+
every component identified in Phase 1. Never generate component code from memory.
|
|
382
|
+
|
|
383
|
+
### 2a: Read the Component Map
|
|
384
|
+
|
|
385
|
+
Read [references/figma-component-map.md](references/figma-component-map.md) in full. Find
|
|
386
|
+
the row for each Figma layer name from your Phase 1 decomposition table. Each row gives
|
|
387
|
+
you the tag, the component class, the package, a `get_doc` starting point, and the key
|
|
388
|
+
attributes and slots most often configured from Figma variants.
|
|
389
|
+
|
|
390
|
+
### 2b: Fetch Component Docs
|
|
391
|
+
|
|
392
|
+
> **Web Components doc names are not tag names.** The catalog uses topic-page names such
|
|
393
|
+
> as `navigation-drawer` (nav drawer), `text-area` (textarea), `data-grid` (premium grid),
|
|
394
|
+
> `grid-lite-overview`, `circular-progress`, and combo docs split across `overview`,
|
|
395
|
+
> `features`, `single-selection`, and `templates`. Never guess a doc name.
|
|
396
|
+
|
|
397
|
+
Call `list_components({ framework: "webcomponents" })` **once** to get the live catalog,
|
|
398
|
+
then:
|
|
399
|
+
|
|
400
|
+
- Resolve each component to its exact doc `name` from that list, and call
|
|
401
|
+
`get_doc({ framework: "webcomponents", name: "<doc-name>" })` — all in a single parallel
|
|
402
|
+
batch, never sequentially. `get_doc` gives usage patterns, HTML examples, and slot names.
|
|
403
|
+
- For the full property/method/event API, call
|
|
404
|
+
`get_api_reference({ platform: "webcomponents", component: "<ClassName>" })`. Use
|
|
405
|
+
`search_api({ platform: "webcomponents", query: "<keyword>" })` first when the exact
|
|
406
|
+
class name is unknown, and use the `section` or `member` parameters to keep responses small.
|
|
407
|
+
- `get_project_setup_guide({ framework: "webcomponents" })` is available when the project's
|
|
408
|
+
setup (registration, theme import, package wiring) needs confirming.
|
|
409
|
+
|
|
410
|
+
Do **not** write any component markup until you have read its doc or API entry.
|
|
411
|
+
|
|
412
|
+
### 2c: Search for Feature Docs
|
|
413
|
+
|
|
414
|
+
Use `search_docs` for feature-level questions raised by the artboard, for example:
|
|
415
|
+
|
|
416
|
+
```
|
|
417
|
+
search_docs({ framework: "webcomponents", query: "grid row editing" })
|
|
418
|
+
search_docs({ framework: "webcomponents", query: "grid virtualization" })
|
|
419
|
+
search_docs({ framework: "webcomponents", query: "column pinning" })
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
Feature docs are mandatory when the artboard shows grid editing, filtering, sorting,
|
|
423
|
+
pinning, or other advanced feature states.
|
|
424
|
+
|
|
425
|
+
### 2d: Document the Final Component Plan
|
|
426
|
+
|
|
427
|
+
After reading all docs, confirm or revise the Phase 1g table with:
|
|
428
|
+
|
|
429
|
+
- Exact tags (e.g. `<igc-grid>`, `<igc-navbar>`) and component classes
|
|
430
|
+
- The **package** each component comes from, and trial vs. `@infragistics` licensed paths
|
|
431
|
+
- The **registration** each one needs — `defineComponents(...)` for `igniteui-webcomponents`,
|
|
432
|
+
`IgcXxxComponent.register()` for the grid packages, `ModuleManager.register(...)` from
|
|
433
|
+
`igniteui-webcomponents-core` for charts and gauges
|
|
434
|
+
- Any additional theme CSS a package requires (the grid packages ship their own)
|
|
435
|
+
|
|
436
|
+
If new packages are required, identify exact packages and versions, then **ask for approval
|
|
437
|
+
before installing**. Present this updated plan to the user and wait for confirmation before
|
|
438
|
+
Phase 3.
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## Phase 3 — Theme Generation (Ignite UI Theming MCP)
|
|
443
|
+
|
|
444
|
+
**Goal:** produce theming code that matches the Figma design's visual language using the
|
|
445
|
+
design tokens extracted in Phase 1e.
|
|
446
|
+
|
|
447
|
+
Read [references/design-token-bridge.md](references/design-token-bridge.md) in full before
|
|
448
|
+
running any theming tool.
|
|
449
|
+
|
|
450
|
+
> **Output format decision — make it once, here.** Pass `output: "css"` (the default) when
|
|
451
|
+
> the project has no Sass; pass `output: "sass"` only when Phase 0b found a Sass setup.
|
|
452
|
+
> Every theming tool below accepts `output`. Do not emit Sass into a project that cannot
|
|
453
|
+
> compile it, and do not use the Angular-only `core()` / `theme()` mixins — the Web
|
|
454
|
+
> Components Sass API uses `igniteui-theming` with individual `palette()`, `typography()`,
|
|
455
|
+
> `elevations()`, and `spacing()` mixins.
|
|
456
|
+
|
|
457
|
+
### 3a: Inspect the Existing Theme (Guard)
|
|
458
|
+
|
|
459
|
+
Open the app entry point and global stylesheet (`src/index.ts` / `main.ts`, `styles.css`,
|
|
460
|
+
or the project's equivalent). Look for:
|
|
461
|
+
|
|
462
|
+
- a pre-built theme import such as `igniteui-webcomponents/themes/dark/material.css`
|
|
463
|
+
- `--ig-theme` / `--ig-theme-variant` declarations on `:root`
|
|
464
|
+
- a `configureTheme(...)` call
|
|
465
|
+
- existing palette overrides (`--ig-primary-500`, …) or app-level semantic variables
|
|
466
|
+
|
|
467
|
+
Then:
|
|
468
|
+
|
|
469
|
+
- **Theme found, but variant mismatch** — if the existing theme is **light** and the Figma
|
|
470
|
+
design is **dark** (or vice versa), treat this as a theme change and proceed with 3b–3c.
|
|
471
|
+
A light theme applied to a dark design produces wrong background colors on every
|
|
472
|
+
component and will fail every Phase 5 check.
|
|
473
|
+
- **Theme found, variant matches** → do **not** regenerate the global theme unless the user
|
|
474
|
+
explicitly asks. Reuse the existing palette and skip to 3d.
|
|
475
|
+
- **No theme found** → proceed with 3b.
|
|
476
|
+
|
|
477
|
+
Detect the Figma design's variant from Phase 1e: if a `color/mode` variable exists, use its
|
|
478
|
+
value. Otherwise use the artboard background color: near-black (`#121212`, `#1a1a1a`,
|
|
479
|
+
`#000`) → `"dark"`; near-white (`#fff`, `#f5f5f5`) → `"light"`.
|
|
480
|
+
|
|
481
|
+
### 3b: Resolve the Design System
|
|
482
|
+
|
|
483
|
+
To determine the design system, use this **strict precedence order**. Stop at the first
|
|
484
|
+
signal that gives a clear answer:
|
|
485
|
+
|
|
486
|
+
1. **Explicit user request** — "make it Material", "use Fluent", etc.
|
|
487
|
+
2. **Library source name in design context** — the `figma_get_design_context` or
|
|
488
|
+
`figma_get_metadata` response may reference the source library file name
|
|
489
|
+
(e.g. `"Indigo.Design UI Kit for Material"` → `material`).
|
|
490
|
+
3. **Variable collection names from Phase 1e** — collection names like
|
|
491
|
+
`Material/color/primary` identify the kit variant directly.
|
|
492
|
+
4. **Elevation variable structure** — inspect the `Elevations/*` variables:
|
|
493
|
+
- **Three-layer DROP_SHADOW** (umbra + penumbra + ambient) → **Material**
|
|
494
|
+
- **Single-layer DROP_SHADOW** → Indigo, Fluent, or Bootstrap
|
|
495
|
+
5. **Palette shade naming** — `primary/500`, `primary/100`–`primary/900` follows the
|
|
496
|
+
Material 100–900 convention → likely **Material**.
|
|
497
|
+
6. **Visual heuristics** (only when all above are inconclusive):
|
|
498
|
+
prominent shadows + ripple effects → `"material"`;
|
|
499
|
+
flat surfaces + sharp corners + Segoe/Inter font → `"fluent"`;
|
|
500
|
+
component borders + Bootstrap grid → `"bootstrap"`;
|
|
501
|
+
rounded purple/indigo accents without Material shadows → `"indigo"`.
|
|
502
|
+
|
|
503
|
+
> **Never use font name as a primary signal.** "Titillium Web" is the default body font in
|
|
504
|
+
> the Indigo.Design UI Kit for Material — it is not exclusive to the Indigo design system.
|
|
505
|
+
|
|
506
|
+
Supported values: `material`, `bootstrap`, `fluent`, `indigo`.
|
|
507
|
+
|
|
508
|
+
> **Web Components read the active design system from CSS variables for the initial theme.**
|
|
509
|
+
> Components read `--ig-theme` and `--ig-theme-variant` (falling back to `bootstrap` /
|
|
510
|
+
> `light` when absent). A generated palette alone does **not** switch the design system —
|
|
511
|
+
> use the pre-built theme CSS or generated `:root` block for that. `configureTheme(ds, variant)`
|
|
512
|
+
> switches registered components at runtime but does not rewrite those root variables.
|
|
513
|
+
|
|
514
|
+
### 3c: Generate the Global Theme
|
|
515
|
+
|
|
516
|
+
Extract the following from Phase 1e variables using
|
|
517
|
+
[references/design-token-bridge.md](references/design-token-bridge.md):
|
|
518
|
+
|
|
519
|
+
```
|
|
520
|
+
primaryColor ← from "color/primary/500" or "primary/500"
|
|
521
|
+
secondaryColor ← from "color/secondary/500" or "secondary/500"
|
|
522
|
+
surfaceColor ← from "color/surface" or "surface/default"
|
|
523
|
+
fontFamily ← from "typography/font-family" or "typography/body/font-family"
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
Read the theming guidance resources before generating, so you extract only values the
|
|
527
|
+
theme system actually accepts:
|
|
528
|
+
|
|
529
|
+
```
|
|
530
|
+
theming_read_resource({ uri: "theming://guidance/colors/rules" }) // luminance + variant rules
|
|
531
|
+
theming_read_resource({ uri: "theming://platforms/webcomponents" }) // platform specifics
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
**CSS path (default — no Sass in the project):**
|
|
535
|
+
|
|
536
|
+
1. Import the pre-built theme CSS for the resolved design system and variant in the app
|
|
537
|
+
entry point. This sets `--ig-theme`, `--ig-theme-variant`, the full palette, typography,
|
|
538
|
+
and elevations in one line:
|
|
539
|
+
|
|
540
|
+
```typescript
|
|
541
|
+
import 'igniteui-webcomponents/themes/dark/material.css';
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
2. Generate the palette overrides from the Figma seed colors:
|
|
545
|
+
|
|
546
|
+
```
|
|
547
|
+
theming_create_palette({
|
|
548
|
+
primary: primaryColor,
|
|
549
|
+
secondary: secondaryColor,
|
|
550
|
+
surface: surfaceColor,
|
|
551
|
+
variant: "<light|dark>",
|
|
552
|
+
platform: "webcomponents",
|
|
553
|
+
licensed: <true if @infragistics package>,
|
|
554
|
+
output: "css"
|
|
555
|
+
})
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
Apply the generated custom properties to `:root` in the global stylesheet. Overriding
|
|
559
|
+
the `*-500` base shade is enough — the remaining shades derive from it.
|
|
560
|
+
|
|
561
|
+
3. Apply typography with plain CSS (`font-family`, `font-size`, `font-weight`) or the CSS
|
|
562
|
+
output of `theming_create_typography`. Do not emit Sass typography mixins into a
|
|
563
|
+
CSS-only app.
|
|
564
|
+
|
|
565
|
+
4. Read and act on any **luminance warning** the palette tools return. When the design has
|
|
566
|
+
several distinct surface depths that one generated surface color cannot express, use
|
|
567
|
+
`theming_create_custom_palette`, or define semantic variables (`--surface-1`,
|
|
568
|
+
`--surface-2`) for the extra depths.
|
|
569
|
+
|
|
570
|
+
**Sass path (only when Sass is configured):**
|
|
571
|
+
|
|
572
|
+
```
|
|
573
|
+
theming_create_theme({
|
|
574
|
+
platform: "webcomponents",
|
|
575
|
+
designSystem: "<resolved design system>",
|
|
576
|
+
primaryColor, secondaryColor, surfaceColor,
|
|
577
|
+
variant: "<light|dark>",
|
|
578
|
+
fontFamily,
|
|
579
|
+
includeTypography: true,
|
|
580
|
+
includeElevations: true,
|
|
581
|
+
includeSpacing: true,
|
|
582
|
+
licensed: <true if @infragistics package>,
|
|
583
|
+
output: "sass"
|
|
584
|
+
})
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
`theming_create_theme` emits the `@use 'igniteui-theming'` imports, the `palette()` /
|
|
588
|
+
`elevations()` / `typography()` / `spacing()` mixin calls, and the `:root` block with
|
|
589
|
+
`--ig-theme` and `--ig-theme-variant`. Apply its output as instructed in the response.
|
|
590
|
+
Use `theming_create_palette` / `theming_create_typography` / `theming_create_elevations`
|
|
591
|
+
individually only when you need one piece.
|
|
592
|
+
|
|
593
|
+
> `theming_create_elevations` takes **`designSystem`** (`"material"` or `"indigo"`) — there
|
|
594
|
+
> is no `preset` parameter.
|
|
595
|
+
|
|
596
|
+
**Runtime switching.** When the design needs light and dark at runtime, either swap the
|
|
597
|
+
pre-built stylesheet or call the library API:
|
|
598
|
+
|
|
599
|
+
```typescript
|
|
600
|
+
import { configureTheme } from 'igniteui-webcomponents';
|
|
601
|
+
configureTheme('material', 'dark');
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
**Grid and chart packages carry their own themes.** The premium grids need
|
|
605
|
+
`igniteui-webcomponents-grids/grids/themes/<variant>/<design-system>.css` in addition to
|
|
606
|
+
the core theme, and inside a Lit component that CSS must be imported `?inline` and injected
|
|
607
|
+
into the shadow root:
|
|
608
|
+
|
|
609
|
+
```typescript
|
|
610
|
+
import gridTheme from 'igniteui-webcomponents-grids/grids/themes/dark/material.css?inline';
|
|
611
|
+
// in render(): html`<style>${gridTheme}</style> <igc-grid ...></igc-grid>`
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
### 3d: Per-Component Token Mapping
|
|
615
|
+
|
|
616
|
+
> **Scope:** applies to every Ignite UI family that exposes design tokens — card, inputs,
|
|
617
|
+
> select, combo, navbar, nav drawer, list, tabs, date pickers, chips, grids, etc. Charts,
|
|
618
|
+
> gauges, and maps have **no design tokens**; configure those through component properties
|
|
619
|
+
> (see 3e).
|
|
620
|
+
|
|
621
|
+
For **every** Ignite UI component in your plan, run this loop:
|
|
622
|
+
|
|
623
|
+
1. `theming_get_component_design_tokens({ component: "<theme-key>" })` — review all token
|
|
624
|
+
names, types, and descriptions, plus any **related themes** listed for compound
|
|
625
|
+
components. Theme keys are not always the tag name: inputs are `input-group`, the nav
|
|
626
|
+
drawer is `navdrawer`, progress bars are `progress-linear` / `progress-circular`, and a
|
|
627
|
+
single-select combo is `simple-combo`. See
|
|
628
|
+
[references/design-token-bridge.md](references/design-token-bridge.md) for the full map.
|
|
629
|
+
2. Go back to the Phase 1e variable map and find the Figma variables that correspond to
|
|
630
|
+
this component's surfaces (background, text, border, hover state).
|
|
631
|
+
3. `theming_create_component_theme({ component: "<theme-key>", platform: "webcomponents", designSystem: "<resolved>", variant: "<light|dark>", tokens: { <only differing tokens> }, output: "css" | "sass" })`
|
|
632
|
+
4. Apply the generated block exactly as returned — to the component selector or to the
|
|
633
|
+
`selector` you passed. Token values must reference palette variables
|
|
634
|
+
(`var(--ig-primary-500)`), never raw hex.
|
|
635
|
+
5. For compound components (`combo`, `select`, `date-picker`, `date-range-picker`, `grid`),
|
|
636
|
+
follow the related-theme chain from step 1 and theme each child with its scoped selector.
|
|
637
|
+
Styling only the parent leaves the dropdown or calendar off-theme.
|
|
638
|
+
|
|
639
|
+
When a specific component needs a different density or spacing from the global default, use
|
|
640
|
+
`theming_set_size` or `theming_set_spacing` with the `component` parameter — this scopes
|
|
641
|
+
`--ig-size` or `--ig-spacing` to that component's selector rather than applying globally.
|
|
642
|
+
For compound components, use `scope` with a sub-component selector. Only apply these
|
|
643
|
+
globally (`:root`) when the entire app has a clearly distinct density. Leave
|
|
644
|
+
`theming_set_roundness` at its default unless the user explicitly requests a change. Never
|
|
645
|
+
derive multiplier values from Figma pixel values — see
|
|
646
|
+
`references/design-token-bridge.md § Spacing, Sizing, and Roundness`.
|
|
647
|
+
|
|
648
|
+
### 3e: Chart Series Colors
|
|
649
|
+
|
|
650
|
+
Charts have no design tokens, and they default to their own brush palette — which will not
|
|
651
|
+
match the Figma series colors. Before implementing any chart:
|
|
652
|
+
|
|
653
|
+
```
|
|
654
|
+
theming_get_chart_series_colors({ chartType: "<e.g. category-chart>" })
|
|
655
|
+
theming_get_chart_series_colors({ customBrushes: ["#9DE772", "#6DB1FF"] }) // validate Figma colors
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
The first call lists which theme tokens on that chart type accept a brush list; the second
|
|
659
|
+
validates the colors you extracted in Phase 1d and flags pairs that are hard to tell apart.
|
|
660
|
+
Apply the result through the chart's `brushes` / `outlines` properties (assigned as arrays
|
|
661
|
+
on the element, not as attributes).
|
|
662
|
+
|
|
663
|
+
---
|
|
664
|
+
|
|
665
|
+
## Phase 4 — Implementation
|
|
666
|
+
|
|
667
|
+
**Goal:** build the view(s) that match the artboard decomposition from Phase 2.
|
|
668
|
+
|
|
669
|
+
### Implementation Rules
|
|
670
|
+
|
|
671
|
+
1. **Never generate component markup without reading its doc or API entry first** (Phase 2b).
|
|
672
|
+
2. **Section by section** — layout → navigation → primary content → secondary → data.
|
|
673
|
+
3. **Register every custom element you use, once, in the right place.**
|
|
674
|
+
```typescript
|
|
675
|
+
import { defineComponents, IgcNavbarComponent, IgcCardComponent } from 'igniteui-webcomponents';
|
|
676
|
+
defineComponents(IgcNavbarComponent, IgcCardComponent);
|
|
677
|
+
```
|
|
678
|
+
Grids use `IgcGridComponent.register()`; charts and gauges use
|
|
679
|
+
`ModuleManager.register(IgcCategoryChartModule, …)` from `igniteui-webcomponents-core`.
|
|
680
|
+
In a framework-wrapped app, follow
|
|
681
|
+
[`igniteui-wc-integrate-with-framework`](../igniteui-wc-integrate-with-framework/SKILL.md)
|
|
682
|
+
instead. Registering components you do not use inflates the bundle — see
|
|
683
|
+
[`igniteui-wc-optimize-bundle-size`](../igniteui-wc-optimize-bundle-size/SKILL.md).
|
|
684
|
+
4. **Respect the shadow DOM boundary.** Page CSS does not reach a component's internals.
|
|
685
|
+
In order of preference: component **design tokens** (Phase 3d) → documented
|
|
686
|
+
`::part(...)` selectors → slotted content you style yourself. Never target internal
|
|
687
|
+
class names. CSS custom properties **do** inherit through shadow roots, which is why all
|
|
688
|
+
color work goes through palette variables.
|
|
689
|
+
5. **Slots, not attributes, carry content.** `igc-list-item` uses `start` / `title` /
|
|
690
|
+
`subtitle` / `end`; `igc-navbar` uses `start` / `end`; `igc-card` composes
|
|
691
|
+
`igc-card-header`, `igc-card-content`, `igc-card-actions`, `igc-card-media`. Confirm the
|
|
692
|
+
slot names from `get_doc` before writing markup.
|
|
693
|
+
6. **Bind non-primitive values as properties, not attributes.** Arrays, objects, and
|
|
694
|
+
functions (chart `brushes`, grid `data`, combo `data`) must be assigned on the element
|
|
695
|
+
(`.data=${rows}` in Lit, `el.brushes = [...]` in plain JS). A serialized attribute
|
|
696
|
+
silently fails.
|
|
697
|
+
7. **Events are `igc*`-prefixed** (`igcChange`, `igcInput`, `igcClosing`, …) — take the
|
|
698
|
+
exact names from `get_api_reference`, and remember there is no two-way binding.
|
|
699
|
+
8. Use CSS Grid first to match Figma frame proportions; add Flexbox for sub-regions.
|
|
700
|
+
9. Apply theming via the tokens and palette variables generated in Phase 3 — no raw hex
|
|
701
|
+
values in view code.
|
|
702
|
+
10. Use typed mock data that matches the design's density and domain.
|
|
703
|
+
11. Keep layout, spacing, and typography in stylesheets (or the component's `static styles`)
|
|
704
|
+
— not inline styles.
|
|
705
|
+
12. **Input variants:** the Indigo.Design kits express `line` / `box` / `border` input
|
|
706
|
+
types; Web Components expose a single boolean **`outlined`** attribute on `igc-input`,
|
|
707
|
+
`igc-textarea`, `igc-select`, `igc-combo`, `igc-date-picker`, `igc-date-range-picker`,
|
|
708
|
+
and the other input-base components. Map `_Input/Border` → `outlined`; map `_Input/Line`
|
|
709
|
+
and `_Input/Box` → default (no `outlined`). There is **no** global injection token
|
|
710
|
+
equivalent — set the attribute on each control, and close any remaining gap with
|
|
711
|
+
`input-group` component tokens rather than internal CSS.
|
|
712
|
+
13. **Layout surfaces:** for every entry in the Phase 1g Surfaces table, add a CSS class
|
|
713
|
+
with the recorded `background`, `border-radius`, `padding`, `border`, and `box-shadow`.
|
|
714
|
+
Never leave a section transparent if the Figma surface has a background; never add a
|
|
715
|
+
background to a section that floats on the page background in the design.
|
|
716
|
+
14. **Implement only controls that appear in the Figma artboard.** Do not add toolbar
|
|
717
|
+
buttons, actions, or UI elements that look useful but are not in the design context
|
|
718
|
+
output for that artboard.
|
|
719
|
+
15. After implementing each major section, save and check in the browser (if the dev server
|
|
720
|
+
is running).
|
|
721
|
+
|
|
722
|
+
### Layout Strategy
|
|
723
|
+
|
|
724
|
+
Translate Figma frame dimensions into CSS Grid first:
|
|
725
|
+
|
|
726
|
+
```css
|
|
727
|
+
/* Artboard: 1440×900px, sidebar 280px, content 1160px */
|
|
728
|
+
.app-layout {
|
|
729
|
+
display: grid;
|
|
730
|
+
grid-template-columns: 280px 1fr;
|
|
731
|
+
grid-template-rows: 64px 1fr;
|
|
732
|
+
min-height: 100vh;
|
|
733
|
+
}
|
|
734
|
+
```
|
|
735
|
+
|
|
736
|
+
Match desktop proportions before adding responsive breakpoints.
|
|
737
|
+
|
|
738
|
+
> A Lit component's host is `display: inline` by default — set `:host { display: block }`
|
|
739
|
+
> (or `grid`/`flex`) or the layout collapses. Charts and grids inside a flexible grid track
|
|
740
|
+
> need an explicit height on both the track and the element.
|
|
741
|
+
|
|
742
|
+
### Project Structure
|
|
743
|
+
|
|
744
|
+
For a new view generated from a Figma artboard in a CLI-scaffolded project:
|
|
745
|
+
|
|
746
|
+
```
|
|
747
|
+
src/app/
|
|
748
|
+
<artboard-name>/
|
|
749
|
+
<artboard-name>.ts ← Lit component: template, static styles, registration
|
|
750
|
+
data.ts ← typed mock data for the view
|
|
751
|
+
_assets.ts ← asset manifest from Phase 1h (when the view has images)
|
|
752
|
+
```
|
|
753
|
+
|
|
754
|
+
Register the route in `src/app/app-routing.ts` when the project uses routing. In a
|
|
755
|
+
non-Lit project, follow the structure already in the repository.
|
|
756
|
+
|
|
757
|
+
---
|
|
758
|
+
|
|
759
|
+
## Phase 5 — Visual Validation (Playwright MCP)
|
|
760
|
+
|
|
761
|
+
**Goal:** measure and compare the running app against the Figma reference screenshots from
|
|
762
|
+
Phase 1c. Use the measurement-driven loop — compare numbers, not impressions.
|
|
763
|
+
|
|
764
|
+
Read [references/validation-patterns.md](references/validation-patterns.md) in full before
|
|
765
|
+
running any Playwright tool.
|
|
766
|
+
|
|
767
|
+
### 5a: Ensure the Dev Server Is Running
|
|
768
|
+
|
|
769
|
+
Ask the user for the local dev URL if not already known (Vite default:
|
|
770
|
+
`http://localhost:5173`).
|
|
771
|
+
|
|
772
|
+
```
|
|
773
|
+
playwright_browser_navigate({ url: "http://localhost:5173" })
|
|
774
|
+
playwright_browser_console_messages() // check for startup errors
|
|
775
|
+
```
|
|
776
|
+
|
|
777
|
+
Unregistered custom elements are a silent failure mode: the element renders as an empty
|
|
778
|
+
inline box with no console error. If a section is missing, check `defineComponents` first.
|
|
779
|
+
|
|
780
|
+
### 5b: Match Viewport to Artboard Dimensions
|
|
781
|
+
|
|
782
|
+
```
|
|
783
|
+
playwright_browser_resize({ width: <artboard.width>, height: <artboard.height> })
|
|
784
|
+
playwright_browser_navigate({ url: "<target route>" }) // re-navigate after resize
|
|
785
|
+
```
|
|
786
|
+
|
|
787
|
+
> **Always re-navigate after resize.** The browser may reset to `about:blank` on viewport
|
|
788
|
+
> change. This is a known Playwright MCP pitfall.
|
|
789
|
+
|
|
790
|
+
### 5c: Capture and Compare Screenshots
|
|
791
|
+
|
|
792
|
+
For **each target artboard** (run the full 5c–5f loop once per page):
|
|
793
|
+
|
|
794
|
+
1. Navigate the browser to the corresponding route.
|
|
795
|
+
2. Take a browser screenshot:
|
|
796
|
+
```
|
|
797
|
+
playwright_browser_take_screenshot({ type: "png" })
|
|
798
|
+
```
|
|
799
|
+
3. Do a **section-by-section** comparison against the Phase 1c reference file:
|
|
800
|
+
top bar → sidebar → **every section in the Phase 1g Surfaces table** → footer.
|
|
801
|
+
4. Do **not** advance to the next artboard until no Critical/Major issues remain on the
|
|
802
|
+
current one.
|
|
803
|
+
|
|
804
|
+
### 5d: Measure Computed Styles
|
|
805
|
+
|
|
806
|
+
For each section with visible differences — and **mandatorily for every entry in the Phase
|
|
807
|
+
1g Surfaces table** — use `playwright_browser_evaluate` to extract exact values. Pass code
|
|
808
|
+
as a **plain JavaScript function string** using the `function` parameter.
|
|
809
|
+
|
|
810
|
+
> **Shadow DOM changes every measurement.** `document.querySelector('igc-card .title')`
|
|
811
|
+
> returns `null` — the inner nodes live in a shadow root. Measure the host element for box
|
|
812
|
+
> metrics, and pierce with `el.shadowRoot.querySelector(...)` (or `::part` targets) for
|
|
813
|
+
> internals. `references/validation-patterns.md` provides a reusable deep-query helper —
|
|
814
|
+
> use it instead of writing ad-hoc selectors.
|
|
815
|
+
|
|
816
|
+
**Surfaces audit (mandatory for every page):** for every section in the Phase 1g Surfaces
|
|
817
|
+
table, assert:
|
|
818
|
+
- `backgroundColor` is **not** `rgba(0, 0, 0, 0)` when the surface has a background color
|
|
819
|
+
- `backgroundColor` **is** `rgba(0, 0, 0, 0)` when the design shows the section floating on
|
|
820
|
+
the page background
|
|
821
|
+
- all child elements shown inside the surface card in Figma are enclosed within the card's
|
|
822
|
+
bounding rect in the DOM
|
|
823
|
+
|
|
824
|
+
**Action controls audit (mandatory for every page):** count and name all visible action
|
|
825
|
+
buttons and toolbar controls, including those inside shadow roots. Compare against the
|
|
826
|
+
Phase 1d inventory — any control not recorded in the Figma design context is fabricated and
|
|
827
|
+
must be removed.
|
|
828
|
+
|
|
829
|
+
**Registration audit:** assert that every `igc-*` tag used on the page is a defined custom
|
|
830
|
+
element (`customElements.get(tag)`); an undefined tag means a missing registration.
|
|
831
|
+
|
|
832
|
+
Compare all returned values against the Figma spec from Phase 1d.
|
|
833
|
+
|
|
834
|
+
### 5e: Classify and Report Mismatches
|
|
835
|
+
|
|
836
|
+
| Severity | Category | Example | Action |
|
|
837
|
+
| ------------ | --------------- | ----------------------------------------- | --------------------------- |
|
|
838
|
+
| **Critical** | Missing element | Button in Figma, absent in code | Auto-fix |
|
|
839
|
+
| **Major** | Wrong component | Figma shows dropdown, code has text input | Auto-fix |
|
|
840
|
+
| **Minor** | Spacing off | 24px gap in Figma, 16px in code | Auto-fix if straightforward |
|
|
841
|
+
| **Cosmetic** | Color shade | `#333` vs `#2d2d2d` | Report only |
|
|
842
|
+
|
|
843
|
+
For each mismatch, produce:
|
|
844
|
+
|
|
845
|
+
```
|
|
846
|
+
ISSUE: <description>
|
|
847
|
+
LOCATION: <section or component>
|
|
848
|
+
FIGMA: <spec value>
|
|
849
|
+
RENDERED: <measured value>
|
|
850
|
+
SEVERITY: <Critical / Major / Minor / Cosmetic>
|
|
851
|
+
FIX: <specific code change>
|
|
852
|
+
```
|
|
853
|
+
|
|
854
|
+
### 5f: Apply Corrections
|
|
855
|
+
|
|
856
|
+
Fix Critical and Major issues immediately. After applying fixes, re-navigate and take a
|
|
857
|
+
fresh screenshot to confirm:
|
|
858
|
+
|
|
859
|
+
```
|
|
860
|
+
playwright_browser_navigate({ url: "<target route>" })
|
|
861
|
+
playwright_browser_take_screenshot({ type: "png" })
|
|
862
|
+
```
|
|
863
|
+
|
|
864
|
+
Repeat the measure → fix → re-verify loop until no Critical or Major issues remain.
|
|
865
|
+
|
|
866
|
+
### 5g: Accessibility Snapshot
|
|
867
|
+
|
|
868
|
+
```
|
|
869
|
+
playwright_browser_snapshot()
|
|
870
|
+
```
|
|
871
|
+
|
|
872
|
+
Check that:
|
|
873
|
+
|
|
874
|
+
- Interactive elements have accessible labels (slotted icon-only buttons need `aria-label`)
|
|
875
|
+
- Headings follow a logical hierarchy
|
|
876
|
+
- Navigation landmarks are present
|
|
877
|
+
|
|
878
|
+
---
|
|
879
|
+
|
|
880
|
+
## Critical Rules
|
|
881
|
+
|
|
882
|
+
- **Phase 0 is not optional.** Never skip MCP verification, and establish which Figma MCP
|
|
883
|
+
variant is connected before Phase 1.
|
|
884
|
+
- **Phase 2b before code.** Never write a tag, attribute, or slot you have not read from a
|
|
885
|
+
doc or API entry. Doc names are not tag names.
|
|
886
|
+
- **Register what you use.** An unregistered element fails silently.
|
|
887
|
+
- **Phase 1c screenshots are immutable ground truth.** Download them; never overwrite them.
|
|
888
|
+
- **Re-navigate after resize** in Phase 5 to avoid Playwright's browser reset bug.
|
|
889
|
+
- **Respect the shadow boundary** — tokens and parts, never internal class names.
|
|
890
|
+
- **Match the theming output format to the project** — CSS by default, Sass only when
|
|
891
|
+
configured.
|
|
892
|
+
- **Rate-limit Figma MCP calls.** Use `figma_get_metadata` for discovery, then targeted
|
|
893
|
+
`figma_get_design_context` per artboard, and `figma_get_variable_defs` once per file.
|
|
894
|
+
- **Fail fast on 3 retries.** If the same correction fails three times, stop, report the
|
|
895
|
+
issue to the user, and ask for guidance.
|
|
896
|
+
- **Do not modify dependency manifests or lock files without asking.** Identify the exact
|
|
897
|
+
packages and versions required, then get approval before installing.
|
|
898
|
+
|
|
899
|
+
---
|
|
900
|
+
|
|
901
|
+
## Related Skills
|
|
902
|
+
|
|
903
|
+
- [`igniteui-wc-choose-components`](../igniteui-wc-choose-components/SKILL.md) — component catalogue, package routing, doc lookup patterns
|
|
904
|
+
- [`igniteui-wc-customize-component-theme`](../igniteui-wc-customize-component-theme/SKILL.md) — source of truth for palette behavior, global theme rules, and the theming system
|
|
905
|
+
- [`igniteui-wc-integrate-with-framework`](../igniteui-wc-integrate-with-framework/SKILL.md) — registration and binding in React, Angular, Vue, or vanilla JS hosts
|
|
906
|
+
- [`igniteui-wc-generate-from-image-design`](../igniteui-wc-generate-from-image-design/SKILL.md) — fallback when no Figma file is available (static image input)
|
|
907
|
+
- [`igniteui-wc-optimize-bundle-size`](../igniteui-wc-optimize-bundle-size/SKILL.md) — keeping registrations and package imports lean
|