import type {
  Element,
  ElementAttributes,
  ElementChildren,
  ElementParams,
} from "./types.js";

/**
@example
const element = document.createElement("div");

// Set any attribute as key value pairs
setAttributes(element, {
	"data-name": "menu",
	"class": "w-full bg-red",
	"style": "margin-right: 0px;"
});

// Or set style using object or classes from array
setAttributes(element, {
	style: {
		marginRight: 0,
	},
	class: [
		isDisabled && "bg-gray",
		"w-full",
	],
});
*/
export function setAttributes(
  element: Element,
  attributes?: ElementAttributes,
): void;

/**
@example
const element = document.createElement("div");
const child = document.createElement("p");
appendChildren(element, [p]);
*/
export function appendChildren(
  element: Element,
  children: ElementChildren,
  creator: (params: ElementParams) => HTMLElement | SVGElement,
): void;

/**
Creates SVG element recursively from a data structure.
Efficently uses document fragements and support style
objects and class arrays -- skipping falsy values.

@example
const svg = createSvgElement([
	"svg",
	{
		width: "30px",
		height: "30px",
		style: {
			filter: "drop-shadow(2px 2px 2px rgba(0, 0, 0, 0.32))",
		},
		class: [
			"extra-marker-icon",
		],
	},
	["circle", { cx: "10", cy: "10", r: "5", fill: "currentColor" }],
]);
*/
export function createSvgElement(params: ElementParams): SVGElement;

/**
Creates HTML element recursively from a data structure.
Efficently uses document fragements and support style
objects and class arrays -- skipping falsy values.

@example
const svg = createElement([
	"i",
	{
		"data-foo": "bar"
		style: {
			filter: "drop-shadow(2px 2px 2px rgba(0, 0, 0, 0.32))",
		},
		class: [
			"fa",
			isCafe && "fa-coffee",
		],
	},
	[// optionally pass in children]
]);
*/
export function createElement(params: ElementParams): HTMLElement;
