From 69e763532d10c3c033097f66c47355dcebaf6e91 Mon Sep 17 00:00:00 2001
From: Dan Cormier <dancormierall@gmail.com>
Date: Wed, 11 Dec 2024 18:11:14 -0500
Subject: [PATCH 1/3] fix(pagination): support accessible markup

[STACKS-687](https://stackoverflow.atlassian.net/browse/STACKS-687)
---
 docs/product/components/pagination.html       | 165 +++++++++++-------
 .../pagination/pagination.a11y.test.ts        |  31 +++-
 lib/components/pagination/pagination.less     |  18 +-
 .../pagination/pagination.visual.test.ts      |  27 +++
 .../baseline/s-pagination-dark-legacy.ico     |   3 +
 .../s-pagination-highcontrast-dark-legacy.ico |   3 +
 ...s-pagination-highcontrast-light-legacy.ico |   3 +
 .../baseline/s-pagination-light-legacy.ico    |   3 +
 .../baseline/s-pagination-dark-legacy.ico     |   3 +
 .../s-pagination-highcontrast-dark-legacy.ico |   3 +
 ...s-pagination-highcontrast-light-legacy.ico |   3 +
 .../baseline/s-pagination-light-legacy.ico    |   3 +
 .../baseline/s-pagination-dark-legacy.ico     |   3 +
 .../s-pagination-highcontrast-dark-legacy.ico |   3 +
 ...s-pagination-highcontrast-light-legacy.ico |   3 +
 .../baseline/s-pagination-light-legacy.ico    |   3 +
 16 files changed, 205 insertions(+), 72 deletions(-)
 create mode 100644 screenshots/Chromium/baseline/s-pagination-dark-legacy.ico
 create mode 100644 screenshots/Chromium/baseline/s-pagination-highcontrast-dark-legacy.ico
 create mode 100644 screenshots/Chromium/baseline/s-pagination-highcontrast-light-legacy.ico
 create mode 100644 screenshots/Chromium/baseline/s-pagination-light-legacy.ico
 create mode 100644 screenshots/Firefox/baseline/s-pagination-dark-legacy.ico
 create mode 100644 screenshots/Firefox/baseline/s-pagination-highcontrast-dark-legacy.ico
 create mode 100644 screenshots/Firefox/baseline/s-pagination-highcontrast-light-legacy.ico
 create mode 100644 screenshots/Firefox/baseline/s-pagination-light-legacy.ico
 create mode 100644 screenshots/Webkit/baseline/s-pagination-dark-legacy.ico
 create mode 100644 screenshots/Webkit/baseline/s-pagination-highcontrast-dark-legacy.ico
 create mode 100644 screenshots/Webkit/baseline/s-pagination-highcontrast-light-legacy.ico
 create mode 100644 screenshots/Webkit/baseline/s-pagination-light-legacy.ico

diff --git a/docs/product/components/pagination.html b/docs/product/components/pagination.html
index 26f8f343eb..1eeac47869 100644
--- a/docs/product/components/pagination.html
+++ b/docs/product/components/pagination.html
@@ -29,72 +29,113 @@
 </section>
 <section class="stacks-section">
     {% header "h2", "Example" %}
+
+    {% tip, "warning", "mb24" %}
+        <strong>Note:</strong> As of Stacks 2.6.1, the recommended pagination component markup has been updated for better accessibility. Please update any existing implementations to the new markup.
+    {% endtip %}
+
     <div class="stacks-preview">
 {% highlight html %}
-<div class="s-pagination">
-    <a class="s-pagination--item is-selected" href="…" aria-current="page">
-        <span class="v-visible-sr">page</span>
-        1
-    </a>
-    <a class="s-pagination--item" href="…">
-        <span class="v-visible-sr">page</span>
-        2
-    </a>
-    <a class="s-pagination--item" href="…">
-        <span class="v-visible-sr">page</span>
-        3
-    </a>
-    <a class="s-pagination--item" href="…">
-        <span class="v-visible-sr">page</span>
-        4
-    </a>
-    <a class="s-pagination--item" href="…">
-        <span class="v-visible-sr">page</span>
-        5
-    </a>
-    <span class="s-pagination--item s-pagination--item__clear">…</span>
-    <a class="s-pagination--item" href="…">
-        <span class="v-visible-sr">page</span>
-        122386
-    </a>
-    <a class="s-pagination--item" href="…">
-        Next
-        <span class="v-visible-sr">page</span>
-    </a>
-</div>
+<nav class="s-pagination">
+    <ul>
+        <li>
+            <a class="s-pagination--item is-selected" href="…" aria-current="page">
+                <span class="v-visible-sr">page</span>
+                1
+            </a>
+        </li>
+        <li>
+            <a class="s-pagination--item" href="…">
+                <span class="v-visible-sr">page</span>
+                2
+            </a>
+        </li>
+        <li>
+            <a class="s-pagination--item" href="…">
+                <span class="v-visible-sr">page</span>
+                3
+            </a>
+        </li>
+        <li>
+            <a class="s-pagination--item" href="…">
+                <span class="v-visible-sr">page</span>
+                4
+            </a>
+        </li>
+        <li>
+            <a class="s-pagination--item" href="…">
+                <span class="v-visible-sr">page</span>
+                5
+            </a>
+        </li>
+        <li>
+            <span class="s-pagination--item s-pagination--item__clear">…</span>
+        </li>
+        <li>
+            <a class="s-pagination--item" href="…">
+                <span class="v-visible-sr">page</span>
+                122386
+            </a>
+        </li>
+        <li>
+            <a class="s-pagination--item" href="…">
+                Next
+                <span class="v-visible-sr">page</span>
+            </a>
+        </li>
+    </ul>
+</nav>
 {% endhighlight %}
         <div class="stacks-preview--example overflow-x-auto">
-            <div class="s-pagination">
-                <a class="s-pagination--item is-selected" href="#" aria-current="page">
-                    <span class="v-visible-sr">page</span>
-                    1
-                </a>
-                <a class="s-pagination--item" href="#">
-                    <span class="v-visible-sr">page</span>
-                    2
-                </a>
-                <a class="s-pagination--item" href="#">
-                    <span class="v-visible-sr">page</span>
-                    3
-                </a>
-                <a class="s-pagination--item" href="#">
-                    <span class="v-visible-sr">page</span>
-                    4
-                </a>
-                <a class="s-pagination--item" href="#">
-                    <span class="v-visible-sr">page</span>
-                    5
-                </a>
-                <span class="s-pagination--item s-pagination--item__clear">…</span>
-                <a class="s-pagination--item" href="#">
-                    <span class="v-visible-sr">page</span>
-                    122386
-                </a>
-                <a class="s-pagination--item" href="#">
-                    Next
-                    <span class="v-visible-sr">page</span>
-                </a>
-            </div>
+            <nav class="s-pagination">
+                <ul>
+                    <li>
+                        <a class="s-pagination--item is-selected" href="#" aria-current="page">
+                            <span class="v-visible-sr">page</span>
+                            1
+                        </a>
+                    </li>
+                    <li>
+                        <a class="s-pagination--item" href="#">
+                            <span class="v-visible-sr">page</span>
+                            2
+                        </a>
+                    </li>
+                    <li>
+                        <a class="s-pagination--item" href="#">
+                            <span class="v-visible-sr">page</span>
+                            3
+                        </a>
+                    </li>
+                    <li>
+                        <a class="s-pagination--item" href="#">
+                            <span class="v-visible-sr">page</span>
+                            4
+                        </a>
+                    </li>
+                    <li>
+                        <a class="s-pagination--item" href="#">
+                            <span class="v-visible-sr">page</span>
+                            5
+                        </a>
+                    </li>
+                    <li>
+                        <span class="s-pagination--item s-pagination--item__clear">…</span>
+                    </li>
+                    <li>
+                        <a class="s-pagination--item" href="#">
+                            <span class="v-visible-sr">page</span>
+                            122386
+                        </a>
+                    </li>
+                    <li>
+                        <a class="s-pagination--item" href="#">
+                            Next
+                            <span class="v-visible-sr">page</span>
+                        </a>
+                    </li>
+                </ul>
+            </nav>
         </div>
     </div>
 </section>
diff --git a/lib/components/pagination/pagination.a11y.test.ts b/lib/components/pagination/pagination.a11y.test.ts
index c7fd0e9cb7..4009191c87 100644
--- a/lib/components/pagination/pagination.a11y.test.ts
+++ b/lib/components/pagination/pagination.a11y.test.ts
@@ -7,15 +7,32 @@ describe("pagination", () => {
         baseClass: "s-pagination",
         children: {
             default: `
-                <a class="s-pagination--item" href="#">Prev</a>
-                <a class="s-pagination--item" href="#">1</a>
-                <span class="s-pagination--item is-selected" aria-current="page">2</span>
-                <a class="s-pagination--item" href="#">3</a>
-                <span class="s-pagination--item s-pagination--item__clear">…</span>
-                <a class="s-pagination--item" href="#">100</a>
-                <a class="s-pagination--item" href="#">Next</a>
+                <ul>
+                    <li>
+                        <a class="s-pagination--item" href="#">Prev</a>
+                    </li>
+                    <li>
+                        <a class="s-pagination--item" href="#">1</a>
+                    </li>
+                    <li>
+                        <span class="s-pagination--item is-selected" aria-current="page">2</span>
+                    </li>
+                    <li>
+                        <a class="s-pagination--item" href="#">3</a>
+                    </li>
+                    <li>
+                        <span class="s-pagination--item s-pagination--item__clear">…</span>
+                    </li>
+                    <li>
+                        <a class="s-pagination--item" href="#">100</a>
+                    </li>
+                    <li>
+                        <a class="s-pagination--item" href="#">Next</a>
+                    </li>
+                </ul>
             `,
         },
+        tag: "nav",
         additionalAssertions: [WCAGNonTextContrast],
     });
 });
