igniteui-webcomponents 7.3.2 → 7.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +87 -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 +3 -1
- package/components/checkbox/checkbox-base.js +4 -0
- package/components/checkbox/checkbox-base.js.map +1 -1
- package/components/checkbox/checkbox.js +4 -12
- package/components/checkbox/checkbox.js.map +1 -1
- package/components/checkbox/switch.js +1 -8
- package/components/checkbox/switch.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 +12 -7
- 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 +24 -24
- package/components/combo/combo.js +21 -26
- 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 +9 -3
- 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 +42 -40
- package/components/date-time-input/date-time-input.base.js +9 -5
- 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 +7 -2
- package/components/file-input/file-input.js +4 -0
- 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-base.d.ts +2 -2
- package/components/input/input-base.js +3 -5
- package/components/input/input-base.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 +6 -4
- package/components/radio/radio.js +24 -25
- package/components/radio/radio.js.map +1 -1
- package/components/radio-group/radio-group.js.map +1 -1
- package/components/rating/rating.d.ts +9 -6
- package/components/rating/rating.js +17 -18
- 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 +5 -15
- package/components/select/select.js.map +1 -1
- package/components/slider/range-slider.d.ts +0 -1
- package/components/slider/range-slider.js +6 -11
- package/components/slider/range-slider.js.map +1 -1
- package/components/slider/slider-base.d.ts +4 -1
- package/components/slider/slider-base.js +20 -18
- package/components/slider/slider-base.js.map +1 -1
- package/components/slider/slider.d.ts +2 -0
- package/components/slider/slider.js +5 -1
- package/components/slider/slider.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 +2 -5
- package/components/textarea/textarea.js +3 -5
- 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 +2 -1
- package/components/validation-container/validation-container.js.map +1 -1
- package/components/virtualization/engine.d.ts +40 -9
- package/components/virtualization/engine.js +126 -61
- package/components/virtualization/engine.js.map +1 -1
- package/components/virtualization/recycle.d.ts +13 -0
- package/components/virtualization/recycle.js +152 -0
- package/components/virtualization/recycle.js.map +1 -0
- package/components/virtualization/virtualization.d.ts +84 -65
- package/components/virtualization/virtualization.js +20 -16
- package/components/virtualization/virtualization.js.map +1 -1
- package/custom-elements.json +18455 -19551
- package/igniteui-webcomponents.css-data.json +2 -2
- package/igniteui-webcomponents.html-data.json +1 -1
- package/index.d.ts +3 -1
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/internals/abort-handler.d.ts +13 -25
- package/internals/abort-handler.js +4 -6
- package/internals/abort-handler.js.map +1 -1
- package/internals/context.d.ts +13 -7
- package/internals/context.js +2 -1
- package/internals/context.js.map +1 -1
- package/internals/controllers/adopt-styles.d.ts +19 -20
- package/internals/controllers/adopt-styles.js +3 -8
- package/internals/controllers/adopt-styles.js.map +1 -1
- package/internals/controllers/aria-projection.d.ts +100 -61
- package/internals/controllers/aria-projection.js +81 -31
- 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 +42 -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 +27 -78
- 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 +19 -19
- package/internals/templates/toggle-shell.js +12 -8
- 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 +53 -41
- package/internals/utils/dom.js +3 -4
- 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 +4 -3
- package/skills/igniteui-wc-choose-components/SKILL.md +2 -1
- package/skills/igniteui-wc-customize-component-theme/SKILL.md +2 -1
- package/skills/igniteui-wc-figma-to-app/SKILL.md +328 -0
- package/skills/igniteui-wc-figma-to-app/references/asset-extraction.md +343 -0
- package/skills/igniteui-wc-figma-to-app/references/design-provenance.md +199 -0
- package/skills/igniteui-wc-figma-to-app/references/design-token-bridge.md +489 -0
- package/skills/igniteui-wc-figma-to-app/references/figma-component-map.md +370 -0
- package/skills/igniteui-wc-figma-to-app/references/figma-exploration.md +222 -0
- package/skills/igniteui-wc-figma-to-app/references/mcp-setup.md +363 -0
- package/skills/igniteui-wc-figma-to-app/references/project-setup.md +105 -0
- package/skills/igniteui-wc-figma-to-app/references/theme-generation.md +180 -0
- package/skills/igniteui-wc-figma-to-app/references/validation-patterns.md +370 -0
- package/skills/igniteui-wc-generate-from-image-design/SKILL.md +2 -1
- package/skills/igniteui-wc-generate-from-image-design/references/gotchas.md +3 -3
- package/skills/igniteui-wc-grids/SKILL.md +133 -0
- package/skills/igniteui-wc-integrate-with-framework/SKILL.md +2 -1
- package/skills/igniteui-wc-migrate-grid-lite-to-premium/SKILL.md +2 -1
- package/skills/igniteui-wc-optimize-bundle-size/SKILL.md +2 -1
- 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,343 @@
|
|
|
1
|
+
# Asset Extraction from Figma
|
|
2
|
+
|
|
3
|
+
> **Part of the [`igniteui-wc-figma-to-app`](../SKILL.md) skill.**
|
|
4
|
+
>
|
|
5
|
+
> Use this file in Phase 1h to identify and extract image assets from Figma artboards before implementation. Read it in full before calling any extraction tool.
|
|
6
|
+
>
|
|
7
|
+
> **Zero-placeholder policy:** every image asset visible in the Figma design must be extracted and committed before Phase 4 begins. Gradient placeholders and empty `<div>` boxes are not acceptable. If the highest-fidelity method is unavailable, use the next tier — but always extract something real.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Step 0 — Decide Where Assets Live
|
|
12
|
+
|
|
13
|
+
Match the project you are in before downloading anything:
|
|
14
|
+
|
|
15
|
+
| Project shape | Asset directory | Referenced as |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| CLI-scaffolded (`igniteui-cli new --framework=webcomponents`) | `src/assets/images/`, `src/assets/icons/` | `/assets/images/hero.jpg` — copied to the build output by `vite-plugin-static-copy` |
|
|
18
|
+
| Stock Vite / plain bundler | `public/images/`, `public/icons/` | `/images/hero.jpg` |
|
|
19
|
+
| Bundler-processed (hashed) assets | anywhere under `src/` | `import heroUrl from '../assets/hero.jpg'` then bind the URL |
|
|
20
|
+
|
|
21
|
+
Create the directories before the first `curl`:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
mkdir -p src/assets/images src/assets/icons # or public/images public/icons
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Step 1 — Acquire the Figma File Key (Required for the REST API)
|
|
30
|
+
|
|
31
|
+
The Figma REST API needs a **file key** — the identifier in every Figma file URL — and a **personal access token**. Reuse the file key from Phase 1 when you have it (the remote Figma server always has one). If not, ask:
|
|
32
|
+
|
|
33
|
+
> "To extract image assets at the highest quality, I need the Figma file key. In the Figma desktop app: right-click the file tab → **Copy link**. The URL looks like `https://www.figma.com/design/ABCDEF1234567890/My-File-Name` — the file key is the segment after `/design/`: **`ABCDEF1234567890`**. If you cannot access it right now, I will use the fallback methods and note which assets need re-exporting at higher quality."
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
echo "https://www.figma.com/design/ABCDEF1234567890/My-App" \
|
|
37
|
+
| sed -E 's|.*/design/([^/]+)/.*|\1|'
|
|
38
|
+
# → ABCDEF1234567890
|
|
39
|
+
export FILE_KEY="ABCDEF1234567890"
|
|
40
|
+
export FIGMA_TOKEN="your-personal-access-token" # REST API only — see below
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The Figma MCP servers do **not** use a personal access token, so this is a separate token (see `mcp-setup.md § Personal access token`). Ask the user to export it in the agent's shell, and never write it into a project file.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Two Fundamentally Different Types of Image Assets
|
|
48
|
+
|
|
49
|
+
| Type | What it is | Figma signal | Best extraction method |
|
|
50
|
+
| ---------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------- | ---------------------------------------- |
|
|
51
|
+
| **Image fill** | A photo, texture, or raster image dragged/pasted into Figma, stored as an IMAGE fill | Layer has a fill of type `IMAGE`; `imageRef` in node data | REST API Method A → original source file |
|
|
52
|
+
| **Vector asset** | A logo, icon, or illustration drawn in Figma with vector tools | Node type `VECTOR`, `BOOLEAN_OPERATION`, or `GROUP` | REST API Method B → clean SVG |
|
|
53
|
+
|
|
54
|
+
Do **not** confuse either with component instances — from the Indigo.Design UI Kits or any other kit — that Phase 1f mapped to a canonical role. Those become Ignite UI components, not extracted assets.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Step 2 — Identify Image Nodes
|
|
59
|
+
|
|
60
|
+
### Naming patterns to look for in `figma_get_metadata`
|
|
61
|
+
|
|
62
|
+
| Naming pattern | Likely asset type | Action |
|
|
63
|
+
| ------------------------------------------------ | ----------------- | ----------------------------------------- |
|
|
64
|
+
| `_Image`, `_Photo`, `_Picture`, `image`, `photo` | Raster image fill | Extract as PNG |
|
|
65
|
+
| `_Hero`, `_Banner`, `_Cover` | Large raster fill | Extract as PNG (2× scale) |
|
|
66
|
+
| `_Thumbnail`, `_Avatar`, `_Illustration` | Raster image fill | Extract as PNG |
|
|
67
|
+
| `_Logo`, `_Brand` | Vector or raster | If vector: SVG; if raster: PNG |
|
|
68
|
+
| `_Icon/` prefix (custom icons) | Custom SVG icon | Extract as SVG, then **register** it |
|
|
69
|
+
| `_Background`, `_Bg` | Large raster fill | Extract as PNG |
|
|
70
|
+
| `_Art`, `_Pattern` | Vector or raster | Classify before extracting |
|
|
71
|
+
|
|
72
|
+
> **Ignore these** — do NOT extract them as image assets:
|
|
73
|
+
>
|
|
74
|
+
> - Any layer that Table A maps to a component (`_Button`, `_Input`, `Button`, `Text field`, … — kit component instances from any kit)
|
|
75
|
+
> - Icon glyphs available from a registerable package (Material Icons Extended, Material Symbols, Lucide, Fluent, …; see `figma-component-map.md § Icons`). Register them with `registerIconFromText` and render `<igc-icon>` instead
|
|
76
|
+
> - Artboard/frame boundaries themselves
|
|
77
|
+
|
|
78
|
+
### Size heuristic
|
|
79
|
+
|
|
80
|
+
Large rectangles (width or height > 200px) at key layout positions (hero area, sidebar background, card thumbnail slot) are almost always image fills. Small nodes (< 48×48px) with icon-like names are usually SVG icons.
|
|
81
|
+
|
|
82
|
+
### Confirm with design context
|
|
83
|
+
|
|
84
|
+
`figma_get_design_context` returns the reference code **plus a JSON block of download URLs for the assets it references**. Each entry confirms the node is a real asset and gives you a directly downloadable URL. Note them — Tier 2 depends on them, and they are short-lived.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Step 3 — Extract at the Highest Available Fidelity
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
Do you have BOTH the FILE_KEY and a FIGMA_TOKEN?
|
|
92
|
+
├─ YES → Tier 1 (REST API). Always the best.
|
|
93
|
+
└─ NO → Did figma_get_design_context return an asset URL for this node?
|
|
94
|
+
(desktop server: http://localhost:3845/assets/…; remote server: short-lived https URLs)
|
|
95
|
+
├─ YES → Tier 2 (download that URL now).
|
|
96
|
+
└─ NO → Can you render the node on its own?
|
|
97
|
+
├─ YES → Tier 3 (figma_get_screenshot per node).
|
|
98
|
+
└─ NO → Tier 4 (CSS placeholder + TODO — last resort only).
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
The remote server also offers `figma_download_assets` (up to 20 nodes per call, exports and original images). If it is in the tool list, use it for Tier 2 when there is no FIGMA_TOKEN.
|
|
102
|
+
|
|
103
|
+
**At the end of Phase 1h, if you used Tier 2 or Tier 3 for any asset:**
|
|
104
|
+
|
|
105
|
+
> Tell the user: "The following assets were extracted at reduced quality because the Figma REST API was not available (no file key or no personal access token): [list]. To replace them with the original source files, run the Tier 1 REST API commands once you have both."
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
### Tier 1 — REST API (Highest Fidelity)
|
|
110
|
+
|
|
111
|
+
**Requires:** `FILE_KEY` and `FIGMA_TOKEN`.
|
|
112
|
+
|
|
113
|
+
#### Method A — Original Image Fills
|
|
114
|
+
|
|
115
|
+
Downloads the **original uploaded file** at native resolution — never a re-render.
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
# A.1 — all image fill URLs in the file
|
|
119
|
+
curl -s -H "X-Figma-Token: $FIGMA_TOKEN" \
|
|
120
|
+
"https://api.figma.com/v1/files/$FILE_KEY/images" \
|
|
121
|
+
-o /tmp/figma_image_fills.json
|
|
122
|
+
# Response: { "images": { "<imageRef>": "<cdn-url>", ... } }
|
|
123
|
+
|
|
124
|
+
# A.2 — node fill data, to match imageRef → node
|
|
125
|
+
curl -s -H "X-Figma-Token: $FIGMA_TOKEN" \
|
|
126
|
+
"https://api.figma.com/v1/files/$FILE_KEY/nodes?ids=$NODE_IDS" \
|
|
127
|
+
-o /tmp/figma_nodes.json
|
|
128
|
+
# Look for: "fills": [{ "type": "IMAGE", "imageRef": "abc123" }]
|
|
129
|
+
|
|
130
|
+
# A.3 — download
|
|
131
|
+
IMAGE_URL=$(jq -r '.images["<imageRef>"]' /tmp/figma_image_fills.json)
|
|
132
|
+
curl -sL "$IMAGE_URL" -o src/assets/images/hero-background.jpg
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
> **URL expiry:** image fill URLs expire in **14 days**. Download during the session.
|
|
136
|
+
|
|
137
|
+
#### Method B — Node Export (SVG, PNG, JPG)
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
# SVG export (logos, icons, illustrations)
|
|
141
|
+
curl -s -H "X-Figma-Token: $FIGMA_TOKEN" \
|
|
142
|
+
"https://api.figma.com/v1/images/$FILE_KEY?ids=$NODE_IDS&format=svg&svg_outline_text=false&contents_only=true" \
|
|
143
|
+
-o /tmp/figma_svg_export.json
|
|
144
|
+
|
|
145
|
+
jq -r '.images | to_entries[] | "\(.key)\t\(.value)"' /tmp/figma_svg_export.json | \
|
|
146
|
+
while IFS=$'\t' read -r nodeId url; do
|
|
147
|
+
filename="$(echo "$nodeId" | tr ':' '-').svg"
|
|
148
|
+
curl -sL "$url" -o "src/assets/icons/$filename"
|
|
149
|
+
done
|
|
150
|
+
|
|
151
|
+
# PNG export at 2× (hero banners, raster compositions)
|
|
152
|
+
curl -s -H "X-Figma-Token: $FIGMA_TOKEN" \
|
|
153
|
+
"https://api.figma.com/v1/images/$FILE_KEY?ids=$NODE_IDS&format=png&scale=2&contents_only=true" \
|
|
154
|
+
-o /tmp/figma_png_export.json
|
|
155
|
+
|
|
156
|
+
jq -r '.images | to_entries[] | "\(.key)\t\(.value)"' /tmp/figma_png_export.json | \
|
|
157
|
+
while IFS=$'\t' read -r nodeId url; do
|
|
158
|
+
filename="$(echo "$nodeId" | tr ':' '-').png"
|
|
159
|
+
curl -sL "$url" -o "src/assets/images/$filename"
|
|
160
|
+
done
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
| Parameter | Value | When to use |
|
|
164
|
+
| ------------------ | ------- | ---------------------------------------------------- |
|
|
165
|
+
| `format` | `svg` | Logos, icons, vector illustrations |
|
|
166
|
+
| `format` | `png` | Hero backgrounds, thumbnails — always pair `scale=2` |
|
|
167
|
+
| `format` | `jpg` | Photos without transparency — use `scale=2` |
|
|
168
|
+
| `scale` | `2` | **Always for PNG/JPG** — retina-quality output |
|
|
169
|
+
| `svg_outline_text` | `false` | Keep text as `<text>` elements (smaller, accessible) |
|
|
170
|
+
| `contents_only` | `true` | Render the node in isolation |
|
|
171
|
+
|
|
172
|
+
> **Export URL expiry:** export URLs expire in **30 days**. Download immediately, then rename each file by purpose.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
### Tier 2 — Download the Design Context Asset URLs
|
|
177
|
+
|
|
178
|
+
**Use when:** Tier 1 is unavailable, but `figma_get_design_context` returned asset URLs for the node.
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
curl -sL "<asset-url-from-design-context>" -o src/assets/images/hero-background.png
|
|
182
|
+
curl -sL "<asset-url-from-design-context>" -o src/assets/icons/logo.svg
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Where the URLs appear in the response:
|
|
186
|
+
|
|
187
|
+
- the JSON block of download URLs accompanying the reference code, and
|
|
188
|
+
- `const imgXxx = "…";` declarations at the top of the generated code, referenced by `<img src={imgXxx} />` or `background-image`
|
|
189
|
+
|
|
190
|
+
**Limitations:** these are renderer outputs, not originals — vectors may come back rasterized, and the URLs expire (a desktop-server URL dies when the Figma desktop app closes; a remote-server URL expires after a short time). Download before doing anything else, rename descriptively, and flag them in the manifest:
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
// TODO: re-export via Tier 1 REST API once FILE_KEY and FIGMA_TOKEN are available
|
|
194
|
+
heroBg: '/assets/images/hero-background.png',
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
### Tier 3 — `figma_get_screenshot` per Node
|
|
200
|
+
|
|
201
|
+
Address the node the same way as in Phase 1 (`figma-exploration.md § Before the First Call`):
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
// Remote server
|
|
205
|
+
figma_get_screenshot({ fileKey: "<fileKey>", nodeId: "<nodeId>", maxDimension: 2048 })
|
|
206
|
+
// Desktop server: the node ID (check the image), or ask the user to select the layer
|
|
207
|
+
figma_get_screenshot({ nodeId: "<nodeId>", maxDimension: 2048 })
|
|
208
|
+
figma_get_screenshot({})
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
If the response is a URL, download it straight into the assets directory (it is short-lived); if the image comes back inline, save it from there. Raise `maxDimension` for detail.
|
|
212
|
+
|
|
213
|
+
**Limitations:** a render, not a source file; vectors are rasterized; may include surrounding canvas. Label them:
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
// TODO: re-export at higher fidelity via Tier 1 — current version is a node render
|
|
217
|
+
heroBg: '/assets/images/hero-background.png',
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
### Tier 4 — CSS Fallback (Last Resort Only)
|
|
223
|
+
|
|
224
|
+
**Use only when** the layer is confirmed to be a pure color fill or gradient — never because extraction felt difficult.
|
|
225
|
+
|
|
226
|
+
```css
|
|
227
|
+
.hero-banner {
|
|
228
|
+
/* TODO: replace with real asset — extraction blocked (no REST token and no design-context asset URL) */
|
|
229
|
+
background: linear-gradient(135deg, #0d1b3e 0%, #1a0533 100%);
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Include every Tier 4 use in the post-session handoff notes.
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## Step 4 — Build an Asset Manifest
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
// src/app/<page>/_assets.ts — generated during Phase 1h
|
|
241
|
+
|
|
242
|
+
export const PAGE_ASSETS = {
|
|
243
|
+
// Figma node 123:456 — "Hero/Background" · Tier 1 REST API PNG @2×
|
|
244
|
+
heroBg: '/assets/images/hero-background.jpg',
|
|
245
|
+
|
|
246
|
+
// Figma node 789:012 — "_Logo/Main" · Tier 1 REST API SVG
|
|
247
|
+
logo: '/assets/icons/logo.svg',
|
|
248
|
+
|
|
249
|
+
// Figma node 345:678 — "Card/Thumbnail" · Tier 2 (TODO: re-export)
|
|
250
|
+
cardThumbnail: '/assets/images/card-thumbnail.png',
|
|
251
|
+
} as const;
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
Name files by layer purpose, never by node ID.
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Step 5 — Using Assets in Web Components Views
|
|
259
|
+
|
|
260
|
+
### Static images in a Lit template
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
import { PAGE_ASSETS } from './_assets.js';
|
|
264
|
+
|
|
265
|
+
render() {
|
|
266
|
+
return html`
|
|
267
|
+
<img
|
|
268
|
+
src=${PAGE_ASSETS.heroBg}
|
|
269
|
+
alt="Dashboard hero background"
|
|
270
|
+
width="1440" height="600"
|
|
271
|
+
fetchpriority="high"
|
|
272
|
+
/>
|
|
273
|
+
`;
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
Always set `width`/`height` (or a CSS aspect ratio) to avoid layout shift, and `alt` for the Phase 5g accessibility check. Use `loading="lazy"` for below-the-fold images and `fetchpriority="high"` for the LCP image.
|
|
278
|
+
|
|
279
|
+
### Background images in component styles
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
static styles = css`
|
|
283
|
+
.dashboard-hero {
|
|
284
|
+
background-image: url('/assets/images/hero-background.jpg');
|
|
285
|
+
background-size: cover;
|
|
286
|
+
background-position: center;
|
|
287
|
+
}
|
|
288
|
+
`;
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
> **Use root-absolute paths inside `css`.** A Lit `css` template is not a stylesheet file on disk — relative URLs resolve against the *document*, not the component, so `url('../x.png')` breaks on nested routes. Either use `/assets/...`, or let the bundler hash the asset:
|
|
292
|
+
>
|
|
293
|
+
> ```typescript
|
|
294
|
+
> import heroUrl from '../../assets/images/hero-background.jpg';
|
|
295
|
+
> // then: style=${`background-image:url(${heroUrl})`} or a CSS custom property
|
|
296
|
+
> ```
|
|
297
|
+
|
|
298
|
+
### Images inside Ignite UI components
|
|
299
|
+
|
|
300
|
+
Use the component's slot rather than absolute positioning:
|
|
301
|
+
|
|
302
|
+
```html
|
|
303
|
+
<igc-card>
|
|
304
|
+
<igc-card-media><img src="/assets/images/card-thumbnail.png" alt="" /></igc-card-media>
|
|
305
|
+
</igc-card>
|
|
306
|
+
|
|
307
|
+
<igc-avatar src="/assets/images/person.jpg" alt="Jane Doe"></igc-avatar>
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Icons are registered, not extracted
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
import { registerIconFromText } from 'igniteui-webcomponents';
|
|
314
|
+
import logoSvg from '../../assets/icons/logo.svg?raw'; // Vite: ?raw gives the SVG text
|
|
315
|
+
|
|
316
|
+
registerIconFromText('brand-logo', logoSvg, 'app');
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
```html
|
|
320
|
+
<igc-icon name="brand-logo" collection="app"></igc-icon>
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
Registering an extracted SVG lets it inherit `color` and the theme, which a plain `<img>` cannot. See `figma-component-map.md § Icons` for the Material Icons Extended setup.
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## Pitfalls
|
|
328
|
+
|
|
329
|
+
| Pitfall | Consequence | Fix |
|
|
330
|
+
| ------------------------------------------------------------ | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
|
331
|
+
| Skipping asset extraction (gradient placeholders) | Implementation looks nothing like the design; Phase 5 fails | Always use at least Tier 2 or Tier 3 — never skip |
|
|
332
|
+
| Not asking for the file key before starting | Falls back to Tier 2/3 when Tier 1 was possible | Reuse the Phase 1 file key, or ask for it in Step 1, and ask for a REST token |
|
|
333
|
+
| Leaving design-context or CDN URLs in source code | URLs expire in hours to 30 days; production breaks | Download during the session; reference only local paths |
|
|
334
|
+
| Naming assets by node ID (`node-123-456.png`) | Unmaintainable | Name by purpose: `hero-background.jpg`, `company-logo.svg` |
|
|
335
|
+
| Relative `url()` inside a Lit `css` template | 404s on nested routes — the URL resolves against the document | Use `/assets/...` or a bundler import |
|
|
336
|
+
| Putting assets in `src/` in a stock Vite app | Served in dev, but not emitted by `vite build` unless imported or copied (the Ignite UI CLI scaffold copies `src/assets`); 404 in production | Use `public/`, or import the asset so the bundler emits it |
|
|
337
|
+
| Using a node screenshot for an SVG logo | Rasterized logo, no scaling, no theming | Tier 1 Method B with `format=svg` |
|
|
338
|
+
| Exporting PNG at `scale=1` | Blurry on HiDPI screens | Always `scale=2` |
|
|
339
|
+
| `svg_outline_text=true` (the default) | Text converted to paths; larger file; no accessibility | Set `svg_outline_text=false` |
|
|
340
|
+
| Extracting kit component instances as images | A static picture instead of a working component | Check Table A / `figma-component-map.md` — those are components, whatever kit they came from |
|
|
341
|
+
| Extracting registerable icons as PNGs | Icons cannot inherit theme color | Register the SVG and use `<igc-icon>` |
|
|
342
|
+
| Extracting background colors or gradients as images | Bundle bloat, breaks theming | Colors → palette variables and component tokens |
|
|
343
|
+
| Not creating asset directories before `curl` | Silent failures or files in the wrong place | `mkdir -p` first |
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# Design Provenance — Recognizing Components From Any UI Kit
|
|
2
|
+
|
|
3
|
+
> **Part of the [`igniteui-wc-figma-to-app`](../SKILL.md) skill.**
|
|
4
|
+
>
|
|
5
|
+
> Use this file in Phase 1f to decide **where every component in the design came from** and to normalize it into a **canonical role** that [figma-component-map.md](figma-component-map.md) resolves to an Ignite UI tag. Read it in full before building the Phase 1g decomposition table.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Why This Step Exists
|
|
10
|
+
|
|
11
|
+
Designers build Figma screens from many sources: the Infragistics **Indigo.Design UI Kits**, public kits (Material 3 Design Kit, Fluent 2, Bootstrap, shadcn/ui, Untitled UI, Ant Design, iOS/Apple kits), an in-house design system, or plain frames with no components at all. The Ignite UI kits map to Ignite UI one-to-one by layer name. Other kits do not, but they describe the same **roles** (a high-emphasis button, an outlined text field, a tab strip), using different names and variant properties.
|
|
12
|
+
|
|
13
|
+
Translating any kit directly into Ignite UI tags would need one mapping table per kit. Instead, this skill uses two steps: **kit → canonical role** (a small vocabulary, normalized here) and **canonical role → Ignite UI** (one table, in `figma-component-map.md`). A kit you have never seen still works if its variant names can be normalized.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Step 1 — Collect the Evidence for Each Instance
|
|
18
|
+
|
|
19
|
+
For every component-like layer in the target artboard, gather what the design data exposes. Use the cheapest source first.
|
|
20
|
+
|
|
21
|
+
| Evidence | Where it comes from | Strength |
|
|
22
|
+
| --- | --- | --- |
|
|
23
|
+
| **Layer / main-component name** | `data-name` in `figma_get_design_context`; instance names in `figma_get_metadata` XML | Medium. Designers rename layers, and detached instances keep the old name. |
|
|
24
|
+
| **Variant properties** (`Variant=Primary`, `Size=md`, `State=Hover`) | The design-context code (component props), or the REST API (below) | Strong. This is the kit's own statement of role and variant. |
|
|
25
|
+
| **Component description** | REST `components` map, or design-context annotations | Strong when present. Kits often document intent here. |
|
|
26
|
+
| **Code Connect mapping** | `figma_get_code_connect_map` | Strong for **role**, but it may point at a *different* library. See the caveat below. |
|
|
27
|
+
| **Library / source file name** | `figma_get_libraries` (the libraries the file subscribes to: name, key, description) and `figma_search_design_system` (returns `libraryName` for a component name). Check the connected server's tool list, because availability varies by Figma MCP version. | Strong for kit identity. Call `get_libraries` **once per file**: it names the kits in play before you look at a single instance. |
|
|
28
|
+
| **Structure + visuals** | Auto-layout, children, fills, size, the screenshot | Weak alone. It is the only evidence for un-componentized frames. |
|
|
29
|
+
|
|
30
|
+
**Reading exact variant properties via the REST API** (use when names are ambiguous and `FIGMA_TOKEN` + `FILE_KEY` are available. This is the REST API token from `mcp-setup.md § Personal access token`, not an MCP credential):
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
curl -s -H "X-Figma-Token: $FIGMA_TOKEN" \
|
|
34
|
+
"https://api.figma.com/v1/files/$FILE_KEY/nodes?ids=$ARTBOARD_ID" -o /tmp/figma_nodes.json
|
|
35
|
+
|
|
36
|
+
# Every instance with its variant properties
|
|
37
|
+
jq '[.. | objects | select(.type? == "INSTANCE")
|
|
38
|
+
| {id, name, componentId, props: (.componentProperties // {} | with_entries(.value |= .value))}]' \
|
|
39
|
+
/tmp/figma_nodes.json
|
|
40
|
+
|
|
41
|
+
# Main-component and component-set names/descriptions (remote == came from a library)
|
|
42
|
+
jq '.nodes[].components, .nodes[].componentSets' /tmp/figma_nodes.json
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Design-context quirks that matter here:**
|
|
46
|
+
|
|
47
|
+
- `data-name` preserves the main-component name, for example `.Status badge`. Components can also appear as local functions with typed props (`Button({ variant = "outline" })`), which carry the variant values.
|
|
48
|
+
- Nodes inside an instance have IDs like `I9:12;6:3`. Treat those as parts of the parent component, not as components of their own.
|
|
49
|
+
- If the response is flagged **sparse** (large frames), fetch the visible child nodes in one parallel batch instead of guessing from the partial output.
|
|
50
|
+
- When Code Connect maps components to a non-Ignite library, pass `disableCodeConnect: true` (where the server supports it) to keep the reference output free of foreign imports. Read the mapping separately with `figma_get_code_connect_map`.
|
|
51
|
+
|
|
52
|
+
`remote: true` on a component means it came from a published library. `componentSetId` groups the variants of one component. Use the **component-set name** as the main-component name, because instance layer names are often edited.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Step 2 — Classify Provenance (Per Instance)
|
|
57
|
+
|
|
58
|
+
Classify **per instance**, not per file. Real files mix sources: an Ignite UI kit navbar next to a hand-drawn KPI tile and a third-party date picker.
|
|
59
|
+
|
|
60
|
+
| Tier | What it is | Recognized by | Resolution path |
|
|
61
|
+
| --- | --- | --- | --- |
|
|
62
|
+
| **A — Ignite UI kit** | Instance of an Indigo.Design UI Kit component | Leading-underscore names (`_Button/Contained`, `_Input/Border`), `Indigo.Design` library names, hidden `size-[0.5px]` variant-indicator nodes, the kit variable collections | Direct lookup in `figma-component-map.md` by kit name. Highest confidence. |
|
|
63
|
+
| **B — Other component library** | Instance of any other published or local component (public kit or in-house) | A main component / component set with variant properties, without Tier A fingerprints | **Normalize** (Step 3) to a canonical role, then look it up in the canonical role index of `figma-component-map.md`. |
|
|
64
|
+
| **C — Un-componentized** | Plain frames, groups, or detached instances | No main component. Type is `FRAME` / `GROUP`, or a detached copy that still carries a component-like name | **Infer** the role from structure and visuals (Step 4). Lowest confidence. Confirm with the user. |
|
|
65
|
+
|
|
66
|
+
Record the tier and a confidence (**high / medium / low**) in the Phase 1g Table A.
|
|
67
|
+
|
|
68
|
+
### Recognizing common public kits (confirmation only)
|
|
69
|
+
|
|
70
|
+
These fingerprints help name the kit in the plan and choose the theme baseline (Phase 3b). Normalization does **not** depend on them. Kit files change between versions, so treat every row as a hint, not a rule.
|
|
71
|
+
|
|
72
|
+
| Kit | Typical fingerprints | Default icon set |
|
|
73
|
+
| --- | --- | --- |
|
|
74
|
+
| Material 3 Design Kit (Google) | Variables/styles under `M3/…` or `md.sys.…` / `md.ref.…`; tonal roles (`primary`, `on-primary`, `primary-container`, `surface-container-*`); button styles *Filled / Tonal / Outlined / Text / Elevated*; text fields *Filled / Outlined* | Material Symbols |
|
|
75
|
+
| Fluent 2 (Microsoft) | Token names like `colorBrandBackground`, `colorNeutralForeground1`, `borderRadiusMedium`; button appearance *Primary / Secondary / Outline / Subtle / Transparent* | Fluent System Icons |
|
|
76
|
+
| Bootstrap kits | Variant names `primary / secondary / success / danger / warning / info / light / dark`; `btn-outline-*`; `form-control` / `form-select` | Bootstrap Icons |
|
|
77
|
+
| shadcn/ui kits | Semantic variables `background`, `foreground`, `primary`, `primary-foreground`, `muted`, `accent`, `border`, `input`, `ring`, `radius`; button variants *default / secondary / outline / ghost / link / destructive* | Lucide |
|
|
78
|
+
| Untitled UI | `Colors/Brand/600`, `Colors/Gray (light mode)/…`, `bg-primary`, `text-secondary`; button hierarchy *Primary / Secondary / Tertiary / Link* (+ *color / gray*) | Untitled UI Icons (paid Pro tier; check the license) |
|
|
79
|
+
| Ant Design kits | Button type *Primary / Default / Dashed / Text / Link*; `colorPrimary`, `colorBgContainer` tokens | Ant Design Icons |
|
|
80
|
+
| iOS / Apple kits | SF Pro type, *Filled / Tinted / Gray / Plain* buttons, grouped inset lists, tab bars at the bottom | SF Symbols (not licensed for web; substitute) |
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Step 3 — Normalize Tier B Instances Into Canonical Roles
|
|
85
|
+
|
|
86
|
+
Normalize **role**, **emphasis**, **style**, **size**, and **state** separately. Match property values case-insensitively and by meaning, not exact spelling.
|
|
87
|
+
|
|
88
|
+
### Role (from the component or component-set name)
|
|
89
|
+
|
|
90
|
+
Strip prefixes, sigils, status emoji, numbering, and platform tags (`.Button`, `Button / Base`, `❖ Button`, `✅ Button`, `[Web] Button`, `Buttons`). A leading `.` usually marks a private or base component. A leading `_` with a `/` path (`_Button/Contained`) is the Tier A Indigo.Design fingerprint. Classify it before stripping anything. Ignore the order of variant axes: `Button (M, Accent)` is the same as `Button (Accent, M)`. Then match against the canonical roles in `figma-component-map.md § Canonical Role Index`. Common synonyms:
|
|
91
|
+
|
|
92
|
+
| Canonical role | Also called |
|
|
93
|
+
| --- | --- |
|
|
94
|
+
| `button` | Btn, CTA, Action |
|
|
95
|
+
| `icon-button` | Button with `Icon only=true`, Icon Btn, Square button |
|
|
96
|
+
| `fab` | Floating action button, Extended FAB |
|
|
97
|
+
| `toggle-group` | Segmented button, Segmented control, Button group (selectable), Radio buttons (button style) |
|
|
98
|
+
| `text-field` | Input, Text input, Field, Form control, Textbox |
|
|
99
|
+
| `textarea` | Text area, Multiline input |
|
|
100
|
+
| `select` | Dropdown (as a form field), Picker, Listbox trigger |
|
|
101
|
+
| `combobox` | Autocomplete, Searchable select, Typeahead, Multi-select, Tag input |
|
|
102
|
+
| `menu` | Dropdown menu, Context menu, Overflow menu, Action sheet (desktop) |
|
|
103
|
+
| `app-bar` | Navbar, Top bar, Header, Toolbar (page-level) |
|
|
104
|
+
| `side-nav` | Sidebar, Drawer, Navigation rail, Rail |
|
|
105
|
+
| `tabs` | Tab bar, Tab list, Segmented tabs |
|
|
106
|
+
| `breadcrumbs` | Breadcrumb, Path |
|
|
107
|
+
| `dialog` | Modal, Alert dialog |
|
|
108
|
+
| `sheet` | Side sheet, Drawer (overlay), Bottom sheet |
|
|
109
|
+
| `toast` | Snackbar, Notification, Sonner |
|
|
110
|
+
| `inline-alert` | Alert, Banner, Callout, Message bar |
|
|
111
|
+
| `tag` | Badge (text pill), Label, Pill, Status |
|
|
112
|
+
| `count-badge` | Badge (dot or number on another element), Indicator |
|
|
113
|
+
| `chip` | Filter chip, Input chip, Assist chip, Removable tag |
|
|
114
|
+
| `data-table` | Table, Data grid, Grid |
|
|
115
|
+
| `list` | List, List group, Menu list (non-overlay) |
|
|
116
|
+
| `progress-linear` / `progress-circular` | Progress bar, Loader / Spinner (determinate or not) |
|
|
117
|
+
|
|
118
|
+
### Emphasis (buttons, icon buttons, links)
|
|
119
|
+
|
|
120
|
+
| Normalized | Kit values that mean it |
|
|
121
|
+
| --- | --- |
|
|
122
|
+
| **high** | Primary, Filled, Solid, Contained, Default (shadcn), Brand, Accent, Hierarchy=Primary |
|
|
123
|
+
| **medium** | Secondary, Tonal, Soft, Outline(d), Stroke, Bordered, Default (Ant/Fluent), Gray |
|
|
124
|
+
| **low** | Tertiary, Ghost, Subtle, Text, Plain, Transparent, Flat, Borderless |
|
|
125
|
+
| **link** | Link, Hyperlink, Link color / Link gray |
|
|
126
|
+
| **elevated** | Elevated, Raised |
|
|
127
|
+
| **danger** (modifier) | Destructive, Danger, Error, Critical |
|
|
128
|
+
|
|
129
|
+
"Secondary" means *outlined* in some kits and *a filled button in the secondary color* in others. Read the visuals of that instance (fill vs stroke) before choosing.
|
|
130
|
+
|
|
131
|
+
### Style (form fields)
|
|
132
|
+
|
|
133
|
+
| Normalized | Kit values / visuals |
|
|
134
|
+
| --- | --- |
|
|
135
|
+
| **outlined** | Outlined, Bordered, Border, Default with a full 1px stroke |
|
|
136
|
+
| **filled** | Filled, Box, Solid, Flushed-with-background, Tonal |
|
|
137
|
+
| **underlined** | Line, Underline, Flushed, Standard |
|
|
138
|
+
| **label-floating** | Label inside the field that moves to the top edge |
|
|
139
|
+
| **label-above** | Label as separate text above the field |
|
|
140
|
+
|
|
141
|
+
### Size and state
|
|
142
|
+
|
|
143
|
+
- **Size:** record the measured control **height** in px (from the design context), not the kit's size name. Kits disagree on what `md` means. Phase 3d turns heights into `--ig-size`.
|
|
144
|
+
- **State:** `Hover`, `Focused`, `Pressed`, `Disabled`, `Error`, `Selected` variants are **states**, not different components. Implement the default state, and use state values only as token inputs (hover color, focus ring) in Phase 3d. A screen showing a `State=Error` field means the design wants validation styling. It does not mean the field is permanently invalid.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Step 4 — Infer Tier C (Un-componentized) Layers
|
|
149
|
+
|
|
150
|
+
Use the exact values from the design context and the screenshot together:
|
|
151
|
+
|
|
152
|
+
| Structure observed | Likely role |
|
|
153
|
+
| --- | --- |
|
|
154
|
+
| Auto-layout row, 28–56px tall, one short text (± icon), solid fill or 1px stroke, radius | `button` (emphasis from fill vs stroke vs none) |
|
|
155
|
+
| Square 24–48px frame with only an icon | `icon-button` |
|
|
156
|
+
| 32–56px frame with a stroke or bottom border, placeholder-grey text, optional chevron/icon | `text-field` (chevron → `select`) |
|
|
157
|
+
| Repeated equal-height rows with leading icon/avatar + 1–2 text lines + trailing element | `list` |
|
|
158
|
+
| Header row of labels over repeated rows aligned in columns | `data-table` |
|
|
159
|
+
| Horizontal labels with one underlined or pill-highlighted item | `tabs` |
|
|
160
|
+
| Small rounded pill with short text | `tag` or `chip` (`chip` when it has a close or select affordance) |
|
|
161
|
+
| Circle 24–64px with an image or initials | `avatar` |
|
|
162
|
+
|
|
163
|
+
Rules for Tier C:
|
|
164
|
+
|
|
165
|
+
- **Confidence is low by default.** List Tier C mappings separately in the Phase 1g review so the user can correct them.
|
|
166
|
+
- **Purely decorative or bespoke layouts** (hero sections, marketing tiles, KPI cards) stay plain semantic HTML plus CSS. Do not force them into a component because a name suggests one.
|
|
167
|
+
- **Interactive controls stay components.** If a Tier C frame is clearly an input, select, date field, table, or tab strip, use the Ignite UI component even when its anatomy differs. The component brings keyboard, focus, ARIA, and form behavior that a custom frame lacks.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Code Connect Caveat
|
|
172
|
+
|
|
173
|
+
`figma_get_code_connect_map` may return mappings to **another** library, for example a shadcn kit connected to `@/components/ui/button`, or an in-house kit connected to the company's React package. Use these mappings as **strong evidence of the role and props** (a Code Connect snippet `<Button variant="outline" size="sm">` confirms *button / medium emphasis / small*). **Never** copy their imports, tags, or props into the implementation. The target is always Ignite UI.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## False Friends — Same Name, Different Ignite UI Component
|
|
178
|
+
|
|
179
|
+
| Name in the kit | Usually means | Ignite UI Web Components choice |
|
|
180
|
+
| --- | --- | --- |
|
|
181
|
+
| **Badge** (shadcn, Untitled UI, Bootstrap) | A text pill / status label | `igc-badge` with slotted text for short status; `igc-chip` when removable or selectable |
|
|
182
|
+
| **Badge** (Material, Fluent) | Dot or count on another element | `igc-badge` positioned over the host |
|
|
183
|
+
| **Dropdown** | A form field in some kits, a menu in others | `igc-select` (field) vs `igc-dropdown` (menu) |
|
|
184
|
+
| **Select** with search (shadcn Combobox, Ant Select `showSearch`) | Filterable single select | `igc-combo single-select` |
|
|
185
|
+
| **Tabs** styled as a pill track (shadcn, Fluent "segmented") | Either view switching or a value toggle | `igc-tabs` if it switches panels; `igc-button-group` if it sets a value |
|
|
186
|
+
| **Sheet** / **Drawer** (overlay) | Temporary side panel | `igc-nav-drawer` for navigation. There is no dedicated sheet component: for content panels use `igc-dialog` or custom markup, and record it as an anatomy delta |
|
|
187
|
+
| **Alert** | Inline message (not modal) | `igc-banner`, or semantic HTML for static callouts |
|
|
188
|
+
| **Toast** vs **Snackbar** | Transient message | `igc-toast` (text only) or `igc-snackbar` (with action) |
|
|
189
|
+
| **Card** with complex internal layout | A surface container | `igc-card` only if header/content/actions anatomy fits; otherwise a Table B surface |
|
|
190
|
+
| **Navigation rail** | Icon-only side nav | `igc-nav-drawer position="relative"` with the `mini` slot, and **without** `open`. The rail is hidden while the drawer is open |
|
|
191
|
+
| **Tab bar** at the bottom (iOS, M3 navigation bar) | App-level navigation | No bottom navigation in Web Components. Use `igc-tabs` or custom markup and document the substitution |
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Output of This Step
|
|
196
|
+
|
|
197
|
+
Fill the **Tier**, **Kit / Source**, **Canonical Role + Props**, **Confidence**, **Token Work**, and **Suspected Anatomy Deltas** columns of the Phase 1g **Table A**. The table and its column rules are defined once, in `figma-exploration.md § 1g`.
|
|
198
|
+
|
|
199
|
+
Only the **Suspected Anatomy Deltas** column feeds the Phase 2d delta ledger. Token Work is never a delta.
|