ply-css 1.5.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLAUDE.md CHANGED
@@ -28,7 +28,7 @@ ply automatically styles semantic HTML elements — `<nav>`, `<table>`, `<code>`
28
28
  8. **Use semantic HTML first** — ply auto-styles `<code>`, `<pre>`, `<kbd>`, `<blockquote>`, `<mark>`, `<table>`, `<details>`, `<dialog>`, `<nav>`, etc. Use native elements before creating custom classes.
29
29
  9. **Only use documented ply classes** — Do NOT invent class names. Search `ply-classes.json` to find the right class. See PLY.md for the full prose reference.
30
30
  10. **Dark mode is automatic** — Auto dark mode activates only when no `data-theme` attribute is set on `<html>`. Use `data-theme="dark"` for explicit dark mode, `data-theme="light"` for explicit light mode, or any custom value (e.g., `data-theme="warm"`) for a custom theme without dark-mode interference. Use `var(--ply-*)` custom properties for colors (see `customProperties` in the JSON), never hard-code values that break dark mode.
31
- 11. **Icons** — Use [Feather Icons](https://feathericons.com) as the preferred icon library. Any icon library works, but Feather pairs well with ply's aesthetic.
31
+ 11. **Icons** — Use [Lucide](https://lucide.dev) as the preferred icon library. Any icon library works, but Lucide pairs well with ply's aesthetic. For icon + text buttons, place the icon before or after the label — the button's built-in `inline-flex` layout with `gap: 0.5em` handles alignment automatically. Use `btn-icon` only for icon-only buttons (no visible text).
32
32
  12. **Container queries** — Use `container-query` on a parent element and `container-tablet-unit-*`, `container-phone-unit-*`, etc. for component-level responsive behavior (responds to parent width, not viewport). See PLY.md for details.
33
33
 
34
34
  ## Custom Themes
@@ -44,12 +44,15 @@ Create a custom theme by defining a `data-theme` value and overriding `--ply-*`
44
44
  --ply-color-body: #1a1a1a;
45
45
  --ply-color-headings: #78350f;
46
46
  --ply-border-color: #fbbf24;
47
+ --ply-border-radius: 0.375rem;
47
48
  --ply-color-accent: #b45309;
48
49
  --ply-btn-default-bg: #b45309; /* Controls btn-primary + links */
49
50
  --ply-btn-default-bg-hover: #92400e;
50
51
  --ply-btn-default-bg-active: #7c2d12;
51
52
  --ply-btn-secondary-bg: #78350f;
52
53
  --ply-btn-border-radius: 0.5rem;
54
+ --ply-btn-font-size: 0.875rem; /* button text size */
55
+ --ply-btn-gap: 0.375rem; /* icon-to-text gap */
53
56
  --ply-nav-bg: #fef3c7;
54
57
  --ply-nav-border: #f59e0b;
55
58
 
package/PLY.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # PLY — AI-Ready CSS Framework
2
2
 
3
- ply is a ratio-based, flexbox CSS framework with dark mode, accessibility defaults, and a small footprint (~21KB gzip full, ~17KB core). 457 utility classes, 120+ CSS custom properties, 13 auto-styled semantic elements.
3
+ ply is a ratio-based, flexbox CSS framework with dark mode, accessibility defaults, and a small footprint (~21KB gzip full, ~17KB core). 458 utility classes, 120+ CSS custom properties, 13 auto-styled semantic elements.
4
4
 
5
5
  **Differentiators:** Small bundle, AI-parseable class system, accessible out of the box, dark mode built-in.
6
6
 
@@ -8,7 +8,7 @@ ply is a ratio-based, flexbox CSS framework with dark mode, accessibility defaul
8
8
 
9
9
  **`ply-classes.json`** is the complete searchable reference. Before writing any custom CSS, search it first:
10
10
 
11
- - **`classes`** — Every ply class (457) with category, description, and usage examples. Search here before inventing a class name or writing a custom style.
11
+ - **`classes`** — Every ply class (458) with category, description, and usage examples. Search here before inventing a class name or writing a custom style.
12
12
  - **`customProperties`** — All `--ply-*` CSS variables organized by category (background, text, borders, interactive, forms, code, tables, buttons, navigation, elevation, brand, palette, colorSurfaces, spacing). Each entry includes light and dark mode values. Use these instead of hardcoding colors.
13
13
  - **`semanticElements`** — Every HTML element ply auto-styles (`<dialog>`, `<details>`, `<table>`, `<code>`, `<kbd>`, `<mark>`, `<progress>`, `<meter>`, headings, form controls) with styling details and usage tips. Check here before building a custom component.
14
14
 
@@ -27,12 +27,15 @@ Create a custom theme by defining a `data-theme` value and overriding `--ply-*`
27
27
  --ply-color-body: #1a1a1a;
28
28
  --ply-color-headings: #78350f;
29
29
  --ply-border-color: #fbbf24;
30
+ --ply-border-radius: 0.375rem;
30
31
  --ply-color-accent: #b45309;
31
32
  --ply-btn-default-bg: #b45309;
32
33
  --ply-btn-default-bg-hover: #92400e;
33
34
  --ply-btn-default-bg-active: #7c2d12;
34
35
  --ply-btn-secondary-bg: #78350f;
35
36
  --ply-btn-border-radius: 0.5rem;
37
+ --ply-btn-font-size: 0.875rem; /* button text size — default 1em inherits from context */
38
+ --ply-btn-gap: 0.375rem; /* icon-to-text gap — default 0.5em */
36
39
  --ply-nav-bg: #fef3c7;
37
40
  --ply-nav-border: #f59e0b;
38
41
 
@@ -144,15 +147,16 @@ Note: The CDN approach gives you ply's classes and dark mode, but you won't have
144
147
 
145
148
  ## Icons
146
149
 
147
- ply does not include icons. [Feather Icons](https://feathericons.com) is the recommended icon library — it's lightweight, clean, and pairs well with ply's aesthetic. Any icon library works.
150
+ ply does not include icons. [Lucide](https://lucide.dev) is the recommended icon library — it's lightweight, clean, and pairs well with ply's aesthetic. Any icon library works.
148
151
 
149
152
  ```html
150
- <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
151
- <script>feather.replace();</script>
153
+ <!-- CDN -->
154
+ <script src="https://cdn.jsdelivr.net/npm/lucide@latest/dist/umd/lucide.min.js"></script>
155
+ <script>lucide.createIcons();</script>
152
156
 
153
157
  <!-- Usage -->
154
- <i data-feather="check"></i> Saved
155
- <button class="btn btn-blue"><i data-feather="send"></i> Send</button>
158
+ <i data-lucide="check"></i> Saved
159
+ <button class="btn btn-primary"><i data-lucide="send"></i> Send</button>
156
160
  ```
157
161
 
158
162
  ## Dark Mode
@@ -246,7 +250,61 @@ All classes, CSS custom properties, and semantic element styles are documented i
246
250
 
247
251
  - **`btn-icon`** — Icon-only button modifier. Equal padding for a square aspect ratio. Always add `aria-label` (no visible text).
248
252
  - Combine with `btn-ghost` for toolbar-style icon buttons. Combine with size modifiers (`btn-sm`, `btn-xs`) for smaller icons.
249
- - For icon + text buttons, use a regular `btn` with an inline SVG no `btn-icon` needed.
253
+ - **Icon + text buttons** Place the icon before or after the label text inside a regular `btn`. The button automatically uses `inline-flex` with `align-items: center` and `gap: 0.5em`, so icon and text are vertically centered with consistent spacing. No extra classes needed.
254
+
255
+ ```html
256
+ <!-- Icon left -->
257
+ <button class="btn btn-primary">
258
+ <i data-lucide="save"></i> Save
259
+ </button>
260
+
261
+ <!-- Icon right -->
262
+ <button class="btn btn-secondary">
263
+ Next <i data-lucide="arrow-right"></i>
264
+ </button>
265
+
266
+ <!-- Icon-only (always include aria-label) -->
267
+ <button class="btn btn-ghost btn-icon" aria-label="Delete">
268
+ <i data-lucide="trash-2"></i>
269
+ </button>
270
+
271
+ <!-- Size variants work the same way -->
272
+ <button class="btn btn-primary btn-sm">
273
+ <i data-lucide="download"></i> Export
274
+ </button>
275
+ ```
276
+
277
+ ### Button Groups
278
+
279
+ Wrap buttons in `.btn-group` for a flex row with consistent gap and connected border-radius on the outer edges.
280
+
281
+ - **`btn-group`** — Default: buttons with `0.5rem` gap between them.
282
+ - **`btn-group joined`** — No gap; buttons connect as a single unit with a 1px divider between them. Use for segmented controls, toolbars, and pagination-style groups.
283
+ - **`align-right`** / **`align-left`** / **`align-center`** — Justify the group within its container.
284
+ - **`fill-width`** — Stretch all buttons to share equal width.
285
+ - **`rounded`** — Larger border-radius on the outer edges.
286
+
287
+ ```html
288
+ <!-- Default: gapped -->
289
+ <div class="btn-group">
290
+ <button class="btn btn-primary">Save</button>
291
+ <button class="btn">Cancel</button>
292
+ </div>
293
+
294
+ <!-- Joined: connected, no gap -->
295
+ <div class="btn-group joined">
296
+ <button class="btn">Week</button>
297
+ <button class="btn btn-primary">Month</button>
298
+ <button class="btn">Year</button>
299
+ </div>
300
+
301
+ <!-- Joined icon toolbar -->
302
+ <div class="btn-group joined">
303
+ <button class="btn btn-ghost btn-icon" aria-label="Bold"><i data-lucide="bold"></i></button>
304
+ <button class="btn btn-ghost btn-icon" aria-label="Italic"><i data-lucide="italic"></i></button>
305
+ <button class="btn btn-ghost btn-icon" aria-label="Underline"><i data-lucide="underline"></i></button>
306
+ </div>
307
+ ```
250
308
 
251
309
  ## Common Patterns
252
310
 
@@ -298,7 +356,7 @@ See `snippets/responsive-header.html` for a full working example.
298
356
  - **`border-top`**, **`border-right`**, **`border-bottom`**, **`border-left`** — Single-side borders.
299
357
  - **`border-thick`** — 3px solid border (all sides). Also `border-top-thick`, `border-right-thick`, `border-bottom-thick`, `border-left-thick`.
300
358
  - **`no-border`** — Remove all borders. Also `no-border-top`, `no-border-right`, `no-border-bottom`, `no-border-left`.
301
- - **`border-radius`** — Default border radius. `border-radius-lg` (0.75rem), `border-radius-xl` (1.5rem), `circle` (100%).
359
+ - **`border-radius`** — Uses `var(--ply-border-radius)` (default 0.25rem, themeable). `border-radius-lg`, `border-radius-xl`, `circle` (100%).
302
360
 
303
361
  ### Other Common Patterns
304
362
 
package/README.md CHANGED
@@ -99,6 +99,7 @@ Override `--ply-*` CSS custom properties to create any theme:
99
99
  --ply-color-accent: #92400e; /* Icons, badges, section accents */
100
100
  --ply-btn-default-bg: #92400e; /* Primary button + links */
101
101
  --ply-btn-secondary-bg: #78350f; /* Secondary button */
102
+ --ply-border-radius: 0.375rem; /* Global border radius */
102
103
  --ply-btn-border-radius: 0.5rem; /* Button corner radius */
103
104
  --ply-font-body: Palatino, Georgia, serif;
104
105
  --ply-font-heading: Palatino, Georgia, serif;
@@ -114,11 +115,11 @@ See `snippets/custom-theme.html` for a full working example.
114
115
 
115
116
  ## Icons
116
117
 
117
- ply doesn't include icons. [Feather Icons](https://feathericons.com) is recommended — lightweight, clean, and pairs well with ply. Any icon library works.
118
+ ply doesn't include icons. [Lucide](https://lucide.dev) is recommended — lightweight, clean, and pairs well with ply. Any icon library works.
118
119
 
119
120
  ```html
120
- <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
121
- <script>feather.replace();</script>
121
+ <script src="https://cdn.jsdelivr.net/npm/lucide@latest/dist/umd/lucide.min.js"></script>
122
+ <script>lucide.createIcons();</script>
122
123
  ```
123
124
 
124
125
  ## AI Integration
@@ -151,7 +152,7 @@ ply targets ADA Title II (28 CFR Part 35) / WCAG 2.1 AA compliance at the framew
151
152
 
152
153
  ## Documentation
153
154
 
154
- Full interactive docs at [plyCSS.com](https://plycss.com) — browse every class with live examples, search the entire framework, and copy-paste code snippets.
155
+ Full interactive docs at [plycss.com](https://plycss.com) — browse every class with live examples, search the entire framework, and copy-paste code snippets.
155
156
 
156
157
  ## Roadmap
157
158
 
@@ -44,6 +44,7 @@
44
44
  --ply-btn-secondary-bg-hover: color-mix(in oklch, var(--ply-btn-secondary-bg), black 15%);
45
45
  --ply-btn-secondary-bg-active: #2b2b2b;
46
46
  --ply-btn-secondary-bg-active: color-mix(in oklch, var(--ply-btn-secondary-bg), black 25%);
47
+ --ply-border-radius: 0.25rem;
47
48
  --ply-btn-border-radius: 2rem;
48
49
  --ply-nav-bg: #ffffff;
49
50
  --ply-nav-color: #161616;
@@ -145,9 +146,9 @@
145
146
  --ply-color-text-inverse: #161616;
146
147
  --ply-border-color: #393939;
147
148
  --ply-border-strong: #6f6f6f;
148
- --ply-color-link: var(--ply-btn-default-bg);
149
+ --ply-color-link: #4589ff;
149
150
  --ply-color-link-hover: #619bff;
150
- --ply-color-link-hover: color-mix(in oklch, var(--ply-btn-default-bg), white 15%);
151
+ --ply-color-link-hover: color-mix(in oklch, #4589ff, white 15%);
151
152
  --ply-color-focus: #0f62fe;
152
153
  --ply-color-field-bg: #262626;
153
154
  --ply-color-input-border: #6f6f6f;
@@ -261,9 +262,9 @@
261
262
  --ply-color-text-inverse: #161616;
262
263
  --ply-border-color: #393939;
263
264
  --ply-border-strong: #6f6f6f;
264
- --ply-color-link: var(--ply-btn-default-bg);
265
+ --ply-color-link: #4589ff;
265
266
  --ply-color-link-hover: #619bff;
266
- --ply-color-link-hover: color-mix(in oklch, var(--ply-btn-default-bg), white 15%);
267
+ --ply-color-link-hover: color-mix(in oklch, #4589ff, white 15%);
267
268
  --ply-color-focus: #0f62fe;
268
269
  --ply-color-field-bg: #262626;
269
270
  --ply-color-input-border: #6f6f6f;
@@ -714,7 +715,7 @@ img {
714
715
  /* Native <details>/<summary> — Swiss/Modernist accordion */
715
716
  details {
716
717
  border: 1px solid var(--ply-border-color, #e0e0e0);
717
- border-radius: 0.25rem;
718
+ border-radius: var(--ply-border-radius);
718
719
  padding: 0.75rem 1rem;
719
720
  margin-bottom: 1.5rem;
720
721
  }
@@ -749,7 +750,7 @@ details[open] > summary {
749
750
  /* Native <dialog> — modal styling */
750
751
  dialog {
751
752
  border: none;
752
- border-radius: 0.25rem;
753
+ border-radius: var(--ply-border-radius);
753
754
  padding: 1.5rem;
754
755
  max-width: 32rem;
755
756
  width: 90%;
@@ -769,21 +770,21 @@ progress {
769
770
  width: 100%;
770
771
  height: 0.5rem;
771
772
  border: none;
772
- border-radius: 0.25rem;
773
+ border-radius: var(--ply-border-radius);
773
774
  background: var(--ply-bg-muted, #e0e0e0);
774
775
  margin-bottom: 1.5rem;
775
776
  }
776
777
  progress::-webkit-progress-bar {
777
778
  background: var(--ply-bg-muted, #e0e0e0);
778
- border-radius: 0.25rem;
779
+ border-radius: var(--ply-border-radius);
779
780
  }
780
781
  progress::-webkit-progress-value {
781
782
  background: var(--ply-color-link, #0f62fe);
782
- border-radius: 0.25rem;
783
+ border-radius: var(--ply-border-radius);
783
784
  }
784
785
  progress::-moz-progress-bar {
785
786
  background: var(--ply-color-link, #0f62fe);
786
- border-radius: 0.25rem;
787
+ border-radius: var(--ply-border-radius);
787
788
  }
788
789
 
789
790
  meter {
@@ -793,7 +794,7 @@ meter {
793
794
  width: 100%;
794
795
  height: 0.5rem;
795
796
  border: none;
796
- border-radius: 0.25rem;
797
+ border-radius: var(--ply-border-radius);
797
798
  background: var(--ply-bg-muted, #e0e0e0);
798
799
  margin-bottom: 1.5rem;
799
800
  }
@@ -1227,7 +1228,7 @@ meter {
1227
1228
  }
1228
1229
 
1229
1230
  .border-radius {
1230
- border-radius: 0.25rem;
1231
+ border-radius: var(--ply-border-radius);
1231
1232
  }
1232
1233
 
1233
1234
  .req,
@@ -1638,7 +1639,7 @@ pre {
1638
1639
  color: var(--ply-color-body, #222);
1639
1640
  background: var(--ply-color-code-bg, #f4f4f4);
1640
1641
  border: 1px solid var(--ply-color-code-border, #d4d4d4);
1641
- border-radius: 0.25rem;
1642
+ border-radius: var(--ply-border-radius);
1642
1643
  padding: 1rem;
1643
1644
  overflow: auto;
1644
1645
  }
@@ -1913,7 +1914,7 @@ table tfoot td {
1913
1914
  .units-row.reverse-direction, .units-row.right-to-left {
1914
1915
  flex-direction: row-reverse;
1915
1916
  }
1916
- .units-row.split {
1917
+ .units-row.joined, .units-row.split {
1917
1918
  --units-gap: 0px;
1918
1919
  gap: 0;
1919
1920
  }
@@ -3225,11 +3226,11 @@ table.table-hovered tbody tr:hover td {
3225
3226
  }
3226
3227
 
3227
3228
  .border-radius-lg {
3228
- border-radius: 0.75rem;
3229
+ border-radius: calc(var(--ply-border-radius) * 3);
3229
3230
  }
3230
3231
 
3231
3232
  .border-radius-xl {
3232
- border-radius: 1.5rem;
3233
+ border-radius: calc(var(--ply-border-radius) * 6);
3233
3234
  }
3234
3235
 
3235
3236
  .text-primary {
@@ -3353,7 +3354,7 @@ table.table-hovered tbody tr:hover td {
3353
3354
 
3354
3355
  .code {
3355
3356
  border: 1px solid #f0f1f2;
3356
- border-radius: 0.25rem;
3357
+ border-radius: var(--ply-border-radius);
3357
3358
  display: inline-block;
3358
3359
  font-size: 0.8rem;
3359
3360
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
@@ -3591,7 +3592,7 @@ table.table-hovered tbody tr:hover td {
3591
3592
  .form input[type=datetime-local],
3592
3593
  .form textarea,
3593
3594
  .form select {
3594
- border-radius: 0.25rem;
3595
+ border-radius: var(--ply-border-radius);
3595
3596
  display: block;
3596
3597
  width: 100%;
3597
3598
  padding: 0.5em 0.75em;
@@ -3694,7 +3695,7 @@ textarea {
3694
3695
  }
3695
3696
 
3696
3697
  fieldset {
3697
- border-radius: 0.25rem;
3698
+ border-radius: var(--ply-border-radius);
3698
3699
  background-color: var(--ply-bg-surface);
3699
3700
  padding: 1.5rem;
3700
3701
  margin-bottom: 1.5rem;
@@ -3827,18 +3828,18 @@ select.input-xs {
3827
3828
  min-width: 0;
3828
3829
  display: block !important;
3829
3830
  margin-bottom: 0;
3830
- border-radius: 0.25rem;
3831
+ border-radius: var(--ply-border-radius);
3831
3832
  }
3832
3833
  .input-groups input:not(:last-child),
3833
3834
  .input-groups textarea:not(:last-child),
3834
3835
  .input-groups select:not(:last-child) {
3835
3836
  border-right: none;
3836
- border-radius: 0.25rem 0 0 0.25rem;
3837
+ border-radius: var(--ply-border-radius) 0 0 var(--ply-border-radius);
3837
3838
  }
3838
3839
  .input-groups input:not(:first-child),
3839
3840
  .input-groups textarea:not(:first-child),
3840
3841
  .input-groups select:not(:first-child) {
3841
- border-radius: 0 0.25rem 0.25rem 0;
3842
+ border-radius: 0 var(--ply-border-radius) var(--ply-border-radius) 0;
3842
3843
  }
3843
3844
  .input-groups input:not(:first-child, :last-child),
3844
3845
  .input-groups textarea:not(:first-child, :last-child),
@@ -3860,11 +3861,11 @@ select.input-xs {
3860
3861
  }
3861
3862
  .input-groups .input-prepend {
3862
3863
  border-right: none;
3863
- border-radius: 0.25rem 0 0 0.25rem;
3864
+ border-radius: var(--ply-border-radius) 0 0 var(--ply-border-radius);
3864
3865
  }
3865
3866
  .input-groups .input-append {
3866
3867
  border-left: none;
3867
- border-radius: 0 0.25rem 0.25rem 0;
3868
+ border-radius: 0 var(--ply-border-radius) var(--ply-border-radius) 0;
3868
3869
  }
3869
3870
  .input-groups .input-append:has(.btn) {
3870
3871
  padding: 0;
@@ -3873,7 +3874,7 @@ select.input-xs {
3873
3874
  .input-groups .input-append .btn {
3874
3875
  display: flex;
3875
3876
  align-items: center;
3876
- border-radius: 0 0.25rem 0.25rem 0;
3877
+ border-radius: 0 var(--ply-border-radius) var(--ply-border-radius) 0;
3877
3878
  margin: 0;
3878
3879
  border-left: none;
3879
3880
  white-space: nowrap;
@@ -3890,7 +3891,7 @@ select.input-xs {
3890
3891
  .input-groups .btn-append .btn {
3891
3892
  display: flex;
3892
3893
  align-items: center;
3893
- border-radius: 0 0.25rem 0.25rem 0;
3894
+ border-radius: 0 var(--ply-border-radius) var(--ply-border-radius) 0;
3894
3895
  margin: 0;
3895
3896
  white-space: nowrap;
3896
3897
  }
@@ -3935,7 +3936,7 @@ select.select-outlined {
3935
3936
  background-size: 0.75em;
3936
3937
  padding: 0.5em 2.5em 0.5em 0.75em;
3937
3938
  border: 1px solid var(--ply-border-strong, #d4d4d4);
3938
- border-radius: 0.25rem;
3939
+ border-radius: var(--ply-border-radius);
3939
3940
  color: var(--ply-color-body);
3940
3941
  font-size: 1em;
3941
3942
  line-height: 1.5rem;
@@ -4197,7 +4198,7 @@ nav ul {
4197
4198
  display: block;
4198
4199
  padding: 0.25rem 0.75rem;
4199
4200
  font-size: 0.875rem;
4200
- border-radius: var(--ply-nav-stacked-radius, 0.25rem);
4201
+ border-radius: var(--ply-nav-stacked-radius, var(--ply-border-radius));
4201
4202
  }
4202
4203
  .nav-stacked a {
4203
4204
  color: var(--ply-nav-color);
@@ -4382,7 +4383,7 @@ nav ul {
4382
4383
  height: 2.25rem;
4383
4384
  padding: 0.25rem 0.75rem;
4384
4385
  border: 1px solid var(--ply-border-color);
4385
- border-radius: 0.25rem;
4386
+ border-radius: var(--ply-border-radius);
4386
4387
  background: var(--ply-bg-surface, #fff);
4387
4388
  color: var(--ply-color-body);
4388
4389
  text-decoration: none;
@@ -4449,13 +4450,15 @@ input[type=button].btn,
4449
4450
  input[type=reset].btn,
4450
4451
  button.btn {
4451
4452
  transition: all 150ms ease-in-out, transform 50ms ease, background 150ms ease-in-out;
4452
- display: inline-block;
4453
+ display: inline-flex;
4453
4454
  vertical-align: top;
4455
+ align-items: center;
4456
+ justify-content: center;
4457
+ gap: var(--ply-btn-gap, 0.5em);
4454
4458
  font-family: var(--ply-font-body, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, Apple Color Emoji, Segoe UI Emoji);
4455
- font-size: 1em;
4459
+ font-size: var(--ply-btn-font-size, 1em);
4456
4460
  font-weight: 400;
4457
4461
  line-height: 1.5rem;
4458
- text-align: center;
4459
4462
  text-decoration: none;
4460
4463
  color: var(--ply-btn-secondary-color, var(--ply-color-text-inverse, #fff));
4461
4464
  -webkit-appearance: none;
@@ -5396,23 +5399,27 @@ button.btn-white.btn-outline.btn-active {
5396
5399
  }
5397
5400
  .btn-single .btn:first-child,
5398
5401
  .btn-group .btn:first-child {
5399
- border-radius: 0.125rem 0 0 0.125rem;
5402
+ border-radius: calc(var(--ply-border-radius) * 0.5) 0 0 calc(var(--ply-border-radius) * 0.5);
5400
5403
  }
5401
5404
  .btn-single .btn:last-child,
5402
5405
  .btn-group .btn:last-child {
5403
- border-radius: 0 0.125rem 0.125rem 0;
5406
+ border-radius: 0 calc(var(--ply-border-radius) * 0.5) calc(var(--ply-border-radius) * 0.5) 0;
5407
+ }
5408
+ .btn-single.joined,
5409
+ .btn-group.joined {
5410
+ gap: 0;
5404
5411
  }
5405
5412
  .btn-single.rounded .btn:first-child,
5406
5413
  .btn-single.rounded .input-search:first-child,
5407
5414
  .btn-group.rounded .btn:first-child,
5408
5415
  .btn-group.rounded .input-search:first-child {
5409
- border-radius: 0.5rem 0 0 0.5rem;
5416
+ border-radius: calc(var(--ply-border-radius) * 2) 0 0 calc(var(--ply-border-radius) * 2);
5410
5417
  }
5411
5418
  .btn-single.rounded .btn:last-child,
5412
5419
  .btn-single.rounded .input-search:last-child,
5413
5420
  .btn-group.rounded .btn:last-child,
5414
5421
  .btn-group.rounded .input-search:last-child {
5415
- border-radius: 0 0.5rem 0.5rem 0;
5422
+ border-radius: 0 calc(var(--ply-border-radius) * 2) calc(var(--ply-border-radius) * 2) 0;
5416
5423
  }
5417
5424
 
5418
5425
  /* =Notifications
@@ -5423,7 +5430,7 @@ button.btn-white.btn-outline.btn-active {
5423
5430
  background: var(--ply-bg-surface-alt, #f7f8f8);
5424
5431
  color: var(--ply-color-body, #0f0f0f);
5425
5432
  margin-bottom: 1.5rem;
5426
- border-radius: 0.25rem;
5433
+ border-radius: var(--ply-border-radius);
5427
5434
  border-left: 4px solid #b3b6b7;
5428
5435
  display: flex;
5429
5436
  align-items: flex-start;
@@ -5470,7 +5477,7 @@ button.btn-white.btn-outline.btn-active {
5470
5477
  align-items: center;
5471
5478
  justify-content: center;
5472
5479
  margin: -0.5rem -0.375rem -0.5rem 0;
5473
- border-radius: 0.25rem;
5480
+ border-radius: var(--ply-border-radius);
5474
5481
  }
5475
5482
  .tools-alert .tools-alert-dismiss:hover,
5476
5483
  .tools-alert .alert-dismiss:hover,