diff --git a/js/icons/arrow-circle-right-icon.js b/js/icons/arrow-circle-right-icon.js
new file mode 100644
index 0000000..0f039f8
--- /dev/null
+++ b/js/icons/arrow-circle-right-icon.js
@@ -0,0 +1,66 @@
+/**
+ * Arrow Circle Right Icon Web Component
+ * A circular arrow pointing right
+ */
+class ArrowCircleRightIcon extends HTMLElement {
+ static get observedAttributes() {
+ return ["size", "color", "stroke-width"];
+ }
+
+ constructor() {
+ super();
+ this.attachShadow({ mode: "open" });
+ }
+
+ connectedCallback() {
+ this.render();
+ }
+
+ attributeChangedCallback() {
+ this.render();
+ }
+
+ get size() {
+ return this.getAttribute("size") || "24";
+ }
+
+ get color() {
+ return this.getAttribute("color") || "currentColor";
+ }
+
+ get strokeWidth() {
+ return this.getAttribute("stroke-width") || "2";
+ }
+
+ render() {
+ this.shadowRoot.innerHTML = `
+
+
+
+
+
+
+ `;
+ }
+}
+
+customElements.define("arrow-circle-right-icon", ArrowCircleRightIcon);
diff --git a/js/icons/book-open-icon.js b/js/icons/book-open-icon.js
new file mode 100644
index 0000000..d309c66
--- /dev/null
+++ b/js/icons/book-open-icon.js
@@ -0,0 +1,64 @@
+/**
+ * Book Open Icon Web Component
+ * An open book icon
+ */
+class BookOpenIcon extends HTMLElement {
+ static get observedAttributes() {
+ return ["size", "color", "stroke-width"];
+ }
+
+ constructor() {
+ super();
+ this.attachShadow({ mode: "open" });
+ }
+
+ connectedCallback() {
+ this.render();
+ }
+
+ attributeChangedCallback() {
+ this.render();
+ }
+
+ get size() {
+ return this.getAttribute("size") || "48";
+ }
+
+ get color() {
+ return this.getAttribute("color") || "currentColor";
+ }
+
+ get strokeWidth() {
+ return this.getAttribute("stroke-width") || "1";
+ }
+
+ render() {
+ this.shadowRoot.innerHTML = `
+
+
+
+
+ `;
+ }
+}
+
+customElements.define("book-open-icon", BookOpenIcon);
diff --git a/js/icons/chevron-down-icon.js b/js/icons/chevron-down-icon.js
new file mode 100644
index 0000000..efc0ed2
--- /dev/null
+++ b/js/icons/chevron-down-icon.js
@@ -0,0 +1,64 @@
+/**
+ * Chevron Down Icon Web Component
+ * A downward pointing chevron
+ */
+class ChevronDownIcon extends HTMLElement {
+ static get observedAttributes() {
+ return ["size", "color", "stroke-width"];
+ }
+
+ constructor() {
+ super();
+ this.attachShadow({ mode: "open" });
+ }
+
+ connectedCallback() {
+ this.render();
+ }
+
+ attributeChangedCallback() {
+ this.render();
+ }
+
+ get size() {
+ return this.getAttribute("size") || "24";
+ }
+
+ get color() {
+ return this.getAttribute("color") || "currentColor";
+ }
+
+ get strokeWidth() {
+ return this.getAttribute("stroke-width") || "2";
+ }
+
+ render() {
+ this.shadowRoot.innerHTML = `
+
+
+
+
+ `;
+ }
+}
+
+customElements.define("chevron-down-icon", ChevronDownIcon);
diff --git a/js/icons/clipboard-icon.js b/js/icons/clipboard-icon.js
new file mode 100644
index 0000000..a62bab9
--- /dev/null
+++ b/js/icons/clipboard-icon.js
@@ -0,0 +1,64 @@
+/**
+ * Clipboard Icon Web Component
+ * A clipboard/document icon
+ */
+class ClipboardIcon extends HTMLElement {
+ static get observedAttributes() {
+ return ["size", "color", "stroke-width"];
+ }
+
+ constructor() {
+ super();
+ this.attachShadow({ mode: "open" });
+ }
+
+ connectedCallback() {
+ this.render();
+ }
+
+ attributeChangedCallback() {
+ this.render();
+ }
+
+ get size() {
+ return this.getAttribute("size") || "32";
+ }
+
+ get color() {
+ return this.getAttribute("color") || "currentColor";
+ }
+
+ get strokeWidth() {
+ return this.getAttribute("stroke-width") || "1";
+ }
+
+ render() {
+ this.shadowRoot.innerHTML = `
+
+
+
+
+ `;
+ }
+}
+
+customElements.define("clipboard-icon", ClipboardIcon);
diff --git a/js/icons/index.js b/js/icons/index.js
index 6813ca2..24f96fa 100644
--- a/js/icons/index.js
+++ b/js/icons/index.js
@@ -2,9 +2,16 @@
* Lucide Icons Index
* Re-exports all icons for easy importing
*/
+
+// Icon functions (return SVG strings)
export { micIcon } from "./mic.js";
export { searchIcon } from "./search.js";
export { menuIcon } from "./menu.js";
export { userIcon } from "./user.js";
export { shoppingBagIcon } from "./shopping-bag.js";
export { sendIcon } from "./send-icon.js";
+
+// Icon web components
+import "./menu-icon.js";
+import "./user-icon.js";
+import "./shopping-bag-icon.js";
diff --git a/js/icons/menu-icon.js b/js/icons/menu-icon.js
new file mode 100644
index 0000000..f550045
--- /dev/null
+++ b/js/icons/menu-icon.js
@@ -0,0 +1,66 @@
+/**
+ * Menu Icon Web Component
+ * A reusable menu/hamburger icon element
+ */
+class MenuIcon extends HTMLElement {
+ static get observedAttributes() {
+ return ["size", "color", "stroke-width"];
+ }
+
+ constructor() {
+ super();
+ this.attachShadow({ mode: "open" });
+ }
+
+ connectedCallback() {
+ this.render();
+ }
+
+ attributeChangedCallback() {
+ this.render();
+ }
+
+ get size() {
+ return this.getAttribute("size") || "32";
+ }
+
+ get color() {
+ return this.getAttribute("color") || "#ffffff";
+ }
+
+ get strokeWidth() {
+ return this.getAttribute("stroke-width") || "2";
+ }
+
+ render() {
+ this.shadowRoot.innerHTML = `
+
+
+
+
+
+
+ `;
+ }
+}
+
+customElements.define("menu-icon", MenuIcon);
diff --git a/js/icons/shopping-bag-icon.js b/js/icons/shopping-bag-icon.js
new file mode 100644
index 0000000..d9babb3
--- /dev/null
+++ b/js/icons/shopping-bag-icon.js
@@ -0,0 +1,66 @@
+/**
+ * Shopping Bag Icon Web Component
+ * A reusable shopping bag/cart icon element
+ */
+class ShoppingBagIcon extends HTMLElement {
+ static get observedAttributes() {
+ return ["size", "color", "stroke-width"];
+ }
+
+ constructor() {
+ super();
+ this.attachShadow({ mode: "open" });
+ }
+
+ connectedCallback() {
+ this.render();
+ }
+
+ attributeChangedCallback() {
+ this.render();
+ }
+
+ get size() {
+ return this.getAttribute("size") || "32";
+ }
+
+ get color() {
+ return this.getAttribute("color") || "#ffffff";
+ }
+
+ get strokeWidth() {
+ return this.getAttribute("stroke-width") || "2";
+ }
+
+ render() {
+ this.shadowRoot.innerHTML = `
+
+
+
+
+
+
+ `;
+ }
+}
+
+customElements.define("shopping-bag-icon", ShoppingBagIcon);
diff --git a/js/icons/user-icon.js b/js/icons/user-icon.js
new file mode 100644
index 0000000..96165ef
--- /dev/null
+++ b/js/icons/user-icon.js
@@ -0,0 +1,66 @@
+/**
+ * User Icon Web Component
+ * A reusable user/profile icon element
+ */
+class UserIcon extends HTMLElement {
+ static get observedAttributes() {
+ return ["size", "color", "stroke-width"];
+ }
+
+ constructor() {
+ super();
+ this.attachShadow({ mode: "open" });
+ }
+
+ connectedCallback() {
+ this.render();
+ }
+
+ attributeChangedCallback() {
+ this.render();
+ }
+
+ get size() {
+ return this.getAttribute("size") || "32";
+ }
+
+ get color() {
+ return this.getAttribute("color") || "#ffffff";
+ }
+
+ get strokeWidth() {
+ return this.getAttribute("stroke-width") || "2";
+ }
+
+ render() {
+ this.shadowRoot.innerHTML = `
+
+
+
+
+
+
+ `;
+ }
+}
+
+customElements.define("user-icon", UserIcon);