// #region Imports
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { Appearanceable } from '../../../Behaviors/Appearanceable';
import { Disableable } from '../../../Behaviors/Disableable';
import { Elevatable } from '../../../Behaviors/Elevatable';
import { Fitable } from '../../../Behaviors/Fitable';
import { Insetable } from '../../../Behaviors/Insetable';
import { Orientable } from '../../../Behaviors/Orientable';
import { Slottable } from '../../../Behaviors/Slottable';
import { TextFormattable } from '../../../Behaviors/TextFormattable';
import { Attribute } from '../../../Decorators/AttributeDecorator';
import { Component } from '../../../Decorators/ComponentDecorator';
import { Property } from '../../../Decorators/PropertyDecorator';
import { Orientation } from '../../../Types/Orientation';
import { CustomElement } from '../../Abstracts/CustomElement';
import { ElevationElement } from '../../Primitives/Elevation/ElevationElement';
import { CardActionsElement } from './CardActionsElement';
import { CardContentElement } from './CardContentElement';
import { cardElementTemplate } from './CardElementTemplate';
import { CardHeaderElement } from './CardHeaderElement';
import { CardSubTitleElement } from './CardSubTitleElement';
import { CardTitleElement } from './CardTitleElement';
import { Themeable } from '../../../../Controls/Behaviors/Themeable';
import { cardElementCosmopolitanStyle } from './Themes/CardElement.Cosmopolitan';
import { cardElementJoyStyle } from './Themes/CardElement.Joy';
import { cardElementRetroStyle } from './Themes/CardElement.Retro';
import { Selectable } from '../../../Behaviors/Selectable';
// #endregion
/**
 * Card - A component that represents a card UI element for displaying related content.
 *
 * @description This component is designed to encapsulate related information within a visually distinct container. Cards can include various sections such as a title, subtitle, content, actions, and footers, making them versatile for many use cases in a user interface.
 *
 * @name Card
 * @element mosaik-card
 * @category UI Components
 *
 * @slot cover - The slot for placing a cover image or graphic at the top of the card.
 * @slot media - The slot for placing media content, such as images or videos.
 * @slot header - The slot for placing header content, typically containing the title.
 * @slot content - The slot for placing the main content of the card.
 * @slot actions - The slot for placing action buttons related to the card.
 * @slot footer - The slot for placing footer content, often for additional information or links.
 *
 * @csspart elevation - The part representing the elevation effect of the card.
 * @csspart cover - The part representing the cover area of the card.
 * @csspart heading - The part representing the heading area of the card.
 * @csspart media - The part representing the media content area of the card.
 * @csspart header - The part representing the header section of the card.
 * @csspart content - The part representing the main content area of the card.
 * @csspart actions - The part representing the actions area of the card.
 * @csspart footer - The part representing the footer area of the card.
 *
 * @cssprop {unknown} --card-font-family - The font-family property for the card text.
 * @cssprop {unknown} --card-font-size - The font-size property for the card text.
 * @cssprop {unknown} --card-font-line-height - The line-height property for the card text.
 * @cssprop {unknown} --card-font-weight - The font-weight property for the card text.
 * @cssprop {unknown} --card-font-letter-spacing - The letter-spacing property for the card text.
 * @cssprop {unknown} --card-font-text-decoration - The text-decoration property for the card text.
 * @cssprop {unknown} --card-font-text-transform - The text-transform property for the card text.
 * @cssprop {unknown} --card-background-color - The background-color property for the card.
 * @cssprop {unknown} --card-border-color - The border-color property for the card.
 * @cssprop {unknown} --card-foreground-color - The foreground-color property for the card.
 * @cssprop {unknown} --card-border-width - The border-width property for the card.
 * @cssprop {unknown} --card-border-radius - The border-radius property for the card.
 * @cssprop {unknown} --card-border-style - The border-style property for the card.
 * @cssprop {unknown} --card-transition-duration - The transition duration for card animations.
 * @cssprop {unknown} --card-transition-mode - The transition mode for card animations.
 * @cssprop {unknown} --card-transition-property - The transition property for the card animations.
 * @cssprop {unknown} --card-shadow - The shadow property for the card.
 * @cssprop {unknown} --card-divider-height - The height of any dividers within the card.
 * @cssprop {unknown} --_has-header - Indicates if the card has a header.
 * @cssprop {unknown} --_has-content - Indicates if the card has content.
 * @cssprop {unknown} --_has-actions - Indicates if the card has actions.
 * @cssprop {unknown} --_has-footer - Indicates if the card has a footer.
 * @cssprop {unknown} --card-content-padding-top - The top padding for the card content area.
 *
 * @dependency {CardContentElement} - The Card Content element used within the card.
 * @dependency {CardHeaderElement} - The Card Header element used within the card.
 * @dependency {CardSubTitleElement} - The Card Sub Title element used within the card.
 * @dependency {CardTitleElement} - The Card Title element used within the card.
 * @dependency {CardActionsElement} - The Card Actions element used within the card.
 * @dependency {ElevationElement} - The Elevation element for visual depth.
 *
 * @example
 * ```html
 * <mosaik-card>
 *   <div slot="cover"><img src="cover-image.jpg" alt="Cover Image"></div>
 *   <div slot="media"><img src="media-image.jpg" alt="Media"></div>
 *   <mosaik-card-header>
 *     <mosaik-card-title>Card Title</mosaik-card-title>
 *     <mosaik-card-sub-title>Card Subtitle</mosaik-card-sub-title>
 *   </mosaik-card-header>
 *   <mosaik-card-content>Content goes here.</mosaik-card-content>
 *   <mosaik-card-actions>
 *     <mosaik-button>Action 1</mosaik-button>
 *     <mosaik-button>Action 2</mosaik-button>
 *   </mosaik-card-actions>
 *   <mosaik-card-footer>Footer content goes here.</mosaik-card-footer>
 * </mosaik-card>
 * ```
 *
 * @public
 */
