{"version":3,"file":"index.cjs","sources":["../src/utils.js","../src/dom.js","../src/LinkPreviewFetcher.js","../src/index.js"],"sourcesContent":["/**\n * Generates a random ID with optional prefix.\n * @param {string} [prefix=''] - Prefix to prepend to the ID.\n * @returns {string} - A unique ID like 'myapp-XXXXXXX'.\n */\nfunction generateID(prefix = \"\") {\n  return `${prefix ? prefix + \"-\" : \"\"}${crypto.randomUUID().slice(0, 8)}`;\n}\n\n/**\n * Appends a copyright notice to the footer.\n *\n * @param {Object} [options={}] - Configuration options.\n * @param {string} [options.title='This Website'] - The title to display before the © symbol.\n * @param {string} [options.site='https://sarawebs.com'] - The URL to link the company name to.\n * @param {string} [options.company='SaraWebs'] - The company or author's name to display.\n * @param {number} [options.year=currentYear] - The year to display. Defaults to the current year.\n */\nfunction addCopyRight({\n  title = \"This Website\",\n  site = \"https://sarawebs.com\",\n  company = \"SaraWebs\",\n  year = new Date().getFullYear(),\n} = {}) {\n  const footer = document.querySelector(\"footer\");\n  if (!footer) return;\n\n  const div = document.createElement(\"div\");\n  const p = document.createElement(\"p\");\n  p.style.textAlign = \"center\";\n  p.innerHTML = `\n    ${title} © ${year}<br>\n    Built with ❤️ by \n    <a href=\"${site}\" target=\"_blank\" rel=\"noopener\" style=\"color:#207de9;text-decoration:none;\">${company}</a>\n  `;\n  div.appendChild(p);\n  footer.appendChild(div);\n}\n\n/**\n * Generates a 2D board array and applies a push function.\n * @param {number} rows - Number of rows.\n * @param {number} cols - Number of columns.\n * @param {Function} pushFunc - Callback to push into each cell.\n * @returns {Array<Array>} - Generated 2D board.\n */\nfunction createBoard(rows, cols, pushFunc) {\n  const board = [];\n  for (let i = 0; i < rows; i++) {\n    board[i] = [];\n    for (let j = 0; j < cols; j++) {\n      pushFunc(board[i], i, j);\n    }\n  }\n  return board;\n}\n/**\n * Returns a random color, either from a provided palette or by generating a random hex color.\n * @param {string[]} [palette] - Optional array of hex color strings.\n * @returns {string} - A random color in hex format.\n */\nfunction getRandomColor(palette) {\n  const defaultPalette = [\n    \"#8e1330\",\n    \"#8a6c1d\",\n    \"#406555\",\n    \"#7c0e45\",\n    \"#8d1978\",\n    \"#181770\",\n    \"#cc38d7\",\n    \"#47504e\",\n    \"#0fa080\",\n    \"#0f64a0\",\n    \"#460fa0\",\n    \"#a00f65\",\n    \"#a00f24\",\n    \"#0f94a0\",\n    \"#0fa067\",\n    \"#0fa03c\",\n    \"#38a00f\",\n    \"#a09d0f\",\n    \"#a0670f\",\n    \"#a0370f\",\n    \"#a00f0f\",\n    \"#2b634d\",\n    \"#2b4c63\",\n    \"#2e6bc6\",\n    \"#1992d4\",\n  ];\n\n  const activePalette =\n    Array.isArray(palette) && palette.length > 0 ? palette : defaultPalette;\n\n  return activePalette[Math.floor(Math.random() * activePalette.length)];\n}\n\nexport { generateID, addCopyRight, createBoard, getRandomColor };\n","// src/dom.js\n\nexport class ElementBuilder {\n  constructor(type) {\n    this.el = document.createElement(type);\n  }\n\n  addClass(...classes) {\n    this.el.classList.add(...classes);\n    return this;\n  }\n\n  setId(id) {\n    this.el.id = id;\n    return this;\n  }\n\n  setText(text) {\n    this.el.textContent = text;\n    return this;\n  }\n\n  setAttr(name, value) {\n    this.el.setAttribute(name, value);\n    return this;\n  }\n\n  on(event, handler) {\n    this.el.addEventListener(event, handler);\n    return this;\n  }\n\n  append(child) {\n    this.el.appendChild(\n      child instanceof ElementBuilder ? child.build() : child,\n    );\n    return this;\n  }\n\n  build() {\n    return this.el;\n  }\n}\n\nexport function labelAndInput({\n  labelText,\n  inputType,\n  id,\n  name,\n  required = false,\n}) {\n  const label = new ElementBuilder(\"label\")\n    .setAttr(\"for\", id)\n    .setText(labelText);\n\n  const input = new ElementBuilder(\"input\")\n    .setAttr(\"type\", inputType)\n    .setAttr(\"id\", id)\n    .setAttr(\"name\", name);\n\n  if (required) {\n    input.setAttr(\"required\", \"\");\n  }\n\n  return [label, input];\n}\n","export class LinkPreviewFetcher {\n  constructor(apiKey, httpClient = (...args) => fetch(...args)) {\n    this.apiKey = apiKey;\n    this.httpClient = httpClient;\n    this.apiEndpoint = \"https://api.linkpreview.net/\";\n  }\n\n  buildUrl(targetUrl) {\n    const encodedUrl = encodeURIComponent(targetUrl);\n    return `${this.apiEndpoint}?key=${this.apiKey}&q=${encodedUrl}`;\n  }\n\n  async fetchPreview(targetUrl) {\n    const requestUrl = this.buildUrl(targetUrl);\n    try {\n      const response = await this.httpClient(requestUrl);\n      if (!response.ok) {\n        throw new Error(`Request failed with status ${response.status}`);\n      }\n      const data = await response.json();\n      return this.parseResponse(data);\n    } catch (err) {\n      console.error(\"LinkPreviewFetcher error:\", err);\n      throw err;\n    }\n  }\n\n  parseResponse(data) {\n    return {\n      title: data.title || \"\",\n      description: data.description || \"\",\n      image: data.image || \"\",\n      url: data.url || \"\",\n    };\n  }\n}\n","// src/index.js\n\nimport {\n  generateID,\n  addCopyRight,\n  createBoard,\n  getRandomColor,\n} from \"./utils.js\";\nimport { ElementBuilder, labelAndInput } from \"./dom.js\";\nimport { LinkPreviewFetcher } from \"./LinkPreviewFetcher.js\";\n\nconst sb_utils = {\n  generateID,\n  addCopyRight,\n  createBoard,\n  getRandomColor,\n  ElementBuilder,\n  labelAndInput,\n  LinkPreviewFetcher,\n};\n\nif (typeof window !== \"undefined\") {\n  window.sb = sb_utils;\n}\n\nexport {\n  generateID,\n  addCopyRight,\n  createBoard,\n  getRandomColor,\n  ElementBuilder,\n  labelAndInput,\n  LinkPreviewFetcher,\n};\n\nexport default sb_utils;\n"],"names":[],"mappings":"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"}