diff --git a/lib/components/pagination/pagination.less b/lib/components/pagination/pagination.less
index b3893cd084..c79a213ae9 100644
--- a/lib/components/pagination/pagination.less
+++ b/lib/components/pagination/pagination.less
@@ -1,4 +1,12 @@
 .s-pagination {
+    // reset list styles on ul.s-pagination and .s-pagination ul
+    ul,
+    ul& {
+        list-style: none;
+        margin: 0;
+        padding: 0;
+    }
+
     & &--item {
         --_pa-item-bg: transparent;
         --_pa-item-bc: var(--bc-darker);
@@ -54,12 +62,16 @@
         color: var(--_pa-item-fc);
 
         border-radius: var(--br-sm);
+        display: inline-block;
         font-size: var(--fs-body1);
         line-height: var(--lh-xl);
         padding: 0 var(--su8);
     }
 
-    display: flex;
-    flex-wrap: wrap;
-    gap: var(--su4);
+    &,
+    ul {
+        display: flex;
+        flex-wrap: wrap;
+        gap: var(--su4);
+    }
 }
diff --git a/lib/components/pagination/pagination.visual.test.ts b/lib/components/pagination/pagination.visual.test.ts
index 737750e157..cea8d729d0 100644
--- a/lib/components/pagination/pagination.visual.test.ts
+++ b/lib/components/pagination/pagination.visual.test.ts
@@ -7,6 +7,32 @@ describe("pagination", () => {
         baseClass: "s-pagination",
         children: {
             default: `
+                <ul>
+                    <li>
+                        <a class="s-pagination--item" href="#">Prev</a>
+                    </li>
+                    <li>
+                        <a class="s-pagination--item" href="#">1</a>
+                    </li>
+                    <li>
+                        <span class="s-pagination--item is-selected" aria-current="page">2</span>
+                    </li>
+                    <li>
+                        <a class="s-pagination--item" href="#">3</a>
+                    </li>
+                    <li>
+                        <span class="s-pagination--item s-pagination--item__clear">…</span>
+                    </li>
+                    <li>
+                        <a class="s-pagination--item" href="#">100</a>
+                    </li>
+                    <li>
+                        <a class="s-pagination--item" href="#">Next</a>
+                    </li>
+                </ul>
+            `,
+            // legacy test for deprecated pagination component markup
+            legacy: `
                 <a class="s-pagination--item" href="#">Prev</a>
                 <a class="s-pagination--item" href="#">1</a>
                 <span class="s-pagination--item is-selected" aria-current="page">2</span>
@@ -16,6 +42,7 @@ describe("pagination", () => {
                 <a class="s-pagination--item" href="#">Next</a>
             `,
         },
+        tag: "nav",
         template: ({ component, testid }) => html`
             <div class="d-inline-block p8" data-testid="${testid}">
                 ${component}
diff --git a/screenshots/Chromium/baseline/s-pagination-dark-legacy.ico b/screenshots/Chromium/baseline/s-pagination-dark-legacy.ico
new file mode 100644
index 0000000000..46f0a07480
--- /dev/null
+++ b/screenshots/Chromium/baseline/s-pagination-dark-legacy.ico
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:56267fe9e1543dcbe35c39d4b88b36e3f6e1071d52f0ddc6ae6074c4942dede9
+size 2930
diff --git a/screenshots/Chromium/baseline/s-pagination-highcontrast-dark-legacy.ico b/screenshots/Chromium/baseline/s-pagination-highcontrast-dark-legacy.ico
new file mode 100644
index 0000000000..f42f7c4cb0
--- /dev/null
+++ b/screenshots/Chromium/baseline/s-pagination-highcontrast-dark-legacy.ico
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:08a4173c2e773e613ec9ae58b05166157cc00ff71dc26d78c6b10357a2121777
+size 2810
diff --git a/screenshots/Chromium/baseline/s-pagination-highcontrast-light-legacy.ico b/screenshots/Chromium/baseline/s-pagination-highcontrast-light-legacy.ico
new file mode 100644
index 0000000000..0906d033f9
--- /dev/null
+++ b/screenshots/Chromium/baseline/s-pagination-highcontrast-light-legacy.ico
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e2d9586a4623896d24b3e69bea97f7d307e1a674a3e8ecb07617d11d45ab6e27
+size 2891
diff --git a/screenshots/Chromium/baseline/s-pagination-light-legacy.ico b/screenshots/Chromium/baseline/s-pagination-light-legacy.ico
new file mode 100644
index 0000000000..5ae152afe8
--- /dev/null
+++ b/screenshots/Chromium/baseline/s-pagination-light-legacy.ico
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:aca0115bfbfe0d36ec2b8cd2a4821846d009c65a47e5ab9e599f19117253609c
+size 2947
diff --git a/screenshots/Firefox/baseline/s-pagination-dark-legacy.ico b/screenshots/Firefox/baseline/s-pagination-dark-legacy.ico
new file mode 100644
index 0000000000..eeac2dd0e7
--- /dev/null
+++ b/screenshots/Firefox/baseline/s-pagination-dark-legacy.ico
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7525ea34e5ceaa5f55895fb4f683f74ae78160c4de11254cd5790297e593246b
+size 3564
diff --git a/screenshots/Firefox/baseline/s-pagination-highcontrast-dark-legacy.ico b/screenshots/Firefox/baseline/s-pagination-highcontrast-dark-legacy.ico
new file mode 100644
index 0000000000..27a989fbb0
--- /dev/null
+++ b/screenshots/Firefox/baseline/s-pagination-highcontrast-dark-legacy.ico
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:50049f9525cedbc6db037aef76ac8cd1b3aad0ed5ad194995a8882ec47dc106b
+size 3527
diff --git a/screenshots/Firefox/baseline/s-pagination-highcontrast-light-legacy.ico b/screenshots/Firefox/baseline/s-pagination-highcontrast-light-legacy.ico
new file mode 100644
index 0000000000..2be89e9477
--- /dev/null
+++ b/screenshots/Firefox/baseline/s-pagination-highcontrast-light-legacy.ico
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d12df32fe9413c902d9aa86e780603f74efd78ae536b4c02e13f1cbb80fe2e32
+size 3517
diff --git a/screenshots/Firefox/baseline/s-pagination-light-legacy.ico b/screenshots/Firefox/baseline/s-pagination-light-legacy.ico
new file mode 100644
index 0000000000..94195b090a
--- /dev/null
+++ b/screenshots/Firefox/baseline/s-pagination-light-legacy.ico
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0571367c9c902dda5a440ed30c0689cfa58521b369c5f6af84db0d72ce01fad2
+size 3492
diff --git a/screenshots/Webkit/baseline/s-pagination-dark-legacy.ico b/screenshots/Webkit/baseline/s-pagination-dark-legacy.ico
new file mode 100644
index 0000000000..0bbd80dee9
--- /dev/null
+++ b/screenshots/Webkit/baseline/s-pagination-dark-legacy.ico
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7e0acd89ef473ba1390edea605dd9c11947160f37a6bcb6d56327c1fb45f6b3b
+size 2412
diff --git a/screenshots/Webkit/baseline/s-pagination-highcontrast-dark-legacy.ico b/screenshots/Webkit/baseline/s-pagination-highcontrast-dark-legacy.ico
new file mode 100644
index 0000000000..6ebd032230
--- /dev/null
+++ b/screenshots/Webkit/baseline/s-pagination-highcontrast-dark-legacy.ico
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:63d357bf92886a4b2a3de71024cea5d3677bf93a38a406f7532721e3f8d102d2
+size 2333
diff --git a/screenshots/Webkit/baseline/s-pagination-highcontrast-light-legacy.ico b/screenshots/Webkit/baseline/s-pagination-highcontrast-light-legacy.ico
new file mode 100644
index 0000000000..f9e529640f
--- /dev/null
+++ b/screenshots/Webkit/baseline/s-pagination-highcontrast-light-legacy.ico
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4921395ccb4b14c481ee180751a3757ff5a50d32917a84b1c69e69e9579b9564
+size 2433
diff --git a/screenshots/Webkit/baseline/s-pagination-light-legacy.ico b/screenshots/Webkit/baseline/s-pagination-light-legacy.ico
new file mode 100644
index 0000000000..a0afeecfec
--- /dev/null
+++ b/screenshots/Webkit/baseline/s-pagination-light-legacy.ico
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2b11d98ca9c19a4a77111c79cd8a3f34cd14d53692096f5713d690f1f1ea18d7
+size 2396

From 60849a1ff1381af690d06130e49319949e5ac3c8 Mon Sep 17 00:00:00 2001
From: Dan Cormier <dancormierall@gmail.com>
Date: Wed, 11 Dec 2024 18:17:32 -0500
Subject: [PATCH 2/3] Remove reference to Stacks 2.6.1 in markup deprecation
 notice

---
 docs/product/components/pagination.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/product/components/pagination.html b/docs/product/components/pagination.html
index 1eeac47869..7b96999548 100644
--- a/docs/product/components/pagination.html
+++ b/docs/product/components/pagination.html
@@ -31,7 +31,7 @@
     {% header "h2", "Example" %}
 
     {% tip, "warning", "mb24" %}
-        <strong>Note:</strong> As of Stacks 2.6.1, the recommended pagination component markup has been updated for better accessibility. Please update any existing implementations to the new markup.
+        <strong>Note:</strong> The recommended pagination component markup has been updated for better accessibility. Please update any existing implementations to the new markup.
     {% endtip %}
 
     <div class="stacks-preview">

From 2604c4ef3b0b128e255f740c5c32a88bc8108c06 Mon Sep 17 00:00:00 2001
From: Dan Cormier <dancormierall@gmail.com>
Date: Thu, 12 Dec 2024 16:23:44 -0500
Subject: [PATCH 3/3] Update docs with review suggestions

Addresses review: https://github.com/StackExchange/Stacks/pull/1870#pullrequestreview-2498703726
---
 docs/product/components/pagination.html | 86 +++++++++++++++++++++++--
 1 file changed, 79 insertions(+), 7 deletions(-)

diff --git a/docs/product/components/pagination.html b/docs/product/components/pagination.html
index 7b96999548..ffd98c3695 100644
--- a/docs/product/components/pagination.html
+++ b/docs/product/components/pagination.html
@@ -29,14 +29,9 @@
 </section>
 <section class="stacks-section">
     {% header "h2", "Example" %}
-
-    {% tip, "warning", "mb24" %}
-        <strong>Note:</strong> The recommended pagination component markup has been updated for better accessibility. Please update any existing implementations to the new markup.
-    {% endtip %}
-
     <div class="stacks-preview">
 {% highlight html %}
-<nav class="s-pagination">
+<nav class="s-pagination" aria-label="pagination">
     <ul>
         <li>
             <a class="s-pagination--item is-selected" href="…" aria-current="page">
@@ -87,7 +82,7 @@
 </nav>
 {% endhighlight %}
         <div class="stacks-preview--example overflow-x-auto">
-            <nav class="s-pagination">
+            <nav class="s-pagination" role="presentation">
                 <ul>
                     <li>
                         <a class="s-pagination--item is-selected" href="#" aria-current="page">
@@ -139,3 +134,80 @@
         </div>
     </div>
 </section>
+
+<section class="stacks-section">
+    {% header "h2", "Legacy example" %}
+
+    {% tip, "warning", "mb24" %}
+        <strong>Note:</strong>The below markup has been deprecated due to insufficient accessibility. Please use the new markup above.
+    {% endtip %}
+
+    <div class="stacks-preview">
+{% highlight html %}
+<div class="s-pagination">
+    <a class="s-pagination--item is-selected" href="…" aria-current="page">
+        <span class="v-visible-sr">page</span>
+        1
+    </a>
+    <a class="s-pagination--item" href="…">
+        <span class="v-visible-sr">page</span>
+        2
+    </a>
+    <a class="s-pagination--item" href="…">
+        <span class="v-visible-sr">page</span>
+        3
+    </a>
+    <a class="s-pagination--item" href="…">
+        <span class="v-visible-sr">page</span>
+        4
+    </a>
+    <a class="s-pagination--item" href="…">
+        <span class="v-visible-sr">page</span>
+        5
+    </a>
+    <span class="s-pagination--item s-pagination--item__clear">…</span>
+    <a class="s-pagination--item" href="…">
+        <span class="v-visible-sr">page</span>
+        122386
+    </a>
+    <a class="s-pagination--item" href="…">
+        Next
+        <span class="v-visible-sr">page</span>
+    </a>
+</div>
+{% endhighlight %}
+        <div class="stacks-preview--example overflow-x-auto">
+            <div class="s-pagination" role="presentation">
+                <a class="s-pagination--item is-selected" href="#" aria-current="page">
+                    <span class="v-visible-sr">page</span>
+                    1
+                </a>
+                <a class="s-pagination--item" href="#">
+                    <span class="v-visible-sr">page</span>
+                    2
+                </a>
+                <a class="s-pagination--item" href="#">
+                    <span class="v-visible-sr">page</span>
+                    3
+                </a>
+                <a class="s-pagination--item" href="#">
+                    <span class="v-visible-sr">page</span>
+                    4
+                </a>
+                <a class="s-pagination--item" href="#">
+                    <span class="v-visible-sr">page</span>
+                    5
+                </a>
+                <span class="s-pagination--item s-pagination--item__clear">…</span>
+                <a class="s-pagination--item" href="#">
+                    <span class="v-visible-sr">page</span>
+                    122386
+                </a>
+                <a class="s-pagination--item" href="#">
+                    Next
+                    <span class="v-visible-sr">page</span>
+                </a>
+            </div>
+        </div>
+    </div>
+</section>