@sky.ui/core 0.0.42 → 0.0.43
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/dist/custom-elements.json +2850 -2850
- package/dist/helper/controllers/animation-controller.d.ts +4 -4
- package/dist/helper/controllers/animation-controller.js.map +1 -1
- package/dist/helper/iconify-offline.js.map +1 -1
- package/dist/helper/utils/color-resolver.js.map +1 -1
- package/dist/helper/utils/contrast-color.js.map +1 -1
- package/dist/helper/utils/size-resolver.js.map +1 -1
- package/dist/sky-alert/sky-alert.js.map +1 -1
- package/dist/sky-appbar/sky-appbar.js.map +1 -1
- package/dist/sky-avatar/sky-avatar.js.map +1 -1
- package/dist/sky-badge/sky-badge.js.map +1 -1
- package/dist/sky-button/sky-button.js.map +1 -1
- package/dist/sky-card/sky-card.js.map +1 -1
- package/dist/sky-checkbox/sky-checkbox.js.map +1 -1
- package/dist/sky-chip/sky-chip.js.map +1 -1
- package/dist/sky-col/sky-col.js.map +1 -1
- package/dist/sky-combobox/sky-combobox.js.map +1 -1
- package/dist/sky-dialog/sky-dialog.js.map +1 -1
- package/dist/sky-divider/sky-divider.js.map +1 -1
- package/dist/sky-flexbox/sky-flexbox.js.map +1 -1
- package/dist/sky-flexcol/sky-flexcol.js.map +1 -1
- package/dist/sky-grid/sky-grid.js.map +1 -1
- package/dist/sky-icon/sky-icon.js +1 -1
- package/dist/sky-icon/sky-icon.js.map +1 -1
- package/dist/sky-image/sky-image.js.map +1 -1
- package/dist/sky-image/srcset-utils.js.map +1 -1
- package/dist/sky-input/sky-input.js.map +1 -1
- package/dist/sky-list/sky-list.js.map +1 -1
- package/dist/sky-listitem/sky-listitem.js.map +1 -1
- package/dist/sky-radio/sky-radio.js.map +1 -1
- package/dist/sky-row/sky-row.js.map +1 -1
- package/dist/sky-sheet/sky-sheet.js.map +1 -1
- package/dist/sky-simple-table/sky-simple-table.js.map +1 -1
- package/dist/sky-theme-provider/sky-theme-provider.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sky-card.js","sources":["../../src/sky-card/sky-card.ts"],"sourcesContent":["import { LitElement, html, css, PropertyValues } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { resolveRadius } from \"../helper/utils/size-resolver\";\nimport { resolveColor } from \"../helper/utils/color-resolver\";\nimport { PresetController } from \"../helper/controllers/preset-controller\";\n\nexport type SkyCardElevation = \"none\" | \"sm\" | \"md\" | \"lg\";\nexport type SkyCardSectionLayout = \"inline\" | \"stack\";\nexport type SkyCardSectionTarget = \"both\" | \"header\" | \"footer\" | \"none\";\n\n/**\n * @element sky-card\n *\n * @summary Customizable card with configurable header/footer sections, blur/background styles, elevation, insets, overlays, and separators.\n *\n * @status stable\n * @since 1.0.0\n *\n * @documentation https://sky-ui.com/components/card\n *\n * @slot - Default slot for the card body content (replaces `bodyPadding` property if used).\n * @slot title - Slot for the card title.\n * @slot subtitle - Slot for the card subtitle.\n * @slot actions - Slot for the card actions (usually buttons).\n * @slot footer-title - Slot for the footer title.\n * @slot footer-subtitle - Slot for the footer subtitle.\n * @slot footer-actions - Slot for the footer actions (usually buttons).\n *\n * @csspart card - The main card container element.\n * @csspart header - The card header section.\n * @csspart footer - The card footer section.\n * @csspart ripple - The ripple animation element injected when the card is clicked.\n *\n * @property {string} bg - Background color of the card. Accepts color tokens or custom CSS colors. Default: `\"primary\"`.\n * @property {string} blurLevel - Level of blur applied to the background. Default: `\"none\"`.\n * @property {string} radius - Border radius of the card. Default: `\"md\"`.\n * @property {string} bodyPadding - Padding for the card body. Default: `\"none\"`.\n * @property {SkyCardElevation} elevation - Shadow depth of the card. Default: `\"md\"`.\n * @property {boolean} outlined - Whether the card has an outline. Default: `false`.\n * @property {boolean} clickable - Whether the card is clickable. Default: `false`.\n * @property {string} headerBg - Background color of the header. Default: `\"transparent\"`.\n * @property {string} headerBlur - Blur level for the header background. Default: `\"none\"`.\n * @property {string} headerPadding - Padding for the header. Default: `\"md\"`.\n * @property {SkyCardSectionLayout} headerLayout - Layout of the header content. Default: `\"inline\"`.\n * @property {string} headerInsetGap - Inset gap for the header section. Default: `\"sm\"`.\n * @property {string} headerRadius - Border radius for the header. Default: `\"md\"`.\n * @property {string} headerSeparatorColor - Color for the header separator. Default: `\"border-light\"`.\n * @property {string} footerBg - Background color of the footer. Default: `\"transparent\"`.\n * @property {string} footerBlur - Blur level for the footer background. Default: `\"none\"`.\n * @property {string} footerPadding - Padding for the footer. Default: `\"md\"`.\n * @property {SkyCardSectionLayout} footerLayout - Layout of the footer content. Default: `\"inline\"`.\n * @property {string} footerInsetGap - Inset gap for the footer section. Default: `\"sm\"`.\n * @property {string} footerRadius - Border radius for the footer. Default: `\"md\"`.\n * @property {string} footerSeparatorColor - Color for the footer separator. Default: `\"border-light\"`.\n * @property {number} padRatio - Ratio to adjust padding. Default: `1`.\n * @property {SkyCardSectionTarget} separators - Determines where separators should appear. Default: `\"none\"`.\n * @property {SkyCardSectionTarget} overlays - Determines where overlays should appear. Default: `\"none\"`.\n * @property {SkyCardSectionTarget} insets - Determines where insets should appear. Default: `\"none\"`.\n * @property {string} preset - Named prop preset from nearest `sky-config-provider`. Default: `\"\"`.\n * @method refreshLayout Recomputes card variables and section synchronization.\n *\n * @example\n * ```html\n * <sky-card bg=\"primary\" elevation=\"lg\" headerpadding=\"md\">\n * <span slot=\"title\">Monthly Report</span>\n * <span slot=\"subtitle\">April 2026</span>\n * <div>Total revenue increased by 18%.</div>\n * <button slot=\"actions\">View Details</button>\n * </sky-card>\n * ```\n * ```vue\n * <template>\n * <sky-card bg=\"primary\" elevation=\"lg\" headerpadding=\"md\">\n * <span slot=\"title\">Monthly Report</span>\n * <span slot=\"subtitle\">April 2026</span>\n * <div>Total revenue increased by 18%.</div>\n * <button slot=\"actions\">View Details</button>\n * </sky-card>\n * </template>\n * ```\n * ```jsx\n * export default function Demo() {\n * return (\n * <sky-card bg=\"primary\" elevation=\"lg\" headerpadding=\"md\">\n * <span slot=\"title\">Monthly Report</span>\n * <span slot=\"subtitle\">April 2026</span>\n * <div>Total revenue increased by 18%.</div>\n * <button slot=\"actions\">View Details</button>\n * </sky-card>\n * );\n * }\n * ```\n */\n@customElement(\"sky-card\")\nexport class SkyCard extends LitElement {\n @property({ type: String, reflect: true }) bg = \"primary\";\n @property({ type: String, reflect: true }) blurLevel = \"none\";\n @property({ type: String, reflect: true }) radius = \"md\";\n @property({ type: String, reflect: true }) bodyPadding = \"none\";\n @property({ type: String, reflect: true }) elevation: SkyCardElevation = \"md\";\n @property({ type: Boolean, reflect: true }) outlined = false;\n @property({ type: Boolean, reflect: true }) clickable = false;\n\n @property({ type: String, reflect: true }) headerBg =\n \"transparent\";\n @property({ type: String, reflect: true })\n headerBlur = \"none\";\n @property({ type: String, reflect: true })\n headerPadding = \"md\";\n @property({ type: String }) headerLayout: SkyCardSectionLayout = \"inline\";\n @property({ type: String, reflect: true })\n headerInsetGap = \"sm\";\n @property({ type: String, reflect: true })\n headerRadius = \"md\";\n @property({ type: String })\n headerSeparatorColor = \"border-light\";\n\n @property({ type: String, reflect: true }) footerBg =\n \"transparent\";\n @property({ type: String, reflect: true })\n footerBlur = \"none\";\n @property({ type: String, reflect: true })\n footerPadding = \"md\";\n @property({ type: String }) footerLayout: SkyCardSectionLayout = \"inline\";\n @property({ type: String, reflect: true })\n footerInsetGap = \"sm\";\n @property({ type: String, reflect: true })\n footerRadius = \"md\";\n @property({ type: String })\n footerSeparatorColor = \"border-light\";\n\n @property({ type: Number }) padRatio = 1;\n\n @property({ type: String }) separators: SkyCardSectionTarget = \"none\";\n @property({ type: String }) overlays: SkyCardSectionTarget = \"none\";\n @property({ type: String }) insets: SkyCardSectionTarget = \"none\";\n\n private _effHeaderSeparator = false;\n private _effFooterSeparator = false;\n private _effHeaderOverlay = false;\n private _effFooterOverlay = false;\n private _effHeaderInset = false;\n private _effFooterInset = false;\n private _varsCache: Record<string, string> = {};\n\n private static readonly BG_MAP = {\n primary: \"var(--sky-glass-primary)\",\n secondary: \"var(--sky-glass-secondary)\",\n tertiary: \"var(--sky-glass-tertiary)\",\n transparent: \"transparent\",\n } as const;\n\n private static readonly BLUR_MAP = {\n none: \"none\",\n xs: \"blur(2px)\",\n sm: \"var(--sky-blur-secondary)\",\n md: \"var(--sky-blur-secondary)\",\n lg: \"var(--sky-blur-tertiary)\",\n } as const;\n\n private static readonly SIZE_MAP = {\n none: \"0\",\n sm: \"var(--sky-space-1\\\\.5, 6px)\",\n md: \"var(--sky-space-4, 16px)\",\n lg: \"var(--sky-space-6, 24px)\",\n xl: \"var(--sky-space-8, 32px)\",\n } as const;\n\n private static readonly GLASS_BG_TIERS = new Set([\n \"primary\",\n \"secondary\",\n \"tertiary\",\n ]);\n\n /** Non-overlay inset bars use hover tints — overlay sections own their own blur. */\n private static readonly SECTION_INSET_BG_MAP = {\n primary: \"var(--sky-hover-primary)\",\n secondary: \"var(--sky-hover-secondary)\",\n tertiary: \"var(--sky-hover-tertiary)\",\n transparent: \"transparent\",\n } as const;\n\n private static _composeBackdrop(blurLevel: string): string {\n const blur =\n SkyCard.BLUR_MAP[blurLevel as keyof typeof SkyCard.BLUR_MAP] ?? blurLevel;\n if (blur === \"none\") return \"none\";\n return `${blur} var(--sky-saturation-secondary) var(--sky-brightness-secondary)`;\n }\n\n private static _composeElevation(level: SkyCardElevation | string): string {\n const depthMap: Record<SkyCardElevation, string | null> = {\n none: null,\n sm: \"var(--sky-box-shadow-primary)\",\n md: \"var(--sky-box-shadow-secondary)\",\n lg: \"var(--sky-box-shadow-tertiary)\",\n };\n const depth = depthMap[level as SkyCardElevation];\n if (depth === null) return \"none\";\n if (depth === undefined) return level;\n return `var(--sky-box-shadow-inset), ${depth}`;\n }\n\n\n /** Named prop preset from nearest `sky-config-provider`. */\n @property({ type: String, reflect: true }) preset = \"\";\n\n private _presets = new PresetController(this);\n\n static styles = css`\n :host {\n display: block;\n }\n\n .card {\n display: flex;\n flex-direction: column;\n width: 100%;\n position: relative;\n overflow: hidden;\n box-sizing: border-box;\n color: var(--sky-text-primary);\n background: var(--_card-bg, var(--sky-glass-primary));\n background-image: var(--_card-glass-surface, var(--sky-glass-surface));\n border-radius: var(--_card-radius, var(--sky-radius-secondary));\n backdrop-filter: var(--_card-backdrop, none);\n -webkit-backdrop-filter: var(--_card-backdrop, none);\n box-shadow: var(\n --_card-shadow,\n var(--sky-box-shadow-inset),\n var(--sky-box-shadow-primary)\n );\n border: var(--_card-border, var(--sky-border-primary));\n transition: var(--sky-transition-default);\n }\n\n :host([outlined]) .card {\n box-shadow: none;\n border: var(--sky-border-primary);\n }\n :host([clickable]) .card {\n cursor: pointer;\n }\n :host([clickable]) .card:hover {\n box-shadow: var(\n --_card-shadow-hover,\n var(--sky-box-shadow-inset),\n var(--sky-box-shadow-hover)\n );\n }\n\n .section {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--sky-space-1\\\\.5, 6px);\n box-sizing: border-box;\n min-width: 0;\n background: transparent;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n .section.stack {\n flex-direction: column;\n align-items: stretch;\n gap: var(--sky-space-1\\\\.5, 6px);\n }\n .section.row {\n flex-direction: row;\n }\n\n .overlay-top {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n z-index: 1;\n }\n .overlay-bottom {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 1;\n }\n\n .inset {\n overflow: hidden;\n box-shadow: none;\n }\n .section.inset[part=\"header\"] {\n border: var(--_header-inset-border, 0 solid transparent);\n border-radius: var(--_header-radius, var(--sky-radius-secondary));\n }\n .section.inset[part=\"footer\"] {\n border: var(--_footer-inset-border, 0 solid transparent);\n border-radius: var(--_footer-radius, var(--sky-radius-secondary));\n }\n .overlay-top.inset {\n top: var(--_header-inset-gap, var(--sky-space-2, 8px));\n left: var(--_header-inset-gap, var(--sky-space-2, 8px));\n right: var(--_header-inset-gap, var(--sky-space-2, 8px));\n }\n .overlay-bottom.inset {\n bottom: var(--_footer-inset-gap, var(--sky-space-2, 8px));\n left: var(--_footer-inset-gap, var(--sky-space-2, 8px));\n right: var(--_footer-inset-gap, var(--sky-space-2, 8px));\n }\n\n .section[part=\"header\"]:has(slot:not([empty])),\n .section[part=\"header\"][has-content] {\n background: var(--_header-bg);\n background-image: var(--_header-glass-surface, none);\n padding-block: var(--_header-pad-y, var(--sky-space-3, 12px));\n padding-inline: var(--_header-pad-x, var(--sky-space-4, 16px));\n }\n .section[part=\"footer\"]:has(slot:not([empty])),\n .section[part=\"footer\"][has-content] {\n background: var(--_footer-bg);\n background-image: var(--_footer-glass-surface, none);\n padding-block: var(--_footer-pad-y, var(--sky-space-3, 12px));\n padding-inline: var(--_footer-pad-x, var(--sky-space-4, 16px));\n }\n\n .section[part=\"header\"].overlay-top:has(slot:not([empty])),\n .section[part=\"header\"].overlay-top[has-content] {\n backdrop-filter: var(--_header-backdrop, none);\n -webkit-backdrop-filter: var(--_header-backdrop, none);\n }\n .section[part=\"footer\"].overlay-bottom:has(slot:not([empty])),\n .section[part=\"footer\"].overlay-bottom[has-content] {\n backdrop-filter: var(--_footer-backdrop, none);\n -webkit-backdrop-filter: var(--_footer-backdrop, none);\n }\n\n .section[part=\"header\"]:not(.inset):has(slot:not([empty])),\n .section[part=\"header\"]:not(.inset)[has-content] {\n border-bottom: var(--_header-separator, 0px) solid\n var(--_header-separator-color, var(--sky-border-light));\n }\n .section[part=\"footer\"]:not(.inset):has(slot:not([empty])),\n .section[part=\"footer\"]:not(.inset)[has-content] {\n border-top: var(--_footer-separator, 0px) solid\n var(--_footer-separator-color, var(--sky-border-light));\n }\n\n ::slotted(:not([slot])) {\n box-sizing: border-box;\n padding-block: var(--_body-pad-y, var(--sky-space-3, 12px));\n padding-inline: var(--_body-pad-x, var(--sky-space-4, 16px));\n }\n slot[empty] {\n display: none;\n }\n\n ::slotted([slot=\"title\"]) {\n font-size: var(--sky-font-size-lg, 18px);\n font-weight: var(--sky-font-weight-semibold, 600);\n margin: 0;\n color: var(--sky-text-primary);\n text-align: start;\n text-shadow: var(--sky-text-shadow-on-glass, none);\n }\n ::slotted([slot=\"subtitle\"]) {\n font-size: var(--sky-font-size-sm, 14px);\n margin: 0;\n color: var(--sky-text-secondary);\n text-align: start;\n text-shadow: var(--sky-text-shadow-on-glass, none);\n }\n ::slotted([slot=\"actions\"]) {\n display: inline-flex;\n gap: var(--sky-space-1\\\\.5, 6px);\n align-items: center;\n margin-left: auto;\n }\n ::slotted([slot=\"footer-title\"]) {\n font-size: var(--sky-font-size-md, 16px);\n font-weight: var(--sky-font-weight-medium, 500);\n margin: 0;\n color: var(--sky-text-primary);\n text-align: start;\n }\n ::slotted([slot=\"footer-subtitle\"]) {\n font-size: var(--sky-font-size-xs, 12px);\n margin: 0;\n color: var(--sky-text-secondary);\n text-align: start;\n }\n ::slotted([slot=\"footer-actions\"]) {\n display: inline-flex;\n gap: var(--sky-space-1\\\\.5, 6px);\n align-items: center;\n margin-left: auto;\n }\n\n .main {\n width: 100%;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .card {\n transition: none;\n }\n }\n `;\n\n override firstUpdated(): void {\n this._wireSlotChangeHandlers();\n\n this._syncHeader();\n this._syncFooter();\n }\n\n /**\n * After PresetController hostUpdate — card chrome may come from presets.\n * Keep flag recompute + CSS var apply here (not willUpdate).\n */\n protected override update(changed: PropertyValues): void {\n if (\n changed.has(\"separators\") ||\n changed.has(\"overlays\") ||\n changed.has(\"insets\")\n ) {\n this._computeEffectiveFlags();\n }\n\n if (\n changed.has(\"bg\") ||\n changed.has(\"blurLevel\") ||\n changed.has(\"radius\") ||\n changed.has(\"elevation\") ||\n changed.has(\"preset\")\n ) {\n this._applyCardVars();\n }\n if (\n changed.has(\"headerPadding\") ||\n changed.has(\"bodyPadding\") ||\n changed.has(\"footerPadding\") ||\n changed.has(\"padRatio\") ||\n changed.has(\"preset\")\n ) {\n this._applyPaddingVars();\n }\n if (\n changed.has(\"headerBg\") ||\n changed.has(\"footerBg\") ||\n changed.has(\"headerBlur\") ||\n changed.has(\"footerBlur\") ||\n changed.has(\"headerRadius\") ||\n changed.has(\"footerRadius\") ||\n changed.has(\"headerInsetGap\") ||\n changed.has(\"footerInsetGap\") ||\n changed.has(\"headerSeparatorColor\") ||\n changed.has(\"footerSeparatorColor\") ||\n changed.has(\"separators\") ||\n changed.has(\"insets\") ||\n changed.has(\"overlays\") ||\n changed.has(\"preset\")\n ) {\n this._applySectionChrome();\n }\n super.update(changed);\n }\n\n private _wireSlotChangeHandlers(): void {\n this.renderRoot\n .querySelector(\"#slot-title\")\n ?.addEventListener(\"slotchange\", () => this._syncHeader());\n this.renderRoot\n .querySelector(\"#slot-subtitle\")\n ?.addEventListener(\"slotchange\", () => this._syncHeader());\n this.renderRoot\n .querySelector(\"#slot-actions\")\n ?.addEventListener(\"slotchange\", () => this._syncHeader());\n\n this.renderRoot\n .querySelector(\"#slot-f-title\")\n ?.addEventListener(\"slotchange\", () => this._syncFooter());\n this.renderRoot\n .querySelector(\"#slot-f-subtitle\")\n ?.addEventListener(\"slotchange\", () => this._syncFooter());\n this.renderRoot\n .querySelector(\"#slot-f-actions\")\n ?.addEventListener(\"slotchange\", () => this._syncFooter());\n }\n\n private _syncHeader(): void {\n const hdr = this.renderRoot.querySelector(\"#hdr\");\n const slots = [\n this.renderRoot.querySelector(\"#slot-title\") as HTMLSlotElement | null,\n this.renderRoot.querySelector(\"#slot-subtitle\") as HTMLSlotElement | null,\n this.renderRoot.querySelector(\"#slot-actions\") as HTMLSlotElement | null,\n ].filter(Boolean) as HTMLSlotElement[];\n\n const has = slots.some(\n (s) => s.assignedNodes({ flatten: true }).length > 0\n );\n hdr?.toggleAttribute(\"has-content\", has);\n\n slots.forEach((s) =>\n s.toggleAttribute(\n \"empty\",\n s.assignedNodes({ flatten: true }).length === 0\n )\n );\n }\n\n private _syncFooter(): void {\n const ftr = this.renderRoot.querySelector(\"#ftr\");\n const slots = [\n this.renderRoot.querySelector(\"#slot-f-title\") as HTMLSlotElement | null,\n this.renderRoot.querySelector(\n \"#slot-f-subtitle\"\n ) as HTMLSlotElement | null,\n this.renderRoot.querySelector(\n \"#slot-f-actions\"\n ) as HTMLSlotElement | null,\n ].filter(Boolean) as HTMLSlotElement[];\n\n const has = slots.some(\n (s) => s.assignedNodes({ flatten: true }).length > 0\n );\n ftr?.toggleAttribute(\"has-content\", has);\n slots.forEach((s) =>\n s.toggleAttribute(\n \"empty\",\n s.assignedNodes({ flatten: true }).length === 0\n )\n );\n }\n\n private _expandPair(sh: SkyCardSectionTarget): [boolean, boolean] {\n switch (sh) {\n case \"both\":\n return [true, true];\n case \"header\":\n return [true, false];\n case \"footer\":\n return [false, true];\n case \"none\":\n default:\n return [false, false];\n }\n }\n\n private _computeEffectiveFlags(): void {\n [this._effHeaderSeparator, this._effFooterSeparator] = this._expandPair(\n this.separators\n );\n [this._effHeaderOverlay, this._effFooterOverlay] = this._expandPair(\n this.overlays\n );\n [this._effHeaderInset, this._effFooterInset] = this._expandPair(\n this.insets\n );\n }\n\n private _setVar(name: string, value: string): void {\n if (this._varsCache[name] === value) return;\n this.style.setProperty(name, value);\n this._varsCache[name] = value;\n }\n\n private _resolveSectionBg(\n token: string,\n isInset: boolean,\n isOverlay: boolean\n ): string {\n if (isInset && !isOverlay) {\n return (\n SkyCard.SECTION_INSET_BG_MAP[\n token as keyof typeof SkyCard.SECTION_INSET_BG_MAP\n ] ?? token\n );\n }\n return SkyCard.BG_MAP[token as keyof typeof SkyCard.BG_MAP] ?? token;\n }\n\n private _resolveSectionGlassSurface(token: string): string {\n return SkyCard.GLASS_BG_TIERS.has(token)\n ? \"var(--sky-glass-surface)\"\n : \"none\";\n }\n\n private _applyCardVars(): void {\n this._setVar(\n \"--_card-bg\",\n SkyCard.BG_MAP[this.bg as keyof typeof SkyCard.BG_MAP] ?? this.bg\n );\n this._setVar(\n \"--_card-glass-surface\",\n SkyCard.GLASS_BG_TIERS.has(this.bg)\n ? \"var(--sky-glass-surface)\"\n : \"none\"\n );\n\n this._setVar(\n \"--_card-backdrop\",\n SkyCard._composeBackdrop(this.blurLevel)\n );\n\n this._setVar(\"--_card-radius\", resolveRadius(this.radius));\n this._setVar(\n \"--_card-shadow\",\n SkyCard._composeElevation(this.elevation)\n );\n this._setVar(\n \"--_card-shadow-hover\",\n \"var(--sky-box-shadow-inset), var(--sky-box-shadow-hover)\"\n );\n }\n\n private _applyPaddingVars(): void {\n const h =\n SkyCard.SIZE_MAP[this.headerPadding as keyof typeof SkyCard.SIZE_MAP] ??\n this.headerPadding;\n const b =\n SkyCard.SIZE_MAP[this.bodyPadding as keyof typeof SkyCard.SIZE_MAP] ??\n this.bodyPadding;\n const f =\n SkyCard.SIZE_MAP[this.footerPadding as keyof typeof SkyCard.SIZE_MAP] ??\n this.footerPadding;\n\n const ratio = Number.isFinite(this.padRatio)\n ? Math.max(0, this.padRatio)\n : 1;\n\n this._setVar(\"--_header-pad-y\", h);\n this._setVar(\"--_header-pad-x\", `calc(${h} * ${ratio})`);\n\n this._setVar(\"--_body-pad-y\", b);\n this._setVar(\"--_body-pad-x\", `calc(${b} * ${ratio})`);\n\n this._setVar(\"--_footer-pad-y\", f);\n this._setVar(\"--_footer-pad-x\", `calc(${f} * ${ratio})`);\n }\n\n private _applySectionChrome(): void {\n const headerSep = this._effHeaderInset\n ? \"0px\"\n : this._effHeaderSeparator\n ? \"1px\"\n : \"0px\";\n const footerSep = this._effFooterInset\n ? \"0px\"\n : this._effFooterSeparator\n ? \"1px\"\n : \"0px\";\n this._setVar(\"--_header-separator\", headerSep);\n this._setVar(\"--_footer-separator\", footerSep);\n\n this._setVar(\"--_header-separator-color\", resolveColor(this.headerSeparatorColor));\n this._setVar(\"--_footer-separator-color\", resolveColor(this.footerSeparatorColor));\n\n const headerInsetBorder =\n this._effHeaderInset && this._effHeaderSeparator\n ? \"1px solid var(--sky-border-light)\"\n : \"0 solid transparent\";\n const footerInsetBorder =\n this._effFooterInset && this._effFooterSeparator\n ? \"1px solid var(--sky-border-light)\"\n : \"0 solid transparent\";\n this._setVar(\"--_header-inset-border\", headerInsetBorder);\n this._setVar(\"--_footer-inset-border\", footerInsetBorder);\n\n this._setVar(\n \"--_header-bg\",\n this._resolveSectionBg(\n this.headerBg,\n this._effHeaderInset,\n this._effHeaderOverlay\n )\n );\n this._setVar(\n \"--_footer-bg\",\n this._resolveSectionBg(\n this.footerBg,\n this._effFooterInset,\n this._effFooterOverlay\n )\n );\n this._setVar(\n \"--_header-glass-surface\",\n this._effHeaderOverlay\n ? this._resolveSectionGlassSurface(this.headerBg)\n : \"none\"\n );\n this._setVar(\n \"--_footer-glass-surface\",\n this._effFooterOverlay\n ? this._resolveSectionGlassSurface(this.footerBg)\n : \"none\"\n );\n this._setVar(\n \"--_header-backdrop\",\n this._effHeaderOverlay\n ? SkyCard._composeBackdrop(this.headerBlur)\n : \"none\"\n );\n this._setVar(\n \"--_footer-backdrop\",\n this._effFooterOverlay\n ? SkyCard._composeBackdrop(this.footerBlur)\n : \"none\"\n );\n\n this._setVar(\n \"--_header-radius\",\n resolveRadius(this.headerRadius)\n );\n this._setVar(\n \"--_footer-radius\",\n resolveRadius(this.footerRadius)\n );\n this._setVar(\n \"--_header-inset-gap\",\n SkyCard.SIZE_MAP[this.headerInsetGap as keyof typeof SkyCard.SIZE_MAP] ??\n this.headerInsetGap\n );\n this._setVar(\n \"--_footer-inset-gap\",\n SkyCard.SIZE_MAP[this.footerInsetGap as keyof typeof SkyCard.SIZE_MAP] ??\n this.footerInsetGap\n );\n }\n /**\n * Recomputes card variables and section synchronization.\n *\n * @returns {void}\n */\n public refreshLayout(): void {\n this._computeEffectiveFlags();\n this._applyCardVars();\n this._applyPaddingVars();\n this._applySectionChrome();\n this._syncHeader();\n this._syncFooter();\n }\n\n override render() {\n const headerLayoutClass = this.headerLayout === \"inline\" ? \"row\" : \"stack\";\n const footerLayoutClass = this.footerLayout === \"inline\" ? \"row\" : \"stack\";\n const headerClasses = classMap({\n section: true,\n [headerLayoutClass]: true,\n \"overlay-top\": !!this._effHeaderOverlay,\n inset: !!this._effHeaderInset,\n });\n const footerClasses = classMap({\n section: true,\n [footerLayoutClass]: true,\n \"overlay-bottom\": !!this._effFooterOverlay,\n inset: !!this._effFooterInset,\n });\n\n return html`\n <div class=\"card\" part=\"card\">\n <div class=${headerClasses} part=\"header\" id=\"hdr\">\n <div class=\"main\">\n <slot name=\"title\" id=\"slot-title\"></slot>\n <slot name=\"subtitle\" id=\"slot-subtitle\"></slot>\n </div>\n <slot name=\"actions\" id=\"slot-actions\"></slot>\n </div>\n\n <slot></slot>\n\n <div class=${footerClasses} part=\"footer\" id=\"ftr\">\n <div class=\"main\">\n <slot name=\"footer-title\" id=\"slot-f-title\"></slot>\n <slot name=\"footer-subtitle\" id=\"slot-f-subtitle\"></slot>\n </div>\n <slot name=\"footer-actions\" id=\"slot-f-actions\"></slot>\n </div>\n </div>\n `;\n }\n}\n"],"names":["SkyCard","LitElement","constructor","super","arguments","this","bg","blurLevel","radius","bodyPadding","elevation","outlined","clickable","headerBg","headerBlur","headerPadding","headerLayout","headerInsetGap","headerRadius","headerSeparatorColor","footerBg","footerBlur","footerPadding","footerLayout","footerInsetGap","footerRadius","footerSeparatorColor","padRatio","separators","overlays","insets","_effHeaderSeparator","_effFooterSeparator","_effHeaderOverlay","_effFooterOverlay","_effHeaderInset","_effFooterInset","_varsCache","preset","_presets","PresetController","_composeBackdrop","blur","BLUR_MAP","_composeElevation","level","depth","none","sm","md","lg","firstUpdated","_wireSlotChangeHandlers","_syncHeader","_syncFooter","update","changed","has","_computeEffectiveFlags","_applyCardVars","_applyPaddingVars","_applySectionChrome","renderRoot","querySelector","addEventListener","hdr","slots","filter","Boolean","some","s","assignedNodes","flatten","length","toggleAttribute","forEach","ftr","_expandPair","sh","_setVar","name","value","style","setProperty","_resolveSectionBg","token","isInset","isOverlay","SECTION_INSET_BG_MAP","BG_MAP","_resolveSectionGlassSurface","GLASS_BG_TIERS","resolveRadius","h","SIZE_MAP","b","f","ratio","Number","isFinite","Math","max","headerSep","footerSep","resolveColor","headerInsetBorder","footerInsetBorder","refreshLayout","render","headerLayoutClass","footerLayoutClass","headerClasses","classMap","section","inset","footerClasses","html","primary","secondary","tertiary","transparent","xs","xl","Set","styles","css","__decorateClass","property","type","String","reflect","prototype","customElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sky-card.js","sources":["../../src/sky-card/sky-card.ts"],"sourcesContent":["import { LitElement, html, css, PropertyValues } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport { classMap } from \"lit/directives/class-map.js\";\r\nimport { resolveRadius } from \"../helper/utils/size-resolver\";\r\nimport { resolveColor } from \"../helper/utils/color-resolver\";\r\nimport { PresetController } from \"../helper/controllers/preset-controller\";\r\n\r\nexport type SkyCardElevation = \"none\" | \"sm\" | \"md\" | \"lg\";\r\nexport type SkyCardSectionLayout = \"inline\" | \"stack\";\r\nexport type SkyCardSectionTarget = \"both\" | \"header\" | \"footer\" | \"none\";\r\n\r\n/**\r\n * @element sky-card\r\n *\r\n * @summary Customizable card with configurable header/footer sections, blur/background styles, elevation, insets, overlays, and separators.\r\n *\r\n * @status stable\r\n * @since 1.0.0\r\n *\r\n * @documentation https://sky-ui.com/components/card\r\n *\r\n * @slot - Default slot for the card body content (replaces `bodyPadding` property if used).\r\n * @slot title - Slot for the card title.\r\n * @slot subtitle - Slot for the card subtitle.\r\n * @slot actions - Slot for the card actions (usually buttons).\r\n * @slot footer-title - Slot for the footer title.\r\n * @slot footer-subtitle - Slot for the footer subtitle.\r\n * @slot footer-actions - Slot for the footer actions (usually buttons).\r\n *\r\n * @csspart card - The main card container element.\r\n * @csspart header - The card header section.\r\n * @csspart footer - The card footer section.\r\n * @csspart ripple - The ripple animation element injected when the card is clicked.\r\n *\r\n * @property {string} bg - Background color of the card. Accepts color tokens or custom CSS colors. Default: `\"primary\"`.\r\n * @property {string} blurLevel - Level of blur applied to the background. Default: `\"none\"`.\r\n * @property {string} radius - Border radius of the card. Default: `\"md\"`.\r\n * @property {string} bodyPadding - Padding for the card body. Default: `\"none\"`.\r\n * @property {SkyCardElevation} elevation - Shadow depth of the card. Default: `\"md\"`.\r\n * @property {boolean} outlined - Whether the card has an outline. Default: `false`.\r\n * @property {boolean} clickable - Whether the card is clickable. Default: `false`.\r\n * @property {string} headerBg - Background color of the header. Default: `\"transparent\"`.\r\n * @property {string} headerBlur - Blur level for the header background. Default: `\"none\"`.\r\n * @property {string} headerPadding - Padding for the header. Default: `\"md\"`.\r\n * @property {SkyCardSectionLayout} headerLayout - Layout of the header content. Default: `\"inline\"`.\r\n * @property {string} headerInsetGap - Inset gap for the header section. Default: `\"sm\"`.\r\n * @property {string} headerRadius - Border radius for the header. Default: `\"md\"`.\r\n * @property {string} headerSeparatorColor - Color for the header separator. Default: `\"border-light\"`.\r\n * @property {string} footerBg - Background color of the footer. Default: `\"transparent\"`.\r\n * @property {string} footerBlur - Blur level for the footer background. Default: `\"none\"`.\r\n * @property {string} footerPadding - Padding for the footer. Default: `\"md\"`.\r\n * @property {SkyCardSectionLayout} footerLayout - Layout of the footer content. Default: `\"inline\"`.\r\n * @property {string} footerInsetGap - Inset gap for the footer section. Default: `\"sm\"`.\r\n * @property {string} footerRadius - Border radius for the footer. Default: `\"md\"`.\r\n * @property {string} footerSeparatorColor - Color for the footer separator. Default: `\"border-light\"`.\r\n * @property {number} padRatio - Ratio to adjust padding. Default: `1`.\r\n * @property {SkyCardSectionTarget} separators - Determines where separators should appear. Default: `\"none\"`.\r\n * @property {SkyCardSectionTarget} overlays - Determines where overlays should appear. Default: `\"none\"`.\r\n * @property {SkyCardSectionTarget} insets - Determines where insets should appear. Default: `\"none\"`.\r\n * @property {string} preset - Named prop preset from nearest `sky-config-provider`. Default: `\"\"`.\r\n * @method refreshLayout Recomputes card variables and section synchronization.\r\n *\r\n * @example\r\n * ```html\r\n * <sky-card bg=\"primary\" elevation=\"lg\" headerpadding=\"md\">\r\n * <span slot=\"title\">Monthly Report</span>\r\n * <span slot=\"subtitle\">April 2026</span>\r\n * <div>Total revenue increased by 18%.</div>\r\n * <button slot=\"actions\">View Details</button>\r\n * </sky-card>\r\n * ```\r\n * ```vue\r\n * <template>\r\n * <sky-card bg=\"primary\" elevation=\"lg\" headerpadding=\"md\">\r\n * <span slot=\"title\">Monthly Report</span>\r\n * <span slot=\"subtitle\">April 2026</span>\r\n * <div>Total revenue increased by 18%.</div>\r\n * <button slot=\"actions\">View Details</button>\r\n * </sky-card>\r\n * </template>\r\n * ```\r\n * ```jsx\r\n * export default function Demo() {\r\n * return (\r\n * <sky-card bg=\"primary\" elevation=\"lg\" headerpadding=\"md\">\r\n * <span slot=\"title\">Monthly Report</span>\r\n * <span slot=\"subtitle\">April 2026</span>\r\n * <div>Total revenue increased by 18%.</div>\r\n * <button slot=\"actions\">View Details</button>\r\n * </sky-card>\r\n * );\r\n * }\r\n * ```\r\n */\r\n@customElement(\"sky-card\")\r\nexport class SkyCard extends LitElement {\r\n @property({ type: String, reflect: true }) bg = \"primary\";\r\n @property({ type: String, reflect: true }) blurLevel = \"none\";\r\n @property({ type: String, reflect: true }) radius = \"md\";\r\n @property({ type: String, reflect: true }) bodyPadding = \"none\";\r\n @property({ type: String, reflect: true }) elevation: SkyCardElevation = \"md\";\r\n @property({ type: Boolean, reflect: true }) outlined = false;\r\n @property({ type: Boolean, reflect: true }) clickable = false;\r\n\r\n @property({ type: String, reflect: true }) headerBg =\r\n \"transparent\";\r\n @property({ type: String, reflect: true })\r\n headerBlur = \"none\";\r\n @property({ type: String, reflect: true })\r\n headerPadding = \"md\";\r\n @property({ type: String }) headerLayout: SkyCardSectionLayout = \"inline\";\r\n @property({ type: String, reflect: true })\r\n headerInsetGap = \"sm\";\r\n @property({ type: String, reflect: true })\r\n headerRadius = \"md\";\r\n @property({ type: String })\r\n headerSeparatorColor = \"border-light\";\r\n\r\n @property({ type: String, reflect: true }) footerBg =\r\n \"transparent\";\r\n @property({ type: String, reflect: true })\r\n footerBlur = \"none\";\r\n @property({ type: String, reflect: true })\r\n footerPadding = \"md\";\r\n @property({ type: String }) footerLayout: SkyCardSectionLayout = \"inline\";\r\n @property({ type: String, reflect: true })\r\n footerInsetGap = \"sm\";\r\n @property({ type: String, reflect: true })\r\n footerRadius = \"md\";\r\n @property({ type: String })\r\n footerSeparatorColor = \"border-light\";\r\n\r\n @property({ type: Number }) padRatio = 1;\r\n\r\n @property({ type: String }) separators: SkyCardSectionTarget = \"none\";\r\n @property({ type: String }) overlays: SkyCardSectionTarget = \"none\";\r\n @property({ type: String }) insets: SkyCardSectionTarget = \"none\";\r\n\r\n private _effHeaderSeparator = false;\r\n private _effFooterSeparator = false;\r\n private _effHeaderOverlay = false;\r\n private _effFooterOverlay = false;\r\n private _effHeaderInset = false;\r\n private _effFooterInset = false;\r\n private _varsCache: Record<string, string> = {};\r\n\r\n private static readonly BG_MAP = {\r\n primary: \"var(--sky-glass-primary)\",\r\n secondary: \"var(--sky-glass-secondary)\",\r\n tertiary: \"var(--sky-glass-tertiary)\",\r\n transparent: \"transparent\",\r\n } as const;\r\n\r\n private static readonly BLUR_MAP = {\r\n none: \"none\",\r\n xs: \"blur(2px)\",\r\n sm: \"var(--sky-blur-secondary)\",\r\n md: \"var(--sky-blur-secondary)\",\r\n lg: \"var(--sky-blur-tertiary)\",\r\n } as const;\r\n\r\n private static readonly SIZE_MAP = {\r\n none: \"0\",\r\n sm: \"var(--sky-space-1\\\\.5, 6px)\",\r\n md: \"var(--sky-space-4, 16px)\",\r\n lg: \"var(--sky-space-6, 24px)\",\r\n xl: \"var(--sky-space-8, 32px)\",\r\n } as const;\r\n\r\n private static readonly GLASS_BG_TIERS = new Set([\r\n \"primary\",\r\n \"secondary\",\r\n \"tertiary\",\r\n ]);\r\n\r\n /** Non-overlay inset bars use hover tints — overlay sections own their own blur. */\r\n private static readonly SECTION_INSET_BG_MAP = {\r\n primary: \"var(--sky-hover-primary)\",\r\n secondary: \"var(--sky-hover-secondary)\",\r\n tertiary: \"var(--sky-hover-tertiary)\",\r\n transparent: \"transparent\",\r\n } as const;\r\n\r\n private static _composeBackdrop(blurLevel: string): string {\r\n const blur =\r\n SkyCard.BLUR_MAP[blurLevel as keyof typeof SkyCard.BLUR_MAP] ?? blurLevel;\r\n if (blur === \"none\") return \"none\";\r\n return `${blur} var(--sky-saturation-secondary) var(--sky-brightness-secondary)`;\r\n }\r\n\r\n private static _composeElevation(level: SkyCardElevation | string): string {\r\n const depthMap: Record<SkyCardElevation, string | null> = {\r\n none: null,\r\n sm: \"var(--sky-box-shadow-primary)\",\r\n md: \"var(--sky-box-shadow-secondary)\",\r\n lg: \"var(--sky-box-shadow-tertiary)\",\r\n };\r\n const depth = depthMap[level as SkyCardElevation];\r\n if (depth === null) return \"none\";\r\n if (depth === undefined) return level;\r\n return `var(--sky-box-shadow-inset), ${depth}`;\r\n }\r\n\r\n\r\n /** Named prop preset from nearest `sky-config-provider`. */\r\n @property({ type: String, reflect: true }) preset = \"\";\r\n\r\n private _presets = new PresetController(this);\r\n\r\n static styles = css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .card {\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n position: relative;\r\n overflow: hidden;\r\n box-sizing: border-box;\r\n color: var(--sky-text-primary);\r\n background: var(--_card-bg, var(--sky-glass-primary));\r\n background-image: var(--_card-glass-surface, var(--sky-glass-surface));\r\n border-radius: var(--_card-radius, var(--sky-radius-secondary));\r\n backdrop-filter: var(--_card-backdrop, none);\r\n -webkit-backdrop-filter: var(--_card-backdrop, none);\r\n box-shadow: var(\r\n --_card-shadow,\r\n var(--sky-box-shadow-inset),\r\n var(--sky-box-shadow-primary)\r\n );\r\n border: var(--_card-border, var(--sky-border-primary));\r\n transition: var(--sky-transition-default);\r\n }\r\n\r\n :host([outlined]) .card {\r\n box-shadow: none;\r\n border: var(--sky-border-primary);\r\n }\r\n :host([clickable]) .card {\r\n cursor: pointer;\r\n }\r\n :host([clickable]) .card:hover {\r\n box-shadow: var(\r\n --_card-shadow-hover,\r\n var(--sky-box-shadow-inset),\r\n var(--sky-box-shadow-hover)\r\n );\r\n }\r\n\r\n .section {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--sky-space-1\\\\.5, 6px);\r\n box-sizing: border-box;\r\n min-width: 0;\r\n background: transparent;\r\n backdrop-filter: none;\r\n -webkit-backdrop-filter: none;\r\n }\r\n .section.stack {\r\n flex-direction: column;\r\n align-items: stretch;\r\n gap: var(--sky-space-1\\\\.5, 6px);\r\n }\r\n .section.row {\r\n flex-direction: row;\r\n }\r\n\r\n .overlay-top {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n z-index: 1;\r\n }\r\n .overlay-bottom {\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n z-index: 1;\r\n }\r\n\r\n .inset {\r\n overflow: hidden;\r\n box-shadow: none;\r\n }\r\n .section.inset[part=\"header\"] {\r\n border: var(--_header-inset-border, 0 solid transparent);\r\n border-radius: var(--_header-radius, var(--sky-radius-secondary));\r\n }\r\n .section.inset[part=\"footer\"] {\r\n border: var(--_footer-inset-border, 0 solid transparent);\r\n border-radius: var(--_footer-radius, var(--sky-radius-secondary));\r\n }\r\n .overlay-top.inset {\r\n top: var(--_header-inset-gap, var(--sky-space-2, 8px));\r\n left: var(--_header-inset-gap, var(--sky-space-2, 8px));\r\n right: var(--_header-inset-gap, var(--sky-space-2, 8px));\r\n }\r\n .overlay-bottom.inset {\r\n bottom: var(--_footer-inset-gap, var(--sky-space-2, 8px));\r\n left: var(--_footer-inset-gap, var(--sky-space-2, 8px));\r\n right: var(--_footer-inset-gap, var(--sky-space-2, 8px));\r\n }\r\n\r\n .section[part=\"header\"]:has(slot:not([empty])),\r\n .section[part=\"header\"][has-content] {\r\n background: var(--_header-bg);\r\n background-image: var(--_header-glass-surface, none);\r\n padding-block: var(--_header-pad-y, var(--sky-space-3, 12px));\r\n padding-inline: var(--_header-pad-x, var(--sky-space-4, 16px));\r\n }\r\n .section[part=\"footer\"]:has(slot:not([empty])),\r\n .section[part=\"footer\"][has-content] {\r\n background: var(--_footer-bg);\r\n background-image: var(--_footer-glass-surface, none);\r\n padding-block: var(--_footer-pad-y, var(--sky-space-3, 12px));\r\n padding-inline: var(--_footer-pad-x, var(--sky-space-4, 16px));\r\n }\r\n\r\n .section[part=\"header\"].overlay-top:has(slot:not([empty])),\r\n .section[part=\"header\"].overlay-top[has-content] {\r\n backdrop-filter: var(--_header-backdrop, none);\r\n -webkit-backdrop-filter: var(--_header-backdrop, none);\r\n }\r\n .section[part=\"footer\"].overlay-bottom:has(slot:not([empty])),\r\n .section[part=\"footer\"].overlay-bottom[has-content] {\r\n backdrop-filter: var(--_footer-backdrop, none);\r\n -webkit-backdrop-filter: var(--_footer-backdrop, none);\r\n }\r\n\r\n .section[part=\"header\"]:not(.inset):has(slot:not([empty])),\r\n .section[part=\"header\"]:not(.inset)[has-content] {\r\n border-bottom: var(--_header-separator, 0px) solid\r\n var(--_header-separator-color, var(--sky-border-light));\r\n }\r\n .section[part=\"footer\"]:not(.inset):has(slot:not([empty])),\r\n .section[part=\"footer\"]:not(.inset)[has-content] {\r\n border-top: var(--_footer-separator, 0px) solid\r\n var(--_footer-separator-color, var(--sky-border-light));\r\n }\r\n\r\n ::slotted(:not([slot])) {\r\n box-sizing: border-box;\r\n padding-block: var(--_body-pad-y, var(--sky-space-3, 12px));\r\n padding-inline: var(--_body-pad-x, var(--sky-space-4, 16px));\r\n }\r\n slot[empty] {\r\n display: none;\r\n }\r\n\r\n ::slotted([slot=\"title\"]) {\r\n font-size: var(--sky-font-size-lg, 18px);\r\n font-weight: var(--sky-font-weight-semibold, 600);\r\n margin: 0;\r\n color: var(--sky-text-primary);\r\n text-align: start;\r\n text-shadow: var(--sky-text-shadow-on-glass, none);\r\n }\r\n ::slotted([slot=\"subtitle\"]) {\r\n font-size: var(--sky-font-size-sm, 14px);\r\n margin: 0;\r\n color: var(--sky-text-secondary);\r\n text-align: start;\r\n text-shadow: var(--sky-text-shadow-on-glass, none);\r\n }\r\n ::slotted([slot=\"actions\"]) {\r\n display: inline-flex;\r\n gap: var(--sky-space-1\\\\.5, 6px);\r\n align-items: center;\r\n margin-left: auto;\r\n }\r\n ::slotted([slot=\"footer-title\"]) {\r\n font-size: var(--sky-font-size-md, 16px);\r\n font-weight: var(--sky-font-weight-medium, 500);\r\n margin: 0;\r\n color: var(--sky-text-primary);\r\n text-align: start;\r\n }\r\n ::slotted([slot=\"footer-subtitle\"]) {\r\n font-size: var(--sky-font-size-xs, 12px);\r\n margin: 0;\r\n color: var(--sky-text-secondary);\r\n text-align: start;\r\n }\r\n ::slotted([slot=\"footer-actions\"]) {\r\n display: inline-flex;\r\n gap: var(--sky-space-1\\\\.5, 6px);\r\n align-items: center;\r\n margin-left: auto;\r\n }\r\n\r\n .main {\r\n width: 100%;\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .card {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n override firstUpdated(): void {\r\n this._wireSlotChangeHandlers();\r\n\r\n this._syncHeader();\r\n this._syncFooter();\r\n }\r\n\r\n /**\r\n * After PresetController hostUpdate — card chrome may come from presets.\r\n * Keep flag recompute + CSS var apply here (not willUpdate).\r\n */\r\n protected override update(changed: PropertyValues): void {\r\n if (\r\n changed.has(\"separators\") ||\r\n changed.has(\"overlays\") ||\r\n changed.has(\"insets\")\r\n ) {\r\n this._computeEffectiveFlags();\r\n }\r\n\r\n if (\r\n changed.has(\"bg\") ||\r\n changed.has(\"blurLevel\") ||\r\n changed.has(\"radius\") ||\r\n changed.has(\"elevation\") ||\r\n changed.has(\"preset\")\r\n ) {\r\n this._applyCardVars();\r\n }\r\n if (\r\n changed.has(\"headerPadding\") ||\r\n changed.has(\"bodyPadding\") ||\r\n changed.has(\"footerPadding\") ||\r\n changed.has(\"padRatio\") ||\r\n changed.has(\"preset\")\r\n ) {\r\n this._applyPaddingVars();\r\n }\r\n if (\r\n changed.has(\"headerBg\") ||\r\n changed.has(\"footerBg\") ||\r\n changed.has(\"headerBlur\") ||\r\n changed.has(\"footerBlur\") ||\r\n changed.has(\"headerRadius\") ||\r\n changed.has(\"footerRadius\") ||\r\n changed.has(\"headerInsetGap\") ||\r\n changed.has(\"footerInsetGap\") ||\r\n changed.has(\"headerSeparatorColor\") ||\r\n changed.has(\"footerSeparatorColor\") ||\r\n changed.has(\"separators\") ||\r\n changed.has(\"insets\") ||\r\n changed.has(\"overlays\") ||\r\n changed.has(\"preset\")\r\n ) {\r\n this._applySectionChrome();\r\n }\r\n super.update(changed);\r\n }\r\n\r\n private _wireSlotChangeHandlers(): void {\r\n this.renderRoot\r\n .querySelector(\"#slot-title\")\r\n ?.addEventListener(\"slotchange\", () => this._syncHeader());\r\n this.renderRoot\r\n .querySelector(\"#slot-subtitle\")\r\n ?.addEventListener(\"slotchange\", () => this._syncHeader());\r\n this.renderRoot\r\n .querySelector(\"#slot-actions\")\r\n ?.addEventListener(\"slotchange\", () => this._syncHeader());\r\n\r\n this.renderRoot\r\n .querySelector(\"#slot-f-title\")\r\n ?.addEventListener(\"slotchange\", () => this._syncFooter());\r\n this.renderRoot\r\n .querySelector(\"#slot-f-subtitle\")\r\n ?.addEventListener(\"slotchange\", () => this._syncFooter());\r\n this.renderRoot\r\n .querySelector(\"#slot-f-actions\")\r\n ?.addEventListener(\"slotchange\", () => this._syncFooter());\r\n }\r\n\r\n private _syncHeader(): void {\r\n const hdr = this.renderRoot.querySelector(\"#hdr\");\r\n const slots = [\r\n this.renderRoot.querySelector(\"#slot-title\") as HTMLSlotElement | null,\r\n this.renderRoot.querySelector(\"#slot-subtitle\") as HTMLSlotElement | null,\r\n this.renderRoot.querySelector(\"#slot-actions\") as HTMLSlotElement | null,\r\n ].filter(Boolean) as HTMLSlotElement[];\r\n\r\n const has = slots.some(\r\n (s) => s.assignedNodes({ flatten: true }).length > 0\r\n );\r\n hdr?.toggleAttribute(\"has-content\", has);\r\n\r\n slots.forEach((s) =>\r\n s.toggleAttribute(\r\n \"empty\",\r\n s.assignedNodes({ flatten: true }).length === 0\r\n )\r\n );\r\n }\r\n\r\n private _syncFooter(): void {\r\n const ftr = this.renderRoot.querySelector(\"#ftr\");\r\n const slots = [\r\n this.renderRoot.querySelector(\"#slot-f-title\") as HTMLSlotElement | null,\r\n this.renderRoot.querySelector(\r\n \"#slot-f-subtitle\"\r\n ) as HTMLSlotElement | null,\r\n this.renderRoot.querySelector(\r\n \"#slot-f-actions\"\r\n ) as HTMLSlotElement | null,\r\n ].filter(Boolean) as HTMLSlotElement[];\r\n\r\n const has = slots.some(\r\n (s) => s.assignedNodes({ flatten: true }).length > 0\r\n );\r\n ftr?.toggleAttribute(\"has-content\", has);\r\n slots.forEach((s) =>\r\n s.toggleAttribute(\r\n \"empty\",\r\n s.assignedNodes({ flatten: true }).length === 0\r\n )\r\n );\r\n }\r\n\r\n private _expandPair(sh: SkyCardSectionTarget): [boolean, boolean] {\r\n switch (sh) {\r\n case \"both\":\r\n return [true, true];\r\n case \"header\":\r\n return [true, false];\r\n case \"footer\":\r\n return [false, true];\r\n case \"none\":\r\n default:\r\n return [false, false];\r\n }\r\n }\r\n\r\n private _computeEffectiveFlags(): void {\r\n [this._effHeaderSeparator, this._effFooterSeparator] = this._expandPair(\r\n this.separators\r\n );\r\n [this._effHeaderOverlay, this._effFooterOverlay] = this._expandPair(\r\n this.overlays\r\n );\r\n [this._effHeaderInset, this._effFooterInset] = this._expandPair(\r\n this.insets\r\n );\r\n }\r\n\r\n private _setVar(name: string, value: string): void {\r\n if (this._varsCache[name] === value) return;\r\n this.style.setProperty(name, value);\r\n this._varsCache[name] = value;\r\n }\r\n\r\n private _resolveSectionBg(\r\n token: string,\r\n isInset: boolean,\r\n isOverlay: boolean\r\n ): string {\r\n if (isInset && !isOverlay) {\r\n return (\r\n SkyCard.SECTION_INSET_BG_MAP[\r\n token as keyof typeof SkyCard.SECTION_INSET_BG_MAP\r\n ] ?? token\r\n );\r\n }\r\n return SkyCard.BG_MAP[token as keyof typeof SkyCard.BG_MAP] ?? token;\r\n }\r\n\r\n private _resolveSectionGlassSurface(token: string): string {\r\n return SkyCard.GLASS_BG_TIERS.has(token)\r\n ? \"var(--sky-glass-surface)\"\r\n : \"none\";\r\n }\r\n\r\n private _applyCardVars(): void {\r\n this._setVar(\r\n \"--_card-bg\",\r\n SkyCard.BG_MAP[this.bg as keyof typeof SkyCard.BG_MAP] ?? this.bg\r\n );\r\n this._setVar(\r\n \"--_card-glass-surface\",\r\n SkyCard.GLASS_BG_TIERS.has(this.bg)\r\n ? \"var(--sky-glass-surface)\"\r\n : \"none\"\r\n );\r\n\r\n this._setVar(\r\n \"--_card-backdrop\",\r\n SkyCard._composeBackdrop(this.blurLevel)\r\n );\r\n\r\n this._setVar(\"--_card-radius\", resolveRadius(this.radius));\r\n this._setVar(\r\n \"--_card-shadow\",\r\n SkyCard._composeElevation(this.elevation)\r\n );\r\n this._setVar(\r\n \"--_card-shadow-hover\",\r\n \"var(--sky-box-shadow-inset), var(--sky-box-shadow-hover)\"\r\n );\r\n }\r\n\r\n private _applyPaddingVars(): void {\r\n const h =\r\n SkyCard.SIZE_MAP[this.headerPadding as keyof typeof SkyCard.SIZE_MAP] ??\r\n this.headerPadding;\r\n const b =\r\n SkyCard.SIZE_MAP[this.bodyPadding as keyof typeof SkyCard.SIZE_MAP] ??\r\n this.bodyPadding;\r\n const f =\r\n SkyCard.SIZE_MAP[this.footerPadding as keyof typeof SkyCard.SIZE_MAP] ??\r\n this.footerPadding;\r\n\r\n const ratio = Number.isFinite(this.padRatio)\r\n ? Math.max(0, this.padRatio)\r\n : 1;\r\n\r\n this._setVar(\"--_header-pad-y\", h);\r\n this._setVar(\"--_header-pad-x\", `calc(${h} * ${ratio})`);\r\n\r\n this._setVar(\"--_body-pad-y\", b);\r\n this._setVar(\"--_body-pad-x\", `calc(${b} * ${ratio})`);\r\n\r\n this._setVar(\"--_footer-pad-y\", f);\r\n this._setVar(\"--_footer-pad-x\", `calc(${f} * ${ratio})`);\r\n }\r\n\r\n private _applySectionChrome(): void {\r\n const headerSep = this._effHeaderInset\r\n ? \"0px\"\r\n : this._effHeaderSeparator\r\n ? \"1px\"\r\n : \"0px\";\r\n const footerSep = this._effFooterInset\r\n ? \"0px\"\r\n : this._effFooterSeparator\r\n ? \"1px\"\r\n : \"0px\";\r\n this._setVar(\"--_header-separator\", headerSep);\r\n this._setVar(\"--_footer-separator\", footerSep);\r\n\r\n this._setVar(\"--_header-separator-color\", resolveColor(this.headerSeparatorColor));\r\n this._setVar(\"--_footer-separator-color\", resolveColor(this.footerSeparatorColor));\r\n\r\n const headerInsetBorder =\r\n this._effHeaderInset && this._effHeaderSeparator\r\n ? \"1px solid var(--sky-border-light)\"\r\n : \"0 solid transparent\";\r\n const footerInsetBorder =\r\n this._effFooterInset && this._effFooterSeparator\r\n ? \"1px solid var(--sky-border-light)\"\r\n : \"0 solid transparent\";\r\n this._setVar(\"--_header-inset-border\", headerInsetBorder);\r\n this._setVar(\"--_footer-inset-border\", footerInsetBorder);\r\n\r\n this._setVar(\r\n \"--_header-bg\",\r\n this._resolveSectionBg(\r\n this.headerBg,\r\n this._effHeaderInset,\r\n this._effHeaderOverlay\r\n )\r\n );\r\n this._setVar(\r\n \"--_footer-bg\",\r\n this._resolveSectionBg(\r\n this.footerBg,\r\n this._effFooterInset,\r\n this._effFooterOverlay\r\n )\r\n );\r\n this._setVar(\r\n \"--_header-glass-surface\",\r\n this._effHeaderOverlay\r\n ? this._resolveSectionGlassSurface(this.headerBg)\r\n : \"none\"\r\n );\r\n this._setVar(\r\n \"--_footer-glass-surface\",\r\n this._effFooterOverlay\r\n ? this._resolveSectionGlassSurface(this.footerBg)\r\n : \"none\"\r\n );\r\n this._setVar(\r\n \"--_header-backdrop\",\r\n this._effHeaderOverlay\r\n ? SkyCard._composeBackdrop(this.headerBlur)\r\n : \"none\"\r\n );\r\n this._setVar(\r\n \"--_footer-backdrop\",\r\n this._effFooterOverlay\r\n ? SkyCard._composeBackdrop(this.footerBlur)\r\n : \"none\"\r\n );\r\n\r\n this._setVar(\r\n \"--_header-radius\",\r\n resolveRadius(this.headerRadius)\r\n );\r\n this._setVar(\r\n \"--_footer-radius\",\r\n resolveRadius(this.footerRadius)\r\n );\r\n this._setVar(\r\n \"--_header-inset-gap\",\r\n SkyCard.SIZE_MAP[this.headerInsetGap as keyof typeof SkyCard.SIZE_MAP] ??\r\n this.headerInsetGap\r\n );\r\n this._setVar(\r\n \"--_footer-inset-gap\",\r\n SkyCard.SIZE_MAP[this.footerInsetGap as keyof typeof SkyCard.SIZE_MAP] ??\r\n this.footerInsetGap\r\n );\r\n }\r\n /**\r\n * Recomputes card variables and section synchronization.\r\n *\r\n * @returns {void}\r\n */\r\n public refreshLayout(): void {\r\n this._computeEffectiveFlags();\r\n this._applyCardVars();\r\n this._applyPaddingVars();\r\n this._applySectionChrome();\r\n this._syncHeader();\r\n this._syncFooter();\r\n }\r\n\r\n override render() {\r\n const headerLayoutClass = this.headerLayout === \"inline\" ? \"row\" : \"stack\";\r\n const footerLayoutClass = this.footerLayout === \"inline\" ? \"row\" : \"stack\";\r\n const headerClasses = classMap({\r\n section: true,\r\n [headerLayoutClass]: true,\r\n \"overlay-top\": !!this._effHeaderOverlay,\r\n inset: !!this._effHeaderInset,\r\n });\r\n const footerClasses = classMap({\r\n section: true,\r\n [footerLayoutClass]: true,\r\n \"overlay-bottom\": !!this._effFooterOverlay,\r\n inset: !!this._effFooterInset,\r\n });\r\n\r\n return html`\r\n <div class=\"card\" part=\"card\">\r\n <div class=${headerClasses} part=\"header\" id=\"hdr\">\r\n <div class=\"main\">\r\n <slot name=\"title\" id=\"slot-title\"></slot>\r\n <slot name=\"subtitle\" id=\"slot-subtitle\"></slot>\r\n </div>\r\n <slot name=\"actions\" id=\"slot-actions\"></slot>\r\n </div>\r\n\r\n <slot></slot>\r\n\r\n <div class=${footerClasses} part=\"footer\" id=\"ftr\">\r\n <div class=\"main\">\r\n <slot name=\"footer-title\" id=\"slot-f-title\"></slot>\r\n <slot name=\"footer-subtitle\" id=\"slot-f-subtitle\"></slot>\r\n </div>\r\n <slot name=\"footer-actions\" id=\"slot-f-actions\"></slot>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n"],"names":["SkyCard","LitElement","constructor","super","arguments","this","bg","blurLevel","radius","bodyPadding","elevation","outlined","clickable","headerBg","headerBlur","headerPadding","headerLayout","headerInsetGap","headerRadius","headerSeparatorColor","footerBg","footerBlur","footerPadding","footerLayout","footerInsetGap","footerRadius","footerSeparatorColor","padRatio","separators","overlays","insets","_effHeaderSeparator","_effFooterSeparator","_effHeaderOverlay","_effFooterOverlay","_effHeaderInset","_effFooterInset","_varsCache","preset","_presets","PresetController","_composeBackdrop","blur","BLUR_MAP","_composeElevation","level","depth","none","sm","md","lg","firstUpdated","_wireSlotChangeHandlers","_syncHeader","_syncFooter","update","changed","has","_computeEffectiveFlags","_applyCardVars","_applyPaddingVars","_applySectionChrome","renderRoot","querySelector","addEventListener","hdr","slots","filter","Boolean","some","s","assignedNodes","flatten","length","toggleAttribute","forEach","ftr","_expandPair","sh","_setVar","name","value","style","setProperty","_resolveSectionBg","token","isInset","isOverlay","SECTION_INSET_BG_MAP","BG_MAP","_resolveSectionGlassSurface","GLASS_BG_TIERS","resolveRadius","h","SIZE_MAP","b","f","ratio","Number","isFinite","Math","max","headerSep","footerSep","resolveColor","headerInsetBorder","footerInsetBorder","refreshLayout","render","headerLayoutClass","footerLayoutClass","headerClasses","classMap","section","inset","footerClasses","html","primary","secondary","tertiary","transparent","xs","xl","Set","styles","css","__decorateClass","property","type","String","reflect","prototype","customElement"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sky-checkbox.js","sources":["../../src/sky-checkbox/sky-checkbox.ts"],"sourcesContent":["import { LitElement, html, css, nothing, unsafeCSS } from \"lit\";\nimport { property, customElement, state } from \"lit/decorators.js\";\nimport { when } from \"lit/directives/when.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { resolveColor } from \"../helper/utils/color-resolver\";\nimport { cssOnFillEnhance } from \"../helper/utils/contrast-color\";\nimport { FormControlBase, FormState } from \"../helper/internals/form-control-base\";\nimport { PresetController } from \"../helper/controllers/preset-controller\";\nimport { skyFocusRingHostStyles } from \"../helper/styles/focus-ring\";\n\nexport interface CheckboxProperties {\n label: string;\n checked: boolean;\n disabled: boolean;\n indeterminate: boolean;\n id: string;\n value: string;\n color: string;\n required: boolean;\n validationErrors: string[];\n validationActive: boolean;\n defaultChecked: boolean;\n requiredMessage: string;\n showErrors: boolean;\n prefix: string;\n suffix: string;\n prefixColor: string;\n suffixColor: string;\n}\n/** `checked` is always the boolean model; `value` keeps form/legacy semantics (see `handleChange`). */\nexport type SkyCheckboxValueChangedDetail = {\n checked: boolean;\n value: string | boolean | undefined;\n};\nexport type SkyCheckboxValidationErrorDetail = { errors: string[] };\nexport type SkyCheckboxValueClearedDetail = { value: string; checked: boolean };\n\n/**\n * @element sky-checkbox\n *\n * @summary Form-associated checkbox with validation, indeterminate state, and customizable label/prefix/suffix rendering.\n *\n * @status stable\n * @since 1.0.0\n *\n * @documentation https://sky-ui.com/components/checkbox\n *\n * @uiVModel checked value-changed detail=checked\n *\n * @slot - Default slot for the checkbox label or other content.\n * @slot prefix - Optional prefix content that can be placed before the label.\n * @slot suffix - Optional suffix content that can be placed after the label.\n *\n * @csspart wrapper - The wrapper element for the checkbox.\n * @csspart input - The native input element used for the checkbox.\n * @csspart label - The label element for the checkbox, used for styling.\n * @csspart box - The visual box for the checkbox, which includes the checkmark and indeterminate state.\n * @csspart checkmark - The checkmark icon that appears when the checkbox is checked.\n * @csspart indeterminate-line - The line representing the indeterminate state of the checkbox.\n * @csspart error-message - The error message displayed if the checkbox is invalid.\n *\n * @property {string} label - The label for the checkbox. Default: `\"\"`.\n * @property {boolean} checked - Whether the checkbox is checked. Default: `false`.\n * @property {boolean} indeterminate - Whether the checkbox is in the indeterminate state. Default: `false`.\n * @property {string} color - The color used for the checkbox and its checkmark. Default: `\"primary\"`.\n * @property {string} value - The value of the checkbox, which gets submitted with the form. Default: `\"\"`.\n * @property {boolean} showErrors - Whether to display validation error messages. Default: `false`.\n * @property {string} prefix - Optional prefix text or content before the label. Default: `\"\"`.\n * @property {string} suffix - Optional suffix text or content after the label. Default: `\"\"`.\n * @property {string} prefixColor - The color for the prefix text. Default: `\"\"`.\n * @property {string} suffixColor - The color for the suffix text. Default: `\"\"`.\n * @property {boolean} defaultChecked - Default checked state for reset operations. Default: `false`.\n * @property {string} preset - Named prop preset from nearest `sky-config-provider`. Default: `\"\"`.\n * @method check Sets checked state to `true`.\n * @method uncheck Sets checked state to `false`.\n * @method toggle Toggles checked state.\n * @method reset Resets checkbox state to defaults and clears UI validation state.\n *\n * @fires {CustomEvent<SkyCheckboxValueChangedDetail>} value-changed - Fired when checked state changes; `detail.checked` is always boolean (use for v-model). `detail.value` is the form token when the `value` prop is set, else mirrors `checked`.\n * @fires {CustomEvent<SkyCheckboxValidationErrorDetail>} validation-error - Fired when validation errors are updated.\n * @fires {CustomEvent<SkyCheckboxValueClearedDetail>} value-cleared - Fired when checkbox is reset programmatically.\n *\n * @example\n * ```html\n * <sky-checkbox label=\"Accept Terms\" required showerrors prefix=\"Legal\"></sky-checkbox>\n * ```\n * ```vue\n * <template>\n * <sky-checkbox label=\"Accept Terms\" required showerrors prefix=\"Legal\"></sky-checkbox>\n * </template>\n * ```\n * ```jsx\n * export default function Demo() {\n * return <sky-checkbox label=\"Accept Terms\" required showerrors prefix=\"Legal\"></sky-checkbox>;\n * }\n * ```\n */\n@customElement(\"sky-checkbox\")\nexport class SkyCheckbox extends FormControlBase {\n static override shadowRootOptions = {\n ...LitElement.shadowRootOptions,\n delegatesFocus: true,\n };\n\n @property({ type: String }) label = \"\";\n @property({ type: String }) override id = \"\";\n @property({ type: String }) value = \"\";\n @property({ type: String }) color = \"primary\";\n @property({ type: Boolean }) defaultChecked = false;\n @property({ type: Boolean }) showErrors = false;\n @property({ type: String }) override prefix = \"\";\n @property({ type: String }) suffix = \"\";\n @property({ type: String }) prefixColor = \"\";\n @property({ type: String }) suffixColor = \"\";\n @property({ type: Boolean, reflect: true }) validationActive: boolean = false;\n @property({ type: Boolean, reflect: true }) invalid: boolean = false;\n @state() private _checked = false;\n @state() private _indeterminate = false;\n @state() private validationErrors: string[] = [];\n @state() private _hasMeaningfulSlot = false;\n\n private _inputElement?: HTMLInputElement;\n private _inputId = `sky-cb-${Math.random().toString(36).slice(2)}`;\n\n @property({ type: Boolean, reflect: true })\n get checked() {\n return this._checked;\n }\n set checked(v: boolean) {\n const old = this._checked;\n this._checked = v;\n\n if (v && this.indeterminate) {\n this.indeterminate = false;\n if (this._inputElement) this._inputElement.indeterminate = false;\n }\n\n this.requestUpdate(\"checked\", old);\n\n if (this._inputElement) {\n this._inputElement.checked = v;\n this._inputElement.indeterminate = this.indeterminate;\n }\n\n this._updateVisualState();\n\n this.syncFormValue();\n this.syncValidity();\n }\n\n @property({ type: Boolean, reflect: true })\n get indeterminate() {\n return this._indeterminate;\n }\n set indeterminate(v: boolean) {\n const old = this._indeterminate;\n this._indeterminate = v;\n\n if (v && this.checked) this.checked = false;\n\n this.requestUpdate(\"indeterminate\", old);\n\n if (this._inputElement) this._inputElement.indeterminate = v;\n\n this._updateVisualState();\n\n this.syncValidity();\n }\n\n\n /** Named prop preset from nearest `sky-config-provider`. */\n @property({ type: String, reflect: true }) preset = \"\";\n\n private _presets = new PresetController(this);\n\n static override styles = [\n skyFocusRingHostStyles,\n css`\n :host {\n display: block;\n position: relative;\n font-family: var(--sky-font);\n /* Tint focus ring with the control color (not global active-primary). */\n --sky-focus-ring-color: var(--checkbox-color, var(--sky-active-primary));\n }\n\n :host([readonly]) .cbx {\n cursor: default;\n }\n\n /* Show focus UI whenever anything inside is focused */\n :host(:focus-within) .cbx span:first-child,\n :host(:focus) .cbx span:first-child {\n box-shadow: var(--sky-focus-ring);\n border-color: var(--checkbox-color, var(--sky-active-primary)) !important;\n }\n\n .checkbox-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--sky-space-1, 5px);\n }\n\n :host([disabled]) {\n pointer-events: none;\n opacity: var(--sky-opacity-disabled, 0.6);\n }\n\n .cbx {\n display: flex;\n align-items: center;\n cursor: pointer;\n user-select: none;\n gap: var(--sky-space-1, 5px);\n transition: color 0.2s ease;\n font-family: var(--sky-font);\n font-size: var(--sky-font-size-sm);\n line-height: var(--sky-line-height-snug, 1.25);\n color: var(--sky-text-primary);\n }\n\n .cbx span {\n display: inline-block;\n vertical-align: middle;\n }\n\n .cbx span:first-child {\n position: relative;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n flex-shrink: 0;\n border-radius: min(6px, var(--sky-radius-primary));\n vertical-align: middle;\n background: var(--sky-glass-solid);\n border: 2px solid var(--sky-text-tertiary);\n display: flex;\n align-items: center;\n justify-content: center;\n transform: translateZ(0);\n contain: layout;\n /* visible so --sky-focus-ring (outer box-shadow) is not clipped */\n overflow: visible;\n transition: background-color 0.2s ease, border-color 0.2s ease,\n box-shadow 0.2s ease;\n }\n\n .cbx span:first-child svg {\n position: absolute;\n width: 12px;\n height: 10px;\n fill: none;\n stroke: var(--sky-on-color-fallback-light, var(--sky-text-white));\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-dasharray: 16px;\n stroke-dashoffset: 16px;\n transition: stroke-dashoffset 0.2s ease, transform 0.2s ease;\n transform: translate3d(0, 0, 0);\n }\n\n .cbx:hover span:first-child {\n background-color: var(--sky-hover-primary);\n border-color: var(--sky-text-tertiary);\n }\n\n input[type=\"checkbox\"]:checked + .cbx:hover span:first-child {\n box-shadow: var(--sky-box-shadow-hover);\n transition: box-shadow 0.2s ease;\n }\n\n /* Keep focus ring above hover shadow when both apply */\n :host(:focus-within) input[type=\"checkbox\"]:checked + .cbx:hover span:first-child,\n :host(:focus) input[type=\"checkbox\"]:checked + .cbx:hover span:first-child {\n box-shadow: var(--sky-focus-ring);\n }\n\n .cbx span:first-child:before {\n content: \"\";\n inset: 0;\n width: auto;\n height: auto;\n background: var(--checkbox-color, var(--sky-active-primary));\n display: block;\n transform: scale(0);\n opacity: 0;\n border-radius: 50%;\n transition: transform 0.2s ease-out, opacity 0.2s ease-out;\n position: absolute;\n z-index: -1;\n pointer-events: none;\n }\n\n input[type=\"checkbox\"] {\n position: absolute;\n opacity: 0;\n width: 1px;\n height: 1px;\n margin: 0;\n padding: 0;\n border: 0;\n }\n\n input[type=\"checkbox\"]:focus-visible + .cbx span:first-child,\n input[type=\"checkbox\"]:focus + .cbx span:first-child {\n outline: none;\n }\n\n input[type=\"checkbox\"]:checked + .cbx span:first-child {\n background: var(--checkbox-color, var(--sky-active-primary));\n border-color: var(--checkbox-color, var(--sky-active-primary));\n transform: none;\n }\n\n input[type=\"checkbox\"]:checked + .cbx span:first-child svg.checkmark {\n stroke-dashoffset: 0;\n transition: stroke-dashoffset 0.2s ease-in-out 0.1s,\n transform 0.2s ease-in-out 0.1s;\n }\n\n input[type=\"checkbox\"]:not(:checked) + .cbx span:first-child svg.checkmark {\n transition: opacity 0.2s ease-in-out;\n opacity: 0;\n }\n\n input[type=\"checkbox\"]:checked + .cbx span:first-child:before {\n transform: scale(3.5);\n opacity: 0;\n transition: transform 0.2s ease-out, opacity 0.2s ease-out;\n }\n\n .cbx.checked span:first-child {\n background: var(--checkbox-color, var(--sky-active-primary));\n border-color: var(--checkbox-color, var(--sky-active-primary));\n }\n\n .cbx.checked span:first-child svg.checkmark {\n stroke-dashoffset: 0;\n transition: stroke-dashoffset 0.2s ease-in-out 0.1s,\n transform 0.2s ease-in-out 0.1s;\n }\n\n .indeterminate-line {\n width: 10px;\n height: 2px;\n background-color: var(--sky-on-color-fallback-light, var(--sky-text-white));\n position: absolute;\n border-radius: 1px;\n transition: opacity 0.2s ease, transform 0.2s ease;\n opacity: 0;\n transform: scaleX(0);\n }\n\n .indeterminate-active {\n opacity: 1;\n transform: scaleX(1);\n }\n\n .checked .checkmark {\n stroke-dashoffset: 0;\n }\n\n .indeterminate .checkmark {\n display: none;\n }\n\n .indeterminate .indeterminate-line {\n opacity: 1;\n transform: scaleX(1);\n }\n\n\n .error-message {\n font-size: var(--sky-font-size-xs);\n color: var(--sky-danger-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n pointer-events: none;\n margin-left: var(--sky-space-1, 5px);\n width: 100%;\n text-align: start;\n font-family: var(--sky-font);\n }\n :dir(rtl) .error-message {\n margin-right: var(--sky-space-1, 5px);\n margin-left: unset;\n }\n\n :host([validationactive]:invalid) .cbx span:first-child {\n\n border-color: var(--sky-danger-primary);\n }\n :host([validationactive]:invalid) .cbx span:first-child svg.checkmark {\n stroke-dashoffset: 0;\n }\n :host([validationactive]:invalid) .cbx span:first-child:before {\n transform: scale(3.5);\n opacity: 0;\n }\n :host([validationactive]:invalid) .error-message {\n display: block;\n }\n\n :host([indeterminate]) .indeterminate-line {\n opacity: 1;\n transform: scaleX(1);\n }\n :host([indeterminate]) .cbx span:first-child {\n background-color: var(--checkbox-color);\n border-color: var(--checkbox-color);\n }\n\n .checkbox-wrapper.no-text {\n gap: 0;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .cbx,\n .cbx span:first-child,\n .cbx span:first-child svg,\n .cbx span:first-child:before,\n .indeterminate-line {\n transition: none;\n }\n }\n\n ${unsafeCSS(\n cssOnFillEnhance([\n {\n selector:\n 'input[type=\"checkbox\"]:checked + .cbx span:first-child svg, .cbx.checked span:first-child svg',\n fillVar: \"var(--checkbox-color, var(--sky-active-primary))\",\n property: \"stroke\",\n },\n {\n selector: \".indeterminate-line, .indeterminate .indeterminate-line\",\n fillVar: \"var(--checkbox-color, var(--sky-active-primary))\",\n property: \"background-color\",\n },\n ]),\n )}\n `,\n ];\n\n protected override getFormValue(): FormState {\n if (!this.name) return null;\n if (this.disabled) return null;\n\n if (!this.checked) return null;\n\n if (this.value && this.value.trim() !== \"\") return this.value;\n\n return \"on\";\n }\n\n protected override setValueFromFormState(state: FormState): void {\n if (state === null) {\n this.checked = false;\n this.indeterminate = false;\n return;\n }\n\n if (typeof state === \"string\") {\n if (this.value && this.value.trim() !== \"\") {\n this.checked = state === this.value;\n } else {\n this.checked = state === \"on\" || state === \"true\" || state === \"1\";\n }\n this.indeterminate = false;\n }\n }\n\n protected override getValidityAnchor(): HTMLElement | undefined {\n return (this.shadowRoot?.querySelector('input[type=\"checkbox\"]') as HTMLElement) ?? undefined;\n }\n\n protected override isEmpty(): boolean {\n return !this.checked;\n }\n\n protected override getNativeControl(): HTMLElement | null {\n return this.shadowRoot?.querySelector('input[type=\"checkbox\"]') as HTMLInputElement | null;\n }\n\n protected override onFormReset(): void {\n this.checked = this.defaultChecked;\n this.indeterminate = false;\n\n this.validationErrors = [];\n this.invalid = false;\n this.validationActive = false;\n }\n\n override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n\n // After PresetController hostUpdate — color may come from presets.\n this.style.setProperty(\"--checkbox-color\", resolveColor(this.color));\n\n if (!this._inputElement) {\n this._inputElement = this.shadowRoot?.querySelector(\n 'input[type=\"checkbox\"]'\n ) as HTMLInputElement;\n }\n\n if (this._inputElement) {\n this._inputElement.checked = this.checked;\n this._inputElement.indeterminate = this.indeterminate;\n this._inputElement.disabled = this.disabled || this.readonly;\n }\n\n this._updateVisualState();\n\n if (\n changed.has(\"checked\") ||\n changed.has(\"name\") ||\n changed.has(\"disabled\") ||\n changed.has(\"readonly\") ||\n changed.has(\"required\") ||\n changed.has(\"value\")\n ) {\n this.syncFormValue();\n this.syncValidity();\n }\n }\n\n private handleChange(event: Event): void {\n const target = event.target as HTMLInputElement;\n\n if (this.disabled || this.readonly) {\n if (this._inputElement) {\n this._inputElement.checked = this.checked;\n this._inputElement.indeterminate = this.indeterminate;\n }\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n this.checked = target.checked;\n\n this.validateInput();\n\n const emittedValue =\n this.value && this.value.trim() !== \"\"\n ? this.checked ? this.value : undefined\n : this.checked;\n\n this.dispatchEvent(\n new CustomEvent<SkyCheckboxValueChangedDetail>(\"value-changed\", {\n detail: { checked: this.checked, value: emittedValue },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private validateInput(): boolean {\n if (!this.validationActive) return true;\n\n this.validationErrors = [];\n if (this.required && !this.checked) {\n this.validationErrors = [this.requiredMessage]; // from base\n }\n\n this.dispatchEvent(\n new CustomEvent<SkyCheckboxValidationErrorDetail>(\"validation-error\", {\n detail: { errors: [...this.validationErrors] },\n bubbles: true,\n composed: true,\n })\n );\n\n const cbx = this.shadowRoot?.querySelector(\".cbx\") as HTMLElement | null;\n if (this.validationErrors.length) cbx?.classList.add(\"invalid\");\n else cbx?.classList.remove(\"invalid\");\n\n const isValid = this.validationErrors.length === 0;\n this.invalid = !isValid;\n\n return isValid;\n }\n\n /**\n * Sets checked state to `true`.\n *\n * @returns {void}\n */\n public check(): void {\n if (this.disabled || this.readonly) return;\n this.checked = true;\n this.indeterminate = false;\n }\n\n /**\n * Sets checked state to `false`.\n *\n * @returns {void}\n */\n public uncheck(): void {\n if (this.disabled || this.readonly) return;\n this.checked = false;\n this.indeterminate = false;\n }\n\n /**\n * Toggles checked state.\n *\n * @returns {void}\n */\n public toggle(): void {\n if (this.disabled || this.readonly) return;\n this.checked = !this.checked;\n this.indeterminate = false;\n }\n\n /**\n * Resets checkbox state to defaults and clears UI validation state.\n *\n * @returns {void}\n */\n public reset(): void {\n this.onFormReset();\n this.syncFormValue();\n this.syncValidity();\n\n this.dispatchEvent(\n new CustomEvent<SkyCheckboxValueClearedDetail>(\"value-cleared\", {\n detail: { value: this.value, checked: this.checked },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private _updateVisualState(): void {\n const cbx = this.shadowRoot?.querySelector(\".cbx\");\n if (!cbx) return;\n\n if (this.checked) {\n cbx.classList.add(\"checked\");\n cbx.classList.remove(\"indeterminate\");\n } else if (this.indeterminate) {\n cbx.classList.add(\"indeterminate\");\n cbx.classList.remove(\"checked\");\n } else {\n cbx.classList.remove(\"checked\", \"indeterminate\");\n }\n }\n\n private _slotHasMeaningfulContent(slotEl: HTMLSlotElement): boolean {\n const nodes = slotEl.assignedNodes({ flatten: true });\n return nodes.some((n) =>\n n.nodeType === Node.ELEMENT_NODE\n ? true\n : (n.textContent ?? \"\").trim().length > 0\n );\n }\n\n private _onSlotChange = (e: Event) => {\n const slot = e.target as HTMLSlotElement;\n const next = this._slotHasMeaningfulContent(slot);\n if (next !== this._hasMeaningfulSlot) this._hasMeaningfulSlot = next;\n };\n\n private get _hasTextContent(): boolean {\n return !!this.prefix || !!this.suffix || !!this.label || this._hasMeaningfulSlot;\n }\n\n private handleBlur = (_e: FocusEvent): void => {\n this.validationActive = true;\n this.validateInput();\n\n const cbx = this.shadowRoot?.querySelector(\".cbx\");\n cbx?.classList.remove(\"active\");\n\n this.syncValidity();\n };\n private _onKeyDown = (e: KeyboardEvent): void => {\n if (this.disabled || this.readonly) return;\n\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n this._inputElement?.click();\n }\n };\n\n\n override render() {\n const hasText = this._hasTextContent;\n const wrapperClasses = classMap({\n \"checkbox-wrapper\": true,\n \"no-text\": !hasText,\n });\n const labelClasses = classMap({\n cbx: true,\n checked: this.checked,\n indeterminate: this.indeterminate,\n });\n const boxClasses = classMap({\n box: true,\n \"box--checked\": this.checked,\n \"box--indeterminate\": this.indeterminate,\n \"box--invalid\": this.validationErrors.length > 0,\n });\n const boxPart =\n \"box\" +\n (this.checked ? \" box--checked\" : \"\") +\n (this.indeterminate ? \" box--indeterminate\" : \"\") +\n (this.validationErrors.length ? \" box--invalid\" : \"\");\n\n return html`\n <div class=${wrapperClasses} part=\"wrapper\">\n <input\n type=\"checkbox\"\n id=\"${this._inputId}\"\n class=\"inp-cbx\"\n part=\"input\"\n .checked=\"${this.checked}\"\n @blur=${this.handleBlur}\n @keydown=${this._onKeyDown}\n .disabled=\"${this.disabled || this.readonly}\"\n .value=\"${this.value}\"\n @change=${this.handleChange}\n aria-checked=${this.indeterminate ? \"mixed\" : this.checked}\n aria-invalid=\"${this.validationErrors.length > 0}\"\n aria-readonly=\"${this.readonly}\"\n />\n <label class=${labelClasses} part=\"label\" for=\"${this._inputId}\">\n <span part=${boxPart} class=${boxClasses}>\n <svg viewBox=\"0 0 12 10\" class=\"checkmark\" part=\"checkmark\">\n <polyline points=\"1.5 6 4.5 9 10.5 1\"></polyline>\n </svg>\n <div class=\"indeterminate-line\" part=\"indeterminate-line\"></div>\n </span>\n <slot @slotchange=${this._onSlotChange}></slot>\n ${when(\n hasText,\n () => {\n const textStyle = styleMap({ textAlign: \"start\", color: \"var(--sky-text-primary)\" });\n const prefixStyle = styleMap({ color: this.prefixColor, display: \"inline-block\" });\n const suffixStyle = styleMap({ color: this.suffixColor, display: \"inline-block\" });\n return html`\n <span style=${textStyle} part=\"text\">\n <div style=${prefixStyle} part=\"prefix\">\n ${this.prefix}\n </div>\n ${this._hasMeaningfulSlot ? nothing : this.label}\n <div style=${suffixStyle} part=\"suffix\">\n ${this.suffix}\n </div>\n </span>\n `;\n },\n )}\n </label>\n </div>\n ${when(\n this.showErrors &&\n this.validationErrors.length > 0 &&\n this.validationActive,\n () => html`<div class=\"error-message\" part=\"error-message\">\n ${this.validationErrors[0]}\n </div>`,\n )}\n `;\n }\n}"],"names":["SkyCheckbox","FormControlBase","constructor","super","arguments","this","label","id","value","color","defaultChecked","showErrors","prefix","suffix","prefixColor","suffixColor","validationActive","invalid","_checked","_indeterminate","validationErrors","_hasMeaningfulSlot","_inputId","Math","random","toString","slice","preset","_presets","PresetController","_onSlotChange","e","slot","target","next","_slotHasMeaningfulContent","handleBlur","_e","validateInput","cbx","shadowRoot","querySelector","classList","remove","syncValidity","_onKeyDown","disabled","readonly","key","preventDefault","_inputElement","click","checked","v","old","indeterminate","requestUpdate","_updateVisualState","syncFormValue","getFormValue","name","trim","setValueFromFormState","state","getValidityAnchor","isEmpty","getNativeControl","onFormReset","updated","changed","style","setProperty","resolveColor","has","handleChange","event","stopPropagation","emittedValue","dispatchEvent","CustomEvent","detail","bubbles","composed","required","requiredMessage","errors","length","add","isValid","check","uncheck","toggle","reset","slotEl","assignedNodes","flatten","some","n","nodeType","Node","ELEMENT_NODE","textContent","_hasTextContent","render","hasText","wrapperClasses","classMap","labelClasses","boxClasses","box","boxPart","html","when","textStyle","styleMap","textAlign","prefixStyle","display","suffixStyle","nothing","shadowRootOptions","LitElement","delegatesFocus","styles","skyFocusRingHostStyles","css","unsafeCSS","cssOnFillEnhance","selector","fillVar","property","__decorateClass","type","String","prototype","Boolean","reflect","customElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sky-checkbox.js","sources":["../../src/sky-checkbox/sky-checkbox.ts"],"sourcesContent":["import { LitElement, html, css, nothing, unsafeCSS } from \"lit\";\r\nimport { property, customElement, state } from \"lit/decorators.js\";\r\nimport { when } from \"lit/directives/when.js\";\r\nimport { classMap } from \"lit/directives/class-map.js\";\r\nimport { styleMap } from \"lit/directives/style-map.js\";\r\nimport { resolveColor } from \"../helper/utils/color-resolver\";\r\nimport { cssOnFillEnhance } from \"../helper/utils/contrast-color\";\r\nimport { FormControlBase, FormState } from \"../helper/internals/form-control-base\";\r\nimport { PresetController } from \"../helper/controllers/preset-controller\";\r\nimport { skyFocusRingHostStyles } from \"../helper/styles/focus-ring\";\r\n\r\nexport interface CheckboxProperties {\r\n label: string;\r\n checked: boolean;\r\n disabled: boolean;\r\n indeterminate: boolean;\r\n id: string;\r\n value: string;\r\n color: string;\r\n required: boolean;\r\n validationErrors: string[];\r\n validationActive: boolean;\r\n defaultChecked: boolean;\r\n requiredMessage: string;\r\n showErrors: boolean;\r\n prefix: string;\r\n suffix: string;\r\n prefixColor: string;\r\n suffixColor: string;\r\n}\r\n/** `checked` is always the boolean model; `value` keeps form/legacy semantics (see `handleChange`). */\r\nexport type SkyCheckboxValueChangedDetail = {\r\n checked: boolean;\r\n value: string | boolean | undefined;\r\n};\r\nexport type SkyCheckboxValidationErrorDetail = { errors: string[] };\r\nexport type SkyCheckboxValueClearedDetail = { value: string; checked: boolean };\r\n\r\n/**\r\n * @element sky-checkbox\r\n *\r\n * @summary Form-associated checkbox with validation, indeterminate state, and customizable label/prefix/suffix rendering.\r\n *\r\n * @status stable\r\n * @since 1.0.0\r\n *\r\n * @documentation https://sky-ui.com/components/checkbox\r\n *\r\n * @uiVModel checked value-changed detail=checked\r\n *\r\n * @slot - Default slot for the checkbox label or other content.\r\n * @slot prefix - Optional prefix content that can be placed before the label.\r\n * @slot suffix - Optional suffix content that can be placed after the label.\r\n *\r\n * @csspart wrapper - The wrapper element for the checkbox.\r\n * @csspart input - The native input element used for the checkbox.\r\n * @csspart label - The label element for the checkbox, used for styling.\r\n * @csspart box - The visual box for the checkbox, which includes the checkmark and indeterminate state.\r\n * @csspart checkmark - The checkmark icon that appears when the checkbox is checked.\r\n * @csspart indeterminate-line - The line representing the indeterminate state of the checkbox.\r\n * @csspart error-message - The error message displayed if the checkbox is invalid.\r\n *\r\n * @property {string} label - The label for the checkbox. Default: `\"\"`.\r\n * @property {boolean} checked - Whether the checkbox is checked. Default: `false`.\r\n * @property {boolean} indeterminate - Whether the checkbox is in the indeterminate state. Default: `false`.\r\n * @property {string} color - The color used for the checkbox and its checkmark. Default: `\"primary\"`.\r\n * @property {string} value - The value of the checkbox, which gets submitted with the form. Default: `\"\"`.\r\n * @property {boolean} showErrors - Whether to display validation error messages. Default: `false`.\r\n * @property {string} prefix - Optional prefix text or content before the label. Default: `\"\"`.\r\n * @property {string} suffix - Optional suffix text or content after the label. Default: `\"\"`.\r\n * @property {string} prefixColor - The color for the prefix text. Default: `\"\"`.\r\n * @property {string} suffixColor - The color for the suffix text. Default: `\"\"`.\r\n * @property {boolean} defaultChecked - Default checked state for reset operations. Default: `false`.\r\n * @property {string} preset - Named prop preset from nearest `sky-config-provider`. Default: `\"\"`.\r\n * @method check Sets checked state to `true`.\r\n * @method uncheck Sets checked state to `false`.\r\n * @method toggle Toggles checked state.\r\n * @method reset Resets checkbox state to defaults and clears UI validation state.\r\n *\r\n * @fires {CustomEvent<SkyCheckboxValueChangedDetail>} value-changed - Fired when checked state changes; `detail.checked` is always boolean (use for v-model). `detail.value` is the form token when the `value` prop is set, else mirrors `checked`.\r\n * @fires {CustomEvent<SkyCheckboxValidationErrorDetail>} validation-error - Fired when validation errors are updated.\r\n * @fires {CustomEvent<SkyCheckboxValueClearedDetail>} value-cleared - Fired when checkbox is reset programmatically.\r\n *\r\n * @example\r\n * ```html\r\n * <sky-checkbox label=\"Accept Terms\" required showerrors prefix=\"Legal\"></sky-checkbox>\r\n * ```\r\n * ```vue\r\n * <template>\r\n * <sky-checkbox label=\"Accept Terms\" required showerrors prefix=\"Legal\"></sky-checkbox>\r\n * </template>\r\n * ```\r\n * ```jsx\r\n * export default function Demo() {\r\n * return <sky-checkbox label=\"Accept Terms\" required showerrors prefix=\"Legal\"></sky-checkbox>;\r\n * }\r\n * ```\r\n */\r\n@customElement(\"sky-checkbox\")\r\nexport class SkyCheckbox extends FormControlBase {\r\n static override shadowRootOptions = {\r\n ...LitElement.shadowRootOptions,\r\n delegatesFocus: true,\r\n };\r\n\r\n @property({ type: String }) label = \"\";\r\n @property({ type: String }) override id = \"\";\r\n @property({ type: String }) value = \"\";\r\n @property({ type: String }) color = \"primary\";\r\n @property({ type: Boolean }) defaultChecked = false;\r\n @property({ type: Boolean }) showErrors = false;\r\n @property({ type: String }) override prefix = \"\";\r\n @property({ type: String }) suffix = \"\";\r\n @property({ type: String }) prefixColor = \"\";\r\n @property({ type: String }) suffixColor = \"\";\r\n @property({ type: Boolean, reflect: true }) validationActive: boolean = false;\r\n @property({ type: Boolean, reflect: true }) invalid: boolean = false;\r\n @state() private _checked = false;\r\n @state() private _indeterminate = false;\r\n @state() private validationErrors: string[] = [];\r\n @state() private _hasMeaningfulSlot = false;\r\n\r\n private _inputElement?: HTMLInputElement;\r\n private _inputId = `sky-cb-${Math.random().toString(36).slice(2)}`;\r\n\r\n @property({ type: Boolean, reflect: true })\r\n get checked() {\r\n return this._checked;\r\n }\r\n set checked(v: boolean) {\r\n const old = this._checked;\r\n this._checked = v;\r\n\r\n if (v && this.indeterminate) {\r\n this.indeterminate = false;\r\n if (this._inputElement) this._inputElement.indeterminate = false;\r\n }\r\n\r\n this.requestUpdate(\"checked\", old);\r\n\r\n if (this._inputElement) {\r\n this._inputElement.checked = v;\r\n this._inputElement.indeterminate = this.indeterminate;\r\n }\r\n\r\n this._updateVisualState();\r\n\r\n this.syncFormValue();\r\n this.syncValidity();\r\n }\r\n\r\n @property({ type: Boolean, reflect: true })\r\n get indeterminate() {\r\n return this._indeterminate;\r\n }\r\n set indeterminate(v: boolean) {\r\n const old = this._indeterminate;\r\n this._indeterminate = v;\r\n\r\n if (v && this.checked) this.checked = false;\r\n\r\n this.requestUpdate(\"indeterminate\", old);\r\n\r\n if (this._inputElement) this._inputElement.indeterminate = v;\r\n\r\n this._updateVisualState();\r\n\r\n this.syncValidity();\r\n }\r\n\r\n\r\n /** Named prop preset from nearest `sky-config-provider`. */\r\n @property({ type: String, reflect: true }) preset = \"\";\r\n\r\n private _presets = new PresetController(this);\r\n\r\n static override styles = [\r\n skyFocusRingHostStyles,\r\n css`\r\n :host {\r\n display: block;\r\n position: relative;\r\n font-family: var(--sky-font);\r\n /* Tint focus ring with the control color (not global active-primary). */\r\n --sky-focus-ring-color: var(--checkbox-color, var(--sky-active-primary));\r\n }\r\n\r\n :host([readonly]) .cbx {\r\n cursor: default;\r\n }\r\n\r\n /* Show focus UI whenever anything inside is focused */\r\n :host(:focus-within) .cbx span:first-child,\r\n :host(:focus) .cbx span:first-child {\r\n box-shadow: var(--sky-focus-ring);\r\n border-color: var(--checkbox-color, var(--sky-active-primary)) !important;\r\n }\r\n\r\n .checkbox-wrapper {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--sky-space-1, 5px);\r\n }\r\n\r\n :host([disabled]) {\r\n pointer-events: none;\r\n opacity: var(--sky-opacity-disabled, 0.6);\r\n }\r\n\r\n .cbx {\r\n display: flex;\r\n align-items: center;\r\n cursor: pointer;\r\n user-select: none;\r\n gap: var(--sky-space-1, 5px);\r\n transition: color 0.2s ease;\r\n font-family: var(--sky-font);\r\n font-size: var(--sky-font-size-sm);\r\n line-height: var(--sky-line-height-snug, 1.25);\r\n color: var(--sky-text-primary);\r\n }\r\n\r\n .cbx span {\r\n display: inline-block;\r\n vertical-align: middle;\r\n }\r\n\r\n .cbx span:first-child {\r\n position: relative;\r\n box-sizing: border-box;\r\n width: 18px;\r\n height: 18px;\r\n flex-shrink: 0;\r\n border-radius: min(6px, var(--sky-radius-primary));\r\n vertical-align: middle;\r\n background: var(--sky-glass-solid);\r\n border: 2px solid var(--sky-text-tertiary);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transform: translateZ(0);\r\n contain: layout;\r\n /* visible so --sky-focus-ring (outer box-shadow) is not clipped */\r\n overflow: visible;\r\n transition: background-color 0.2s ease, border-color 0.2s ease,\r\n box-shadow 0.2s ease;\r\n }\r\n\r\n .cbx span:first-child svg {\r\n position: absolute;\r\n width: 12px;\r\n height: 10px;\r\n fill: none;\r\n stroke: var(--sky-on-color-fallback-light, var(--sky-text-white));\r\n stroke-width: 2;\r\n stroke-linecap: round;\r\n stroke-linejoin: round;\r\n stroke-dasharray: 16px;\r\n stroke-dashoffset: 16px;\r\n transition: stroke-dashoffset 0.2s ease, transform 0.2s ease;\r\n transform: translate3d(0, 0, 0);\r\n }\r\n\r\n .cbx:hover span:first-child {\r\n background-color: var(--sky-hover-primary);\r\n border-color: var(--sky-text-tertiary);\r\n }\r\n\r\n input[type=\"checkbox\"]:checked + .cbx:hover span:first-child {\r\n box-shadow: var(--sky-box-shadow-hover);\r\n transition: box-shadow 0.2s ease;\r\n }\r\n\r\n /* Keep focus ring above hover shadow when both apply */\r\n :host(:focus-within) input[type=\"checkbox\"]:checked + .cbx:hover span:first-child,\r\n :host(:focus) input[type=\"checkbox\"]:checked + .cbx:hover span:first-child {\r\n box-shadow: var(--sky-focus-ring);\r\n }\r\n\r\n .cbx span:first-child:before {\r\n content: \"\";\r\n inset: 0;\r\n width: auto;\r\n height: auto;\r\n background: var(--checkbox-color, var(--sky-active-primary));\r\n display: block;\r\n transform: scale(0);\r\n opacity: 0;\r\n border-radius: 50%;\r\n transition: transform 0.2s ease-out, opacity 0.2s ease-out;\r\n position: absolute;\r\n z-index: -1;\r\n pointer-events: none;\r\n }\r\n\r\n input[type=\"checkbox\"] {\r\n position: absolute;\r\n opacity: 0;\r\n width: 1px;\r\n height: 1px;\r\n margin: 0;\r\n padding: 0;\r\n border: 0;\r\n }\r\n\r\n input[type=\"checkbox\"]:focus-visible + .cbx span:first-child,\r\n input[type=\"checkbox\"]:focus + .cbx span:first-child {\r\n outline: none;\r\n }\r\n\r\n input[type=\"checkbox\"]:checked + .cbx span:first-child {\r\n background: var(--checkbox-color, var(--sky-active-primary));\r\n border-color: var(--checkbox-color, var(--sky-active-primary));\r\n transform: none;\r\n }\r\n\r\n input[type=\"checkbox\"]:checked + .cbx span:first-child svg.checkmark {\r\n stroke-dashoffset: 0;\r\n transition: stroke-dashoffset 0.2s ease-in-out 0.1s,\r\n transform 0.2s ease-in-out 0.1s;\r\n }\r\n\r\n input[type=\"checkbox\"]:not(:checked) + .cbx span:first-child svg.checkmark {\r\n transition: opacity 0.2s ease-in-out;\r\n opacity: 0;\r\n }\r\n\r\n input[type=\"checkbox\"]:checked + .cbx span:first-child:before {\r\n transform: scale(3.5);\r\n opacity: 0;\r\n transition: transform 0.2s ease-out, opacity 0.2s ease-out;\r\n }\r\n\r\n .cbx.checked span:first-child {\r\n background: var(--checkbox-color, var(--sky-active-primary));\r\n border-color: var(--checkbox-color, var(--sky-active-primary));\r\n }\r\n\r\n .cbx.checked span:first-child svg.checkmark {\r\n stroke-dashoffset: 0;\r\n transition: stroke-dashoffset 0.2s ease-in-out 0.1s,\r\n transform 0.2s ease-in-out 0.1s;\r\n }\r\n\r\n .indeterminate-line {\r\n width: 10px;\r\n height: 2px;\r\n background-color: var(--sky-on-color-fallback-light, var(--sky-text-white));\r\n position: absolute;\r\n border-radius: 1px;\r\n transition: opacity 0.2s ease, transform 0.2s ease;\r\n opacity: 0;\r\n transform: scaleX(0);\r\n }\r\n\r\n .indeterminate-active {\r\n opacity: 1;\r\n transform: scaleX(1);\r\n }\r\n\r\n .checked .checkmark {\r\n stroke-dashoffset: 0;\r\n }\r\n\r\n .indeterminate .checkmark {\r\n display: none;\r\n }\r\n\r\n .indeterminate .indeterminate-line {\r\n opacity: 1;\r\n transform: scaleX(1);\r\n }\r\n\r\n\r\n .error-message {\r\n font-size: var(--sky-font-size-xs);\r\n color: var(--sky-danger-primary);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n pointer-events: none;\r\n margin-left: var(--sky-space-1, 5px);\r\n width: 100%;\r\n text-align: start;\r\n font-family: var(--sky-font);\r\n }\r\n :dir(rtl) .error-message {\r\n margin-right: var(--sky-space-1, 5px);\r\n margin-left: unset;\r\n }\r\n\r\n :host([validationactive]:invalid) .cbx span:first-child {\r\n\r\n border-color: var(--sky-danger-primary);\r\n }\r\n :host([validationactive]:invalid) .cbx span:first-child svg.checkmark {\r\n stroke-dashoffset: 0;\r\n }\r\n :host([validationactive]:invalid) .cbx span:first-child:before {\r\n transform: scale(3.5);\r\n opacity: 0;\r\n }\r\n :host([validationactive]:invalid) .error-message {\r\n display: block;\r\n }\r\n\r\n :host([indeterminate]) .indeterminate-line {\r\n opacity: 1;\r\n transform: scaleX(1);\r\n }\r\n :host([indeterminate]) .cbx span:first-child {\r\n background-color: var(--checkbox-color);\r\n border-color: var(--checkbox-color);\r\n }\r\n\r\n .checkbox-wrapper.no-text {\r\n gap: 0;\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .cbx,\r\n .cbx span:first-child,\r\n .cbx span:first-child svg,\r\n .cbx span:first-child:before,\r\n .indeterminate-line {\r\n transition: none;\r\n }\r\n }\r\n\r\n ${unsafeCSS(\r\n cssOnFillEnhance([\r\n {\r\n selector:\r\n 'input[type=\"checkbox\"]:checked + .cbx span:first-child svg, .cbx.checked span:first-child svg',\r\n fillVar: \"var(--checkbox-color, var(--sky-active-primary))\",\r\n property: \"stroke\",\r\n },\r\n {\r\n selector: \".indeterminate-line, .indeterminate .indeterminate-line\",\r\n fillVar: \"var(--checkbox-color, var(--sky-active-primary))\",\r\n property: \"background-color\",\r\n },\r\n ]),\r\n )}\r\n `,\r\n ];\r\n\r\n protected override getFormValue(): FormState {\r\n if (!this.name) return null;\r\n if (this.disabled) return null;\r\n\r\n if (!this.checked) return null;\r\n\r\n if (this.value && this.value.trim() !== \"\") return this.value;\r\n\r\n return \"on\";\r\n }\r\n\r\n protected override setValueFromFormState(state: FormState): void {\r\n if (state === null) {\r\n this.checked = false;\r\n this.indeterminate = false;\r\n return;\r\n }\r\n\r\n if (typeof state === \"string\") {\r\n if (this.value && this.value.trim() !== \"\") {\r\n this.checked = state === this.value;\r\n } else {\r\n this.checked = state === \"on\" || state === \"true\" || state === \"1\";\r\n }\r\n this.indeterminate = false;\r\n }\r\n }\r\n\r\n protected override getValidityAnchor(): HTMLElement | undefined {\r\n return (this.shadowRoot?.querySelector('input[type=\"checkbox\"]') as HTMLElement) ?? undefined;\r\n }\r\n\r\n protected override isEmpty(): boolean {\r\n return !this.checked;\r\n }\r\n\r\n protected override getNativeControl(): HTMLElement | null {\r\n return this.shadowRoot?.querySelector('input[type=\"checkbox\"]') as HTMLInputElement | null;\r\n }\r\n\r\n protected override onFormReset(): void {\r\n this.checked = this.defaultChecked;\r\n this.indeterminate = false;\r\n\r\n this.validationErrors = [];\r\n this.invalid = false;\r\n this.validationActive = false;\r\n }\r\n\r\n override updated(changed: Map<string, unknown>): void {\r\n super.updated(changed);\r\n\r\n // After PresetController hostUpdate — color may come from presets.\r\n this.style.setProperty(\"--checkbox-color\", resolveColor(this.color));\r\n\r\n if (!this._inputElement) {\r\n this._inputElement = this.shadowRoot?.querySelector(\r\n 'input[type=\"checkbox\"]'\r\n ) as HTMLInputElement;\r\n }\r\n\r\n if (this._inputElement) {\r\n this._inputElement.checked = this.checked;\r\n this._inputElement.indeterminate = this.indeterminate;\r\n this._inputElement.disabled = this.disabled || this.readonly;\r\n }\r\n\r\n this._updateVisualState();\r\n\r\n if (\r\n changed.has(\"checked\") ||\r\n changed.has(\"name\") ||\r\n changed.has(\"disabled\") ||\r\n changed.has(\"readonly\") ||\r\n changed.has(\"required\") ||\r\n changed.has(\"value\")\r\n ) {\r\n this.syncFormValue();\r\n this.syncValidity();\r\n }\r\n }\r\n\r\n private handleChange(event: Event): void {\r\n const target = event.target as HTMLInputElement;\r\n\r\n if (this.disabled || this.readonly) {\r\n if (this._inputElement) {\r\n this._inputElement.checked = this.checked;\r\n this._inputElement.indeterminate = this.indeterminate;\r\n }\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n\r\n this.checked = target.checked;\r\n\r\n this.validateInput();\r\n\r\n const emittedValue =\r\n this.value && this.value.trim() !== \"\"\r\n ? this.checked ? this.value : undefined\r\n : this.checked;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<SkyCheckboxValueChangedDetail>(\"value-changed\", {\r\n detail: { checked: this.checked, value: emittedValue },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private validateInput(): boolean {\r\n if (!this.validationActive) return true;\r\n\r\n this.validationErrors = [];\r\n if (this.required && !this.checked) {\r\n this.validationErrors = [this.requiredMessage]; // from base\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<SkyCheckboxValidationErrorDetail>(\"validation-error\", {\r\n detail: { errors: [...this.validationErrors] },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n\r\n const cbx = this.shadowRoot?.querySelector(\".cbx\") as HTMLElement | null;\r\n if (this.validationErrors.length) cbx?.classList.add(\"invalid\");\r\n else cbx?.classList.remove(\"invalid\");\r\n\r\n const isValid = this.validationErrors.length === 0;\r\n this.invalid = !isValid;\r\n\r\n return isValid;\r\n }\r\n\r\n /**\r\n * Sets checked state to `true`.\r\n *\r\n * @returns {void}\r\n */\r\n public check(): void {\r\n if (this.disabled || this.readonly) return;\r\n this.checked = true;\r\n this.indeterminate = false;\r\n }\r\n\r\n /**\r\n * Sets checked state to `false`.\r\n *\r\n * @returns {void}\r\n */\r\n public uncheck(): void {\r\n if (this.disabled || this.readonly) return;\r\n this.checked = false;\r\n this.indeterminate = false;\r\n }\r\n\r\n /**\r\n * Toggles checked state.\r\n *\r\n * @returns {void}\r\n */\r\n public toggle(): void {\r\n if (this.disabled || this.readonly) return;\r\n this.checked = !this.checked;\r\n this.indeterminate = false;\r\n }\r\n\r\n /**\r\n * Resets checkbox state to defaults and clears UI validation state.\r\n *\r\n * @returns {void}\r\n */\r\n public reset(): void {\r\n this.onFormReset();\r\n this.syncFormValue();\r\n this.syncValidity();\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<SkyCheckboxValueClearedDetail>(\"value-cleared\", {\r\n detail: { value: this.value, checked: this.checked },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private _updateVisualState(): void {\r\n const cbx = this.shadowRoot?.querySelector(\".cbx\");\r\n if (!cbx) return;\r\n\r\n if (this.checked) {\r\n cbx.classList.add(\"checked\");\r\n cbx.classList.remove(\"indeterminate\");\r\n } else if (this.indeterminate) {\r\n cbx.classList.add(\"indeterminate\");\r\n cbx.classList.remove(\"checked\");\r\n } else {\r\n cbx.classList.remove(\"checked\", \"indeterminate\");\r\n }\r\n }\r\n\r\n private _slotHasMeaningfulContent(slotEl: HTMLSlotElement): boolean {\r\n const nodes = slotEl.assignedNodes({ flatten: true });\r\n return nodes.some((n) =>\r\n n.nodeType === Node.ELEMENT_NODE\r\n ? true\r\n : (n.textContent ?? \"\").trim().length > 0\r\n );\r\n }\r\n\r\n private _onSlotChange = (e: Event) => {\r\n const slot = e.target as HTMLSlotElement;\r\n const next = this._slotHasMeaningfulContent(slot);\r\n if (next !== this._hasMeaningfulSlot) this._hasMeaningfulSlot = next;\r\n };\r\n\r\n private get _hasTextContent(): boolean {\r\n return !!this.prefix || !!this.suffix || !!this.label || this._hasMeaningfulSlot;\r\n }\r\n\r\n private handleBlur = (_e: FocusEvent): void => {\r\n this.validationActive = true;\r\n this.validateInput();\r\n\r\n const cbx = this.shadowRoot?.querySelector(\".cbx\");\r\n cbx?.classList.remove(\"active\");\r\n\r\n this.syncValidity();\r\n };\r\n private _onKeyDown = (e: KeyboardEvent): void => {\r\n if (this.disabled || this.readonly) return;\r\n\r\n if (e.key === \" \" || e.key === \"Enter\") {\r\n e.preventDefault();\r\n this._inputElement?.click();\r\n }\r\n };\r\n\r\n\r\n override render() {\r\n const hasText = this._hasTextContent;\r\n const wrapperClasses = classMap({\r\n \"checkbox-wrapper\": true,\r\n \"no-text\": !hasText,\r\n });\r\n const labelClasses = classMap({\r\n cbx: true,\r\n checked: this.checked,\r\n indeterminate: this.indeterminate,\r\n });\r\n const boxClasses = classMap({\r\n box: true,\r\n \"box--checked\": this.checked,\r\n \"box--indeterminate\": this.indeterminate,\r\n \"box--invalid\": this.validationErrors.length > 0,\r\n });\r\n const boxPart =\r\n \"box\" +\r\n (this.checked ? \" box--checked\" : \"\") +\r\n (this.indeterminate ? \" box--indeterminate\" : \"\") +\r\n (this.validationErrors.length ? \" box--invalid\" : \"\");\r\n\r\n return html`\r\n <div class=${wrapperClasses} part=\"wrapper\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"${this._inputId}\"\r\n class=\"inp-cbx\"\r\n part=\"input\"\r\n .checked=\"${this.checked}\"\r\n @blur=${this.handleBlur}\r\n @keydown=${this._onKeyDown}\r\n .disabled=\"${this.disabled || this.readonly}\"\r\n .value=\"${this.value}\"\r\n @change=${this.handleChange}\r\n aria-checked=${this.indeterminate ? \"mixed\" : this.checked}\r\n aria-invalid=\"${this.validationErrors.length > 0}\"\r\n aria-readonly=\"${this.readonly}\"\r\n />\r\n <label class=${labelClasses} part=\"label\" for=\"${this._inputId}\">\r\n <span part=${boxPart} class=${boxClasses}>\r\n <svg viewBox=\"0 0 12 10\" class=\"checkmark\" part=\"checkmark\">\r\n <polyline points=\"1.5 6 4.5 9 10.5 1\"></polyline>\r\n </svg>\r\n <div class=\"indeterminate-line\" part=\"indeterminate-line\"></div>\r\n </span>\r\n <slot @slotchange=${this._onSlotChange}></slot>\r\n ${when(\r\n hasText,\r\n () => {\r\n const textStyle = styleMap({ textAlign: \"start\", color: \"var(--sky-text-primary)\" });\r\n const prefixStyle = styleMap({ color: this.prefixColor, display: \"inline-block\" });\r\n const suffixStyle = styleMap({ color: this.suffixColor, display: \"inline-block\" });\r\n return html`\r\n <span style=${textStyle} part=\"text\">\r\n <div style=${prefixStyle} part=\"prefix\">\r\n ${this.prefix}\r\n </div>\r\n ${this._hasMeaningfulSlot ? nothing : this.label}\r\n <div style=${suffixStyle} part=\"suffix\">\r\n ${this.suffix}\r\n </div>\r\n </span>\r\n `;\r\n },\r\n )}\r\n </label>\r\n </div>\r\n ${when(\r\n this.showErrors &&\r\n this.validationErrors.length > 0 &&\r\n this.validationActive,\r\n () => html`<div class=\"error-message\" part=\"error-message\">\r\n ${this.validationErrors[0]}\r\n </div>`,\r\n )}\r\n `;\r\n }\r\n}"],"names":["SkyCheckbox","FormControlBase","constructor","super","arguments","this","label","id","value","color","defaultChecked","showErrors","prefix","suffix","prefixColor","suffixColor","validationActive","invalid","_checked","_indeterminate","validationErrors","_hasMeaningfulSlot","_inputId","Math","random","toString","slice","preset","_presets","PresetController","_onSlotChange","e","slot","target","next","_slotHasMeaningfulContent","handleBlur","_e","validateInput","cbx","shadowRoot","querySelector","classList","remove","syncValidity","_onKeyDown","disabled","readonly","key","preventDefault","_inputElement","click","checked","v","old","indeterminate","requestUpdate","_updateVisualState","syncFormValue","getFormValue","name","trim","setValueFromFormState","state","getValidityAnchor","isEmpty","getNativeControl","onFormReset","updated","changed","style","setProperty","resolveColor","has","handleChange","event","stopPropagation","emittedValue","dispatchEvent","CustomEvent","detail","bubbles","composed","required","requiredMessage","errors","length","add","isValid","check","uncheck","toggle","reset","slotEl","assignedNodes","flatten","some","n","nodeType","Node","ELEMENT_NODE","textContent","_hasTextContent","render","hasText","wrapperClasses","classMap","labelClasses","boxClasses","box","boxPart","html","when","textStyle","styleMap","textAlign","prefixStyle","display","suffixStyle","nothing","shadowRootOptions","LitElement","delegatesFocus","styles","skyFocusRingHostStyles","css","unsafeCSS","cssOnFillEnhance","selector","fillVar","property","__decorateClass","type","String","prototype","Boolean","reflect","customElement"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sky-chip.js","sources":["../../src/sky-chip/sky-chip.ts"],"sourcesContent":["import { LitElement, html, css, nothing, unsafeCSS } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { when } from \"lit/directives/when.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport {\n isDefaultColorToken,\n resolveAccentColorForToken,\n resolveColor,\n resolveInkColorForToken,\n} from \"../helper/utils/color-resolver\";\nimport { cssOnFillEnhance, ON_COLOR_FALLBACK_LIGHT } from \"../helper/utils/contrast-color\";\nimport { resolveRadius } from \"../helper/utils/size-resolver\";\nimport { PresetController } from \"../helper/controllers/preset-controller\";\nimport { SkyIcon } from \"../sky-icon/sky-icon.js\";\nimport { skyFocusRingHostStyles } from \"../helper/styles/focus-ring\";\n\nexport type SkyChipVariant =\n | \"solid\"\n | \"flat\"\n | \"shadow\"\n | \"bordered\"\n | \"faded\"\n | \"light\"\n | \"dot\";\nexport type SkyChipRemovedEventDetail = { label: string };\n\n/**\n * @element sky-chip\n *\n * @summary Customizable chip for tags or selections with icon support, removable action, loading state, and visual variants.\n *\n * @status stable\n * @since 1.0.0\n *\n * @documentation https://sky-ui.com/components/chip\n * @dependency sky-icon\n *\n * @slot - Default slot for the chip label or any other content.\n * @slot prefix - Optional prefix content that can be placed before the label.\n * @slot suffix - Optional suffix content that can be placed after the label.\n *\n * @csspart chip - The visual representation of the chip component.\n * @csspart icon - The icons displayed within the chip.\n * @csspart close-button - The button for removing the chip.\n * @csspart loading-spinner - The spinner that appears during loading.\n * @csspart error-message - The error message displayed for invalid chips.\n *\n * @property {string} label - The label displayed on the chip. Default: `\"\"`.\n * @property {boolean} removable - Whether the chip can be removed by the user. Default: `false`.\n * @property {string} color - The background color of the chip, can accept tokens or custom CSS color. Default: `\"primary\"`.\n * @property {string} radius - The border radius of the chip. Default: `\"full\"`.\n * @property {string} size - The size of the chip, which affects padding and font size. Default: `\"md\"`.\n * @property {string} iconL - Left icon; shown only when the `prefix` slot is empty. Default: `null`.\n * @property {string} iconR - Right icon; shown only when the `suffix` slot is empty. Default: `null`.\n * @property {boolean} loading - Whether the chip is in a loading state. Default: `false`.\n * @property {boolean} disabled - Whether the chip is disabled. Default: `false`.\n * @property {SkyChipVariant} variant - Visual style variant. Default: `\"flat\"`.\n * @property {string} preset - Named prop preset from nearest `sky-config-provider`. Default: `\"\"`.\n * @method removeChip Dispatches `chip-removed` and removes the chip from the DOM.\n *\n * @fires {CustomEvent<SkyChipRemovedEventDetail>} chip-removed - Fired when the chip is removed by user action.\n *\n * @Behavior\n * - Uses default slot content when present, otherwise falls back to `label`.\n * - `iconL` / `iconR` render only when `prefix` / `suffix` slots have no meaningful content.\n * - Emits `chip-removed` and removes itself when removable close action is triggered.\n * - Resolves color tokens and radius/size presets to CSS values at render time.\n *\n * @example\n * ```html\n * <sky-chip label=\"Active Filter\" removable iconl=\"ion:funnel\" variant=\"light\"></sky-chip>\n * ```\n * ```vue\n * <template>\n * <sky-chip label=\"Active Filter\" removable iconl=\"ion:funnel\" variant=\"light\"></sky-chip>\n * </template>\n * ```\n * ```jsx\n * export default function Demo() {\n * return <sky-chip label=\"Active Filter\" removable iconl=\"ion:funnel\" variant=\"light\"></sky-chip>;\n * }\n * ```\n */\n@customElement(\"sky-chip\")\nexport class SkyChip extends LitElement {\n\n static dependencies: Record<string, CustomElementConstructor> = {\n \"sky-icon\": SkyIcon,\n };\n\n @property({ type: String }) label: string = \"\";\n @property({ type: Boolean }) removable: boolean = false;\n\n /** Accepts preset tokens OR any valid CSS color (e.g., #0af, rgb(), var(--x)) */\n @property({ type: String }) color: string = \"primary\";\n\n /** Radius can be any CSS radius value */\n @property({ type: String }) radius: string = \"full\";\n\n /** Size controls padding + font-size (xs, sm, md, lg, xl or numeric like \"14px\") */\n @property({ type: String }) size: string = \"md\";\n\n @property({ type: String }) iconL: string | null = null;\n @property({ type: String }) iconR: string | null = null;\n @property({ type: Boolean }) loading: boolean = false;\n @property({ type: Boolean, reflect: true }) disabled: boolean = false;\n @property({ type: String, reflect: true }) variant: SkyChipVariant = \"flat\";\n\n /** Named prop preset from nearest `sky-config-provider`. */\n @property({ type: String, reflect: true }) preset = \"\";\n\n private _presets = new PresetController(this);\n\n static override styles = [\n skyFocusRingHostStyles,\n css`\n :host {\n display: inline-block;\n font-family: var(--sky-font);\n z-index: 1;\n --sky-focus-ring-color: var(--chip-bg-color, var(--sky-active-primary));\n }\n\n :host([disabled]) {\n pointer-events: none;\n opacity: var(--sky-opacity-disabled, 0.6);\n }\n\n .chip {\n position: relative;\n display: flex;\n gap: 2px;\n width: max-content;\n align-items: center;\n border-radius: var(--sky-radius-secondary);\n color: var(--chip-text-color);\n font-weight: var(--sky-font-weight-medium, 500);\n transition: background-color 0.3s ease, color 0.3s ease,\n box-shadow 0.2s ease, transform 0.2s ease;\n cursor: pointer;\n background-color: var(--chip-bg-color);\n }\n\n .close-button {\n position: relative;\n display: flex;\n height: 18px;\n width: 18px;\n justify-content: center;\n font-size: inherit;\n align-items: center;\n background-color: var(--sky-hover-primary);\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n border: none;\n border-radius: var(--sky-radius-full);\n cursor: pointer;\n color: var(--sky-text-primary);\n transition: color 0.2s ease, background-color 0.2s ease;\n }\n\n .close-button sky-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n line-height: 1;\n transition: color 0.3s ease;\n }\n\n :dir(rtl) .close-button {\n margin-right: var(--sky-space-1, 5px);\n margin-left: unset;\n }\n\n .close-button:hover {\n color: var(--sky-danger-primary);\n }\n\n .close-button:focus-visible {\n outline: none;\n box-shadow: var(--sky-focus-ring);\n }\n\n .close-button:hover sky-icon,\n .close-button:focus-visible sky-icon{\n color: var(--sky-danger-primary);\n outline: none;\n }\n\n .icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--chip-text-color);\n }\n\n sky-icon {\n display: inline-block;\n width: 1em;\n height: 1em;\n }\n\n ::slotted([slot=\"prefix\"]),\n ::slotted([slot=\"suffix\"]) {\n display: inline-flex;\n align-items: center;\n }\n\n .loading-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--sky-overlay-primary);\n border-radius: inherit;\n }\n\n .loading-spinner {\n width: 14px;\n height: 14px;\n border: 2px solid var(--sky-border-light, var(--sky-text-tertiary));\n border-top-color: var(--chip-bg-color);\n border-radius: var(--sky-radius-full);\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .chip,\n .close-button,\n .close-button sky-icon {\n transition: none;\n }\n .loading-spinner {\n animation: none;\n }\n }\n\n .chip.bordered {\n border: 1px solid var(--chip-ink-color, var(--chip-bg-color));\n color: var(--chip-ink-color, var(--chip-bg-color));\n background: transparent;\n }\n\n .chip.light {\n background: transparent;\n color: var(--chip-ink-color, var(--chip-bg-color));\n }\n\n .chip.flat {\n box-shadow: none;\n background: color-mix(\n in srgb,\n var(--chip-fill-color, var(--chip-bg-color)) 20%,\n transparent\n );\n color: var(--chip-ink-color, var(--chip-bg-color));\n }\n\n .chip.faded {\n background-color: var(--sky-glass-primary);\n border: 1px solid var(--sky-text-tertiary);\n color: var(--chip-ink-color, var(--chip-bg-color));\n }\n\n .chip.shadow {\n box-shadow: var(--sky-box-shadow-primary);\n }\n\n .chip.shadow:hover {\n box-shadow: var(--sky-box-shadow-hover);\n }\n\n .chip.faded .icon,\n .chip.flat .icon,\n .chip.light .icon,\n .chip.dot .icon,\n .chip.bordered .icon {\n color: var(--chip-ink-color, var(--chip-bg-color));\n }\n\n .chip.dot {\n padding-left: var(--sky-space-5, 20px) !important;\n position: relative;\n background-color: transparent;\n border: 1px solid var(--sky-text-tertiary);\n color: var(--sky-text-primary);\n }\n\n .chip.dot::before {\n content: \"\";\n position: absolute;\n left: var(--sky-space-1\\\\.5, 6px);\n top: 50%;\n transform: translateY(-50%);\n width: var(--sky-space-2, 8px);\n height: var(--sky-space-2, 8px);\n border-radius: var(--sky-radius-full);\n background-color: var(--chip-accent-color, var(--chip-bg-color));\n }\n\n /* Solid / shadow chips: enhance label + icon FG against fill. */\n ${unsafeCSS(\n cssOnFillEnhance([\n {\n selector: \".chip.solid, .chip.shadow\",\n fillVar: \"--chip-bg-color\",\n },\n {\n selector: \".chip.solid .icon, .chip.shadow .icon\",\n fillVar: \"--chip-bg-color\",\n },\n ]),\n )}\n `,\n ];\n\n /** Updates host CSS variables from current color token/value. */\n protected override updated(): void {\n const bgColor = resolveColor(this.color);\n const textColor = isDefaultColorToken(this.color)\n ? \"var(--sky-text-primary)\"\n : ON_COLOR_FALLBACK_LIGHT;\n\n this.style.setProperty(\"--chip-bg-color\", bgColor);\n this.style.setProperty(\"--chip-text-color\", textColor);\n\n if (isDefaultColorToken(this.color)) {\n this.style.setProperty(\"--chip-ink-color\", resolveInkColorForToken(this.color));\n this.style.setProperty(\n \"--chip-accent-color\",\n resolveAccentColorForToken(this.color),\n );\n this.style.setProperty(\"--chip-fill-color\", \"var(--sky-hover-tertiary)\");\n } else {\n this.style.removeProperty(\"--chip-ink-color\");\n this.style.removeProperty(\"--chip-accent-color\");\n this.style.removeProperty(\"--chip-fill-color\");\n }\n }\n\n /** Size resolver similar to button: controls padding + font-size */\n private _resolveSize(\n input: string\n ): {\n padding: string;\n fontSize: string;\n } {\n const presets: Record<string, { padding: string; fontSize: string }> = {\n xs: { padding: \"2px 4px\", fontSize: \"11px\" },\n sm: { padding: \"3px 6px\", fontSize: \"12px\" },\n md: { padding: \"4px 8px\", fontSize: \"13px\" },\n lg: { padding: \"5px 10px\", fontSize: \"14px\" },\n xl: { padding: \"6px 12px\", fontSize: \"15px\" },\n };\n\n if (presets[input]) return presets[input];\n\n const m = String(input).trim().match(/^([\\d.]+)(px|rem|em)?$/i);\n const unit = m?.[2] || \"px\";\n const fsNum = m ? parseFloat(m[1]) : 13;\n const fs = `${fsNum}${unit}`;\n\n const clamp = (n: number, min: number, max: number) =>\n Math.max(min, Math.min(max, n));\n\n const py = clamp(fsNum * 0.4, 2, 10);\n const px = clamp(fsNum * 0.8, 6, 16);\n\n const to = (n: number) => `${Math.round(n * 100) / 100}${unit}`;\n\n return {\n padding: `${to(py)} ${to(px)}`,\n fontSize: fs,\n };\n }\n\n /**\n * Dispatches `chip-removed` and removes the chip from the DOM.\n *\n * @returns {void}\n */\n public removeChip(): void {\n const removeEvent = new CustomEvent<SkyChipRemovedEventDetail>(\"chip-removed\", {\n detail: { label: this.label },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(removeEvent);\n this.remove();\n }\n\n private _slotHasMeaningfulContent(slotEl: HTMLSlotElement): boolean {\n const nodes = slotEl.assignedNodes({ flatten: true });\n return nodes.some((n) =>\n n.nodeType === Node.ELEMENT_NODE\n ? true\n : (n.textContent ?? \"\").trim().length > 0\n );\n }\n\n /** Light DOM check works before the shadow tree exists (first render). */\n private _hasPrefixSlotContent(): boolean {\n if (this.querySelector('[slot=\"prefix\"]')) return true;\n const slot = this.shadowRoot?.querySelector(\n 'slot[name=\"prefix\"]',\n ) as HTMLSlotElement | null;\n return slot ? this._slotHasMeaningfulContent(slot) : false;\n }\n\n private _hasSuffixSlotContent(): boolean {\n if (this.querySelector('[slot=\"suffix\"]')) return true;\n const slot = this.shadowRoot?.querySelector(\n 'slot[name=\"suffix\"]',\n ) as HTMLSlotElement | null;\n return slot ? this._slotHasMeaningfulContent(slot) : false;\n }\n\n private _hasDefaultSlotContent(): boolean {\n for (const n of Array.from(this.childNodes)) {\n if (n.nodeType === Node.ELEMENT_NODE) {\n const slot = (n as Element).getAttribute(\"slot\");\n if (slot === \"prefix\" || slot === \"suffix\") continue;\n return true;\n }\n if ((n.textContent ?? \"\").trim().length > 0) return true;\n }\n const slot = this.shadowRoot?.querySelector(\n \"slot:not([name])\",\n ) as HTMLSlotElement | null;\n return slot ? this._slotHasMeaningfulContent(slot) : false;\n }\n\n private _onSlotChange = (): void => {\n this.requestUpdate();\n };\n\n override render() {\n const sizeDef = this._resolveSize(this.size);\n const chipStyle = {\n padding: sizeDef.padding,\n borderRadius: resolveRadius(this.radius),\n fontSize: sizeDef.fontSize,\n };\n\n return html`\n <div\n class=${classMap({\n chip: true,\n [this.variant]: true,\n loading: this.loading,\n })}\n style=${styleMap(chipStyle)}\n part=\"chip\"\n >\n <slot name=\"prefix\" @slotchange=${this._onSlotChange}></slot>\n ${when(!this._hasPrefixSlotContent() && this.iconL, () => html`\n <sky-icon class=\"icon\" part=\"icon\" icon=\"${this.iconL!}\"></sky-icon>\n `)}\n <slot @slotchange=${this._onSlotChange}></slot>\n ${this._hasDefaultSlotContent() ? nothing : this.label}\n <slot name=\"suffix\" @slotchange=${this._onSlotChange}></slot>\n ${when(!this._hasSuffixSlotContent() && this.iconR, () => html`\n <sky-icon class=\"icon icon-right\" part=\"icon\" icon=\"${this.iconR!}\"></sky-icon>\n `)}\n ${when(this.removable, () => html`\n <button\n class=\"close-button\"\n part=\"close-button\"\n type=\"button\"\n aria-label=\"Remove chip\"\n @click=${this.removeChip}\n >\n <sky-icon icon=\"ion:close\"></sky-icon>\n </button>\n `)}\n ${when(this.loading, () => html`\n <div class=\"loading-overlay\" part=\"loading-overlay\">\n <div class=\"loading-spinner\" part=\"loading-spinner\"></div>\n </div>\n `)}\n </div>\n `;\n }\n}"],"names":["SkyChip","LitElement","constructor","super","arguments","this","label","removable","color","radius","size","iconL","iconR","loading","disabled","variant","preset","_presets","PresetController","_onSlotChange","requestUpdate","updated","bgColor","resolveColor","textColor","isDefaultColorToken","ON_COLOR_FALLBACK_LIGHT","style","setProperty","resolveInkColorForToken","resolveAccentColorForToken","removeProperty","_resolveSize","input","presets","xs","padding","fontSize","sm","md","lg","xl","m","String","trim","match","unit","fsNum","parseFloat","fs","clamp","n","min","max","Math","py","px","to","round","removeChip","removeEvent","CustomEvent","detail","bubbles","composed","dispatchEvent","remove","_slotHasMeaningfulContent","slotEl","assignedNodes","flatten","some","nodeType","Node","ELEMENT_NODE","textContent","length","_hasPrefixSlotContent","querySelector","slot","shadowRoot","_hasSuffixSlotContent","_hasDefaultSlotContent","Array","from","childNodes","getAttribute","render","sizeDef","chipStyle","borderRadius","resolveRadius","html","classMap","chip","styleMap","when","nothing","dependencies","SkyIcon","styles","skyFocusRingHostStyles","css","unsafeCSS","cssOnFillEnhance","selector","fillVar","__decorateClass","property","type","prototype","Boolean","reflect","customElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sky-chip.js","sources":["../../src/sky-chip/sky-chip.ts"],"sourcesContent":["import { LitElement, html, css, nothing, unsafeCSS } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport { when } from \"lit/directives/when.js\";\r\nimport { styleMap } from \"lit/directives/style-map.js\";\r\nimport { classMap } from \"lit/directives/class-map.js\";\r\nimport {\r\n isDefaultColorToken,\r\n resolveAccentColorForToken,\r\n resolveColor,\r\n resolveInkColorForToken,\r\n} from \"../helper/utils/color-resolver\";\r\nimport { cssOnFillEnhance, ON_COLOR_FALLBACK_LIGHT } from \"../helper/utils/contrast-color\";\r\nimport { resolveRadius } from \"../helper/utils/size-resolver\";\r\nimport { PresetController } from \"../helper/controllers/preset-controller\";\r\nimport { SkyIcon } from \"../sky-icon/sky-icon.js\";\r\nimport { skyFocusRingHostStyles } from \"../helper/styles/focus-ring\";\r\n\r\nexport type SkyChipVariant =\r\n | \"solid\"\r\n | \"flat\"\r\n | \"shadow\"\r\n | \"bordered\"\r\n | \"faded\"\r\n | \"light\"\r\n | \"dot\";\r\nexport type SkyChipRemovedEventDetail = { label: string };\r\n\r\n/**\r\n * @element sky-chip\r\n *\r\n * @summary Customizable chip for tags or selections with icon support, removable action, loading state, and visual variants.\r\n *\r\n * @status stable\r\n * @since 1.0.0\r\n *\r\n * @documentation https://sky-ui.com/components/chip\r\n * @dependency sky-icon\r\n *\r\n * @slot - Default slot for the chip label or any other content.\r\n * @slot prefix - Optional prefix content that can be placed before the label.\r\n * @slot suffix - Optional suffix content that can be placed after the label.\r\n *\r\n * @csspart chip - The visual representation of the chip component.\r\n * @csspart icon - The icons displayed within the chip.\r\n * @csspart close-button - The button for removing the chip.\r\n * @csspart loading-spinner - The spinner that appears during loading.\r\n * @csspart error-message - The error message displayed for invalid chips.\r\n *\r\n * @property {string} label - The label displayed on the chip. Default: `\"\"`.\r\n * @property {boolean} removable - Whether the chip can be removed by the user. Default: `false`.\r\n * @property {string} color - The background color of the chip, can accept tokens or custom CSS color. Default: `\"primary\"`.\r\n * @property {string} radius - The border radius of the chip. Default: `\"full\"`.\r\n * @property {string} size - The size of the chip, which affects padding and font size. Default: `\"md\"`.\r\n * @property {string} iconL - Left icon; shown only when the `prefix` slot is empty. Default: `null`.\r\n * @property {string} iconR - Right icon; shown only when the `suffix` slot is empty. Default: `null`.\r\n * @property {boolean} loading - Whether the chip is in a loading state. Default: `false`.\r\n * @property {boolean} disabled - Whether the chip is disabled. Default: `false`.\r\n * @property {SkyChipVariant} variant - Visual style variant. Default: `\"flat\"`.\r\n * @property {string} preset - Named prop preset from nearest `sky-config-provider`. Default: `\"\"`.\r\n * @method removeChip Dispatches `chip-removed` and removes the chip from the DOM.\r\n *\r\n * @fires {CustomEvent<SkyChipRemovedEventDetail>} chip-removed - Fired when the chip is removed by user action.\r\n *\r\n * @Behavior\r\n * - Uses default slot content when present, otherwise falls back to `label`.\r\n * - `iconL` / `iconR` render only when `prefix` / `suffix` slots have no meaningful content.\r\n * - Emits `chip-removed` and removes itself when removable close action is triggered.\r\n * - Resolves color tokens and radius/size presets to CSS values at render time.\r\n *\r\n * @example\r\n * ```html\r\n * <sky-chip label=\"Active Filter\" removable iconl=\"ion:funnel\" variant=\"light\"></sky-chip>\r\n * ```\r\n * ```vue\r\n * <template>\r\n * <sky-chip label=\"Active Filter\" removable iconl=\"ion:funnel\" variant=\"light\"></sky-chip>\r\n * </template>\r\n * ```\r\n * ```jsx\r\n * export default function Demo() {\r\n * return <sky-chip label=\"Active Filter\" removable iconl=\"ion:funnel\" variant=\"light\"></sky-chip>;\r\n * }\r\n * ```\r\n */\r\n@customElement(\"sky-chip\")\r\nexport class SkyChip extends LitElement {\r\n\r\n static dependencies: Record<string, CustomElementConstructor> = {\r\n \"sky-icon\": SkyIcon,\r\n };\r\n\r\n @property({ type: String }) label: string = \"\";\r\n @property({ type: Boolean }) removable: boolean = false;\r\n\r\n /** Accepts preset tokens OR any valid CSS color (e.g., #0af, rgb(), var(--x)) */\r\n @property({ type: String }) color: string = \"primary\";\r\n\r\n /** Radius can be any CSS radius value */\r\n @property({ type: String }) radius: string = \"full\";\r\n\r\n /** Size controls padding + font-size (xs, sm, md, lg, xl or numeric like \"14px\") */\r\n @property({ type: String }) size: string = \"md\";\r\n\r\n @property({ type: String }) iconL: string | null = null;\r\n @property({ type: String }) iconR: string | null = null;\r\n @property({ type: Boolean }) loading: boolean = false;\r\n @property({ type: Boolean, reflect: true }) disabled: boolean = false;\r\n @property({ type: String, reflect: true }) variant: SkyChipVariant = \"flat\";\r\n\r\n /** Named prop preset from nearest `sky-config-provider`. */\r\n @property({ type: String, reflect: true }) preset = \"\";\r\n\r\n private _presets = new PresetController(this);\r\n\r\n static override styles = [\r\n skyFocusRingHostStyles,\r\n css`\r\n :host {\r\n display: inline-block;\r\n font-family: var(--sky-font);\r\n z-index: 1;\r\n --sky-focus-ring-color: var(--chip-bg-color, var(--sky-active-primary));\r\n }\r\n\r\n :host([disabled]) {\r\n pointer-events: none;\r\n opacity: var(--sky-opacity-disabled, 0.6);\r\n }\r\n\r\n .chip {\r\n position: relative;\r\n display: flex;\r\n gap: 2px;\r\n width: max-content;\r\n align-items: center;\r\n border-radius: var(--sky-radius-secondary);\r\n color: var(--chip-text-color);\r\n font-weight: var(--sky-font-weight-medium, 500);\r\n transition: background-color 0.3s ease, color 0.3s ease,\r\n box-shadow 0.2s ease, transform 0.2s ease;\r\n cursor: pointer;\r\n background-color: var(--chip-bg-color);\r\n }\r\n\r\n .close-button {\r\n position: relative;\r\n display: flex;\r\n height: 18px;\r\n width: 18px;\r\n justify-content: center;\r\n font-size: inherit;\r\n align-items: center;\r\n background-color: var(--sky-hover-primary);\r\n backdrop-filter: none;\r\n -webkit-backdrop-filter: none;\r\n border: none;\r\n border-radius: var(--sky-radius-full);\r\n cursor: pointer;\r\n color: var(--sky-text-primary);\r\n transition: color 0.2s ease, background-color 0.2s ease;\r\n }\r\n\r\n .close-button sky-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n line-height: 1;\r\n transition: color 0.3s ease;\r\n }\r\n\r\n :dir(rtl) .close-button {\r\n margin-right: var(--sky-space-1, 5px);\r\n margin-left: unset;\r\n }\r\n\r\n .close-button:hover {\r\n color: var(--sky-danger-primary);\r\n }\r\n\r\n .close-button:focus-visible {\r\n outline: none;\r\n box-shadow: var(--sky-focus-ring);\r\n }\r\n\r\n .close-button:hover sky-icon,\r\n .close-button:focus-visible sky-icon{\r\n color: var(--sky-danger-primary);\r\n outline: none;\r\n }\r\n\r\n .icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: var(--chip-text-color);\r\n }\r\n\r\n sky-icon {\r\n display: inline-block;\r\n width: 1em;\r\n height: 1em;\r\n }\r\n\r\n ::slotted([slot=\"prefix\"]),\r\n ::slotted([slot=\"suffix\"]) {\r\n display: inline-flex;\r\n align-items: center;\r\n }\r\n\r\n .loading-overlay {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: var(--sky-overlay-primary);\r\n border-radius: inherit;\r\n }\r\n\r\n .loading-spinner {\r\n width: 14px;\r\n height: 14px;\r\n border: 2px solid var(--sky-border-light, var(--sky-text-tertiary));\r\n border-top-color: var(--chip-bg-color);\r\n border-radius: var(--sky-radius-full);\r\n animation: spin 0.8s linear infinite;\r\n }\r\n\r\n @keyframes spin {\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .chip,\r\n .close-button,\r\n .close-button sky-icon {\r\n transition: none;\r\n }\r\n .loading-spinner {\r\n animation: none;\r\n }\r\n }\r\n\r\n .chip.bordered {\r\n border: 1px solid var(--chip-ink-color, var(--chip-bg-color));\r\n color: var(--chip-ink-color, var(--chip-bg-color));\r\n background: transparent;\r\n }\r\n\r\n .chip.light {\r\n background: transparent;\r\n color: var(--chip-ink-color, var(--chip-bg-color));\r\n }\r\n\r\n .chip.flat {\r\n box-shadow: none;\r\n background: color-mix(\r\n in srgb,\r\n var(--chip-fill-color, var(--chip-bg-color)) 20%,\r\n transparent\r\n );\r\n color: var(--chip-ink-color, var(--chip-bg-color));\r\n }\r\n\r\n .chip.faded {\r\n background-color: var(--sky-glass-primary);\r\n border: 1px solid var(--sky-text-tertiary);\r\n color: var(--chip-ink-color, var(--chip-bg-color));\r\n }\r\n\r\n .chip.shadow {\r\n box-shadow: var(--sky-box-shadow-primary);\r\n }\r\n\r\n .chip.shadow:hover {\r\n box-shadow: var(--sky-box-shadow-hover);\r\n }\r\n\r\n .chip.faded .icon,\r\n .chip.flat .icon,\r\n .chip.light .icon,\r\n .chip.dot .icon,\r\n .chip.bordered .icon {\r\n color: var(--chip-ink-color, var(--chip-bg-color));\r\n }\r\n\r\n .chip.dot {\r\n padding-left: var(--sky-space-5, 20px) !important;\r\n position: relative;\r\n background-color: transparent;\r\n border: 1px solid var(--sky-text-tertiary);\r\n color: var(--sky-text-primary);\r\n }\r\n\r\n .chip.dot::before {\r\n content: \"\";\r\n position: absolute;\r\n left: var(--sky-space-1\\\\.5, 6px);\r\n top: 50%;\r\n transform: translateY(-50%);\r\n width: var(--sky-space-2, 8px);\r\n height: var(--sky-space-2, 8px);\r\n border-radius: var(--sky-radius-full);\r\n background-color: var(--chip-accent-color, var(--chip-bg-color));\r\n }\r\n\r\n /* Solid / shadow chips: enhance label + icon FG against fill. */\r\n ${unsafeCSS(\r\n cssOnFillEnhance([\r\n {\r\n selector: \".chip.solid, .chip.shadow\",\r\n fillVar: \"--chip-bg-color\",\r\n },\r\n {\r\n selector: \".chip.solid .icon, .chip.shadow .icon\",\r\n fillVar: \"--chip-bg-color\",\r\n },\r\n ]),\r\n )}\r\n `,\r\n ];\r\n\r\n /** Updates host CSS variables from current color token/value. */\r\n protected override updated(): void {\r\n const bgColor = resolveColor(this.color);\r\n const textColor = isDefaultColorToken(this.color)\r\n ? \"var(--sky-text-primary)\"\r\n : ON_COLOR_FALLBACK_LIGHT;\r\n\r\n this.style.setProperty(\"--chip-bg-color\", bgColor);\r\n this.style.setProperty(\"--chip-text-color\", textColor);\r\n\r\n if (isDefaultColorToken(this.color)) {\r\n this.style.setProperty(\"--chip-ink-color\", resolveInkColorForToken(this.color));\r\n this.style.setProperty(\r\n \"--chip-accent-color\",\r\n resolveAccentColorForToken(this.color),\r\n );\r\n this.style.setProperty(\"--chip-fill-color\", \"var(--sky-hover-tertiary)\");\r\n } else {\r\n this.style.removeProperty(\"--chip-ink-color\");\r\n this.style.removeProperty(\"--chip-accent-color\");\r\n this.style.removeProperty(\"--chip-fill-color\");\r\n }\r\n }\r\n\r\n /** Size resolver similar to button: controls padding + font-size */\r\n private _resolveSize(\r\n input: string\r\n ): {\r\n padding: string;\r\n fontSize: string;\r\n } {\r\n const presets: Record<string, { padding: string; fontSize: string }> = {\r\n xs: { padding: \"2px 4px\", fontSize: \"11px\" },\r\n sm: { padding: \"3px 6px\", fontSize: \"12px\" },\r\n md: { padding: \"4px 8px\", fontSize: \"13px\" },\r\n lg: { padding: \"5px 10px\", fontSize: \"14px\" },\r\n xl: { padding: \"6px 12px\", fontSize: \"15px\" },\r\n };\r\n\r\n if (presets[input]) return presets[input];\r\n\r\n const m = String(input).trim().match(/^([\\d.]+)(px|rem|em)?$/i);\r\n const unit = m?.[2] || \"px\";\r\n const fsNum = m ? parseFloat(m[1]) : 13;\r\n const fs = `${fsNum}${unit}`;\r\n\r\n const clamp = (n: number, min: number, max: number) =>\r\n Math.max(min, Math.min(max, n));\r\n\r\n const py = clamp(fsNum * 0.4, 2, 10);\r\n const px = clamp(fsNum * 0.8, 6, 16);\r\n\r\n const to = (n: number) => `${Math.round(n * 100) / 100}${unit}`;\r\n\r\n return {\r\n padding: `${to(py)} ${to(px)}`,\r\n fontSize: fs,\r\n };\r\n }\r\n\r\n /**\r\n * Dispatches `chip-removed` and removes the chip from the DOM.\r\n *\r\n * @returns {void}\r\n */\r\n public removeChip(): void {\r\n const removeEvent = new CustomEvent<SkyChipRemovedEventDetail>(\"chip-removed\", {\r\n detail: { label: this.label },\r\n bubbles: true,\r\n composed: true,\r\n });\r\n this.dispatchEvent(removeEvent);\r\n this.remove();\r\n }\r\n\r\n private _slotHasMeaningfulContent(slotEl: HTMLSlotElement): boolean {\r\n const nodes = slotEl.assignedNodes({ flatten: true });\r\n return nodes.some((n) =>\r\n n.nodeType === Node.ELEMENT_NODE\r\n ? true\r\n : (n.textContent ?? \"\").trim().length > 0\r\n );\r\n }\r\n\r\n /** Light DOM check works before the shadow tree exists (first render). */\r\n private _hasPrefixSlotContent(): boolean {\r\n if (this.querySelector('[slot=\"prefix\"]')) return true;\r\n const slot = this.shadowRoot?.querySelector(\r\n 'slot[name=\"prefix\"]',\r\n ) as HTMLSlotElement | null;\r\n return slot ? this._slotHasMeaningfulContent(slot) : false;\r\n }\r\n\r\n private _hasSuffixSlotContent(): boolean {\r\n if (this.querySelector('[slot=\"suffix\"]')) return true;\r\n const slot = this.shadowRoot?.querySelector(\r\n 'slot[name=\"suffix\"]',\r\n ) as HTMLSlotElement | null;\r\n return slot ? this._slotHasMeaningfulContent(slot) : false;\r\n }\r\n\r\n private _hasDefaultSlotContent(): boolean {\r\n for (const n of Array.from(this.childNodes)) {\r\n if (n.nodeType === Node.ELEMENT_NODE) {\r\n const slot = (n as Element).getAttribute(\"slot\");\r\n if (slot === \"prefix\" || slot === \"suffix\") continue;\r\n return true;\r\n }\r\n if ((n.textContent ?? \"\").trim().length > 0) return true;\r\n }\r\n const slot = this.shadowRoot?.querySelector(\r\n \"slot:not([name])\",\r\n ) as HTMLSlotElement | null;\r\n return slot ? this._slotHasMeaningfulContent(slot) : false;\r\n }\r\n\r\n private _onSlotChange = (): void => {\r\n this.requestUpdate();\r\n };\r\n\r\n override render() {\r\n const sizeDef = this._resolveSize(this.size);\r\n const chipStyle = {\r\n padding: sizeDef.padding,\r\n borderRadius: resolveRadius(this.radius),\r\n fontSize: sizeDef.fontSize,\r\n };\r\n\r\n return html`\r\n <div\r\n class=${classMap({\r\n chip: true,\r\n [this.variant]: true,\r\n loading: this.loading,\r\n })}\r\n style=${styleMap(chipStyle)}\r\n part=\"chip\"\r\n >\r\n <slot name=\"prefix\" @slotchange=${this._onSlotChange}></slot>\r\n ${when(!this._hasPrefixSlotContent() && this.iconL, () => html`\r\n <sky-icon class=\"icon\" part=\"icon\" icon=\"${this.iconL!}\"></sky-icon>\r\n `)}\r\n <slot @slotchange=${this._onSlotChange}></slot>\r\n ${this._hasDefaultSlotContent() ? nothing : this.label}\r\n <slot name=\"suffix\" @slotchange=${this._onSlotChange}></slot>\r\n ${when(!this._hasSuffixSlotContent() && this.iconR, () => html`\r\n <sky-icon class=\"icon icon-right\" part=\"icon\" icon=\"${this.iconR!}\"></sky-icon>\r\n `)}\r\n ${when(this.removable, () => html`\r\n <button\r\n class=\"close-button\"\r\n part=\"close-button\"\r\n type=\"button\"\r\n aria-label=\"Remove chip\"\r\n @click=${this.removeChip}\r\n >\r\n <sky-icon icon=\"ion:close\"></sky-icon>\r\n </button>\r\n `)}\r\n ${when(this.loading, () => html`\r\n <div class=\"loading-overlay\" part=\"loading-overlay\">\r\n <div class=\"loading-spinner\" part=\"loading-spinner\"></div>\r\n </div>\r\n `)}\r\n </div>\r\n `;\r\n }\r\n}"],"names":["SkyChip","LitElement","constructor","super","arguments","this","label","removable","color","radius","size","iconL","iconR","loading","disabled","variant","preset","_presets","PresetController","_onSlotChange","requestUpdate","updated","bgColor","resolveColor","textColor","isDefaultColorToken","ON_COLOR_FALLBACK_LIGHT","style","setProperty","resolveInkColorForToken","resolveAccentColorForToken","removeProperty","_resolveSize","input","presets","xs","padding","fontSize","sm","md","lg","xl","m","String","trim","match","unit","fsNum","parseFloat","fs","clamp","n","min","max","Math","py","px","to","round","removeChip","removeEvent","CustomEvent","detail","bubbles","composed","dispatchEvent","remove","_slotHasMeaningfulContent","slotEl","assignedNodes","flatten","some","nodeType","Node","ELEMENT_NODE","textContent","length","_hasPrefixSlotContent","querySelector","slot","shadowRoot","_hasSuffixSlotContent","_hasDefaultSlotContent","Array","from","childNodes","getAttribute","render","sizeDef","chipStyle","borderRadius","resolveRadius","html","classMap","chip","styleMap","when","nothing","dependencies","SkyIcon","styles","skyFocusRingHostStyles","css","unsafeCSS","cssOnFillEnhance","selector","fillVar","__decorateClass","property","type","prototype","Boolean","reflect","customElement"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sky-col.js","sources":["../../src/sky-col/sky-col.ts"],"sourcesContent":["import { customElement, property } from \"lit/decorators.js\";\r\nimport { when } from \"lit/directives/when.js\";\r\nimport { LitElement, html, css } from \"lit\";\r\nimport { PresetController } from \"../helper/controllers/preset-controller\";\n\r\nexport type SkyColAlign = \"stretch\" | \"start\" | \"center\" | \"end\" | \"baseline\";\r\nexport type SkyColJustify =\r\n | \"start\"\r\n | \"center\"\r\n | \"end\"\r\n | \"space-between\"\r\n | \"space-around\"\r\n | \"space-evenly\";\r\n\r\n/**\r\n * @element sky-col\r\n *\r\n * @summary Grid/flex column helper with responsive spans and configurable alignment/justification.\r\n *\r\n * @status stable\r\n * @since 1.0.0\r\n *\r\n * @documentation https://sky-ui.com/components/grid\r\n *\r\n * @slot title - Optional title content shown before main content.\r\n * @slot - Default content for the column body.\r\n *\r\n * @csspart col - The column container.\r\n *\r\n * @property {number} span - Default column span.\r\n * @property {string} gap - Internal content gap CSS value.\r\n * @property {SkyColJustify} justify - Content justification within the column.\r\n * @property {SkyColAlign} align - Content alignment within the column.\r\n * @property {number | undefined} start - Optional explicit grid column start.\r\n * @property {number | undefined} end - Optional explicit grid column end.\r\n * @property {number | undefined} sm - Responsive span for small breakpoint.\r\n * @property {number | undefined} md - Responsive span for medium breakpoint.\r\n * @property {number | undefined} lg - Responsive span for large breakpoint.\r\n * @property {number | undefined} xl - Responsive span for extra-large breakpoint.\r\n * @property {string} preset - Named prop preset from nearest `sky-config-provider`. Default: `\"\"`.\n * @method refreshLayout Reapplies internal CSS variables from current properties.\r\n *\r\n * @Behavior\r\n * - Applies span and responsive spans through host CSS variables.\r\n * - Supports explicit `start`/`end` grid positioning when provided.\r\n * - Automatically updates layout variables when relevant properties change.\r\n *\r\n * @example\r\n * ```html\r\n * <sky-col span=\"4\" md=\"6\" justify=\"space-between\" align=\"center\">\r\n * <span slot=\"title\">Revenue</span>\r\n * Q2 performance details\r\n * </sky-col>\r\n * ```\r\n * ```vue\r\n * <template>\r\n * <sky-col span=\"4\" md=\"6\" justify=\"space-between\" align=\"center\">\r\n * <span slot=\"title\">Revenue</span>\r\n * Q2 performance details\r\n * </sky-col>\r\n * </template>\r\n * ```\r\n * ```jsx\r\n * export default function Demo() {\r\n * return (\r\n * <sky-col span=\"4\" md=\"6\" justify=\"space-between\" align=\"center\">\r\n * <span slot=\"title\">Revenue</span>\r\n * Q2 performance details\r\n * </sky-col>\r\n * );\r\n * }\r\n * ```\r\n */\r\n@customElement(\"sky-col\")\r\nexport class SkyCol extends LitElement {\r\n @property({ type: Number }) span = 1;\r\n @property({ type: String }) gap = \"0\";\r\n @property({ type: String }) justify: SkyColJustify = \"center\";\r\n @property({ type: String }) align: SkyColAlign = \"stretch\";\r\n\r\n @property({ type: Number }) start?: number;\r\n @property({ type: Number }) end?: number;\r\n\r\n @property({ type: Number }) sm?: number;\r\n @property({ type: Number }) md?: number;\r\n @property({ type: Number }) lg?: number;\r\n @property({ type: Number }) xl?: number;\r\n\r\n\n /** Named prop preset from nearest `sky-config-provider`. */\n @property({ type: String, reflect: true }) preset = \"\";\n\n private _presets = new PresetController(this);\n\n static override styles = css`\r\n :host {\r\n display: contents;\r\n }\r\n\r\n .col {\r\n display: flex;\r\n flex-direction: column;\r\n grid-column: span var(--col-span, 1);\r\n gap: var(--col-gap, 0);\r\n align-items: var(--col-align, stretch);\r\n justify-content: var(--col-justify, center);\r\n }\r\n\r\n ::slotted([slot=\"title\"]) {\r\n font-weight: bold;\r\n margin-bottom: 0.5rem;\r\n }\r\n\r\n @media (max-width: 768px) {\r\n .col {\r\n grid-column: span var(--col-span-sm, var(--col-span, 1));\r\n }\r\n }\r\n @media (max-width: 992px) {\r\n .col {\r\n grid-column: span var(--col-span-md, var(--col-span, 1));\r\n }\r\n }\r\n @media (max-width: 1200px) {\r\n .col {\r\n grid-column: span var(--col-span-lg, var(--col-span, 1));\r\n }\r\n }\r\n @media (min-width: 1201px) {\r\n .col {\r\n grid-column: span var(--col-span-xl, var(--col-span, var(--col-span, 1)));\r\n }\r\n }\r\n `;\r\n\r\n override firstUpdated(): void {\r\n this.syncVars();\r\n }\r\n\r\n override updated(changed: Map<string | number | symbol, unknown>): void {\r\n if (\r\n changed.has(\"span\") ||\r\n changed.has(\"gap\") ||\r\n changed.has(\"justify\") ||\r\n changed.has(\"align\") ||\r\n changed.has(\"sm\") ||\r\n changed.has(\"md\") ||\r\n changed.has(\"lg\") ||\r\n changed.has(\"xl\") ||\r\n changed.has(\"start\") ||\r\n changed.has(\"end\")\r\n ) {\r\n this.syncVars();\r\n }\r\n }\r\n\r\n /**\r\n * Reapplies internal CSS variables from current properties.\r\n *\r\n * @returns {void}\r\n */\r\n public refreshLayout(): void {\r\n this.syncVars();\r\n }\r\n\r\n private syncVars(): void {\r\n this.style.setProperty(\"--col-span\", String(this.span));\r\n this.style.setProperty(\"--col-gap\", this.gap);\r\n this.style.setProperty(\"--col-justify\", this.justify);\r\n this.style.setProperty(\"--col-align\", this.align);\r\n\r\n if (this.sm) this.style.setProperty(\"--col-span-sm\", String(this.sm));\r\n if (this.md) this.style.setProperty(\"--col-span-md\", String(this.md));\r\n if (this.lg) this.style.setProperty(\"--col-span-lg\", String(this.lg));\r\n if (this.xl) this.style.setProperty(\"--col-span-xl\", String(this.xl));\r\n\r\n if (this.start) this.style.setProperty(\"--col-start\", String(this.start));\r\n if (this.end) this.style.setProperty(\"--col-end\", String(this.end));\r\n }\r\n\r\n override render() {\r\n const gridStyle =\r\n this.start || this.end\r\n ? `grid-column: ${this.start ?? \"auto\"} / ${this.end ?? \"auto\"};`\r\n : \"\";\r\n\r\n return html`\r\n <div class=\"col\" style=${when(this.start || this.end, () => gridStyle, () => \"\")} part=\"col\">\r\n <slot name=\"title\"></slot>\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}"],"names":["SkyCol","LitElement","constructor","super","arguments","this","span","gap","justify","align","preset","_presets","PresetController","firstUpdated","syncVars","updated","changed","has","refreshLayout","style","setProperty","String","sm","md","lg","xl","start","end","render","gridStyle","html","when","styles","css","__decorateClass","property","type","Number","prototype","reflect","customElement"],"mappings":"gbA0EO,IAAMA,EAAN,cAAqBC,EAArB,WAAAC,GAAAC,SAAAC,WACuBC,KAAAC,KAAO,EACPD,KAAAE,IAAM,IACNF,KAAAG,QAAyB,SACzBH,KAAAI,MAAqB,UAYNJ,KAAAK,OAAS,GAEpDL,KAAQM,SAAW,IAAIC,EAAiBP,KAAI,CA2CnC,YAAAQ,GACPR,KAAKS,UACP,CAES,OAAAC,CAAQC,IAEbA,EAAQC,IAAI,SACZD,EAAQC,IAAI,QACZD,EAAQC,IAAI,YACZD,EAAQC,IAAI,UACZD,EAAQC,IAAI,OACZD,EAAQC,IAAI,OACZD,EAAQC,IAAI,OACZD,EAAQC,IAAI,OACZD,EAAQC,IAAI,UACZD,EAAQC,IAAI,SAEZZ,KAAKS,UAET,CAOO,aAAAI,GACLb,KAAKS,UACP,CAEQ,QAAAA,GACNT,KAAKc,MAAMC,YAAY,aAAcC,OAAOhB,KAAKC,OACjDD,KAAKc,MAAMC,YAAY,YAAaf,KAAKE,KACzCF,KAAKc,MAAMC,YAAY,gBAAiBf,KAAKG,SAC7CH,KAAKc,MAAMC,YAAY,cAAef,KAAKI,OAEvCJ,KAAKiB,IAAIjB,KAAKc,MAAMC,YAAY,gBAAiBC,OAAOhB,KAAKiB,KAC7DjB,KAAKkB,IAAIlB,KAAKc,MAAMC,YAAY,gBAAiBC,OAAOhB,KAAKkB,KAC7DlB,KAAKmB,IAAInB,KAAKc,MAAMC,YAAY,gBAAiBC,OAAOhB,KAAKmB,KAC7DnB,KAAKoB,IAAIpB,KAAKc,MAAMC,YAAY,gBAAiBC,OAAOhB,KAAKoB,KAE7DpB,KAAKqB,OAAOrB,KAAKc,MAAMC,YAAY,cAAeC,OAAOhB,KAAKqB,QAC9DrB,KAAKsB,KAAKtB,KAAKc,MAAMC,YAAY,YAAaC,OAAOhB,KAAKsB,KAChE,CAES,MAAAC,GACP,MAAMC,EACJxB,KAAKqB,OAASrB,KAAKsB,IACf,gBAAgBtB,KAAKqB,OAAS,YAAYrB,KAAKsB,KAAO,UACtD,GAEN,OAAOG,CAAA;+BACoBC,EAAK1B,KAAKqB,OAASrB,KAAKsB,IAAK,IAAME,EAAW,IAAM;;;;KAKjF,GAtHW7B,EAoBKgC,OAASC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAnBGC,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UADPrC,EACiBsC,UAAA,OAAA,GACAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMf,UAFPrB,EAEiBsC,UAAA,MAAA,GACAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMf,UAHPrB,EAGiBsC,UAAA,UAAA,GACAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMf,UAJPrB,EAIiBsC,UAAA,QAAA,GAEAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UANPrC,EAMiBsC,UAAA,QAAA,GACAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UAPPrC,EAOiBsC,UAAA,MAAA,GAEAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UATPrC,EASiBsC,UAAA,KAAA,GACAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UAVPrC,EAUiBsC,UAAA,KAAA,GACAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UAXPrC,EAWiBsC,UAAA,KAAA,GACAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UAZPrC,EAYiBsC,UAAA,KAAA,GAIeJ,EAAA,CAA1CC,EAAS,CAAEC,KAAMf,OAAQkB,SAAS,KAhBxBvC,EAgBgCsC,UAAA,SAAA,GAhBhCtC,EAANkC,EAAA,CADNM,EAAc,YACFxC"}
|
|
1
|
+
{"version":3,"file":"sky-col.js","sources":["../../src/sky-col/sky-col.ts"],"sourcesContent":["import { customElement, property } from \"lit/decorators.js\";\r\nimport { when } from \"lit/directives/when.js\";\r\nimport { LitElement, html, css } from \"lit\";\r\nimport { PresetController } from \"../helper/controllers/preset-controller\";\r\n\r\nexport type SkyColAlign = \"stretch\" | \"start\" | \"center\" | \"end\" | \"baseline\";\r\nexport type SkyColJustify =\r\n | \"start\"\r\n | \"center\"\r\n | \"end\"\r\n | \"space-between\"\r\n | \"space-around\"\r\n | \"space-evenly\";\r\n\r\n/**\r\n * @element sky-col\r\n *\r\n * @summary Grid/flex column helper with responsive spans and configurable alignment/justification.\r\n *\r\n * @status stable\r\n * @since 1.0.0\r\n *\r\n * @documentation https://sky-ui.com/components/grid\r\n *\r\n * @slot title - Optional title content shown before main content.\r\n * @slot - Default content for the column body.\r\n *\r\n * @csspart col - The column container.\r\n *\r\n * @property {number} span - Default column span.\r\n * @property {string} gap - Internal content gap CSS value.\r\n * @property {SkyColJustify} justify - Content justification within the column.\r\n * @property {SkyColAlign} align - Content alignment within the column.\r\n * @property {number | undefined} start - Optional explicit grid column start.\r\n * @property {number | undefined} end - Optional explicit grid column end.\r\n * @property {number | undefined} sm - Responsive span for small breakpoint.\r\n * @property {number | undefined} md - Responsive span for medium breakpoint.\r\n * @property {number | undefined} lg - Responsive span for large breakpoint.\r\n * @property {number | undefined} xl - Responsive span for extra-large breakpoint.\r\n * @property {string} preset - Named prop preset from nearest `sky-config-provider`. Default: `\"\"`.\r\n * @method refreshLayout Reapplies internal CSS variables from current properties.\r\n *\r\n * @Behavior\r\n * - Applies span and responsive spans through host CSS variables.\r\n * - Supports explicit `start`/`end` grid positioning when provided.\r\n * - Automatically updates layout variables when relevant properties change.\r\n *\r\n * @example\r\n * ```html\r\n * <sky-col span=\"4\" md=\"6\" justify=\"space-between\" align=\"center\">\r\n * <span slot=\"title\">Revenue</span>\r\n * Q2 performance details\r\n * </sky-col>\r\n * ```\r\n * ```vue\r\n * <template>\r\n * <sky-col span=\"4\" md=\"6\" justify=\"space-between\" align=\"center\">\r\n * <span slot=\"title\">Revenue</span>\r\n * Q2 performance details\r\n * </sky-col>\r\n * </template>\r\n * ```\r\n * ```jsx\r\n * export default function Demo() {\r\n * return (\r\n * <sky-col span=\"4\" md=\"6\" justify=\"space-between\" align=\"center\">\r\n * <span slot=\"title\">Revenue</span>\r\n * Q2 performance details\r\n * </sky-col>\r\n * );\r\n * }\r\n * ```\r\n */\r\n@customElement(\"sky-col\")\r\nexport class SkyCol extends LitElement {\r\n @property({ type: Number }) span = 1;\r\n @property({ type: String }) gap = \"0\";\r\n @property({ type: String }) justify: SkyColJustify = \"center\";\r\n @property({ type: String }) align: SkyColAlign = \"stretch\";\r\n\r\n @property({ type: Number }) start?: number;\r\n @property({ type: Number }) end?: number;\r\n\r\n @property({ type: Number }) sm?: number;\r\n @property({ type: Number }) md?: number;\r\n @property({ type: Number }) lg?: number;\r\n @property({ type: Number }) xl?: number;\r\n\r\n\r\n /** Named prop preset from nearest `sky-config-provider`. */\r\n @property({ type: String, reflect: true }) preset = \"\";\r\n\r\n private _presets = new PresetController(this);\r\n\r\n static override styles = css`\r\n :host {\r\n display: contents;\r\n }\r\n\r\n .col {\r\n display: flex;\r\n flex-direction: column;\r\n grid-column: span var(--col-span, 1);\r\n gap: var(--col-gap, 0);\r\n align-items: var(--col-align, stretch);\r\n justify-content: var(--col-justify, center);\r\n }\r\n\r\n ::slotted([slot=\"title\"]) {\r\n font-weight: bold;\r\n margin-bottom: 0.5rem;\r\n }\r\n\r\n @media (max-width: 768px) {\r\n .col {\r\n grid-column: span var(--col-span-sm, var(--col-span, 1));\r\n }\r\n }\r\n @media (max-width: 992px) {\r\n .col {\r\n grid-column: span var(--col-span-md, var(--col-span, 1));\r\n }\r\n }\r\n @media (max-width: 1200px) {\r\n .col {\r\n grid-column: span var(--col-span-lg, var(--col-span, 1));\r\n }\r\n }\r\n @media (min-width: 1201px) {\r\n .col {\r\n grid-column: span var(--col-span-xl, var(--col-span, var(--col-span, 1)));\r\n }\r\n }\r\n `;\r\n\r\n override firstUpdated(): void {\r\n this.syncVars();\r\n }\r\n\r\n override updated(changed: Map<string | number | symbol, unknown>): void {\r\n if (\r\n changed.has(\"span\") ||\r\n changed.has(\"gap\") ||\r\n changed.has(\"justify\") ||\r\n changed.has(\"align\") ||\r\n changed.has(\"sm\") ||\r\n changed.has(\"md\") ||\r\n changed.has(\"lg\") ||\r\n changed.has(\"xl\") ||\r\n changed.has(\"start\") ||\r\n changed.has(\"end\")\r\n ) {\r\n this.syncVars();\r\n }\r\n }\r\n\r\n /**\r\n * Reapplies internal CSS variables from current properties.\r\n *\r\n * @returns {void}\r\n */\r\n public refreshLayout(): void {\r\n this.syncVars();\r\n }\r\n\r\n private syncVars(): void {\r\n this.style.setProperty(\"--col-span\", String(this.span));\r\n this.style.setProperty(\"--col-gap\", this.gap);\r\n this.style.setProperty(\"--col-justify\", this.justify);\r\n this.style.setProperty(\"--col-align\", this.align);\r\n\r\n if (this.sm) this.style.setProperty(\"--col-span-sm\", String(this.sm));\r\n if (this.md) this.style.setProperty(\"--col-span-md\", String(this.md));\r\n if (this.lg) this.style.setProperty(\"--col-span-lg\", String(this.lg));\r\n if (this.xl) this.style.setProperty(\"--col-span-xl\", String(this.xl));\r\n\r\n if (this.start) this.style.setProperty(\"--col-start\", String(this.start));\r\n if (this.end) this.style.setProperty(\"--col-end\", String(this.end));\r\n }\r\n\r\n override render() {\r\n const gridStyle =\r\n this.start || this.end\r\n ? `grid-column: ${this.start ?? \"auto\"} / ${this.end ?? \"auto\"};`\r\n : \"\";\r\n\r\n return html`\r\n <div class=\"col\" style=${when(this.start || this.end, () => gridStyle, () => \"\")} part=\"col\">\r\n <slot name=\"title\"></slot>\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}"],"names":["SkyCol","LitElement","constructor","super","arguments","this","span","gap","justify","align","preset","_presets","PresetController","firstUpdated","syncVars","updated","changed","has","refreshLayout","style","setProperty","String","sm","md","lg","xl","start","end","render","gridStyle","html","when","styles","css","__decorateClass","property","type","Number","prototype","reflect","customElement"],"mappings":"gbA0EO,IAAMA,EAAN,cAAqBC,EAArB,WAAAC,GAAAC,SAAAC,WACuBC,KAAAC,KAAO,EACPD,KAAAE,IAAM,IACNF,KAAAG,QAAyB,SACzBH,KAAAI,MAAqB,UAYNJ,KAAAK,OAAS,GAEpDL,KAAQM,SAAW,IAAIC,EAAiBP,KAAI,CA2CnC,YAAAQ,GACPR,KAAKS,UACP,CAES,OAAAC,CAAQC,IAEbA,EAAQC,IAAI,SACZD,EAAQC,IAAI,QACZD,EAAQC,IAAI,YACZD,EAAQC,IAAI,UACZD,EAAQC,IAAI,OACZD,EAAQC,IAAI,OACZD,EAAQC,IAAI,OACZD,EAAQC,IAAI,OACZD,EAAQC,IAAI,UACZD,EAAQC,IAAI,SAEZZ,KAAKS,UAET,CAOO,aAAAI,GACLb,KAAKS,UACP,CAEQ,QAAAA,GACNT,KAAKc,MAAMC,YAAY,aAAcC,OAAOhB,KAAKC,OACjDD,KAAKc,MAAMC,YAAY,YAAaf,KAAKE,KACzCF,KAAKc,MAAMC,YAAY,gBAAiBf,KAAKG,SAC7CH,KAAKc,MAAMC,YAAY,cAAef,KAAKI,OAEvCJ,KAAKiB,IAAIjB,KAAKc,MAAMC,YAAY,gBAAiBC,OAAOhB,KAAKiB,KAC7DjB,KAAKkB,IAAIlB,KAAKc,MAAMC,YAAY,gBAAiBC,OAAOhB,KAAKkB,KAC7DlB,KAAKmB,IAAInB,KAAKc,MAAMC,YAAY,gBAAiBC,OAAOhB,KAAKmB,KAC7DnB,KAAKoB,IAAIpB,KAAKc,MAAMC,YAAY,gBAAiBC,OAAOhB,KAAKoB,KAE7DpB,KAAKqB,OAAOrB,KAAKc,MAAMC,YAAY,cAAeC,OAAOhB,KAAKqB,QAC9DrB,KAAKsB,KAAKtB,KAAKc,MAAMC,YAAY,YAAaC,OAAOhB,KAAKsB,KAChE,CAES,MAAAC,GACP,MAAMC,EACJxB,KAAKqB,OAASrB,KAAKsB,IACf,gBAAgBtB,KAAKqB,OAAS,YAAYrB,KAAKsB,KAAO,UACtD,GAEN,OAAOG,CAAA;+BACoBC,EAAK1B,KAAKqB,OAASrB,KAAKsB,IAAK,IAAME,EAAW,IAAM;;;;KAKjF,GAtHW7B,EAoBKgC,OAASC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAnBGC,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UADPrC,EACiBsC,UAAA,OAAA,GACAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMf,UAFPrB,EAEiBsC,UAAA,MAAA,GACAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMf,UAHPrB,EAGiBsC,UAAA,UAAA,GACAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMf,UAJPrB,EAIiBsC,UAAA,QAAA,GAEAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UANPrC,EAMiBsC,UAAA,QAAA,GACAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UAPPrC,EAOiBsC,UAAA,MAAA,GAEAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UATPrC,EASiBsC,UAAA,KAAA,GACAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UAVPrC,EAUiBsC,UAAA,KAAA,GACAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UAXPrC,EAWiBsC,UAAA,KAAA,GACAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UAZPrC,EAYiBsC,UAAA,KAAA,GAIeJ,EAAA,CAA1CC,EAAS,CAAEC,KAAMf,OAAQkB,SAAS,KAhBxBvC,EAgBgCsC,UAAA,SAAA,GAhBhCtC,EAANkC,EAAA,CADNM,EAAc,YACFxC"}
|