@sky.ui/core 0.0.38 → 0.0.40

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.
Files changed (94) hide show
  1. package/dist/custom-elements.json +2399 -2312
  2. package/dist/helper/controllers/animation-controller.d.ts +4 -4
  3. package/dist/helper/controllers/animation-controller.js.map +1 -1
  4. package/dist/helper/controllers/popover-controller.d.ts +11 -11
  5. package/dist/helper/controllers/popover-controller.js.map +1 -1
  6. package/dist/helper/iconify-offline.js.map +1 -1
  7. package/dist/helper/index.js +1 -1
  8. package/dist/helper/internals/form-control-base.d.ts +4 -4
  9. package/dist/helper/internals/form-control-base.js.map +1 -1
  10. package/dist/helper/utils/color-resolver.d.ts +9 -1
  11. package/dist/helper/utils/color-resolver.js +1 -1
  12. package/dist/helper/utils/color-resolver.js.map +1 -1
  13. package/dist/helper/utils/contrast-color.d.ts +128 -0
  14. package/dist/helper/utils/contrast-color.js +2 -0
  15. package/dist/helper/utils/contrast-color.js.map +1 -0
  16. package/dist/helper/utils/index.d.ts +1 -0
  17. package/dist/helper/utils/index.js +1 -1
  18. package/dist/helper/utils/size-resolver.js.map +1 -1
  19. package/dist/index.js +1 -1
  20. package/dist/sky-alert/sky-alert.d.ts +5 -5
  21. package/dist/sky-alert/sky-alert.js +28 -16
  22. package/dist/sky-alert/sky-alert.js.map +1 -1
  23. package/dist/sky-appbar/sky-appbar.d.ts +2 -2
  24. package/dist/sky-appbar/sky-appbar.js +20 -27
  25. package/dist/sky-appbar/sky-appbar.js.map +1 -1
  26. package/dist/sky-avatar/sky-avatar.d.ts +3 -3
  27. package/dist/sky-avatar/sky-avatar.js +8 -11
  28. package/dist/sky-avatar/sky-avatar.js.map +1 -1
  29. package/dist/sky-badge/sky-badge.d.ts +5 -5
  30. package/dist/sky-badge/sky-badge.js +22 -14
  31. package/dist/sky-badge/sky-badge.js.map +1 -1
  32. package/dist/sky-button/sky-button.d.ts +5 -5
  33. package/dist/sky-button/sky-button.js +38 -26
  34. package/dist/sky-button/sky-button.js.map +1 -1
  35. package/dist/sky-card/sky-card.d.ts +5 -5
  36. package/dist/sky-card/sky-card.js +20 -20
  37. package/dist/sky-card/sky-card.js.map +1 -1
  38. package/dist/sky-checkbox/sky-checkbox.d.ts +2 -2
  39. package/dist/sky-checkbox/sky-checkbox.js +78 -68
  40. package/dist/sky-checkbox/sky-checkbox.js.map +1 -1
  41. package/dist/sky-chip/sky-chip.d.ts +3 -3
  42. package/dist/sky-chip/sky-chip.js +48 -36
  43. package/dist/sky-chip/sky-chip.js.map +1 -1
  44. package/dist/sky-col/sky-col.d.ts +4 -4
  45. package/dist/sky-col/sky-col.js +8 -3
  46. package/dist/sky-col/sky-col.js.map +1 -1
  47. package/dist/sky-combobox/sky-combobox.d.ts +22 -9
  48. package/dist/sky-combobox/sky-combobox.js +792 -336
  49. package/dist/sky-combobox/sky-combobox.js.map +1 -1
  50. package/dist/sky-dialog/sky-dialog.d.ts +4 -4
  51. package/dist/sky-dialog/sky-dialog.js +17 -19
  52. package/dist/sky-dialog/sky-dialog.js.map +1 -1
  53. package/dist/sky-divider/sky-divider.d.ts +3 -3
  54. package/dist/sky-divider/sky-divider.js.map +1 -1
  55. package/dist/sky-flexbox/sky-flexbox.d.ts +7 -7
  56. package/dist/sky-flexbox/sky-flexbox.js +2 -2
  57. package/dist/sky-flexbox/sky-flexbox.js.map +1 -1
  58. package/dist/sky-flexcol/sky-flexcol.d.ts +3 -3
  59. package/dist/sky-flexcol/sky-flexcol.js.map +1 -1
  60. package/dist/sky-form/sky-form.d.ts +12 -12
  61. package/dist/sky-form/sky-form.js +12 -12
  62. package/dist/sky-form/sky-form.js.map +1 -1
  63. package/dist/sky-grid/sky-grid.d.ts +2 -2
  64. package/dist/sky-grid/sky-grid.js.map +1 -1
  65. package/dist/sky-icon/sky-icon.d.ts +1 -1
  66. package/dist/sky-icon/sky-icon.js +1 -1
  67. package/dist/sky-icon/sky-icon.js.map +1 -1
  68. package/dist/sky-image/sky-image.d.ts +5 -5
  69. package/dist/sky-image/sky-image.js.map +1 -1
  70. package/dist/sky-image/srcset-utils.js.map +1 -1
  71. package/dist/sky-input/sky-input.d.ts +8 -7
  72. package/dist/sky-input/sky-input.js +489 -202
  73. package/dist/sky-input/sky-input.js.map +1 -1
  74. package/dist/sky-list/sky-list.d.ts +4 -4
  75. package/dist/sky-list/sky-list.js +1 -3
  76. package/dist/sky-list/sky-list.js.map +1 -1
  77. package/dist/sky-listitem/sky-listitem.d.ts +2 -2
  78. package/dist/sky-listitem/sky-listitem.js +4 -7
  79. package/dist/sky-listitem/sky-listitem.js.map +1 -1
  80. package/dist/sky-radio/sky-radio.d.ts +5 -3
  81. package/dist/sky-radio/sky-radio.js +33 -15
  82. package/dist/sky-radio/sky-radio.js.map +1 -1
  83. package/dist/sky-row/sky-row.d.ts +2 -2
  84. package/dist/sky-row/sky-row.js.map +1 -1
  85. package/dist/sky-sheet/sky-sheet.d.ts +6 -6
  86. package/dist/sky-sheet/sky-sheet.js +21 -21
  87. package/dist/sky-sheet/sky-sheet.js.map +1 -1
  88. package/dist/sky-simple-table/sky-simple-table.d.ts +4 -4
  89. package/dist/sky-simple-table/sky-simple-table.js +4 -1
  90. package/dist/sky-simple-table/sky-simple-table.js.map +1 -1
  91. package/dist/sky-theme-provider/sky-theme-provider.d.ts +27 -27
  92. package/dist/sky-theme-provider/sky-theme-provider.js +1 -1
  93. package/dist/sky-theme-provider/sky-theme-provider.js.map +1 -1
  94. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"sky-alert.js","sources":["../../src/sky-alert/sky-alert.ts"],"sourcesContent":["import { LitElement, html, css, PropertyValues } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\nimport { styleMap } from \"lit/directives/style-map.js\";\r\nimport { classMap } from \"lit/directives/class-map.js\";\r\nimport { when } from \"lit/directives/when.js\";\r\nimport { resolveRadius } from \"../helper/utils/size-resolver\";\r\nimport {\r\n resolveColor,\r\n resolveTextColorForToken,\r\n fadeMix,\r\n hoverShade,\r\n isDefaultColorToken,\r\n tuneSurfaceVariantForDefaultColor,\r\n resolveSemanticSurfaceKey,\r\n semanticSoftSurfaceTokens,\r\n skyBorderPrimaryShorthand,\r\n} from \"../helper/utils/color-resolver\";\r\nimport { SkyIcon } from \"../sky-icon/sky-icon.js\";\r\n\r\nexport type SkyAlertClosedEventDetail = { title: string; message: string };\r\nexport type SkyAlertStrip = \"start\" | \"end\" | \"both\" | \"none\";\r\nexport type SkyAlertVariant = \"flat\" | \"bordered\" | \"light\" | \"faded\" | \"solid\";\r\nexport type SkyAlertRoleType = \"alert\" | \"alertdialog\";\r\n/** Resolved size metrics returned by `SkyAlert._resolveSize()`. */\r\ntype SkyAlertResolvedSize = {\r\n padding: string;\r\n titleFontSize: string;\r\n messageFontSize: string;\r\n gap: string;\r\n icon: string;\r\n closeSize: string;\r\n closeFontSize: string;\r\n spinner: string;\r\n stripWidth: string;\r\n minHeight: string;\r\n};\r\n\r\n/**\r\n * @element sky-alert\r\n *\r\n * @summary Status alert banner with variants, optional icon, strip accents, actions, dismiss behavior, and loading state.\r\n *\r\n * @status stable\r\n * @since 1.0.0\r\n *\r\n * @documentation https://library.sky-ui.com/components/alert\r\n * @dependency sky-icon\r\n *\r\n * @slot - Custom message content (used when `message` is empty).\r\n * @slot actions - Action buttons or links displayed on the trailing side.\r\n *\r\n * @property {string} title - Title text shown above the message.\r\n * @property {string} message - Message text rendered inside the alert.\r\n * @property {boolean} removable - Shows a dismiss button when enabled.\r\n * @property {string} color - Base color token or CSS color used by the alert.\r\n * @property {string} size - Preset size token (`xs | sm | md | lg | xl`) or CSS length.\r\n * @property {string} radius - Radius token or CSS length.\r\n * @property {string | null} icon - Optional leading icon name for `<sky-icon>`.\r\n * @property {SkyAlertStrip} strip - Strip accent placement.\r\n * @property {string} stripColor - Strip accent color token or CSS color.\r\n * @property {SkyAlertVariant} variant - Visual style variant.\r\n * @property {boolean} loading - Shows a loading overlay.\r\n * @property {SkyAlertRoleType} roleType - ARIA role for the alert container.\r\n * @method close Dispatches `alert-closed` and removes the alert from the DOM.\r\n *\r\n * @fires {CustomEvent<SkyAlertClosedEventDetail>} alert-closed - Fired when the alert is dismissed via the close button; bubbles and is composed.\r\n *\r\n * @csspart alert - The outer alert container.\r\n * @csspart icon - The optional leading icon.\r\n * @csspart content - The content container (title + message/slot).\r\n * @csspart title - The title text element.\r\n * @csspart message - The message text element (when `message` is provided).\r\n * @csspart actions - The trailing actions container.\r\n * @csspart close-button - The dismiss button (when `removable`).\r\n * @csspart loading-overlay - Overlay shown when `loading` is true.\r\n * @csspart loading-spinner - Spinner element shown inside the loading overlay.\r\n *\r\n * @Behavior\r\n * - `message` content takes priority over default-slot message content.\r\n * - Dismissing a removable alert dispatches `alert-closed` and removes the element.\r\n * - `strip` controls accent placement (`start`, `end`, `both`, `none`).\r\n * - `role-type=\"alert\"` maps to `aria-live=\"assertive\"`; `alertdialog` maps to `aria-live=\"polite\"`.\r\n * - Respects reduced motion preferences for entry, button hover rotation, and spinner animation.\r\n *\r\n * @example\r\n * ```html\r\n * <sky-alert title=\"Upload Complete\" message=\"Your file is now available.\" variant=\"bordered\" strip=\"start\" removable>\r\n * <button slot=\"actions\">View</button>\r\n * </sky-alert>\r\n * ```\r\n * ```vue\r\n * <template>\r\n * <sky-alert title=\"Upload Complete\" message=\"Your file is now available.\" variant=\"bordered\" strip=\"start\" removable>\r\n * <button slot=\"actions\">View</button>\r\n * </sky-alert>\r\n * </template>\r\n * ```\r\n * ```jsx\r\n * export default function Demo() {\r\n * return (\r\n * <sky-alert title=\"Upload Complete\" message=\"Your file is now available.\" variant=\"bordered\" strip=\"start\" removable>\r\n * <button slot=\"actions\">View</button>\r\n * </sky-alert>\r\n * );\r\n * }\r\n * ```\r\n */\r\n\r\n@customElement(\"sky-alert\")\r\nexport class SkyAlert extends LitElement {\r\n\r\n static dependencies: Record<string, CustomElementConstructor> = {\r\n \"sky-icon\": SkyIcon,\r\n };\r\n\r\n /** Title text displayed above the message. @default \"\" */\r\n @property({ type: String }) title: string = \"\";\r\n\r\n /** Message text displayed inside the alert. @default \"\" */\r\n @property({ type: String }) message: string = \"\";\r\n\r\n /** Shows a close button that dismisses the alert. @default false */\r\n @property({ type: Boolean }) removable: boolean = false;\r\n\r\n /** Base color token or CSS color. @default \"primary\" */\r\n @property({ type: String }) color: string = \"primary\";\r\n\r\n /** Size token (`xs | sm | md | lg | xl`) or CSS length. @default \"md\" */\r\n @property({ type: String }) size: string = \"md\";\r\n\r\n /** Radius token or CSS length. @default \"md\" */\r\n @property({ type: String }) radius: string = \"md\";\r\n\r\n /** Optional leading icon name for `<sky-icon>`. @default null */\r\n @property({ type: String }) icon: string | null = null;\r\n\r\n /** Strip accent position. @default \"none\" */\r\n @property({ type: String, reflect: true }) strip: SkyAlertStrip = \"none\";\r\n\r\n /** Strip accent color. @default \"currentColor\" */\r\n @property({ type: String })\r\n stripColor: string = \"currentColor\";\r\n\r\n /** Visual style variant. @default \"solid\" */\r\n @property({ type: String, reflect: true })\r\n variant: SkyAlertVariant = \"solid\";\r\n\r\n /** Shows a loading overlay. @default false */\r\n @property({ type: Boolean }) loading: boolean = false;\r\n\r\n /** ARIA role applied to the alert container. @default \"alert\" */\r\n @property({ type: String, reflect: true })\r\n roleType: SkyAlertRoleType = \"alert\";\r\n\r\n /** Internal style variables */\r\n private _styleVars: Record<string, string> = {};\r\n\r\n /** Cached result of _resolveSize for the last `size` value (avoids recomputing when only color/variant change). */\r\n private _sizeCache: { size: string; result: SkyAlertResolvedSize } | null = null;\r\n\r\n /** True when the actions slot has assigned content (used to show separator only when needed). */\r\n @state() private _hasActionsSlotContent = false;\r\n\r\n static override styles = css`\r\n :host {\r\n display: block;\r\n font-family: var(--sky-font);\r\n width: 100%;\r\n }\r\n\r\n .alert {\r\n position: relative;\r\n width: 100%;\r\n box-sizing: border-box;\r\n display: flex;\r\n align-items: stretch;\r\n gap: var(--alert-gap, var(--sky-space-2, 8px));\r\n padding: var(--alert-padding);\r\n border-radius: var(--alert-radius);\r\n border: var(--alert-border, none);\r\n color: var(--alert-color, var(--sky-text-primary));\r\n background-color: var(--alert-bg, transparent);\r\n backdrop-filter: none;\r\n -webkit-backdrop-filter: none;\r\n transition: var(--sky-transition-default);\r\n min-height: var(--alert-min-height, 36px);\r\n animation: skyc-fade-in var(--sky-duration-fast, 120ms) var(--sky-ease-out, ease-out);\r\n }\r\n\r\n /* Strip styles (logical properties for RTL) */\r\n .alert.strip-start::before,\r\n .alert.strip-end::after {\r\n content: \"\";\r\n position: absolute;\r\n top: 0;\r\n bottom: 0;\r\n width: var(--strip-width, 4px);\r\n background: var(--strip-color, currentColor);\r\n z-index: 1;\r\n }\r\n\r\n .alert.strip-start::before {\r\n inset-inline-start: 0;\r\n border-start-start-radius: inherit;\r\n border-end-start-radius: inherit;\r\n }\r\n\r\n .alert.strip-end::after {\r\n inset-inline-end: 0;\r\n border-start-end-radius: inherit;\r\n border-end-end-radius: inherit;\r\n }\r\n\r\n .alert.strip-start {\r\n border-start-start-radius: 0 !important;\r\n border-end-start-radius: 0 !important;\r\n }\r\n .alert.strip-end {\r\n border-start-end-radius: 0 !important;\r\n border-end-end-radius: 0 !important;\r\n }\r\n\r\n .alert.strip-start.strip-end {\r\n border-radius: 0 !important;\r\n }\r\n\r\n /* Remove borders on strip sides */\r\n .alert.strip-start.bordered {\r\n border-inline-start: none !important;\r\n }\r\n .alert.strip-end.bordered {\r\n border-inline-end: none !important;\r\n }\r\n .alert.strip-start.strip-end.bordered {\r\n border-inline-start: none !important;\r\n border-inline-end: none !important;\r\n }\r\n\r\n .alert.faded.strip-start {\r\n border-inline-start: none !important;\r\n }\r\n .alert.faded.strip-end {\r\n border-inline-end: none !important;\r\n }\r\n .alert.faded.strip-start.strip-end {\r\n border-inline-start: none !important;\r\n border-inline-end: none !important;\r\n }\r\n\r\n .icon {\r\n align-self: flex-start;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: var(--icon-size, 20px);\r\n color: inherit;\r\n flex-shrink: 0;\r\n padding-block-start: 2px;\r\n }\r\n\r\n .content {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n }\r\n\r\n .title {\r\n font: var(--sky-text-title);\r\n font-size: var(--title-font-size);\r\n color: inherit;\r\n margin: 0 0 var(--sky-space-1, 4px) 0;\r\n }\r\n\r\n .message {\r\n margin: 0;\r\n text-align: start;\r\n font: var(--sky-text-body);\r\n font-size: var(--message-font-size);\r\n color: inherit;\r\n }\r\n\r\n ::slotted(*) {\r\n font: var(--sky-text-body);\r\n font-size: var(--message-font-size);\r\n }\r\n\r\n .actions {\r\n display: inline-flex;\r\n gap: var(--sky-space-2, 8px);\r\n align-items: center;\r\n justify-content: flex-end;\r\n flex: 0 0 auto;\r\n align-self: stretch;\r\n border-inline-start: 1px solid var(--sky-border-light);\r\n padding-inline-start: var(--sky-space-2, 8px);\r\n margin-inline-start: var(--sky-space-1, 4px);\r\n }\r\n\r\n .actions-slot-placeholder {\r\n position: absolute;\r\n width: 0;\r\n height: 0;\r\n overflow: hidden;\r\n opacity: 0;\r\n pointer-events: none;\r\n }\r\n\r\n .close-button {\r\n margin-inline-start: var(--sky-space-1\\\\.5, 6px);\r\n display: inline-flex;\r\n aspect-ratio: 1 / 1;\r\n justify-content: center;\r\n align-items: center;\r\n width: var(--close-size, 24px);\r\n height: var(--close-size, 24px);\r\n box-sizing: border-box;\r\n background: var(--close-bg, var(--sky-hover-primary));\r\n border: none;\r\n border-radius: var(--sky-radius-full, 50%);\r\n font-size: var(--close-font-size, 16px);\r\n cursor: pointer;\r\n font-weight: var(--sky-font-weight-bold, 700);\r\n color: var(--close-color, currentColor);\r\n transition: var(--sky-transition-fast);\r\n -webkit-tap-highlight-color: transparent;\r\n }\r\n\r\n .close-button:hover {\r\n transform: rotate(90deg);\r\n background: var(--close-hover-bg, var(--sky-hover-secondary));\r\n color: var(--close-hover-color, currentColor);\r\n }\r\n\r\n .close-button:focus-visible {\r\n outline: none;\r\n box-shadow: var(--sky-focus-ring);\r\n background: var(--close-hover-bg, var(--sky-hover-secondary));\r\n color: var(--close-hover-color, currentColor);\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-secondary);\r\n border-radius: inherit;\r\n backdrop-filter: none;\r\n -webkit-backdrop-filter: none;\r\n z-index: 2;\r\n }\r\n\r\n .loading-spinner {\r\n width: var(--spinner-size, 16px);\r\n height: var(--spinner-size, 16px);\r\n border: 2px solid currentColor;\r\n border-top-color: transparent;\r\n border-radius: var(--sky-radius-full, 50%);\r\n animation: skyc-spin 0.8s linear infinite;\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .alert {\r\n animation: none;\r\n transition: none;\r\n }\r\n\r\n .close-button {\r\n transition: none;\r\n }\r\n\r\n .close-button:hover,\r\n .close-button:focus-visible {\r\n transform: none;\r\n }\r\n\r\n .loading-spinner {\r\n animation: none;\r\n }\r\n }\r\n\r\n @keyframes skyc-spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @keyframes skyc-fade-in {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-2px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n }\r\n `;\r\n\r\n /**\r\n * Resolves size to get padding, font sizes, and other metrics.\r\n * Result is memoized by `size` to avoid recomputing when only color/variant/radius change.\r\n */\r\n private _resolveSize(input: string): SkyAlertResolvedSize {\r\n const key = String(input).trim();\r\n if (this._sizeCache && this._sizeCache.size === key) return this._sizeCache.result;\r\n\r\n const presets: Record<\r\n string,\r\n {\r\n padding: string;\r\n titleFontSize: string;\r\n messageFontSize: string;\r\n gap: string;\r\n icon: string;\r\n closeSize: string;\r\n closeFontSize: string;\r\n spinner: string;\r\n stripWidth: string;\r\n minHeight: string;\r\n }\r\n > = {\r\n xs: {\r\n padding: \"3px 7px\",\r\n titleFontSize: \"12px\",\r\n messageFontSize: \"11px\",\r\n gap: \"4px\",\r\n icon: \"14px\",\r\n closeSize: \"18px\",\r\n closeFontSize: \"12px\",\r\n spinner: \"12px\",\r\n stripWidth: \"2px\",\r\n minHeight: \"28px\",\r\n },\r\n sm: {\r\n padding: \"5px 9px\",\r\n titleFontSize: \"14px\",\r\n messageFontSize: \"13px\",\r\n gap: \"6px\",\r\n icon: \"16px\",\r\n closeSize: \"20px\",\r\n closeFontSize: \"14px\",\r\n spinner: \"14px\",\r\n stripWidth: \"3px\",\r\n minHeight: \"32px\",\r\n },\r\n md: {\r\n padding: \"8px 12px\",\r\n titleFontSize: \"16px\",\r\n messageFontSize: \"14px\",\r\n gap: \"8px\",\r\n icon: \"20px\",\r\n closeSize: \"24px\",\r\n closeFontSize: \"16px\",\r\n spinner: \"16px\",\r\n stripWidth: \"4px\",\r\n minHeight: \"36px\",\r\n },\r\n lg: {\r\n padding: \"10px 14px\",\r\n titleFontSize: \"18px\",\r\n messageFontSize: \"15px\",\r\n gap: \"10px\",\r\n icon: \"22px\",\r\n closeSize: \"28px\",\r\n closeFontSize: \"18px\",\r\n spinner: \"18px\",\r\n stripWidth: \"5px\",\r\n minHeight: \"40px\",\r\n },\r\n xl: {\r\n padding: \"12px 16px\",\r\n titleFontSize: \"20px\",\r\n messageFontSize: \"16px\",\r\n gap: \"12px\",\r\n icon: \"24px\",\r\n closeSize: \"32px\",\r\n closeFontSize: \"20px\",\r\n spinner: \"20px\",\r\n stripWidth: \"6px\",\r\n minHeight: \"44px\",\r\n },\r\n };\r\n\r\n if (presets[input]) {\r\n this._sizeCache = { size: key, result: presets[input] };\r\n return presets[input];\r\n }\r\n\r\n const m = String(input)\r\n .trim()\r\n .match(/^([\\d.]+)(px|rem|em)?$/i);\r\n const unit = m?.[2] || \"px\";\r\n const fsNum = m ? parseFloat(m[1]) : 16;\r\n const fs = `${fsNum}${unit}`;\r\n\r\n const to = (n: number) => `${Math.round(n * 100) / 100}${unit}`;\r\n const clamp = (n: number, min: number, max: number) =>\r\n Math.max(min, Math.min(max, n));\r\n\r\n const titleFs = fs;\r\n const messageFs = clamp(fsNum * 0.875, 11, 16);\r\n const py = clamp(fsNum * 0.5, 3, 12);\r\n const px = clamp(fsNum * 0.75, 7, 16);\r\n const gap = clamp(fsNum * 0.5, 4, 12);\r\n const icon = clamp(fsNum * 1.25, 14, 24);\r\n const closeSize = clamp(fsNum * 1.5, 18, 32);\r\n const closeFont = clamp(fsNum * 1, 12, 20);\r\n const spinner = clamp(fsNum * 1, 12, 20);\r\n const stripWidth = clamp(fsNum * 0.25, 2, 6);\r\n const minHeight = clamp(fsNum * 2.25, 28, 44);\r\n\r\n return {\r\n padding: `${to(py)} ${to(px)}`,\r\n titleFontSize: titleFs,\r\n messageFontSize: to(messageFs),\r\n gap: to(gap),\r\n icon: to(icon),\r\n closeSize: to(closeSize),\r\n closeFontSize: to(closeFont),\r\n spinner: to(spinner),\r\n stripWidth: to(stripWidth),\r\n minHeight: to(minHeight),\r\n };\r\n }\r\n\r\n /** Recomputes style variables when visual inputs change. */\r\n override willUpdate(changedProperties: PropertyValues): void {\r\n super.willUpdate(changedProperties);\r\n\r\n if (\r\n changedProperties.has(\"color\") ||\r\n changedProperties.has(\"variant\") ||\r\n changedProperties.has(\"stripColor\") ||\r\n changedProperties.has(\"radius\") ||\r\n changedProperties.has(\"size\")\r\n ) {\r\n this._updateStyleVars();\r\n }\r\n }\r\n\r\n /** Initializes actions-slot presence state after first render. */\r\n override firstUpdated(): void {\r\n queueMicrotask(() => this._checkActionsSlot());\r\n }\r\n\r\n /** Computes CSS custom properties from current variant, size, and color inputs. */\r\n private _updateStyleVars(): void {\r\n const baseColor = resolveColor(this.color);\r\n const textColor = resolveTextColorForToken(this.color);\r\n const stripColorResolved = this.stripColor === \"currentColor\"\r\n ? baseColor\r\n : resolveColor(this.stripColor);\r\n\r\n const s = this._resolveSize(this.size);\r\n\r\n const semanticKey = resolveSemanticSurfaceKey(this.color);\r\n\r\n const variantStyles = {\r\n solid: {\r\n bg: baseColor,\r\n color: textColor,\r\n border: \"none\",\r\n },\r\n flat: semanticKey\r\n ? semanticSoftSurfaceTokens(semanticKey)\r\n : {\r\n bg: fadeMix(baseColor, 20),\r\n color: hoverShade(baseColor, 30),\r\n border: \"none\",\r\n },\r\n faded: semanticKey\r\n ? semanticSoftSurfaceTokens(semanticKey, { bordered: true })\r\n : {\r\n bg: \"var(--sky-hover-tertiary)\",\r\n color: baseColor,\r\n border: \"1px solid var(--sky-text-tertiary)\",\r\n },\r\n bordered: {\r\n bg: \"transparent\",\r\n color: semanticKey\r\n ? `var(--sky-${semanticKey}-primary-dark)`\r\n : baseColor,\r\n border: `2px solid ${baseColor}`,\r\n },\r\n light: {\r\n bg: \"transparent\",\r\n color: semanticKey\r\n ? `var(--sky-${semanticKey}-primary-dark)`\r\n : baseColor,\r\n border: \"none\",\r\n },\r\n } as const;\r\n\r\n const currentVariant = this.variant in variantStyles\r\n ? this.variant as keyof typeof variantStyles\r\n : \"flat\";\r\n\r\n let v = tuneSurfaceVariantForDefaultColor(\r\n this.color,\r\n currentVariant,\r\n variantStyles[currentVariant],\r\n );\r\n\r\n if (\r\n isDefaultColorToken(this.color) &&\r\n (currentVariant === \"flat\" || currentVariant === \"faded\")\r\n ) {\r\n v = {\r\n ...v,\r\n bg: \"var(--sky-glass-solid)\",\r\n color: \"var(--sky-text-primary)\",\r\n border: currentVariant === \"faded\" ? skyBorderPrimaryShorthand() : \"none\",\r\n };\r\n }\r\n\r\n let closeBg = \"var(--sky-hover-primary)\";\r\n let closeColor = \"currentColor\";\r\n let closeHoverBg = \"var(--sky-hover-secondary)\";\r\n let closeHoverColor = \"currentColor\";\r\n\r\n if (currentVariant === \"solid\") {\r\n closeBg = fadeMix(textColor, 20);\r\n closeColor = textColor;\r\n closeHoverBg = fadeMix(textColor, 30);\r\n closeHoverColor = textColor;\r\n } else if (currentVariant === \"flat\" || currentVariant === \"faded\") {\r\n if (semanticKey) {\r\n closeBg = `var(--sky-${semanticKey}-g0)`;\r\n closeColor = v.color;\r\n closeHoverBg = `var(--sky-${semanticKey}-g1)`;\r\n closeHoverColor = v.color;\r\n } else if (isDefaultColorToken(this.color)) {\r\n closeBg = \"var(--sky-hover-primary)\";\r\n closeColor = v.color;\r\n closeHoverBg = \"var(--sky-hover-secondary)\";\r\n closeHoverColor = v.color;\r\n } else {\r\n closeBg = fadeMix(baseColor, 15);\r\n closeColor = v.color;\r\n closeHoverBg = fadeMix(baseColor, 25);\r\n closeHoverColor = v.color;\r\n }\r\n }\r\n\r\n this._styleVars = {\r\n \"--alert-bg\": v.bg,\r\n \"--alert-color\": v.color,\r\n \"--alert-border\": v.border,\r\n \"--alert-radius\": resolveRadius(this.radius),\r\n \"--alert-padding\": s.padding,\r\n \"--alert-gap\": s.gap,\r\n \"--alert-min-height\": s.minHeight,\r\n \"--title-font-size\": s.titleFontSize,\r\n \"--message-font-size\": s.messageFontSize,\r\n \"--icon-size\": s.icon,\r\n \"--close-size\": s.closeSize,\r\n \"--close-font-size\": s.closeFontSize,\r\n \"--spinner-size\": s.spinner,\r\n \"--strip-color\": stripColorResolved,\r\n \"--strip-width\": s.stripWidth,\r\n \"--close-bg\": closeBg,\r\n \"--close-color\": closeColor,\r\n \"--close-hover-bg\": closeHoverBg,\r\n \"--close-hover-color\": closeHoverColor,\r\n };\r\n }\r\n\r\n /**\r\n * Dispatches `alert-closed` and removes the alert from the DOM.\r\n *\r\n * @returns {void}\r\n */\r\n public close(): void {\r\n const evt = new CustomEvent<SkyAlertClosedEventDetail>(\"alert-closed\", {\r\n detail: { title: this.title, message: this.message },\r\n bubbles: true,\r\n composed: true,\r\n });\r\n this.dispatchEvent(evt);\r\n this.remove();\r\n }\r\n\r\n /** Returns the ARIA role applied to the alert container. */\r\n private getAriaRole(): SkyAlertRoleType {\r\n return this.roleType;\r\n }\r\n\r\n /** Checks whether the actions slot currently has meaningful assigned content. */\r\n private _checkActionsSlot(): void {\r\n const slot = this.renderRoot?.querySelector<HTMLSlotElement>('slot[name=\"actions\"]');\r\n if (!slot) return;\r\n const nodes = slot.assignedNodes({ flatten: true });\r\n const hasContent = nodes.some(\r\n (n) => n.nodeType !== Node.TEXT_NODE || (n.textContent?.trim().length ?? 0) > 0,\r\n );\r\n if (hasContent !== this._hasActionsSlotContent) {\r\n this._hasActionsSlotContent = hasContent;\r\n }\r\n }\r\n\r\n /** Updates action-slot state when the slot assignment changes. */\r\n private _onActionsSlotChange(e: Event): void {\r\n const slot = e.target as HTMLSlotElement;\r\n const nodes = slot.assignedNodes({ flatten: true });\r\n const hasContent = nodes.some(\r\n (n) => n.nodeType !== Node.TEXT_NODE || (n.textContent?.trim().length ?? 0) > 0,\r\n );\r\n this._hasActionsSlotContent = hasContent;\r\n }\r\n\r\n override render() {\r\n const roleAttr = this.getAriaRole();\r\n const alertClasses = classMap({\r\n alert: true,\r\n [this.variant]: true,\r\n \"strip-start\": this.strip === \"start\" || this.strip === \"both\",\r\n \"strip-end\": this.strip === \"end\" || this.strip === \"both\",\r\n });\r\n\r\n return html`\r\n <div\r\n part=\"alert\"\r\n class=${alertClasses}\r\n role=\"${roleAttr}\"\r\n aria-live=\"${this.roleType === \"alert\" ? \"assertive\" : \"polite\"}\"\r\n style=${styleMap(this._styleVars)}\r\n >\r\n ${when(\r\n this.icon,\r\n () => html`<sky-icon part=\"icon\" class=\"icon\" icon=\"${this.icon!}\"></sky-icon>`,\r\n )}\r\n\r\n <div part=\"content\" class=\"content\">\r\n ${when(\r\n this.title,\r\n () => html`<div part=\"title\" class=\"title\">${this.title}</div>`,\r\n )}\r\n ${when(\r\n this.message,\r\n () => html`<p part=\"message\" class=\"message\">${this.message}</p>`,\r\n () => html`<slot></slot>`,\r\n )}\r\n </div>\r\n\r\n ${when(\r\n this._hasActionsSlotContent || this.removable,\r\n () => html`\r\n <div part=\"actions\" class=\"actions\">\r\n <slot name=\"actions\" @slotchange=${this._onActionsSlotChange}></slot>\r\n ${when(\r\n this.removable,\r\n () => html`\r\n <button\r\n part=\"close-button\"\r\n class=\"close-button\"\r\n type=\"button\"\r\n @click=${this.close}\r\n aria-label=\"Dismiss alert\"\r\n title=\"Dismiss\"\r\n >\r\n <sky-icon icon=\"ion:close\"></sky-icon>\r\n </button>\r\n `,\r\n )}\r\n </div>\r\n `,\r\n () => html`\r\n <div class=\"actions-slot-placeholder\" aria-hidden=\"true\">\r\n <slot name=\"actions\" @slotchange=${this._onActionsSlotChange}></slot>\r\n </div>\r\n `,\r\n )}\r\n\r\n ${when(\r\n this.loading,\r\n () => html`\r\n <div part=\"loading-overlay\" class=\"loading-overlay\">\r\n <div part=\"loading-spinner\" class=\"loading-spinner\"></div>\r\n </div>\r\n `,\r\n )}\r\n </div>\r\n `;\r\n }\r\n}"],"names":["SkyAlert","LitElement","constructor","super","arguments","this","title","message","removable","color","size","radius","icon","strip","stripColor","variant","loading","roleType","_styleVars","_sizeCache","_hasActionsSlotContent","_resolveSize","input","key","String","trim","result","presets","xs","padding","titleFontSize","messageFontSize","gap","closeSize","closeFontSize","spinner","stripWidth","minHeight","sm","md","lg","xl","m","match","unit","fsNum","parseFloat","to","n","Math","round","clamp","min","max","titleFs","messageFs","py","px","closeFont","willUpdate","changedProperties","has","_updateStyleVars","firstUpdated","queueMicrotask","_checkActionsSlot","baseColor","resolveColor","textColor","resolveTextColorForToken","stripColorResolved","s","semanticKey","resolveSemanticSurfaceKey","variantStyles","solid","bg","border","flat","semanticSoftSurfaceTokens","fadeMix","hoverShade","faded","bordered","light","currentVariant","v","tuneSurfaceVariantForDefaultColor","isDefaultColorToken","skyBorderPrimaryShorthand","closeBg","closeColor","closeHoverBg","closeHoverColor","resolveRadius","close","evt","CustomEvent","detail","bubbles","composed","dispatchEvent","remove","getAriaRole","slot","renderRoot","querySelector","hasContent","assignedNodes","flatten","some","nodeType","Node","TEXT_NODE","textContent","length","_onActionsSlotChange","e","target","render","roleAttr","alertClasses","classMap","alert","html","styleMap","when","dependencies","SkyIcon","styles","css","__decorateClass","property","type","prototype","Boolean","reflect","state","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"sky-alert.js","sources":["../../src/sky-alert/sky-alert.ts"],"sourcesContent":["import { LitElement, html, css, PropertyValues, unsafeCSS } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { when } from 'lit/directives/when.js';\nimport { resolveRadius } from '../helper/utils/size-resolver';\nimport {\n resolveColor,\n resolveTextColorForToken,\n fadeMix,\n hoverShade,\n isDefaultColorToken,\n tuneSurfaceVariantForDefaultColor,\n resolveSemanticSurfaceKey,\n semanticSoftSurfaceTokens,\n skyBorderPrimaryShorthand,\n} from '../helper/utils/color-resolver';\nimport { cssOnFillEnhance } from '../helper/utils/contrast-color';\nimport { SkyIcon } from '../sky-icon/sky-icon.js';\n\nexport type SkyAlertClosedEventDetail = { title: string; message: string };\nexport type SkyAlertStrip = 'start' | 'end' | 'both' | 'none';\nexport type SkyAlertVariant = 'flat' | 'bordered' | 'light' | 'faded' | 'solid';\nexport type SkyAlertRoleType = 'alert' | 'alertdialog';\n/** Resolved size metrics returned by `SkyAlert._resolveSize()`. */\ntype SkyAlertResolvedSize = {\n padding: string;\n titleFontSize: string;\n messageFontSize: string;\n gap: string;\n icon: string;\n closeSize: string;\n closeFontSize: string;\n spinner: string;\n stripWidth: string;\n minHeight: string;\n};\n\n/**\n * @element sky-alert\n *\n * @summary Status alert banner with variants, optional icon, strip accents, actions, dismiss behavior, and loading state.\n *\n * @status stable\n * @since 1.0.0\n *\n * @documentation https://sky-ui.com/components/alert\n * @dependency sky-icon\n *\n * @slot - Custom message content (used when `message` is empty).\n * @slot actions - Action buttons or links displayed on the trailing side.\n *\n * @property {string} title - Title text shown above the message.\n * @property {string} message - Message text rendered inside the alert.\n * @property {boolean} removable - Shows a dismiss button when enabled.\n * @property {string} color - Base color token or CSS color used by the alert.\n * @property {string} size - Preset size token (`xs | sm | md | lg | xl`) or CSS length.\n * @property {string} radius - Radius token or CSS length.\n * @property {string | null} icon - Optional leading icon name for `<sky-icon>`.\n * @property {SkyAlertStrip} strip - Strip accent placement.\n * @property {string} stripColor - Strip accent color token or CSS color.\n * @property {SkyAlertVariant} variant - Visual style variant.\n * @property {boolean} loading - Shows a loading overlay.\n * @property {SkyAlertRoleType} roleType - ARIA role for the alert container.\n * @method close Dispatches `alert-closed` and removes the alert from the DOM.\n *\n * @fires {CustomEvent<SkyAlertClosedEventDetail>} alert-closed - Fired when the alert is dismissed via the close button; bubbles and is composed.\n *\n * @csspart alert - The outer alert container.\n * @csspart icon - The optional leading icon.\n * @csspart content - The content container (title + message/slot).\n * @csspart title - The title text element.\n * @csspart message - The message text element (when `message` is provided).\n * @csspart actions - The trailing actions container.\n * @csspart close-button - The dismiss button (when `removable`).\n * @csspart loading-overlay - Overlay shown when `loading` is true.\n * @csspart loading-spinner - Spinner element shown inside the loading overlay.\n *\n * @Behavior\n * - `message` content takes priority over default-slot message content.\n * - Dismissing a removable alert dispatches `alert-closed` and removes the element.\n * - `strip` controls accent placement (`start`, `end`, `both`, `none`).\n * - `role-type=\"alert\"` maps to `aria-live=\"assertive\"`; `alertdialog` maps to `aria-live=\"polite\"`.\n * - Respects reduced motion preferences for entry, button hover rotation, and spinner animation.\n *\n * @example\n * ```html\n * <sky-alert title=\"Upload Complete\" message=\"Your file is now available.\" variant=\"bordered\" strip=\"start\" removable>\n * <button slot=\"actions\">View</button>\n * </sky-alert>\n * ```\n * ```vue\n * <template>\n * <sky-alert title=\"Upload Complete\" message=\"Your file is now available.\" variant=\"bordered\" strip=\"start\" removable>\n * <button slot=\"actions\">View</button>\n * </sky-alert>\n * </template>\n * ```\n * ```jsx\n * export default function Demo() {\n * return (\n * <sky-alert title=\"Upload Complete\" message=\"Your file is now available.\" variant=\"bordered\" strip=\"start\" removable>\n * <button slot=\"actions\">View</button>\n * </sky-alert>\n * );\n * }\n * ```\n */\n\n@customElement('sky-alert')\nexport class SkyAlert extends LitElement {\n static dependencies: Record<string, CustomElementConstructor> = {\n 'sky-icon': SkyIcon,\n };\n\n /** Title text displayed above the message. @default \"\" */\n @property({ type: String }) title: string = '';\n\n /** Message text displayed inside the alert. @default \"\" */\n @property({ type: String }) message: string = '';\n\n /** Shows a close button that dismisses the alert. @default false */\n @property({ type: Boolean }) removable: boolean = false;\n\n /** Base color token or CSS color. @default \"primary\" */\n @property({ type: String }) color: string = 'primary';\n\n /** Size token (`xs | sm | md | lg | xl`) or CSS length. @default \"md\" */\n @property({ type: String }) size: string = 'md';\n\n /** Radius token or CSS length. @default \"md\" */\n @property({ type: String }) radius: string = 'md';\n\n /** Optional leading icon name for `<sky-icon>`. @default null */\n @property({ type: String }) icon: string | null = null;\n\n /** Strip accent position. @default \"none\" */\n @property({ type: String, reflect: true }) strip: SkyAlertStrip = 'none';\n\n /** Strip accent color. @default \"currentColor\" */\n @property({ type: String })\n stripColor: string = 'currentColor';\n\n /** Visual style variant. @default \"solid\" */\n @property({ type: String, reflect: true })\n variant: SkyAlertVariant = 'solid';\n\n /** Shows a loading overlay. @default false */\n @property({ type: Boolean }) loading: boolean = false;\n\n /** ARIA role applied to the alert container. @default \"alert\" */\n @property({ type: String, reflect: true })\n roleType: SkyAlertRoleType = 'alert';\n\n /** Internal style variables */\n private _styleVars: Record<string, string> = {};\n\n /** Cached result of _resolveSize for the last `size` value (avoids recomputing when only color/variant change). */\n private _sizeCache: { size: string; result: SkyAlertResolvedSize } | null =\n null;\n\n /** True when the actions slot has assigned content (used to show separator only when needed). */\n @state() private _hasActionsSlotContent = false;\n\n static override styles = css`\n :host {\n display: block;\n font-family: var(--sky-font);\n width: 100%;\n }\n\n .alert {\n position: relative;\n width: 100%;\n box-sizing: border-box;\n display: flex;\n align-items: stretch;\n gap: var(--alert-gap, var(--sky-space-2, 8px));\n padding: var(--alert-padding);\n border-radius: var(--alert-radius);\n border: var(--alert-border, none);\n color: var(--alert-color, var(--sky-text-primary));\n background-color: var(--alert-bg, transparent);\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n transition: var(--sky-transition-default);\n min-height: var(--alert-min-height, 36px);\n animation: skyc-fade-in var(--sky-duration-fast, 120ms)\n var(--sky-ease-out, ease-out);\n }\n\n /* Strip styles (logical properties for RTL) */\n .alert.strip-start::before,\n .alert.strip-end::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n width: var(--strip-width, 4px);\n background: var(--strip-color, currentColor);\n z-index: 1;\n }\n\n .alert.strip-start::before {\n inset-inline-start: 0;\n border-start-start-radius: inherit;\n border-end-start-radius: inherit;\n }\n\n .alert.strip-end::after {\n inset-inline-end: 0;\n border-start-end-radius: inherit;\n border-end-end-radius: inherit;\n }\n\n .alert.strip-start {\n border-start-start-radius: 0 !important;\n border-end-start-radius: 0 !important;\n }\n .alert.strip-end {\n border-start-end-radius: 0 !important;\n border-end-end-radius: 0 !important;\n }\n\n .alert.strip-start.strip-end {\n border-radius: 0 !important;\n }\n\n /* Remove borders on strip sides */\n .alert.strip-start.bordered {\n border-inline-start: none !important;\n }\n .alert.strip-end.bordered {\n border-inline-end: none !important;\n }\n .alert.strip-start.strip-end.bordered {\n border-inline-start: none !important;\n border-inline-end: none !important;\n }\n\n .alert.faded.strip-start {\n border-inline-start: none !important;\n }\n .alert.faded.strip-end {\n border-inline-end: none !important;\n }\n .alert.faded.strip-start.strip-end {\n border-inline-start: none !important;\n border-inline-end: none !important;\n }\n\n .icon {\n align-self: flex-start;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--icon-size, 20px);\n color: inherit;\n flex-shrink: 0;\n padding-block-start: 2px;\n }\n\n .content {\n flex: 1 1 auto;\n min-width: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n .title {\n font: var(--sky-text-title);\n font-size: var(--title-font-size);\n color: inherit;\n margin: 0 0 var(--sky-space-1, 4px) 0;\n }\n\n .message {\n margin: 0;\n text-align: start;\n font: var(--sky-text-body);\n font-size: var(--message-font-size);\n color: inherit;\n }\n\n ::slotted(*) {\n font: var(--sky-text-body);\n font-size: var(--message-font-size);\n }\n\n .actions {\n display: inline-flex;\n gap: var(--sky-space-2, 8px);\n align-items: center;\n justify-content: flex-end;\n flex: 0 0 auto;\n align-self: stretch;\n border-inline-start: 1px solid var(--sky-border-light);\n padding-inline-start: var(--sky-space-2, 8px);\n margin-inline-start: var(--sky-space-1, 4px);\n }\n\n .actions-slot-placeholder {\n position: absolute;\n width: 0;\n height: 0;\n overflow: hidden;\n opacity: 0;\n pointer-events: none;\n }\n\n .close-button {\n margin-inline-start: var(--sky-space-1\\\\.5, 6px);\n display: inline-flex;\n aspect-ratio: 1 / 1;\n justify-content: center;\n align-items: center;\n width: var(--close-size, 24px);\n height: var(--close-size, 24px);\n box-sizing: border-box;\n background: var(--close-bg, var(--sky-hover-primary));\n border: none;\n border-radius: var(--sky-radius-full, 50%);\n font-size: var(--close-font-size, 16px);\n cursor: pointer;\n font-weight: var(--sky-font-weight-bold, 700);\n color: var(--close-color, currentColor);\n transition: var(--sky-transition-fast);\n -webkit-tap-highlight-color: transparent;\n }\n\n .close-button:hover {\n transform: rotate(90deg);\n background: var(--close-hover-bg, var(--sky-hover-secondary));\n color: var(--close-hover-color, currentColor);\n }\n\n .close-button:focus-visible {\n outline: none;\n box-shadow: var(--sky-focus-ring);\n background: var(--close-hover-bg, var(--sky-hover-secondary));\n color: var(--close-hover-color, currentColor);\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-secondary);\n border-radius: inherit;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n z-index: 2;\n }\n\n .loading-spinner {\n width: var(--spinner-size, 16px);\n height: var(--spinner-size, 16px);\n border: 2px solid currentColor;\n border-top-color: transparent;\n border-radius: var(--sky-radius-full, 50%);\n animation: skyc-spin 0.8s linear infinite;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .alert {\n animation: none;\n transition: none;\n }\n\n .close-button {\n transition: none;\n }\n\n .close-button:hover,\n .close-button:focus-visible {\n transform: none;\n }\n\n .loading-spinner {\n animation: none;\n }\n }\n\n @keyframes skyc-spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n @keyframes skyc-fade-in {\n from {\n opacity: 0;\n transform: translateY(-2px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n ${unsafeCSS(\n cssOnFillEnhance([\n {\n selector: '.alert.solid',\n fillVar: '--alert-bg',\n },\n ])\n )}\n `;\n\n /**\n * Resolves size to get padding, font sizes, and other metrics.\n * Result is memoized by `size` to avoid recomputing when only color/variant/radius change.\n */\n private _resolveSize(input: string): SkyAlertResolvedSize {\n const key = String(input).trim();\n if (this._sizeCache && this._sizeCache.size === key)\n return this._sizeCache.result;\n\n const presets: Record<\n string,\n {\n padding: string;\n titleFontSize: string;\n messageFontSize: string;\n gap: string;\n icon: string;\n closeSize: string;\n closeFontSize: string;\n spinner: string;\n stripWidth: string;\n minHeight: string;\n }\n > = {\n xs: {\n padding: '3px 7px',\n titleFontSize: '12px',\n messageFontSize: '11px',\n gap: '4px',\n icon: '14px',\n closeSize: '18px',\n closeFontSize: '12px',\n spinner: '12px',\n stripWidth: '2px',\n minHeight: '28px',\n },\n sm: {\n padding: '5px 9px',\n titleFontSize: '14px',\n messageFontSize: '13px',\n gap: '6px',\n icon: '16px',\n closeSize: '20px',\n closeFontSize: '14px',\n spinner: '14px',\n stripWidth: '3px',\n minHeight: '32px',\n },\n md: {\n padding: '8px 12px',\n titleFontSize: '16px',\n messageFontSize: '14px',\n gap: '8px',\n icon: '20px',\n closeSize: '24px',\n closeFontSize: '16px',\n spinner: '16px',\n stripWidth: '4px',\n minHeight: '36px',\n },\n lg: {\n padding: '10px 14px',\n titleFontSize: '18px',\n messageFontSize: '15px',\n gap: '10px',\n icon: '22px',\n closeSize: '28px',\n closeFontSize: '18px',\n spinner: '18px',\n stripWidth: '5px',\n minHeight: '40px',\n },\n xl: {\n padding: '12px 16px',\n titleFontSize: '20px',\n messageFontSize: '16px',\n gap: '12px',\n icon: '24px',\n closeSize: '32px',\n closeFontSize: '20px',\n spinner: '20px',\n stripWidth: '6px',\n minHeight: '44px',\n },\n };\n\n if (presets[input]) {\n this._sizeCache = { size: key, result: presets[input] };\n return presets[input];\n }\n\n const m = String(input)\n .trim()\n .match(/^([\\d.]+)(px|rem|em)?$/i);\n const unit = m?.[2] || 'px';\n const fsNum = m ? parseFloat(m[1]) : 16;\n const fs = `${fsNum}${unit}`;\n\n const to = (n: number) => `${Math.round(n * 100) / 100}${unit}`;\n const clamp = (n: number, min: number, max: number) =>\n Math.max(min, Math.min(max, n));\n\n const titleFs = fs;\n const messageFs = clamp(fsNum * 0.875, 11, 16);\n const py = clamp(fsNum * 0.5, 3, 12);\n const px = clamp(fsNum * 0.75, 7, 16);\n const gap = clamp(fsNum * 0.5, 4, 12);\n const icon = clamp(fsNum * 1.25, 14, 24);\n const closeSize = clamp(fsNum * 1.5, 18, 32);\n const closeFont = clamp(fsNum * 1, 12, 20);\n const spinner = clamp(fsNum * 1, 12, 20);\n const stripWidth = clamp(fsNum * 0.25, 2, 6);\n const minHeight = clamp(fsNum * 2.25, 28, 44);\n\n return {\n padding: `${to(py)} ${to(px)}`,\n titleFontSize: titleFs,\n messageFontSize: to(messageFs),\n gap: to(gap),\n icon: to(icon),\n closeSize: to(closeSize),\n closeFontSize: to(closeFont),\n spinner: to(spinner),\n stripWidth: to(stripWidth),\n minHeight: to(minHeight),\n };\n }\n\n /** Recomputes style variables when visual inputs change. */\n override willUpdate(changedProperties: PropertyValues): void {\n super.willUpdate(changedProperties);\n\n if (\n changedProperties.has('color') ||\n changedProperties.has('variant') ||\n changedProperties.has('stripColor') ||\n changedProperties.has('radius') ||\n changedProperties.has('size')\n ) {\n this._updateStyleVars();\n }\n }\n\n /** Initializes actions-slot presence state after first render. */\n override firstUpdated(): void {\n queueMicrotask(() => this._checkActionsSlot());\n }\n\n /** Computes CSS custom properties from current variant, size, and color inputs. */\n private _updateStyleVars(): void {\n const baseColor = resolveColor(this.color);\n const textColor = resolveTextColorForToken(this.color);\n const stripColorResolved =\n this.stripColor === 'currentColor'\n ? baseColor\n : resolveColor(this.stripColor);\n\n const s = this._resolveSize(this.size);\n\n const semanticKey = resolveSemanticSurfaceKey(this.color);\n\n const variantStyles = {\n solid: {\n bg: baseColor,\n color: textColor,\n border: 'none',\n },\n flat: semanticKey\n ? semanticSoftSurfaceTokens(semanticKey)\n : {\n bg: fadeMix(baseColor, 20),\n color: hoverShade(baseColor, 30),\n border: 'none',\n },\n faded: semanticKey\n ? semanticSoftSurfaceTokens(semanticKey, { bordered: true })\n : {\n bg: 'var(--sky-hover-tertiary)',\n color: baseColor,\n border: '1px solid var(--sky-text-tertiary)',\n },\n bordered: {\n bg: 'transparent',\n color: semanticKey\n ? `var(--sky-${semanticKey}-primary-dark)`\n : baseColor,\n border: `2px solid ${baseColor}`,\n },\n light: {\n bg: 'transparent',\n color: semanticKey\n ? `var(--sky-${semanticKey}-primary-dark)`\n : baseColor,\n border: 'none',\n },\n } as const;\n\n const currentVariant =\n this.variant in variantStyles\n ? (this.variant as keyof typeof variantStyles)\n : 'flat';\n\n let v = tuneSurfaceVariantForDefaultColor(\n this.color,\n currentVariant,\n variantStyles[currentVariant]\n );\n\n if (\n isDefaultColorToken(this.color) &&\n (currentVariant === 'flat' || currentVariant === 'faded')\n ) {\n v = {\n ...v,\n bg: 'var(--sky-glass-solid)',\n color: 'var(--sky-text-primary)',\n border:\n currentVariant === 'faded' ? skyBorderPrimaryShorthand() : 'none',\n };\n }\n\n let closeBg = 'var(--sky-hover-primary)';\n let closeColor = 'currentColor';\n let closeHoverBg = 'var(--sky-hover-secondary)';\n let closeHoverColor = 'currentColor';\n\n if (currentVariant === 'solid') {\n closeBg = fadeMix(textColor, 20);\n closeColor = textColor;\n closeHoverBg = fadeMix(textColor, 30);\n closeHoverColor = textColor;\n } else if (currentVariant === 'flat' || currentVariant === 'faded') {\n if (semanticKey) {\n closeBg = `var(--sky-${semanticKey}-g0)`;\n closeColor = v.color;\n closeHoverBg = `var(--sky-${semanticKey}-g1)`;\n closeHoverColor = v.color;\n } else if (isDefaultColorToken(this.color)) {\n closeBg = 'var(--sky-hover-primary)';\n closeColor = v.color;\n closeHoverBg = 'var(--sky-hover-secondary)';\n closeHoverColor = v.color;\n } else {\n closeBg = fadeMix(baseColor, 15);\n closeColor = v.color;\n closeHoverBg = fadeMix(baseColor, 25);\n closeHoverColor = v.color;\n }\n }\n\n this._styleVars = {\n '--alert-bg': v.bg,\n '--alert-color': v.color,\n '--alert-border': v.border,\n '--alert-radius': resolveRadius(this.radius),\n '--alert-padding': s.padding,\n '--alert-gap': s.gap,\n '--alert-min-height': s.minHeight,\n '--title-font-size': s.titleFontSize,\n '--message-font-size': s.messageFontSize,\n '--icon-size': s.icon,\n '--close-size': s.closeSize,\n '--close-font-size': s.closeFontSize,\n '--spinner-size': s.spinner,\n '--strip-color': stripColorResolved,\n '--strip-width': s.stripWidth,\n '--close-bg': closeBg,\n '--close-color': closeColor,\n '--close-hover-bg': closeHoverBg,\n '--close-hover-color': closeHoverColor,\n };\n }\n\n /**\n * Dispatches `alert-closed` and removes the alert from the DOM.\n *\n * @returns {void}\n */\n public close(): void {\n const evt = new CustomEvent<SkyAlertClosedEventDetail>('alert-closed', {\n detail: { title: this.title, message: this.message },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(evt);\n this.remove();\n }\n\n /** Returns the ARIA role applied to the alert container. */\n private getAriaRole(): SkyAlertRoleType {\n return this.roleType;\n }\n\n /** Checks whether the actions slot currently has meaningful assigned content. */\n private _checkActionsSlot(): void {\n const slot = this.renderRoot?.querySelector<HTMLSlotElement>(\n 'slot[name=\"actions\"]'\n );\n if (!slot) return;\n const nodes = slot.assignedNodes({ flatten: true });\n const hasContent = nodes.some(\n (n) =>\n n.nodeType !== Node.TEXT_NODE || (n.textContent?.trim().length ?? 0) > 0\n );\n if (hasContent !== this._hasActionsSlotContent) {\n this._hasActionsSlotContent = hasContent;\n }\n }\n\n /** Updates action-slot state when the slot assignment changes. */\n private _onActionsSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n const nodes = slot.assignedNodes({ flatten: true });\n const hasContent = nodes.some(\n (n) =>\n n.nodeType !== Node.TEXT_NODE || (n.textContent?.trim().length ?? 0) > 0\n );\n this._hasActionsSlotContent = hasContent;\n }\n\n override render() {\n const roleAttr = this.getAriaRole();\n const alertClasses = classMap({\n alert: true,\n [this.variant]: true,\n 'strip-start': this.strip === 'start' || this.strip === 'both',\n 'strip-end': this.strip === 'end' || this.strip === 'both',\n });\n\n return html`\n <div\n part=\"alert\"\n class=${alertClasses}\n role=\"${roleAttr}\"\n aria-live=\"${this.roleType === 'alert' ? 'assertive' : 'polite'}\"\n style=${styleMap(this._styleVars)}\n >\n ${when(\n this.icon,\n () =>\n html`<sky-icon\n part=\"icon\"\n class=\"icon\"\n icon=\"${this.icon!}\"\n ></sky-icon>`\n )}\n\n <div part=\"content\" class=\"content\">\n ${when(\n this.title,\n () => html`<div part=\"title\" class=\"title\">${this.title}</div>`\n )}\n ${when(\n this.message,\n () => html`<p part=\"message\" class=\"message\">${this.message}</p>`,\n () => html`<slot></slot>`\n )}\n </div>\n\n ${when(\n this._hasActionsSlotContent || this.removable,\n () => html`\n <div part=\"actions\" class=\"actions\">\n <slot\n name=\"actions\"\n @slotchange=${this._onActionsSlotChange}\n ></slot>\n ${when(\n this.removable,\n () => html`\n <button\n part=\"close-button\"\n class=\"close-button\"\n type=\"button\"\n @click=${this.close}\n aria-label=\"Dismiss alert\"\n title=\"Dismiss\"\n >\n <sky-icon icon=\"ion:close\"></sky-icon>\n </button>\n `\n )}\n </div>\n `,\n () => html`\n <div class=\"actions-slot-placeholder\" aria-hidden=\"true\">\n <slot\n name=\"actions\"\n @slotchange=${this._onActionsSlotChange}\n ></slot>\n </div>\n `\n )}\n ${when(\n this.loading,\n () => html`\n <div part=\"loading-overlay\" class=\"loading-overlay\">\n <div part=\"loading-spinner\" class=\"loading-spinner\"></div>\n </div>\n `\n )}\n </div>\n `;\n }\n}\n"],"names":["SkyAlert","LitElement","constructor","super","arguments","this","title","message","removable","color","size","radius","icon","strip","stripColor","variant","loading","roleType","_styleVars","_sizeCache","_hasActionsSlotContent","_resolveSize","input","key","String","trim","result","presets","xs","padding","titleFontSize","messageFontSize","gap","closeSize","closeFontSize","spinner","stripWidth","minHeight","sm","md","lg","xl","m","match","unit","fsNum","parseFloat","to","n","Math","round","clamp","min","max","titleFs","messageFs","py","px","closeFont","willUpdate","changedProperties","has","_updateStyleVars","firstUpdated","queueMicrotask","_checkActionsSlot","baseColor","resolveColor","textColor","resolveTextColorForToken","stripColorResolved","s","semanticKey","resolveSemanticSurfaceKey","variantStyles","solid","bg","border","flat","semanticSoftSurfaceTokens","fadeMix","hoverShade","faded","bordered","light","currentVariant","v","tuneSurfaceVariantForDefaultColor","isDefaultColorToken","skyBorderPrimaryShorthand","closeBg","closeColor","closeHoverBg","closeHoverColor","resolveRadius","close","evt","CustomEvent","detail","bubbles","composed","dispatchEvent","remove","getAriaRole","slot","renderRoot","querySelector","hasContent","assignedNodes","flatten","some","nodeType","Node","TEXT_NODE","textContent","length","_onActionsSlotChange","e","target","render","roleAttr","alertClasses","classMap","alert","html","styleMap","when","dependencies","SkyIcon","styles","css","unsafeCSS","cssOnFillEnhance","selector","fillVar","__decorateClass","property","type","prototype","Boolean","reflect","state","customElement"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { LitElement, PropertyValues } from "lit";
1
+ import { LitElement, PropertyValues } from 'lit';
2
2
  /**
3
3
  * @element sky-appbar
4
4
  *
@@ -7,7 +7,7 @@ import { LitElement, PropertyValues } from "lit";
7
7
  * @status stable
8
8
  * @since 1.0.0
9
9
  *
10
- * @documentation https://library.sky-ui.com/components/appbar
10
+ * @documentation https://sky-ui.com/components/appbar
11
11
  * @dependency sky-icon
12
12
  *
13
13
  * @slot button - Leading area (e.g., menu/back button). Defaults to a hamburger icon.
@@ -1,8 +1,8 @@
1
- import{css as t,LitElement as e,nothing as r,html as o}from"lit";import{property as a,customElement as n}from"lit/decorators.js";import{isDefaultColorToken as i,resolveColor as s,resolveTextColorForToken as l}from"../helper/utils/color-resolver.js";import{SkyIcon as d}from"../sky-icon/sky-icon.js";var c=Object.defineProperty,p=Object.getOwnPropertyDescriptor,b=(t,e,r,o)=>{for(var a,n=o>1?void 0:o?p(e,r):e,i=t.length-1;i>=0;i--)(a=t[i])&&(n=(o?a(e,r,n):a(n))||n);return o&&n&&c(e,r,n),n};let y=class extends e{constructor(){super(...arguments),this.title="App Bar",this.color="default",this.url="",this.banner=!0,this.dense=!1,this.elevated=!1,this.leadingLabel="Open menu"}_applyColorSurface(){if(!i(this.color))return this.setAttribute("data-surface","solid"),this.style.setProperty("--appbar-bg-color",s(this.color)),void this.style.setProperty("--appbar-text-color",l(this.color));this.removeAttribute("data-surface"),this.style.removeProperty("--appbar-bg-color"),this.style.removeProperty("--appbar-text-color")}connectedCallback(){super.connectedCallback(),this._applyColorSurface(),this._applyBackgroundImage()}_applyBackgroundImage(){const t=this.url?`url(${this.url})`:"none";this.style.setProperty("--appbar-bg-image",t)}updated(t){t.has("color")&&this._applyColorSurface(),t.has("url")&&this._applyBackgroundImage()}render(){return o`
2
- ${this.url?o`
3
- <div class="background" aria-hidden="true"></div>
4
- <div class="background-overlay" aria-hidden="true"></div>
5
- `:r}
1
+ import{unsafeCSS as t,css as e,LitElement as r,nothing as o,html as a}from"lit";import{property as n,customElement as s}from"lit/decorators.js";import{isDefaultColorToken as i,resolveColor as l,resolveTextColorForToken as d}from"../helper/utils/color-resolver.js";import{cssOnFillEnhance as c}from"../helper/utils/contrast-color.js";import{SkyIcon as p}from"../sky-icon/sky-icon.js";var b=Object.defineProperty,y=Object.getOwnPropertyDescriptor,u=(t,e,r,o)=>{for(var a,n=o>1?void 0:o?y(e,r):e,s=t.length-1;s>=0;s--)(a=t[s])&&(n=(o?a(e,r,n):a(n))||n);return o&&n&&b(e,r,n),n};let k=class extends r{constructor(){super(...arguments),this.title="App Bar",this.color="default",this.url="",this.banner=!0,this.dense=!1,this.elevated=!1,this.leadingLabel="Open menu"}_applyColorSurface(){if(!i(this.color))return this.setAttribute("data-surface","solid"),this.style.setProperty("--appbar-bg-color",l(this.color)),void this.style.setProperty("--appbar-text-color",d(this.color));this.removeAttribute("data-surface"),this.style.removeProperty("--appbar-bg-color"),this.style.removeProperty("--appbar-text-color")}connectedCallback(){super.connectedCallback(),this._applyColorSurface(),this._applyBackgroundImage()}_applyBackgroundImage(){const t=this.url?`url(${this.url})`:"none";this.style.setProperty("--appbar-bg-image",t)}updated(t){t.has("color")&&this._applyColorSurface(),t.has("url")&&this._applyBackgroundImage()}render(){return a`
2
+ ${this.url?a`
3
+ <div class="background" aria-hidden="true"></div>
4
+ <div class="background-overlay" aria-hidden="true"></div>
5
+ `:o}
6
6
  <div
7
7
  class="content"
8
8
  part="content"
@@ -26,7 +26,7 @@ import{css as t,LitElement as e,nothing as r,html as o}from"lit";import{property
26
26
  <slot></slot>
27
27
  </div>
28
28
  </div>
29
- `}};y.dependencies={"sky-icon":d},y.styles=t`
29
+ `}};k.dependencies={"sky-icon":p},k.styles=e`
30
30
  :host {
31
31
  width: 100%;
32
32
  display: flex;
@@ -39,24 +39,18 @@ import{css as t,LitElement as e,nothing as r,html as o}from"lit";import{property
39
39
  transition: var(--sky-transition-default);
40
40
  }
41
41
 
42
- :host(:not([data-surface="solid"])) {
42
+ :host(:not([data-surface='solid'])) {
43
43
  background: var(--sky-glass-secondary);
44
44
  background-image: var(--sky-glass-surface);
45
- backdrop-filter:
46
- var(--sky-blur-secondary)
47
- var(--sky-saturation-secondary)
48
- var(--sky-brightness-secondary);
49
- -webkit-backdrop-filter:
50
- var(--sky-blur-secondary)
51
- var(--sky-saturation-secondary)
45
+ backdrop-filter: var(--sky-blur-secondary) var(--sky-saturation-secondary)
52
46
  var(--sky-brightness-secondary);
47
+ -webkit-backdrop-filter: var(--sky-blur-secondary)
48
+ var(--sky-saturation-secondary) var(--sky-brightness-secondary);
53
49
  border-bottom: var(--sky-border-secondary);
54
- box-shadow:
55
- var(--sky-box-shadow-inset),
56
- var(--sky-box-shadow-primary);
50
+ box-shadow: var(--sky-box-shadow-inset), var(--sky-box-shadow-primary);
57
51
  }
58
52
 
59
- :host([data-surface="solid"]) {
53
+ :host([data-surface='solid']) {
60
54
  background-color: var(--appbar-bg-color);
61
55
  color: var(--appbar-text-color);
62
56
  backdrop-filter: none;
@@ -65,13 +59,11 @@ import{css as t,LitElement as e,nothing as r,html as o}from"lit";import{property
65
59
  box-shadow: var(--sky-box-shadow-primary);
66
60
  }
67
61
 
68
- :host([elevated]:not([data-surface="solid"])) {
69
- box-shadow:
70
- var(--sky-box-shadow-inset),
71
- var(--sky-box-shadow-secondary);
62
+ :host([elevated]:not([data-surface='solid'])) {
63
+ box-shadow: var(--sky-box-shadow-inset), var(--sky-box-shadow-secondary);
72
64
  }
73
65
 
74
- :host([elevated][data-surface="solid"]) {
66
+ :host([elevated][data-surface='solid']) {
75
67
  box-shadow: var(--sky-box-shadow-secondary);
76
68
  }
77
69
 
@@ -187,13 +179,13 @@ import{css as t,LitElement as e,nothing as r,html as o}from"lit";import{property
187
179
  }
188
180
 
189
181
  .actions ::slotted(button),
190
- .actions ::slotted([role="button"]) {
182
+ .actions ::slotted([role='button']) {
191
183
  min-width: var(--sky-touch-target, 44px);
192
184
  min-height: var(--sky-touch-target, 44px);
193
185
  box-sizing: border-box;
194
186
  }
195
187
 
196
- :host-context([dir="rtl"]) .leading-button .icon {
188
+ :host-context([dir='rtl']) .leading-button .icon {
197
189
  transform: scaleX(-1);
198
190
  }
199
191
 
@@ -206,10 +198,11 @@ import{css as t,LitElement as e,nothing as r,html as o}from"lit";import{property
206
198
  transition: none;
207
199
  }
208
200
 
209
- :host-context([dir="rtl"]) .leading-button .icon {
201
+ :host-context([dir='rtl']) .leading-button .icon {
210
202
  transform: none;
211
203
  }
212
204
  }
213
205
 
214
- `,b([a({type:String})],y.prototype,"title",2),b([a({type:String})],y.prototype,"color",2),b([a({type:String})],y.prototype,"url",2),b([a({type:Boolean})],y.prototype,"banner",2),b([a({type:Boolean})],y.prototype,"dense",2),b([a({type:Boolean})],y.prototype,"elevated",2),b([a({type:String})],y.prototype,"leadingLabel",2),y=b([n("sky-appbar")],y);export{y as SkyAppbar};
206
+ ${t(c([{selector:':host([data-surface="solid"])',fillVar:"--appbar-bg-color"}]))}
207
+ `,u([n({type:String})],k.prototype,"title",2),u([n({type:String})],k.prototype,"color",2),u([n({type:String})],k.prototype,"url",2),u([n({type:Boolean})],k.prototype,"banner",2),u([n({type:Boolean})],k.prototype,"dense",2),u([n({type:Boolean})],k.prototype,"elevated",2),u([n({type:String})],k.prototype,"leadingLabel",2),k=u([s("sky-appbar")],k);export{k as SkyAppbar};
215
208
  //# sourceMappingURL=sky-appbar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sky-appbar.js","sources":["../../src/sky-appbar/sky-appbar.ts"],"sourcesContent":["import { LitElement, html, css, PropertyValues, nothing } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport {\r\n resolveColor,\r\n resolveTextColorForToken,\r\n isDefaultColorToken,\r\n} from \"../helper/utils/color-resolver\";\r\nimport { SkyIcon } from \"../sky-icon/sky-icon.js\";\r\n\r\n/**\r\n * @element sky-appbar\r\n *\r\n * @summary Application top bar with title, optional leading control, trailing actions, and optional color/image background.\r\n *\r\n * @status stable\r\n * @since 1.0.0\r\n *\r\n * @documentation https://library.sky-ui.com/components/appbar\r\n * @dependency sky-icon\r\n *\r\n * @slot button - Leading area (e.g., menu/back button). Defaults to a hamburger icon.\r\n * @slot - Trailing actions (icons/buttons). This is the default slot.\r\n *\r\n * @property {string} title - Title text displayed in the app bar.\r\n * @property {string} color - Semantic token or CSS color for bar background; foreground color is derived for contrast.\r\n * @property {string} url - Background image URL.\r\n * @property {boolean} banner - Uses `role=\"banner\"` when true, otherwise `role=\"group\"`.\r\n * @property {boolean} dense - Enables compact vertical spacing.\r\n * @property {boolean} elevated - Applies elevated shadow styling.\r\n * @property {string} leadingLabel - Accessible label for default leading button fallback.\r\n *\r\n * @csspart content - Wrapper that contains the leading slot, title, and actions.\r\n * @csspart leading - Container for the leading slot (e.g. menu button).\r\n * @csspart title - The title area (contains .title-text with the title string).\r\n * @csspart actions - The trailing actions container.\r\n *\r\n * @Behavior\r\n * - `color` resolves background via `resolveColor()` and text/icon color via `resolveTextColorForToken()`.\r\n * - `url` renders a background layer behind content.\r\n * - `banner` should be true only for the primary page app bar landmark.\r\n * - In RTL contexts, the default leading icon is mirrored unless reduced motion is enabled.\r\n *\r\n * @example\r\n * ```html\r\n * <sky-appbar title=\"Dashboard\" color=\"primary\" dense>\r\n * <button slot=\"button\">Menu</button>\r\n * <sky-icon icon=\"ion:search\"></sky-icon>\r\n * </sky-appbar>\r\n * ```\r\n * ```vue\r\n * <template>\r\n * <sky-appbar title=\"Dashboard\" color=\"primary\" dense>\r\n * <button slot=\"button\">Menu</button>\r\n * <sky-icon icon=\"ion:search\"></sky-icon>\r\n * </sky-appbar>\r\n * </template>\r\n * ```\r\n * ```jsx\r\n * export default function Demo() {\r\n * return (\r\n * <sky-appbar title=\"Dashboard\" color=\"primary\" dense>\r\n * <button slot=\"button\">Menu</button>\r\n * <sky-icon icon=\"ion:search\"></sky-icon>\r\n * </sky-appbar>\r\n * );\r\n * }\r\n * ```\r\n */\r\n@customElement(\"sky-appbar\")\r\nexport class SkyAppbar extends LitElement {\r\n\r\n static dependencies: Record<string, CustomElementConstructor> = {\r\n \"sky-icon\": SkyIcon,\r\n };\r\n\r\n /** Title text displayed in the app bar. @default \"App Bar\" */\r\n @property({ type: String }) title = \"App Bar\";\r\n\r\n /**\r\n * Bar background token or CSS color; when set, foreground uses `resolveTextColorForToken` for contrast.\r\n * @default \"default\"\r\n */\r\n @property({ type: String }) color = \"default\";\r\n\r\n /** Background image URL. @default \"\" */\r\n @property({ type: String }) url = \"\";\r\n\r\n /** When true, the bar has role=\"banner\" (main app header). Set false for secondary bars. @default true */\r\n @property({ type: Boolean }) banner = true;\r\n\r\n /** When true, reduces vertical padding for a compact bar. @default false */\r\n @property({ type: Boolean }) dense = false;\r\n\r\n /** When true, applies stronger shadow (e.g. for sticky bar after scroll). @default false */\r\n @property({ type: Boolean }) elevated = false;\r\n\r\n /** Accessible label for the default leading button when no slot content is provided. @default \"Open menu\" */\r\n @property({ type: String }) leadingLabel = \"Open menu\";\r\n\r\n static override styles = css`\r\n :host {\r\n width: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n position: relative;\r\n font-family: var(--sky-font);\r\n overflow: hidden;\r\n color: var(--appbar-text-color, var(--sky-text-primary));\r\n transition: var(--sky-transition-default);\r\n }\r\n\r\n :host(:not([data-surface=\"solid\"])) {\r\n background: var(--sky-glass-secondary);\r\n background-image: var(--sky-glass-surface);\r\n backdrop-filter:\r\n var(--sky-blur-secondary)\r\n var(--sky-saturation-secondary)\r\n var(--sky-brightness-secondary);\r\n -webkit-backdrop-filter:\r\n var(--sky-blur-secondary)\r\n var(--sky-saturation-secondary)\r\n var(--sky-brightness-secondary);\r\n border-bottom: var(--sky-border-secondary);\r\n box-shadow:\r\n var(--sky-box-shadow-inset),\r\n var(--sky-box-shadow-primary);\r\n }\r\n\r\n :host([data-surface=\"solid\"]) {\r\n background-color: var(--appbar-bg-color);\r\n color: var(--appbar-text-color);\r\n backdrop-filter: none;\r\n -webkit-backdrop-filter: none;\r\n border-bottom: var(--sky-border-primary);\r\n box-shadow: var(--sky-box-shadow-primary);\r\n }\r\n\r\n :host([elevated]:not([data-surface=\"solid\"])) {\r\n box-shadow:\r\n var(--sky-box-shadow-inset),\r\n var(--sky-box-shadow-secondary);\r\n }\r\n\r\n :host([elevated][data-surface=\"solid\"]) {\r\n box-shadow: var(--sky-box-shadow-secondary);\r\n }\r\n\r\n .background {\r\n position: absolute;\r\n inset: 0;\r\n width: 100%;\r\n height: 100%;\r\n background-image: var(--appbar-bg-image, none);\r\n background-size: cover;\r\n background-position: center;\r\n z-index: -2;\r\n pointer-events: none;\r\n }\r\n\r\n .background-overlay {\r\n position: absolute;\r\n inset: 0;\r\n background: var(--appbar-bg-overlay, transparent);\r\n z-index: -1;\r\n pointer-events: none;\r\n backdrop-filter: none;\r\n -webkit-backdrop-filter: none;\r\n }\r\n\r\n .content {\r\n display: flex;\r\n padding: var(--sky-space-2, 8px) var(--sky-space-4, 16px);\r\n align-items: center;\r\n justify-content: space-between;\r\n width: 100%;\r\n position: relative;\r\n gap: var(--sky-space-2, 8px);\r\n backdrop-filter: none;\r\n -webkit-backdrop-filter: none;\r\n }\r\n\r\n :host([dense]) .content {\r\n padding-block: var(--sky-space-1, 4px);\r\n }\r\n\r\n .title-area {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n padding-inline-start: var(--sky-space-2\\\\.5, 10px);\r\n }\r\n\r\n .title-text {\r\n font: var(--sky-text-title);\r\n backdrop-filter: none;\r\n -webkit-backdrop-filter: none;\r\n }\r\n\r\n .leading {\r\n display: flex;\r\n align-items: center;\r\n flex-shrink: 0;\r\n backdrop-filter: none;\r\n -webkit-backdrop-filter: none;\r\n }\r\n\r\n .leading ::slotted(*) {\r\n cursor: pointer;\r\n }\r\n\r\n .leading-button {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n background: none;\r\n cursor: pointer;\r\n font: inherit;\r\n color: inherit;\r\n -webkit-tap-highlight-color: transparent;\r\n min-width: var(--sky-touch-target, 44px);\r\n min-height: var(--sky-touch-target, 44px);\r\n box-sizing: border-box;\r\n border-radius: var(--sky-radius-primary);\r\n backdrop-filter: none;\r\n -webkit-backdrop-filter: none;\r\n transition: var(--sky-transition-fast);\r\n }\r\n\r\n .leading-button:hover {\r\n background: var(--sky-hover-primary);\r\n }\r\n\r\n .leading-button:focus-visible,\r\n .leading ::slotted(*:focus-visible),\r\n .actions ::slotted(*:focus-visible) {\r\n outline: none;\r\n box-shadow: var(--sky-focus-ring);\r\n }\r\n\r\n .icon {\r\n cursor: pointer;\r\n font-size: var(--sky-font-size-xl, 1.25rem);\r\n display: flex;\r\n align-items: center;\r\n }\r\n\r\n .actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--sky-space-2, 8px);\r\n padding-inline-start: var(--sky-space-2\\\\.5, 10px);\r\n flex-shrink: 0;\r\n backdrop-filter: none;\r\n -webkit-backdrop-filter: none;\r\n }\r\n\r\n .actions ::slotted(button),\r\n .actions ::slotted([role=\"button\"]) {\r\n min-width: var(--sky-touch-target, 44px);\r\n min-height: var(--sky-touch-target, 44px);\r\n box-sizing: border-box;\r\n }\r\n\r\n :host-context([dir=\"rtl\"]) .leading-button .icon {\r\n transform: scaleX(-1);\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n :host,\r\n .content,\r\n .leading-button,\r\n .leading ::slotted(*),\r\n .actions ::slotted(*) {\r\n transition: none;\r\n }\r\n\r\n :host-context([dir=\"rtl\"]) .leading-button .icon {\r\n transform: none;\r\n }\r\n }\r\n\r\n `;\r\n\r\n /** Applies glass vs solid surface tokens from `color`. */\r\n private _applyColorSurface(): void {\r\n if (!isDefaultColorToken(this.color)) {\r\n this.setAttribute(\"data-surface\", \"solid\");\r\n this.style.setProperty(\"--appbar-bg-color\", resolveColor(this.color));\r\n this.style.setProperty(\r\n \"--appbar-text-color\",\r\n resolveTextColorForToken(this.color),\r\n );\r\n return;\r\n }\r\n\r\n this.removeAttribute(\"data-surface\");\r\n this.style.removeProperty(\"--appbar-bg-color\");\r\n this.style.removeProperty(\"--appbar-text-color\");\r\n }\r\n\r\n override connectedCallback(): void {\r\n super.connectedCallback();\r\n this._applyColorSurface();\r\n this._applyBackgroundImage();\r\n }\r\n\r\n /** Sets background image CSS variable from `url`. */\r\n private _applyBackgroundImage(): void {\r\n const image = this.url ? `url(${this.url})` : \"none\";\r\n this.style.setProperty(\"--appbar-bg-image\", image);\r\n }\r\n\r\n /** Updates host style variables when visual input properties change. */\r\n protected override updated(changedProperties: PropertyValues): void {\r\n if (changedProperties.has(\"color\")) {\r\n this._applyColorSurface();\r\n }\r\n\r\n if (changedProperties.has(\"url\")) {\r\n this._applyBackgroundImage();\r\n }\r\n }\r\n\r\n override render() {\r\n return html`\r\n ${this.url\r\n ? html`\r\n <div class=\"background\" aria-hidden=\"true\"></div>\r\n <div class=\"background-overlay\" aria-hidden=\"true\"></div>\r\n `\r\n : nothing}\r\n <div\r\n class=\"content\"\r\n part=\"content\"\r\n role=\"${this.banner ? \"banner\" : \"group\"}\"\r\n >\r\n <div class=\"leading\" part=\"leading\">\r\n <slot name=\"button\">\r\n <button\r\n type=\"button\"\r\n class=\"leading-button\"\r\n aria-label=\"${this.leadingLabel}\"\r\n >\r\n <sky-icon class=\"icon\" icon=\"mdi:menu\"></sky-icon>\r\n </button>\r\n </slot>\r\n </div>\r\n <div class=\"title-area\" part=\"title\">\r\n <span class=\"title-text\">${this.title}</span>\r\n </div>\r\n <div class=\"actions\" part=\"actions\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n"],"names":["SkyAppbar","LitElement","constructor","super","arguments","this","title","color","url","banner","dense","elevated","leadingLabel","_applyColorSurface","isDefaultColorToken","setAttribute","style","setProperty","resolveColor","resolveTextColorForToken","removeAttribute","removeProperty","connectedCallback","_applyBackgroundImage","image","updated","changedProperties","has","render","html","nothing","dependencies","SkyIcon","styles","css","__decorateClass","property","type","String","prototype","Boolean","customElement"],"mappings":"2eAqEO,IAAMA,EAAN,cAAwBC,EAAxB,WAAAC,GAAAC,SAAAC,WAOuBC,KAAAC,MAAQ,UAMRD,KAAAE,MAAQ,UAGRF,KAAAG,IAAM,GAGLH,KAAAI,QAAS,EAGTJ,KAAAK,OAAQ,EAGRL,KAAAM,UAAW,EAGZN,KAAAO,aAAe,WAAA,CA8LnC,kBAAAC,GACN,IAAKC,EAAoBT,KAAKE,OAO5B,OANAF,KAAKU,aAAa,eAAgB,SAClCV,KAAKW,MAAMC,YAAY,oBAAqBC,EAAab,KAAKE,aAC9DF,KAAKW,MAAMC,YACT,sBACAE,EAAyBd,KAAKE,QAKlCF,KAAKe,gBAAgB,gBACrBf,KAAKW,MAAMK,eAAe,qBAC1BhB,KAAKW,MAAMK,eAAe,sBAC5B,CAES,iBAAAC,GACPnB,MAAMmB,oBACNjB,KAAKQ,qBACLR,KAAKkB,uBACP,CAGQ,qBAAAA,GACN,MAAMC,EAAQnB,KAAKG,IAAM,OAAOH,KAAKG,OAAS,OAC9CH,KAAKW,MAAMC,YAAY,oBAAqBO,EAC9C,CAGmB,OAAAC,CAAQC,GACrBA,EAAkBC,IAAI,UACxBtB,KAAKQ,qBAGHa,EAAkBC,IAAI,QACxBtB,KAAKkB,uBAET,CAES,MAAAK,GACP,OAAOC,CAAA;QACHxB,KAAKG,IACHqB,CAAA;;;YAIAC;;;;gBAIMzB,KAAKI,OAAS,SAAW;;;;;;;4BAObJ,KAAKO;;;;;;;qCAOIP,KAAKC;;;;;;KAOxC,GAjSWN,EAEJ+B,aAAyD,CAC9D,WAAYC,GAHHhC,EA8BKiC,OAASC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAvBGC,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UAPPtC,EAOiBuC,UAAA,QAAA,GAMAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UAbPtC,EAaiBuC,UAAA,QAAA,GAGAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UAhBPtC,EAgBiBuC,UAAA,MAAA,GAGCJ,EAAA,CAA5BC,EAAS,CAAEC,KAAMG,WAnBPxC,EAmBkBuC,UAAA,SAAA,GAGAJ,EAAA,CAA5BC,EAAS,CAAEC,KAAMG,WAtBPxC,EAsBkBuC,UAAA,QAAA,GAGAJ,EAAA,CAA5BC,EAAS,CAAEC,KAAMG,WAzBPxC,EAyBkBuC,UAAA,WAAA,GAGDJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UA5BPtC,EA4BiBuC,UAAA,eAAA,GA5BjBvC,EAANmC,EAAA,CADNM,EAAc,eACFzC"}
1
+ {"version":3,"file":"sky-appbar.js","sources":["../../src/sky-appbar/sky-appbar.ts"],"sourcesContent":["import { LitElement, html, css, PropertyValues, nothing, unsafeCSS } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport {\n resolveColor,\n resolveTextColorForToken,\n isDefaultColorToken,\n} from '../helper/utils/color-resolver';\nimport { cssOnFillEnhance } from '../helper/utils/contrast-color';\nimport { SkyIcon } from '../sky-icon/sky-icon.js';\n\n/**\n * @element sky-appbar\n *\n * @summary Application top bar with title, optional leading control, trailing actions, and optional color/image background.\n *\n * @status stable\n * @since 1.0.0\n *\n * @documentation https://sky-ui.com/components/appbar\n * @dependency sky-icon\n *\n * @slot button - Leading area (e.g., menu/back button). Defaults to a hamburger icon.\n * @slot - Trailing actions (icons/buttons). This is the default slot.\n *\n * @property {string} title - Title text displayed in the app bar.\n * @property {string} color - Semantic token or CSS color for bar background; foreground color is derived for contrast.\n * @property {string} url - Background image URL.\n * @property {boolean} banner - Uses `role=\"banner\"` when true, otherwise `role=\"group\"`.\n * @property {boolean} dense - Enables compact vertical spacing.\n * @property {boolean} elevated - Applies elevated shadow styling.\n * @property {string} leadingLabel - Accessible label for default leading button fallback.\n *\n * @csspart content - Wrapper that contains the leading slot, title, and actions.\n * @csspart leading - Container for the leading slot (e.g. menu button).\n * @csspart title - The title area (contains .title-text with the title string).\n * @csspart actions - The trailing actions container.\n *\n * @Behavior\n * - `color` resolves background via `resolveColor()` and text/icon color via `resolveTextColorForToken()`.\n * - `url` renders a background layer behind content.\n * - `banner` should be true only for the primary page app bar landmark.\n * - In RTL contexts, the default leading icon is mirrored unless reduced motion is enabled.\n *\n * @example\n * ```html\n * <sky-appbar title=\"Dashboard\" color=\"primary\" dense>\n * <button slot=\"button\">Menu</button>\n * <sky-icon icon=\"ion:search\"></sky-icon>\n * </sky-appbar>\n * ```\n * ```vue\n * <template>\n * <sky-appbar title=\"Dashboard\" color=\"primary\" dense>\n * <button slot=\"button\">Menu</button>\n * <sky-icon icon=\"ion:search\"></sky-icon>\n * </sky-appbar>\n * </template>\n * ```\n * ```jsx\n * export default function Demo() {\n * return (\n * <sky-appbar title=\"Dashboard\" color=\"primary\" dense>\n * <button slot=\"button\">Menu</button>\n * <sky-icon icon=\"ion:search\"></sky-icon>\n * </sky-appbar>\n * );\n * }\n * ```\n */\n@customElement('sky-appbar')\nexport class SkyAppbar extends LitElement {\n static dependencies: Record<string, CustomElementConstructor> = {\n 'sky-icon': SkyIcon,\n };\n\n /** Title text displayed in the app bar. @default \"App Bar\" */\n @property({ type: String }) title = 'App Bar';\n\n /**\n * Bar background token or CSS color; when set, foreground uses `resolveTextColorForToken` for contrast.\n * @default \"default\"\n */\n @property({ type: String }) color = 'default';\n\n /** Background image URL. @default \"\" */\n @property({ type: String }) url = '';\n\n /** When true, the bar has role=\"banner\" (main app header). Set false for secondary bars. @default true */\n @property({ type: Boolean }) banner = true;\n\n /** When true, reduces vertical padding for a compact bar. @default false */\n @property({ type: Boolean }) dense = false;\n\n /** When true, applies stronger shadow (e.g. for sticky bar after scroll). @default false */\n @property({ type: Boolean }) elevated = false;\n\n /** Accessible label for the default leading button when no slot content is provided. @default \"Open menu\" */\n @property({ type: String }) leadingLabel = 'Open menu';\n\n static override styles = css`\n :host {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n position: relative;\n font-family: var(--sky-font);\n overflow: hidden;\n color: var(--appbar-text-color, var(--sky-text-primary));\n transition: var(--sky-transition-default);\n }\n\n :host(:not([data-surface='solid'])) {\n background: var(--sky-glass-secondary);\n background-image: var(--sky-glass-surface);\n backdrop-filter: var(--sky-blur-secondary) var(--sky-saturation-secondary)\n var(--sky-brightness-secondary);\n -webkit-backdrop-filter: var(--sky-blur-secondary)\n var(--sky-saturation-secondary) var(--sky-brightness-secondary);\n border-bottom: var(--sky-border-secondary);\n box-shadow: var(--sky-box-shadow-inset), var(--sky-box-shadow-primary);\n }\n\n :host([data-surface='solid']) {\n background-color: var(--appbar-bg-color);\n color: var(--appbar-text-color);\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n border-bottom: var(--sky-border-primary);\n box-shadow: var(--sky-box-shadow-primary);\n }\n\n :host([elevated]:not([data-surface='solid'])) {\n box-shadow: var(--sky-box-shadow-inset), var(--sky-box-shadow-secondary);\n }\n\n :host([elevated][data-surface='solid']) {\n box-shadow: var(--sky-box-shadow-secondary);\n }\n\n .background {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n background-image: var(--appbar-bg-image, none);\n background-size: cover;\n background-position: center;\n z-index: -2;\n pointer-events: none;\n }\n\n .background-overlay {\n position: absolute;\n inset: 0;\n background: var(--appbar-bg-overlay, transparent);\n z-index: -1;\n pointer-events: none;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n .content {\n display: flex;\n padding: var(--sky-space-2, 8px) var(--sky-space-4, 16px);\n align-items: center;\n justify-content: space-between;\n width: 100%;\n position: relative;\n gap: var(--sky-space-2, 8px);\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n :host([dense]) .content {\n padding-block: var(--sky-space-1, 4px);\n }\n\n .title-area {\n flex: 1 1 auto;\n min-width: 0;\n padding-inline-start: var(--sky-space-2\\\\.5, 10px);\n }\n\n .title-text {\n font: var(--sky-text-title);\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n .leading {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n .leading ::slotted(*) {\n cursor: pointer;\n }\n\n .leading-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n font: inherit;\n color: inherit;\n -webkit-tap-highlight-color: transparent;\n min-width: var(--sky-touch-target, 44px);\n min-height: var(--sky-touch-target, 44px);\n box-sizing: border-box;\n border-radius: var(--sky-radius-primary);\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n transition: var(--sky-transition-fast);\n }\n\n .leading-button:hover {\n background: var(--sky-hover-primary);\n }\n\n .leading-button:focus-visible,\n .leading ::slotted(*:focus-visible),\n .actions ::slotted(*:focus-visible) {\n outline: none;\n box-shadow: var(--sky-focus-ring);\n }\n\n .icon {\n cursor: pointer;\n font-size: var(--sky-font-size-xl, 1.25rem);\n display: flex;\n align-items: center;\n }\n\n .actions {\n display: flex;\n align-items: center;\n gap: var(--sky-space-2, 8px);\n padding-inline-start: var(--sky-space-2\\\\.5, 10px);\n flex-shrink: 0;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n .actions ::slotted(button),\n .actions ::slotted([role='button']) {\n min-width: var(--sky-touch-target, 44px);\n min-height: var(--sky-touch-target, 44px);\n box-sizing: border-box;\n }\n\n :host-context([dir='rtl']) .leading-button .icon {\n transform: scaleX(-1);\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host,\n .content,\n .leading-button,\n .leading ::slotted(*),\n .actions ::slotted(*) {\n transition: none;\n }\n\n :host-context([dir='rtl']) .leading-button .icon {\n transform: none;\n }\n }\n\n ${unsafeCSS(\n cssOnFillEnhance([\n {\n selector: ':host([data-surface=\"solid\"])',\n fillVar: '--appbar-bg-color',\n },\n ])\n )}\n `;\n\n /** Applies glass vs solid surface tokens from `color`. */\n private _applyColorSurface(): void {\n if (!isDefaultColorToken(this.color)) {\n this.setAttribute('data-surface', 'solid');\n this.style.setProperty('--appbar-bg-color', resolveColor(this.color));\n this.style.setProperty(\n '--appbar-text-color',\n resolveTextColorForToken(this.color)\n );\n return;\n }\n\n this.removeAttribute('data-surface');\n this.style.removeProperty('--appbar-bg-color');\n this.style.removeProperty('--appbar-text-color');\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._applyColorSurface();\n this._applyBackgroundImage();\n }\n\n /** Sets background image CSS variable from `url`. */\n private _applyBackgroundImage(): void {\n const image = this.url ? `url(${this.url})` : 'none';\n this.style.setProperty('--appbar-bg-image', image);\n }\n\n /** Updates host style variables when visual input properties change. */\n protected override updated(changedProperties: PropertyValues): void {\n if (changedProperties.has('color')) {\n this._applyColorSurface();\n }\n\n if (changedProperties.has('url')) {\n this._applyBackgroundImage();\n }\n }\n\n override render() {\n return html`\n ${\n this.url\n ? html`\n <div class=\"background\" aria-hidden=\"true\"></div>\n <div class=\"background-overlay\" aria-hidden=\"true\"></div>\n `\n : nothing\n }\n <div\n class=\"content\"\n part=\"content\"\n role=\"${this.banner ? 'banner' : 'group'}\"\n >\n <div class=\"leading\" part=\"leading\">\n <slot name=\"button\">\n <button\n type=\"button\"\n class=\"leading-button\"\n aria-label=\"${this.leadingLabel}\"\n >\n <sky-icon class=\"icon\" icon=\"mdi:menu\"></sky-icon>\n </button>\n </slot>\n </div>\n <div class=\"title-area\" part=\"title\">\n <span class=\"title-text\">${this.title}</span>\n </div>\n <div class=\"actions\" part=\"actions\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n}\n"],"names":["SkyAppbar","LitElement","constructor","super","arguments","this","title","color","url","banner","dense","elevated","leadingLabel","_applyColorSurface","isDefaultColorToken","setAttribute","style","setProperty","resolveColor","resolveTextColorForToken","removeAttribute","removeProperty","connectedCallback","_applyBackgroundImage","image","updated","changedProperties","has","render","html","nothing","dependencies","SkyIcon","styles","css","unsafeCSS","cssOnFillEnhance","selector","fillVar","__decorateClass","property","type","String","prototype","Boolean","customElement"],"mappings":"+jBAsEO,IAAMA,EAAN,cAAwBC,EAAxB,WAAAC,GAAAC,SAAAC,WAMuBC,KAAAC,MAAQ,UAMRD,KAAAE,MAAQ,UAGRF,KAAAG,IAAM,GAGLH,KAAAI,QAAS,EAGTJ,KAAAK,OAAQ,EAGRL,KAAAM,UAAW,EAGZN,KAAAO,aAAe,WAAA,CA8LnC,kBAAAC,GACN,IAAKC,EAAoBT,KAAKE,OAO5B,OANAF,KAAKU,aAAa,eAAgB,SAClCV,KAAKW,MAAMC,YAAY,oBAAqBC,EAAab,KAAKE,aAC9DF,KAAKW,MAAMC,YACT,sBACAE,EAAyBd,KAAKE,QAKlCF,KAAKe,gBAAgB,gBACrBf,KAAKW,MAAMK,eAAe,qBAC1BhB,KAAKW,MAAMK,eAAe,sBAC5B,CAES,iBAAAC,GACPnB,MAAMmB,oBACNjB,KAAKQ,qBACLR,KAAKkB,uBACP,CAGQ,qBAAAA,GACN,MAAMC,EAAQnB,KAAKG,IAAM,OAAOH,KAAKG,OAAS,OAC9CH,KAAKW,MAAMC,YAAY,oBAAqBO,EAC9C,CAGmB,OAAAC,CAAQC,GACrBA,EAAkBC,IAAI,UACxBtB,KAAKQ,qBAGHa,EAAkBC,IAAI,QACxBtB,KAAKkB,uBAET,CAES,MAAAK,GACP,OAAOC,CAAA;QAEHxB,KAAKG,IACDqB,CAAA;;;cAIAC;;;;gBAKIzB,KAAKI,OAAS,SAAW;;;;;;;4BAObJ,KAAKO;;;;;;;qCAOIP,KAAKC;;;;;;KAOxC,GAlSWN,EACJ+B,aAAyD,CAC9D,WAAYC,GAFHhC,EA6BKiC,OAASC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAiLrBC,EACAC,EAAiB,CACf,CACEC,SAAU,gCACVC,QAAS;IA5MWC,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UANP1C,EAMiB2C,UAAA,QAAA,GAMAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UAZP1C,EAYiB2C,UAAA,QAAA,GAGAJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UAfP1C,EAeiB2C,UAAA,MAAA,GAGCJ,EAAA,CAA5BC,EAAS,CAAEC,KAAMG,WAlBP5C,EAkBkB2C,UAAA,SAAA,GAGAJ,EAAA,CAA5BC,EAAS,CAAEC,KAAMG,WArBP5C,EAqBkB2C,UAAA,QAAA,GAGAJ,EAAA,CAA5BC,EAAS,CAAEC,KAAMG,WAxBP5C,EAwBkB2C,UAAA,WAAA,GAGDJ,EAAA,CAA3BC,EAAS,CAAEC,KAAMC,UA3BP1C,EA2BiB2C,UAAA,eAAA,GA3BjB3C,EAANuC,EAAA,CADNM,EAAc,eACF7C"}
@@ -1,5 +1,5 @@
1
- import { LitElement, PropertyValues } from "lit";
2
- export type SkyAvatarFit = "cover" | "contain";
1
+ import { LitElement, PropertyValues } from 'lit';
2
+ export type SkyAvatarFit = 'cover' | 'contain';
3
3
  /**
4
4
  * @element sky-avatar
5
5
  *
@@ -8,7 +8,7 @@ export type SkyAvatarFit = "cover" | "contain";
8
8
  * @status stable
9
9
  * @since 1.0.0
10
10
  *
11
- * @documentation https://library.sky-ui.com/components/avatar
11
+ * @documentation https://sky-ui.com/components/avatar
12
12
  *
13
13
  * @slot - Fallback content (e.g., initials or an icon) rendered when `image` is empty.
14
14
  *
@@ -10,12 +10,12 @@ import{css as t,LitElement as e,nothing as i,html as r}from"lit";import{property
10
10
  @keydown=${this._handleInteractiveKeydown}
11
11
  >
12
12
  ${this.image?r`<img
13
- class="image-probe"
14
- src=${this.image}
15
- alt=""
16
- @load=${this._onImageLoad}
17
- @error=${this._onImageError}
18
- />`:i}
13
+ class="image-probe"
14
+ src=${this.image}
15
+ alt=""
16
+ @load=${this._onImageLoad}
17
+ @error=${this._onImageError}
18
+ />`:i}
19
19
  <div class="loading-overlay" part="loading-overlay">
20
20
  <div class="spinner" part="spinner"></div>
21
21
  </div>
@@ -56,9 +56,7 @@ import{css as t,LitElement as e,nothing as i,html as r}from"lit";import{property
56
56
 
57
57
  :host([shadow]) .avatar {
58
58
  background-color: var(--sky-glass-solid);
59
- box-shadow:
60
- var(--sky-box-shadow-inset),
61
- var(--sky-box-shadow-primary);
59
+ box-shadow: var(--sky-box-shadow-inset), var(--sky-box-shadow-primary);
62
60
  border: var(--sky-border-primary);
63
61
  }
64
62
 
@@ -74,8 +72,7 @@ import{css as t,LitElement as e,nothing as i,html as r}from"lit";import{property
74
72
 
75
73
  :host([shadow]) .avatar:focus-visible {
76
74
  box-shadow:
77
- var(--sky-focus-ring),
78
- var(--sky-box-shadow-inset),
75
+ var(--sky-focus-ring), var(--sky-box-shadow-inset),
79
76
  var(--sky-box-shadow-primary);
80
77
  }
81
78
 
@@ -1 +1 @@
1
- {"version":3,"file":"sky-avatar.js","sources":["../../src/sky-avatar/sky-avatar.ts"],"sourcesContent":["import { LitElement, html, css, PropertyValues, nothing } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\nimport { when } from \"lit/directives/when.js\";\r\nimport { keyed } from \"lit/directives/keyed.js\";\r\nimport { resolveRadius } from \"../helper/utils/size-resolver\";\r\nimport { resolveColor } from \"../helper/utils/color-resolver\";\r\nimport { styleMap } from \"lit/directives/style-map.js\";\r\nimport { classMap } from \"lit/directives/class-map.js\";\r\n\r\nexport type SkyAvatarFit = \"cover\" | \"contain\";\r\n\r\nconst SIZE_PRESETS: Record<string, string> = {\r\n sm: \"var(--sky-space-8, 2rem)\",\r\n md: \"var(--sky-space-10, 2.5rem)\",\r\n lg: \"var(--sky-space-12, 3rem)\",\r\n};\r\n\r\nconst SIZE_PX: Record<string, number> = { sm: 32, md: 40, lg: 48 };\r\n\r\n\r\n/**\r\n * @element sky-avatar\r\n *\r\n * @summary Avatar that renders image content or fallback slot content with configurable size, radius, outline, and loading state.\r\n *\r\n * @status stable\r\n * @since 1.0.0\r\n *\r\n * @documentation https://library.sky-ui.com/components/avatar\r\n *\r\n * @slot - Fallback content (e.g., initials or an icon) rendered when `image` is empty.\r\n *\r\n * @property {string} size - Avatar size: preset `sm` | `md` | `lg` or CSS length (for example `50px`).\r\n * @property {string} image - Image URL; fallback slot is shown on load error.\r\n * @property {SkyAvatarFit} fit - Image fill mode: `cover` (default) or `contain`.\r\n * @property {string} radius - Border radius token or CSS value.\r\n * @property {string} color - Token or CSS color applied to fallback slot content.\r\n * @property {string} alt - Accessible name when image content conveys meaning.\r\n * @property {string} outline - CSS `outline` value.\r\n * @property {string} outlineOffset - CSS `outline-offset` value.\r\n * @property {boolean} loading - Shows loading overlay when true.\r\n * @property {boolean} disabled - Dims and disables pointer interactions.\r\n * @property {boolean} interactive - Enables interactive behavior with keyboard/click activation.\r\n * @property {boolean} shadow - When true, applies solid surface, border ring, and elevation; no backdrop blur.\r\n *\r\n * @csspart avatar - The avatar container element.\r\n * @csspart loading-overlay - The loading overlay container (shown when `loading` is true).\r\n * @csspart spinner - The spinner element shown when loading.\r\n *\r\n * @Behavior\r\n * - Applies image content when available; otherwise renders fallback slot content.\r\n * - Uses keyed rendering to reset avatar content when image availability changes.\r\n * - Scales spinner dimensions from resolved avatar size for numeric values.\r\n * - Respects reduced-motion preference by disabling spinner animation.\r\n *\r\n * @example\r\n * ```html\r\n * <sky-avatar size=\"56px\" radius=\"full\" color=\"primary\">\r\n * JD\r\n * </sky-avatar>\r\n * ```\r\n * ```vue\r\n * <template>\r\n * <sky-avatar size=\"56px\" radius=\"full\" color=\"primary\">\r\n * JD\r\n * </sky-avatar>\r\n * </template>\r\n * ```\r\n * ```jsx\r\n * export default function Demo() {\r\n * return (\r\n * <sky-avatar size=\"56px\" radius=\"full\" color=\"primary\">\r\n * JD\r\n * </sky-avatar>\r\n * );\r\n * }\r\n * ```\r\n */\r\n@customElement(\"sky-avatar\")\r\nexport class SkyAvatar extends LitElement {\r\n\r\n /** Avatar size: preset sm|md|lg or CSS length. @default \"50px\" */\r\n @property({ type: String }) size: string = \"50px\";\r\n\r\n /** Image URL. On error, slot is shown. @default \"\" */\r\n @property({ type: String }) image: string = \"\";\r\n\r\n /** How the image fills the avatar. @default \"cover\" */\r\n @property({ type: String, reflect: true }) fit: SkyAvatarFit = \"cover\";\r\n\r\n /** Border radius token or CSS value. @default \"md\" */\r\n @property({ type: String }) radius: string = \"md\";\r\n\r\n /** Accessible name when image is set. @default \"\" */\r\n @property({ type: String }) alt: string = \"\";\r\n\r\n /** Slot text/icon color token/CSS color. @default \"dark\" */\r\n @property({ type: String }) color: string = \"dark\";\r\n\r\n /** Outline string. @default \"\" */\r\n @property({ type: String }) outline: string = \"\";\r\n\r\n /** Outline offset value. @default \"2px\" */\r\n @property({ type: String }) outlineOffset: string = \"2px\";\r\n\r\n /** Loading state. @default false */\r\n @property({ type: Boolean, reflect: true }) loading: boolean = false;\r\n\r\n /** Disables the avatar. @default false */\r\n @property({ type: Boolean, reflect: true }) disabled: boolean = false;\r\n\r\n /** When true, focusable with focus ring and click. @default false */\r\n @property({ type: Boolean }) interactive: boolean = false;\r\n\r\n /**\r\n * Elevated ring styling (`border`, inset shadow). No backdrop blur on avatar media.\r\n * `false` (default) keeps the avatar minimal for inline use.\r\n */\r\n @property({ type: Boolean, reflect: true })\r\n shadow = false;\r\n\r\n /** True when image failed to load; show slot instead. */\r\n @state() private _imageError = false;\r\n\r\n\r\n static override styles = css`\r\n :host {\r\n display: inline-flex;\r\n line-height: 0;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n\r\n :host([disabled]) {\r\n opacity: var(--sky-opacity-disabled, 0.5);\r\n pointer-events: none;\r\n }\r\n\r\n .avatar {\r\n width: var(--avatar-size);\r\n height: var(--avatar-size);\r\n position: relative;\r\n background-size: var(--avatar-bg-size, cover);\r\n background-position: center;\r\n background-repeat: no-repeat;\r\n border-radius: var(--avatar-border-radius, var(--sky-radius-secondary));\r\n display: flex;\r\n color: var(--slot-text-color);\r\n justify-content: center;\r\n align-items: center;\r\n background-clip: padding-box;\r\n -webkit-background-clip: padding-box;\r\n box-sizing: border-box;\r\n overflow: hidden;\r\n backdrop-filter: none;\r\n -webkit-backdrop-filter: none;\r\n }\r\n\r\n :host([shadow]) .avatar {\r\n background-color: var(--sky-glass-solid);\r\n box-shadow:\r\n var(--sky-box-shadow-inset),\r\n var(--sky-box-shadow-primary);\r\n border: var(--sky-border-primary);\r\n }\r\n\r\n :host([loading]) .avatar {\r\n will-change: transform;\r\n transform: translateZ(0);\r\n }\r\n\r\n .avatar:focus-visible {\r\n outline: none;\r\n box-shadow: var(--sky-focus-ring);\r\n }\r\n\r\n :host([shadow]) .avatar:focus-visible {\r\n box-shadow:\r\n var(--sky-focus-ring),\r\n var(--sky-box-shadow-inset),\r\n var(--sky-box-shadow-primary);\r\n }\r\n\r\n .avatar--interactive {\r\n cursor: pointer;\r\n -webkit-tap-highlight-color: transparent;\r\n }\r\n\r\n .image-probe {\r\n position: absolute;\r\n width: 0;\r\n height: 0;\r\n opacity: 0;\r\n pointer-events: none;\r\n }\r\n\r\n ::slotted(*) {\r\n font-family: var(--sky-font);\r\n font-weight: var(--sky-font-weight-semibold, 600);\r\n font-size: calc(var(--avatar-size) * 0.38);\r\n line-height: 1;\r\n letter-spacing: var(--sky-letter-spacing-normal, 0);\r\n text-align: center;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n object-fit: contain;\r\n backdrop-filter: none;\r\n -webkit-backdrop-filter: none;\r\n }\r\n\r\n .loading-overlay {\r\n position: absolute;\r\n inset: 0;\r\n border-radius: inherit;\r\n background: var(--sky-overlay-secondary);\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n z-index: 1;\r\n visibility: hidden;\r\n backdrop-filter: none;\r\n -webkit-backdrop-filter: none;\r\n }\r\n :host([loading]) .loading-overlay {\r\n visibility: visible;\r\n }\r\n\r\n .spinner {\r\n border-width: 2px;\r\n border-style: solid;\r\n border-color: var(--sky-border-light);\r\n border-top-color: var(--slot-text-color, var(--sky-text-primary));\r\n border-radius: var(--sky-radius-full);\r\n width: 40px;\r\n height: 40px;\r\n animation: spin var(--sky-duration-slow, 1s) linear infinite;\r\n }\r\n\r\n @keyframes spin {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n :host([loading]) .avatar {\r\n will-change: auto;\r\n transform: none;\r\n }\r\n\r\n .spinner {\r\n animation: none;\r\n border-top-color: var(--slot-text-color, var(--sky-text-primary));\r\n opacity: var(--sky-opacity-muted, 0.7);\r\n }\r\n }\r\n `;\r\n\r\n override updated(changed: PropertyValues): void {\r\n super.updated(changed);\r\n\r\n if (changed.has(\"image\")) {\r\n this._imageError = false;\r\n }\r\n\r\n const resolvedSize = SIZE_PRESETS[this.size] ?? this.size;\r\n this.style.setProperty(\"--avatar-size\", resolvedSize);\r\n\r\n this.style.setProperty(\r\n \"--avatar-bg-size\",\r\n this.fit === \"contain\" ? \"contain\" : \"cover\",\r\n );\r\n\r\n this.style.setProperty(\r\n \"--avatar-border-radius\",\r\n resolveRadius(this.radius),\r\n );\r\n\r\n if (this.color) {\r\n this.style.setProperty(\"--slot-text-color\", resolveColor(this.color));\r\n }\r\n\r\n this.adjustSpinnerSize();\r\n }\r\n\r\n /** Marks image load success and keeps image rendering active. */\r\n private _onImageLoad = (): void => {\r\n this._imageError = false;\r\n };\r\n\r\n /** Marks image load failure and enables fallback slot rendering. */\r\n private _onImageError = (): void => {\r\n this._imageError = true;\r\n };\r\n\r\n /** Re-dispatches click in interactive mode for host-level consumers. */\r\n private _handleInteractiveClick(e: Event): void {\r\n if (!this.interactive || this.disabled) return;\r\n e.stopPropagation();\r\n this.dispatchEvent(new Event(\"click\", { bubbles: true, composed: true }));\r\n }\r\n\r\n /** Handles keyboard activation in interactive mode. */\r\n private _handleInteractiveKeydown(e: KeyboardEvent): void {\r\n if (!this.interactive || this.disabled) return;\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n this.dispatchEvent(new Event(\"click\", { bubbles: true, composed: true }));\r\n }\r\n }\r\n\r\n\r\n\r\n /** Derives spinner dimensions from current avatar size. */\r\n private adjustSpinnerSize(): void {\r\n const avatarSizePx =\r\n SIZE_PX[this.size] ?? parseFloat(this.size);\r\n if (Number.isFinite(avatarSizePx)) {\r\n const spinnerSize = avatarSizePx * 0.25;\r\n const spinner = this.shadowRoot?.querySelector<HTMLElement>(\".spinner\");\r\n if (spinner) {\r\n spinner.style.width = `${spinnerSize}px`;\r\n spinner.style.height = `${spinnerSize}px`;\r\n spinner.style.borderWidth = `${Math.max(1, spinnerSize / 10)}px`;\r\n }\r\n }\r\n }\r\n\r\n override render() {\r\n const showImage = this.image && !this._imageError;\r\n const avatarStyle: Record<string, string> = {};\r\n if (showImage) {\r\n avatarStyle[\"backgroundImage\"] = `url(${encodeURI(this.image)})`;\r\n }\r\n if (this.outline) {\r\n avatarStyle[\"outline\"] = this.outline;\r\n }\r\n if (this.outlineOffset) {\r\n avatarStyle[\"outlineOffset\"] = this.outlineOffset;\r\n }\r\n\r\n const role = this.interactive\r\n ? \"button\"\r\n : showImage && this.alt\r\n ? \"img\"\r\n : nothing;\r\n const ariaLabel =\r\n this.interactive && this.alt\r\n ? this.alt\r\n : showImage && this.alt\r\n ? this.alt\r\n : nothing;\r\n\r\n return html`\r\n <div\r\n class=${classMap({\r\n avatar: true,\r\n \"avatar--interactive\": !!this.interactive,\r\n })}\r\n part=\"avatar\"\r\n style=${styleMap(avatarStyle)}\r\n role=${role}\r\n aria-label=${ariaLabel}\r\n tabindex=${this.interactive && !this.disabled ? \"0\" : nothing}\r\n @click=${this._handleInteractiveClick}\r\n @keydown=${this._handleInteractiveKeydown}\r\n >\r\n ${this.image\r\n ? html`<img\r\n class=\"image-probe\"\r\n src=${this.image}\r\n alt=\"\"\r\n @load=${this._onImageLoad}\r\n @error=${this._onImageError}\r\n />`\r\n : nothing}\r\n <div class=\"loading-overlay\" part=\"loading-overlay\">\r\n <div class=\"spinner\" part=\"spinner\"></div>\r\n </div>\r\n ${keyed(\r\n showImage ? \"_img_\" : \"_slot_\",\r\n when(!showImage, () => html`<slot></slot>`, () => nothing),\r\n )}\r\n </div>\r\n `;\r\n }\r\n}\r\n"],"names":["SIZE_PRESETS","sm","md","lg","SIZE_PX","SkyAvatar","LitElement","constructor","super","arguments","this","size","image","fit","radius","alt","color","outline","outlineOffset","loading","disabled","interactive","shadow","_imageError","_onImageLoad","_onImageError","updated","changed","has","resolvedSize","style","setProperty","resolveRadius","resolveColor","adjustSpinnerSize","_handleInteractiveClick","e","stopPropagation","dispatchEvent","Event","bubbles","composed","_handleInteractiveKeydown","key","preventDefault","avatarSizePx","parseFloat","Number","isFinite","spinnerSize","spinner","shadowRoot","querySelector","width","height","borderWidth","Math","max","render","showImage","avatarStyle","encodeURI","role","nothing","ariaLabel","html","classMap","avatar","styleMap","keyed","when","styles","css","__decorateClass","property","type","String","prototype","reflect","Boolean","state","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"sky-avatar.js","sources":["../../src/sky-avatar/sky-avatar.ts"],"sourcesContent":["import { LitElement, html, css, PropertyValues, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { when } from 'lit/directives/when.js';\nimport { keyed } from 'lit/directives/keyed.js';\nimport { resolveRadius } from '../helper/utils/size-resolver';\nimport { resolveColor } from '../helper/utils/color-resolver';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { classMap } from 'lit/directives/class-map.js';\n\nexport type SkyAvatarFit = 'cover' | 'contain';\n\nconst SIZE_PRESETS: Record<string, string> = {\n sm: 'var(--sky-space-8, 2rem)',\n md: 'var(--sky-space-10, 2.5rem)',\n lg: 'var(--sky-space-12, 3rem)',\n};\n\nconst SIZE_PX: Record<string, number> = { sm: 32, md: 40, lg: 48 };\n\n/**\n * @element sky-avatar\n *\n * @summary Avatar that renders image content or fallback slot content with configurable size, radius, outline, and loading state.\n *\n * @status stable\n * @since 1.0.0\n *\n * @documentation https://sky-ui.com/components/avatar\n *\n * @slot - Fallback content (e.g., initials or an icon) rendered when `image` is empty.\n *\n * @property {string} size - Avatar size: preset `sm` | `md` | `lg` or CSS length (for example `50px`).\n * @property {string} image - Image URL; fallback slot is shown on load error.\n * @property {SkyAvatarFit} fit - Image fill mode: `cover` (default) or `contain`.\n * @property {string} radius - Border radius token or CSS value.\n * @property {string} color - Token or CSS color applied to fallback slot content.\n * @property {string} alt - Accessible name when image content conveys meaning.\n * @property {string} outline - CSS `outline` value.\n * @property {string} outlineOffset - CSS `outline-offset` value.\n * @property {boolean} loading - Shows loading overlay when true.\n * @property {boolean} disabled - Dims and disables pointer interactions.\n * @property {boolean} interactive - Enables interactive behavior with keyboard/click activation.\n * @property {boolean} shadow - When true, applies solid surface, border ring, and elevation; no backdrop blur.\n *\n * @csspart avatar - The avatar container element.\n * @csspart loading-overlay - The loading overlay container (shown when `loading` is true).\n * @csspart spinner - The spinner element shown when loading.\n *\n * @Behavior\n * - Applies image content when available; otherwise renders fallback slot content.\n * - Uses keyed rendering to reset avatar content when image availability changes.\n * - Scales spinner dimensions from resolved avatar size for numeric values.\n * - Respects reduced-motion preference by disabling spinner animation.\n *\n * @example\n * ```html\n * <sky-avatar size=\"56px\" radius=\"full\" color=\"primary\">\n * JD\n * </sky-avatar>\n * ```\n * ```vue\n * <template>\n * <sky-avatar size=\"56px\" radius=\"full\" color=\"primary\">\n * JD\n * </sky-avatar>\n * </template>\n * ```\n * ```jsx\n * export default function Demo() {\n * return (\n * <sky-avatar size=\"56px\" radius=\"full\" color=\"primary\">\n * JD\n * </sky-avatar>\n * );\n * }\n * ```\n */\n@customElement('sky-avatar')\nexport class SkyAvatar extends LitElement {\n /** Avatar size: preset sm|md|lg or CSS length. @default \"50px\" */\n @property({ type: String }) size: string = '50px';\n\n /** Image URL. On error, slot is shown. @default \"\" */\n @property({ type: String }) image: string = '';\n\n /** How the image fills the avatar. @default \"cover\" */\n @property({ type: String, reflect: true }) fit: SkyAvatarFit = 'cover';\n\n /** Border radius token or CSS value. @default \"md\" */\n @property({ type: String }) radius: string = 'md';\n\n /** Accessible name when image is set. @default \"\" */\n @property({ type: String }) alt: string = '';\n\n /** Slot text/icon color token/CSS color. @default \"dark\" */\n @property({ type: String }) color: string = 'dark';\n\n /** Outline string. @default \"\" */\n @property({ type: String }) outline: string = '';\n\n /** Outline offset value. @default \"2px\" */\n @property({ type: String }) outlineOffset: string = '2px';\n\n /** Loading state. @default false */\n @property({ type: Boolean, reflect: true }) loading: boolean = false;\n\n /** Disables the avatar. @default false */\n @property({ type: Boolean, reflect: true }) disabled: boolean = false;\n\n /** When true, focusable with focus ring and click. @default false */\n @property({ type: Boolean }) interactive: boolean = false;\n\n /**\n * Elevated ring styling (`border`, inset shadow). No backdrop blur on avatar media.\n * `false` (default) keeps the avatar minimal for inline use.\n */\n @property({ type: Boolean, reflect: true })\n shadow = false;\n\n /** True when image failed to load; show slot instead. */\n @state() private _imageError = false;\n\n static override styles = css`\n :host {\n display: inline-flex;\n line-height: 0;\n justify-content: center;\n align-items: center;\n }\n\n :host([disabled]) {\n opacity: var(--sky-opacity-disabled, 0.5);\n pointer-events: none;\n }\n\n .avatar {\n width: var(--avatar-size);\n height: var(--avatar-size);\n position: relative;\n background-size: var(--avatar-bg-size, cover);\n background-position: center;\n background-repeat: no-repeat;\n border-radius: var(--avatar-border-radius, var(--sky-radius-secondary));\n display: flex;\n color: var(--slot-text-color);\n justify-content: center;\n align-items: center;\n background-clip: padding-box;\n -webkit-background-clip: padding-box;\n box-sizing: border-box;\n overflow: hidden;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n :host([shadow]) .avatar {\n background-color: var(--sky-glass-solid);\n box-shadow: var(--sky-box-shadow-inset), var(--sky-box-shadow-primary);\n border: var(--sky-border-primary);\n }\n\n :host([loading]) .avatar {\n will-change: transform;\n transform: translateZ(0);\n }\n\n .avatar:focus-visible {\n outline: none;\n box-shadow: var(--sky-focus-ring);\n }\n\n :host([shadow]) .avatar:focus-visible {\n box-shadow:\n var(--sky-focus-ring), var(--sky-box-shadow-inset),\n var(--sky-box-shadow-primary);\n }\n\n .avatar--interactive {\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n }\n\n .image-probe {\n position: absolute;\n width: 0;\n height: 0;\n opacity: 0;\n pointer-events: none;\n }\n\n ::slotted(*) {\n font-family: var(--sky-font);\n font-weight: var(--sky-font-weight-semibold, 600);\n font-size: calc(var(--avatar-size) * 0.38);\n line-height: 1;\n letter-spacing: var(--sky-letter-spacing-normal, 0);\n text-align: center;\n display: flex;\n justify-content: center;\n align-items: center;\n object-fit: contain;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n .loading-overlay {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background: var(--sky-overlay-secondary);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 1;\n visibility: hidden;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n :host([loading]) .loading-overlay {\n visibility: visible;\n }\n\n .spinner {\n border-width: 2px;\n border-style: solid;\n border-color: var(--sky-border-light);\n border-top-color: var(--slot-text-color, var(--sky-text-primary));\n border-radius: var(--sky-radius-full);\n width: 40px;\n height: 40px;\n animation: spin var(--sky-duration-slow, 1s) linear infinite;\n }\n\n @keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host([loading]) .avatar {\n will-change: auto;\n transform: none;\n }\n\n .spinner {\n animation: none;\n border-top-color: var(--slot-text-color, var(--sky-text-primary));\n opacity: var(--sky-opacity-muted, 0.7);\n }\n }\n `;\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n\n if (changed.has('image')) {\n this._imageError = false;\n }\n\n const resolvedSize = SIZE_PRESETS[this.size] ?? this.size;\n this.style.setProperty('--avatar-size', resolvedSize);\n\n this.style.setProperty(\n '--avatar-bg-size',\n this.fit === 'contain' ? 'contain' : 'cover'\n );\n\n this.style.setProperty(\n '--avatar-border-radius',\n resolveRadius(this.radius)\n );\n\n if (this.color) {\n this.style.setProperty('--slot-text-color', resolveColor(this.color));\n }\n\n this.adjustSpinnerSize();\n }\n\n /** Marks image load success and keeps image rendering active. */\n private _onImageLoad = (): void => {\n this._imageError = false;\n };\n\n /** Marks image load failure and enables fallback slot rendering. */\n private _onImageError = (): void => {\n this._imageError = true;\n };\n\n /** Re-dispatches click in interactive mode for host-level consumers. */\n private _handleInteractiveClick(e: Event): void {\n if (!this.interactive || this.disabled) return;\n e.stopPropagation();\n this.dispatchEvent(new Event('click', { bubbles: true, composed: true }));\n }\n\n /** Handles keyboard activation in interactive mode. */\n private _handleInteractiveKeydown(e: KeyboardEvent): void {\n if (!this.interactive || this.disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.dispatchEvent(new Event('click', { bubbles: true, composed: true }));\n }\n }\n\n /** Derives spinner dimensions from current avatar size. */\n private adjustSpinnerSize(): void {\n const avatarSizePx = SIZE_PX[this.size] ?? parseFloat(this.size);\n if (Number.isFinite(avatarSizePx)) {\n const spinnerSize = avatarSizePx * 0.25;\n const spinner = this.shadowRoot?.querySelector<HTMLElement>('.spinner');\n if (spinner) {\n spinner.style.width = `${spinnerSize}px`;\n spinner.style.height = `${spinnerSize}px`;\n spinner.style.borderWidth = `${Math.max(1, spinnerSize / 10)}px`;\n }\n }\n }\n\n override render() {\n const showImage = this.image && !this._imageError;\n const avatarStyle: Record<string, string> = {};\n if (showImage) {\n avatarStyle['backgroundImage'] = `url(${encodeURI(this.image)})`;\n }\n if (this.outline) {\n avatarStyle['outline'] = this.outline;\n }\n if (this.outlineOffset) {\n avatarStyle['outlineOffset'] = this.outlineOffset;\n }\n\n const role = this.interactive\n ? 'button'\n : showImage && this.alt\n ? 'img'\n : nothing;\n const ariaLabel =\n this.interactive && this.alt\n ? this.alt\n : showImage && this.alt\n ? this.alt\n : nothing;\n\n return html`\n <div\n class=${classMap({\n avatar: true,\n 'avatar--interactive': !!this.interactive,\n })}\n part=\"avatar\"\n style=${styleMap(avatarStyle)}\n role=${role}\n aria-label=${ariaLabel}\n tabindex=${this.interactive && !this.disabled ? '0' : nothing}\n @click=${this._handleInteractiveClick}\n @keydown=${this._handleInteractiveKeydown}\n >\n ${\n this.image\n ? html`<img\n class=\"image-probe\"\n src=${this.image}\n alt=\"\"\n @load=${this._onImageLoad}\n @error=${this._onImageError}\n />`\n : nothing\n }\n <div class=\"loading-overlay\" part=\"loading-overlay\">\n <div class=\"spinner\" part=\"spinner\"></div>\n </div>\n ${keyed(\n showImage ? '_img_' : '_slot_',\n when(\n !showImage,\n () => html`<slot></slot>`,\n () => nothing\n )\n )}\n </div>\n `;\n }\n}\n"],"names":["SIZE_PRESETS","sm","md","lg","SIZE_PX","SkyAvatar","LitElement","constructor","super","arguments","this","size","image","fit","radius","alt","color","outline","outlineOffset","loading","disabled","interactive","shadow","_imageError","_onImageLoad","_onImageError","updated","changed","has","resolvedSize","style","setProperty","resolveRadius","resolveColor","adjustSpinnerSize","_handleInteractiveClick","e","stopPropagation","dispatchEvent","Event","bubbles","composed","_handleInteractiveKeydown","key","preventDefault","avatarSizePx","parseFloat","Number","isFinite","spinnerSize","spinner","shadowRoot","querySelector","width","height","borderWidth","Math","max","render","showImage","avatarStyle","encodeURI","role","nothing","ariaLabel","html","classMap","avatar","styleMap","keyed","when","styles","css","__decorateClass","property","type","String","prototype","reflect","Boolean","state","customElement"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import { LitElement, PropertyValues } from "lit";
1
+ import { LitElement, PropertyValues } from 'lit';
2
2
  export type SkyBadgeClickEventDetail = {
3
3
  originalEvent: Event;
4
4
  };
5
- export type SkyBadgePosition = "default" | "floating" | "inline";
6
- export type SkyBadgeShape = "circle" | "pill" | "custom";
7
- export type SkyBadgePlacement = "custom" | "top-right" | "top-left" | "bottom-left" | "bottom-right" | "top-center";
5
+ export type SkyBadgePosition = 'default' | 'floating' | 'inline';
6
+ export type SkyBadgeShape = 'circle' | 'pill' | 'custom';
7
+ export type SkyBadgePlacement = 'custom' | 'top-right' | 'top-left' | 'bottom-left' | 'bottom-right' | 'top-center';
8
8
  /**
9
9
  * @element sky-badge
10
10
  *
@@ -13,7 +13,7 @@ export type SkyBadgePlacement = "custom" | "top-right" | "top-left" | "bottom-le
13
13
  * @status stable
14
14
  * @since 1.0.0
15
15
  *
16
- * @documentation https://library.sky-ui.com/components/badge
16
+ * @documentation https://sky-ui.com/components/badge
17
17
  * @dependency sky-icon
18
18
  *
19
19
  * @slot - The content the badge attaches to.