diff --git a/templates/loop/no-products-found.html.twig b/templates/loop/no-products-found.html.twig
new file mode 100644
index 0000000..bc52b9c
--- /dev/null
+++ b/templates/loop/no-products-found.html.twig
@@ -0,0 +1,17 @@
+{#
+ # No Products Found (Bootstrap 5 Override)
+ #
+ # Displayed when the product archive has no results.
+ #
+ # WooCommerce PHP equivalent: loop/no-products-found.php
+ #
+ # @package WcBootstrap
+ # @since 0.1.0
+ #}
+
+
+
+
+ {{ __('No products were found matching your selection.') }}
+
+
diff --git a/templates/loop/orderby.html.twig b/templates/loop/orderby.html.twig
new file mode 100644
index 0000000..27485aa
--- /dev/null
+++ b/templates/loop/orderby.html.twig
@@ -0,0 +1,40 @@
+{#
+ # Catalog Ordering / Sort Dropdown (Bootstrap 5 Override)
+ #
+ # Renders the product sort-by dropdown as a Bootstrap 5 form-select.
+ #
+ # Expected context:
+ # catalog_orderby_options - Associative array of { value: label } sort options
+ # orderby - Currently selected orderby value
+ # use_label - Whether to display a label (boolean)
+ #
+ # WooCommerce PHP equivalent: loop/orderby.php
+ #
+ # @package WcBootstrap
+ # @since 0.1.0
+ #}
+
+
diff --git a/templates/loop/pagination.html.twig b/templates/loop/pagination.html.twig
new file mode 100644
index 0000000..0365293
--- /dev/null
+++ b/templates/loop/pagination.html.twig
@@ -0,0 +1,24 @@
+{#
+ # Product Pagination (Bootstrap 5 Override)
+ #
+ # Renders pagination for the product archive using Bootstrap 5 pagination component.
+ #
+ # Expected context:
+ # total - Total number of pages
+ # current - Current page number (1-based)
+ #
+ # WooCommerce PHP equivalent: loop/pagination.php
+ #
+ # @package WcBootstrap
+ # @since 0.1.0
+ #}
+
+{% set max_pages = total|default(1) %}
+{% set current_page = current|default(1) %}
+
+{% if max_pages > 1 %}
+ {% include 'components/pagination.html.twig' with {
+ current_page: current_page,
+ max_pages: max_pages
+ } %}
+{% endif %}
diff --git a/templates/loop/price.html.twig b/templates/loop/price.html.twig
new file mode 100644
index 0000000..0f1433b
--- /dev/null
+++ b/templates/loop/price.html.twig
@@ -0,0 +1,21 @@
+{#
+ # Loop Product Price (Bootstrap 5 Override)
+ #
+ # Renders the product price within the shop loop.
+ # Price HTML is pre-formatted by WooCommerce (includes sale/regular markup).
+ #
+ # Expected context:
+ # product - WC_Product object with:
+ # .get_price_html() - Formatted price HTML (includes / for sales)
+ #
+ # WooCommerce PHP equivalent: loop/price.php
+ #
+ # @package WcBootstrap
+ # @since 0.1.0
+ #}
+
+{% if product is defined %}
+
+ {{ product.get_price_html()|raw }}
+
+{% endif %}
diff --git a/templates/loop/rating.html.twig b/templates/loop/rating.html.twig
new file mode 100644
index 0000000..3458ceb
--- /dev/null
+++ b/templates/loop/rating.html.twig
@@ -0,0 +1,40 @@
+{#
+ # Loop Product Rating (Bootstrap 5 Override)
+ #
+ # Renders star ratings for products in the shop loop.
+ #
+ # Expected context:
+ # product - WC_Product object with:
+ # .get_average_rating() - Average rating (0-5)
+ # .get_review_count() - Number of reviews
+ # reviews_enabled - Whether reviews/ratings are enabled (boolean)
+ #
+ # WooCommerce PHP equivalent: loop/rating.php
+ #
+ # @package WcBootstrap
+ # @since 0.1.0
+ #}
+
+{% if reviews_enabled is not defined or reviews_enabled %}
+ {% if product is defined and product.get_average_rating() > 0 %}
+ {% set rating = product.get_average_rating() %}
+ {% set count = product.get_review_count() %}
+
+
+ {% for i in 1..5 %}
+ {% if i <= rating|round(0, 'floor') %}
+
+ {% elseif i - rating < 1 %}
+
+ {% else %}
+
+ {% endif %}
+ {% endfor %}
+ {% if count > 0 %}
+ ({{ count }})
+ {% endif %}
+
+ {% endif %}
+{% endif %}
diff --git a/templates/loop/result-count.html.twig b/templates/loop/result-count.html.twig
new file mode 100644
index 0000000..9830183
--- /dev/null
+++ b/templates/loop/result-count.html.twig
@@ -0,0 +1,33 @@
+{#
+ # Result Count (Bootstrap 5 Override)
+ #
+ # Displays the "Showing X-Y of Z results" text.
+ #
+ # Expected context:
+ # total - Total number of products
+ # per_page - Products per page
+ # current - Current page number
+ # orderedby - Whether results are currently sorted (optional)
+ #
+ # WooCommerce PHP equivalent: loop/result-count.php
+ #
+ # @package WcBootstrap
+ # @since 0.1.0
+ #}
+
+
+ {% if total is defined %}
+ {% set first = ((current|default(1) - 1) * per_page|default(total)) + 1 %}
+ {% set last = current|default(1) * per_page|default(total) %}
+ {% if last > total %}{% set last = total %}{% endif %}
+
+ {% if total <= per_page|default(total) or total == 0 %}
+ {{ _n('Showing the single result', 'Showing all %d results', total)|format(total) }}
+ {% else %}
+ {{ __('Showing %1$d–%2$d of %3$d results')|format(first, last, total) }}
+ {% endif %}
+ {% endif %}
+
diff --git a/templates/loop/sale-flash.html.twig b/templates/loop/sale-flash.html.twig
new file mode 100644
index 0000000..42375a2
--- /dev/null
+++ b/templates/loop/sale-flash.html.twig
@@ -0,0 +1,21 @@
+{#
+ # Sale Badge (Bootstrap 5 Override)
+ #
+ # Renders a sale badge overlay on product cards.
+ #
+ # Expected context:
+ # product - WC_Product object with:
+ # .is_on_sale() - Whether product is currently on sale
+ # post - Global post object
+ #
+ # WooCommerce PHP equivalent: loop/sale-flash.php
+ #
+ # @package WcBootstrap
+ # @since 0.1.0
+ #}
+
+{% if product is defined and product.is_on_sale() %}
+
+ {{ __('Sale!') }}
+
+{% endif %}
diff --git a/templates/product-searchform.html.twig b/templates/product-searchform.html.twig
new file mode 100644
index 0000000..a08df19
--- /dev/null
+++ b/templates/product-searchform.html.twig
@@ -0,0 +1,32 @@
+{#
+ # Product Search Form (Bootstrap 5 Override)
+ #
+ # Renders the WooCommerce product search form as a Bootstrap 5 input-group.
+ #
+ # Expected context:
+ # index - Unique form index (for multiple search forms on a page)
+ #
+ # WooCommerce PHP equivalent: product-searchform.php
+ #
+ # @package WcBootstrap
+ # @since 0.1.0
+ #}
+
+{% set field_id = 'woocommerce-product-search-field-' ~ (index|default(0)) %}
+
+