let CardElement = class CardElement extends Themeable(Elevatable(Appearanceable(Insetable(Disableable(Fitable(Orientable(TextFormattable(Slottable(Selectable(CustomElement)))))))))) {
    // #region Fields
    _header;
    _subHeader;
    _content;
    _inlineMedia;
    // #endregion
    // #region Ctor
    /**
     * @public
     */
    constructor() {
        super();
        this._header = '';
        this._subHeader = '';
        this._content = '';
        this._inlineMedia = false;
        // TODO: REMARK: This is a workaround for the issue with the docs generation.
        // If we set the orientation property like this `this.orientation = Orientation.Vertical;` the
        // docs generation will generates a wrong type.
        Object.assign(this, { orientation: Orientation.Vertical });
    }
    // #endregion
    // #region Properties
    /**
     * Returns the `is` property.
     *
     * @public
     * @static
     * @readonly
    */
    static get is() {
        return 'mosaik-card';
    }
    /**
     * The `header` property represents the header of the card.
     * It will inherited automatically by the `CardHeaderElement`.
     *
     * @public
     */
    get header() {
        return this._header;
    }
    set header(value) {
        if (this._header !== value) {
            this._header = value;
            this.requestUpdate('header');
        }
    }
    /**
     * The `subHeader` property represents the sub header of the card.
     * It will inherited automatically by the `CardSubTitleElement`.
     *
     * @public
     */
    get subHeader() {
        return this._subHeader;
    }
    set subHeader(value) {
        if (this._subHeader !== value) {
            this._subHeader = value;
            this.requestUpdate('subHeader');
        }
    }
    /**
     * Gets or sets the `content` property.
     *
     * @public
     */
    get content() {
        return this._content;
    }
    set content(value) {
        if (this._content !== value) {
            this._content = value;
            this.requestUpdate('content');
        }
    }
    /**
     * Gets or sets the `inlineMedia` property.
     *
     * @public
     * @attr
     */
    get inlineMedia() {
        return this._inlineMedia;
    }
    set inlineMedia(value) {
        if (this._inlineMedia !== value) {
            this._inlineMedia = value;
            this.requestUpdate('inlineMedia');
        }
    }
};
__decorate([
    Property({ type: String }),
    __metadata("design:type", String),
    __metadata("design:paramtypes", [String])
], CardElement.prototype, "header", null);
__decorate([
    Property({ type: String }),
    __metadata("design:type", String),
    __metadata("design:paramtypes", [String])
], CardElement.prototype, "subHeader", null);
__decorate([
    Property({ type: String }),
    __metadata("design:type", String),
    __metadata("design:paramtypes", [String])
], CardElement.prototype, "content", null);
__decorate([
    Attribute({
        type: Boolean,
        useDefault: true
    }),
    __metadata("design:type", Boolean),
    __metadata("design:paramtypes", [Boolean])
], CardElement.prototype, "inlineMedia", null);
CardElement = __decorate([
    Component({
        selector: 'mosaik-card',
        template: cardElementTemplate,
        themes: {
            joy: cardElementJoyStyle,
            retro: cardElementRetroStyle,
            cosmopolitan: cardElementCosmopolitanStyle
        },
        imports: [
            CardContentElement,
            CardHeaderElement,
            CardSubTitleElement,
            CardTitleElement,
            CardActionsElement,
            ElevationElement
        ]
    }),
    __metadata("design:paramtypes", [])
], CardElement);
export { CardElement };
//# sourceMappingURL=CardElement.js.map