"use strict";
var __create = Object.create;
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
var __objRest = (source, exclude) => {
  var target = {};
  for (var prop in source)
    if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
      target[prop] = source[prop];
  if (source != null && __getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(source)) {
      if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
        target[prop] = source[prop];
    }
  return target;
};
var __export = (target, all) => {
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
  if (from && typeof from === "object" || typeof from === "function") {
    for (let key of __getOwnPropNames(from))
      if (!__hasOwnProp.call(to, key) && key !== except)
        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  }
  return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
  // If the importer is in node compatibility mode or this is not an ESM
  // file that has been converted to a CommonJS file using a Babel-
  // compatible transform (i.e. "__esModule" has not been set), then set
  // "default" to the CommonJS "module.exports" for node compatibility.
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
  mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var Icon_exports = {};
__export(Icon_exports, {
  default: () => Icon_default
});
module.exports = __toCommonJS(Icon_exports);
var import_jsx_runtime = require("react/jsx-runtime");
var import_react = __toESM(require("react"));
var import_prop_types = require("prop-types");
var import_styled_components = require("styled-components");
var import_lodash = __toESM(require("lodash.get"));
var import_Box = __toESM(require("../Box"));
const Icon = (_a) => {
  var _b = _a, {
    as: Component,
    size = 12,
    width = size,
    height = size,
    fill,
    stroke,
    theme,
    title,
    description,
    ariaLabel
  } = _b, props = __objRest(_b, [
    "as",
    "size",
    "width",
    "height",
    "fill",
    "stroke",
    "theme",
    "title",
    "description",
    "ariaLabel"
  ]);
  const componentWithTitle = (propsTitle) => {
    const titleId = `${ariaLabel}-titleId`;
    let ariaDescribedBy = titleId;
    const titleElement = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("title", { id: titleId, children: title }, titleId);
    let svgChildren = [titleElement];
    if (description) {
      const descId = `${ariaLabel}-descId`;
      const descElement = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("desc", { id: descId, children: description }, descId);
      ariaDescribedBy += ` ${descId}`;
      svgChildren = [...svgChildren, descElement];
    }
    const defaultProps = __spreadProps(__spreadValues({}, Component.defaultProps), {
      role: "img",
      "aria-describedby": ariaDescribedBy
    });
    const newSvg = import_react.default.createElement(
      "svg",
      __spreadValues(__spreadValues({}, propsTitle), defaultProps),
      svgChildren,
      Component().props.children
    );
    return newSvg;
  };
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
    import_Box.default,
    __spreadProps(__spreadValues(__spreadValues(__spreadValues({
      as: title && ariaLabel ? componentWithTitle : Component,
      width: (0, import_lodash.default)(theme.yoga.spacing, width, width),
      height: (0, import_lodash.default)(theme.yoga.spacing, height, height)
    }, fill && { fill: (0, import_lodash.default)(theme.yoga.colors, fill, fill) }), stroke && { stroke: (0, import_lodash.default)(theme.yoga.colors, stroke, stroke) }), props), {
      "aria-hidden": title ? void 0 : true
    })
  );
};
const commonSizes = [
  "xxxsmall",
  "xxsmall",
  "xsmall",
  "small",
  "medium",
  "large",
  "xlarge",
  "xxlarge",
  "xxxlarge",
  "huge",
  "xhuge"
];
Icon.propTypes = {
  /** SVG to be rendered. */
  as: import_prop_types.elementType.isRequired,
  /** Fill color. Use it as one of theme.colors
   * tokens (vibin, neutral, stamina...) */
  fill: import_prop_types.string,
  /** Stroke color. Use it as one of theme.colors
   * tokens (vibin, neutral, stamina...) */
  stroke: import_prop_types.string,
  /** Text that will be displayed in the title element, used for accessibility */
  title: import_prop_types.string,
  /** Text used as element description, used for accessibility.
   * A title must be given in order to use description corretly.
   */
  description: import_prop_types.string,
  /** Text used as identifier for aria-describedby, title and description */
  ariaLabel: (props, propName, componentName) => {
    const { title, ariaLabel } = props;
    if (title && !ariaLabel) {
      return new Error(
        `accessible elements, such as title, must receive the ${propName} property as an identifier.`
      );
    }
    (0, import_prop_types.checkPropTypes)(
      {
        [propName]: import_prop_types.string
      },
      { ariaLabel },
      "prop",
      componentName
    );
    return null;
  },
  /** Horizontal size of the SVG. Use it as one of
   * theme.spacing tokens (xxsmall, small, medium...) */
  width: (0, import_prop_types.oneOfType)([(0, import_prop_types.oneOf)(commonSizes), import_prop_types.string, import_prop_types.number]),
  /** Vertical size of the SVG. Use it as one of
   * theme.spacing tokens (xxsmall, small, medium...) */
  height: (0, import_prop_types.oneOfType)([(0, import_prop_types.oneOf)(commonSizes), import_prop_types.string, import_prop_types.number]),
  /** Size for vertical and horizontal of the SVG.
   * Use it as one of theme.spacing tokens (xxsmall, small, medium...) */
  size: (0, import_prop_types.oneOfType)([(0, import_prop_types.oneOf)(commonSizes), import_prop_types.string, import_prop_types.number])
};
var Icon_default = (0, import_styled_components.withTheme)(Icon);
