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/llms-full.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # plycss (ply) — Complete Documentation
2
2
 
3
- > ply is a ratio-based, AI-ready CSS framework with built-in dark mode, WCAG 2.1 AA accessibility, and a small footprint (~21KB gzipped). 457 utility classes, 120+ CSS custom properties, 13 auto-styled semantic elements. No JavaScript. No build step. Install via npm as `plycss` or use the CDN.
3
+ > ply is a ratio-based, AI-ready CSS framework with built-in dark mode, WCAG 2.1 AA accessibility, and a small footprint (~21KB gzipped). 458 utility classes, 120+ CSS custom properties, 13 auto-styled semantic elements. No JavaScript. No build step. Install via npm as `plycss` or use the CDN.
4
4
 
5
5
  ---
6
6
 
@@ -246,6 +246,7 @@ Override `--ply-*` custom properties to theme the entire app with one CSS block:
246
246
  --ply-color-body: #1a1a1a;
247
247
  --ply-color-headings: #78350f;
248
248
  --ply-border-color: #fbbf24;
249
+ --ply-border-radius: 0.375rem;
249
250
  --ply-btn-default-bg: #b45309;
250
251
  --ply-btn-default-bg-hover: #92400e;
251
252
  --ply-btn-default-bg-active: #7c2d12;
@@ -266,6 +267,36 @@ Setting any `data-theme` value prevents auto dark mode from interfering. All 120
266
267
 
267
268
  **Important:** If you override colors, verify 4.5:1 contrast for normal text and 3:1 for large text (18px bold / 24px) and UI components (WCAG 1.4.3).
268
269
 
270
+ ### Third-Party Components & Dark Mode
271
+
272
+ When integrating third-party components that don't use `--ply-*` variables, map ply's variables to their styling:
273
+
274
+ ```css
275
+ /* Map ply variables to a third-party date picker */
276
+ .third-party-datepicker {
277
+ background: var(--ply-bg-surface);
278
+ color: var(--ply-color-body);
279
+ border-color: var(--ply-border-color);
280
+ }
281
+ .third-party-datepicker .selected {
282
+ background: var(--ply-btn-default-bg);
283
+ color: var(--ply-color-text-inverse);
284
+ }
285
+ .third-party-datepicker .header {
286
+ background: var(--ply-bg-surface-alt);
287
+ color: var(--ply-color-headings);
288
+ }
289
+ ```
290
+
291
+ Key variables for mapping:
292
+ - Backgrounds: `--ply-bg-body`, `--ply-bg-surface`, `--ply-bg-surface-alt`, `--ply-bg-muted`
293
+ - Text: `--ply-color-body`, `--ply-color-secondary`, `--ply-color-muted`
294
+ - Borders: `--ply-border-color`, `--ply-border-strong`, `--ply-border-radius`
295
+ - Interactive: `--ply-btn-default-bg`, `--ply-color-link`, `--ply-color-focus`
296
+ - Inverse text: `--ply-color-text-inverse` (white in light, dark in dark)
297
+
298
+ This ensures third-party components follow ply's theme automatically, including dark mode and custom themes.
299
+
269
300
  ---
270
301
 
271
302
  ## Navigation — Semantic and Responsive
@@ -369,7 +400,7 @@ Always include: `<meta name="viewport" content="width=device-width, initial-scal
369
400
  - `padding-xs` (0.25rem), `padding-sm` (0.5rem), `padding` (default), `padding-lg` (1.5rem), `padding-xl` (2rem)
370
401
  - `margin-bottom`, `margin-top-lg`, `margin-xl` — directional + size variants
371
402
  - `border` — 1px solid using `--ply-border-color` (theme-aware)
372
- - `border-radius` (default), `border-radius-lg` (0.75rem), `border-radius-xl` (1.5rem)
403
+ - `border-radius` uses `var(--ply-border-radius)` (default 0.25rem, themeable). `border-radius-lg`, `border-radius-xl`
373
404
 
374
405
  Equal-height cards in a row:
375
406
 
@@ -454,6 +485,48 @@ Outline buttons in input groups automatically match the input border. Button sca
454
485
 
455
486
  ---
456
487
 
488
+ ## Tables
489
+
490
+ ply auto-styles `<table>` with borders, padding, and readable spacing. No classes needed for a basic table.
491
+
492
+ | Class | Effect |
493
+ |---|---|
494
+ | `table-bordered` | Borders on all cells |
495
+ | `table-stroked` | Bottom borders only |
496
+ | `table-stripped` | Striped odd rows |
497
+ | `table-hovered` | Row highlight on hover |
498
+ | `table-simple` | Remove borders and left padding |
499
+ | `table-flat` | Remove all borders and padding |
500
+ | `table-container` | Responsive horizontal scroll wrapper |
501
+ | `sortable` | Sort arrows on `<th>` (add to individual headers) |
502
+ | `sort-asc` / `sort-desc` | Active sort direction indicator |
503
+ | `table-filter` | Auto-size selects for filter bars |
504
+ | `table-actions` | Right-aligned toolbar above table |
505
+
506
+ ```html
507
+ <div class="table-container">
508
+ <table class="table-stripped table-hovered">
509
+ <thead>
510
+ <tr>
511
+ <th class="sortable sort-asc">Name</th>
512
+ <th class="sortable">Email</th>
513
+ <th>Role</th>
514
+ </tr>
515
+ </thead>
516
+ <tbody>
517
+ <tr><td>Jane Doe</td><td>jane@example.com</td><td>Admin</td></tr>
518
+ <tr><td>John Smith</td><td>john@example.com</td><td>Editor</td></tr>
519
+ </tbody>
520
+ </table>
521
+ </div>
522
+ ```
523
+
524
+ Tables respond to dark mode automatically — borders, stripe colors, and hover colors adapt via `--ply-color-table-border`, `--ply-color-table-stripped`, and `--ply-color-table-hovered`. Combine classes freely: `table-stripped table-hovered table-bordered` gives striped rows with hover highlights and full borders.
525
+
526
+ Wrap any table in `<div class="table-container">` to get horizontal scrolling on small screens instead of layout overflow.
527
+
528
+ ---
529
+
457
530
  ## Alerts and Notifications
458
531
 
459
532
  ```html
@@ -799,7 +872,7 @@ ply is built for AI code generation:
799
872
 
800
873
  1. **Single-dash class names** read like English — `units-row`, `equal-height`, `padding`, `border-radius`
801
874
  2. **No abbreviation guessing** — `padding-lg` not `pl-6`, `margin-top` not `mt-4`
802
- 3. **457 documented classes** in `ply-classes.json` — machine-readable reference
875
+ 3. **458 documented classes** in `ply-classes.json` — machine-readable reference
803
876
  4. **Semantic HTML first** — auto-styled elements reduce class clutter
804
877
  5. **AI-friendly aliases** — `btn-lg`/`btn-big`, `btn-sm`/`btn-small`, `alert`/`tools-alert` all work
805
878
 
package/llms.txt CHANGED
@@ -1,13 +1,13 @@
1
1
  # plycss (ply)
2
2
 
3
- > ply is a ratio-based, AI-ready CSS framework with dark mode, WCAG 2.1 AA accessibility, and a small footprint (~21KB gzipped). 457 utility classes, 120+ CSS custom properties, 13 auto-styled semantic elements. No JavaScript. No build step.
3
+ > ply is a ratio-based, AI-ready CSS framework with dark mode, WCAG 2.1 AA accessibility, and a small footprint (~21KB gzipped). 458 utility classes, 120+ CSS custom properties, 13 auto-styled semantic elements. No JavaScript. No build step.
4
4
 
5
5
  ply is standalone — do not use Tailwind, Bootstrap, or other CSS frameworks alongside it. Class names are single-dash and human-readable: `btn-primary`, `unit-50`, `padding-lg`, `text-secondary`. Install via npm (`plycss`) or CDN.
6
6
 
7
7
  ## Documentation
8
8
 
9
9
  - [Full AI Reference (PLY.md)](https://raw.githubusercontent.com/thatgibbyguy/ply/master/PLY.md): Complete class reference, usage rules, accessibility patterns, keyboard navigation, custom widget ARIA patterns, and code snippets
10
- - [Machine-Readable Class Map (ply-classes.json)](https://raw.githubusercontent.com/thatgibbyguy/ply/master/ply-classes.json): All 457 classes, 120+ CSS custom properties, and 13 semantic elements with descriptions, categories, and examples
10
+ - [Machine-Readable Class Map (ply-classes.json)](https://raw.githubusercontent.com/thatgibbyguy/ply/master/ply-classes.json): All 458 classes, 120+ CSS custom properties, and 13 semantic elements with descriptions, categories, and examples
11
11
  - [VPAT 2.5 Accessibility Conformance](https://raw.githubusercontent.com/thatgibbyguy/ply/master/docs/VPAT.md): Full WCAG 2.1 Level A and AA conformance report
12
12
 
13
13
  ## Snippets
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ply-css",
3
- "version": "1.5.0",
3
+ "version": "1.6.1",
4
4
  "description": "ply — A ratio-based, AI-ready CSS framework with dark mode, accessibility, and a small footprint",
5
5
  "main": "dist/css/ply.css",
6
6
  "style": "dist/css/ply.min.css",
package/ply-classes.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.5.0",
2
+ "version": "1.6.1",
3
3
  "framework": "ply",
4
4
  "totalClasses": 457,
5
5
  "uniqueClasses": 457,
@@ -14,6 +14,7 @@
14
14
  "--ply-color-headings",
15
15
  "--ply-color-secondary",
16
16
  "--ply-border-color",
17
+ "--ply-border-radius",
17
18
  "--ply-btn-default-bg",
18
19
  "--ply-btn-secondary-bg",
19
20
  "--ply-color-accent",
@@ -54,12 +55,13 @@
54
55
  "--ply-btn-secondary-bg-active",
55
56
  "--ply-color-link-hover",
56
57
  "--ply-color-accent",
58
+ "--ply-border-radius",
57
59
  "--ply-btn-border-radius"
58
60
  ]
59
61
  },
60
62
  "themeTemplate": {
61
63
  "description": "Copy-paste starting point for custom themes. Replace placeholder values with your design colors. Every ply component respects these variables.",
62
- "css": "[data-theme=\"my-theme\"] {\n /* Background */\n --ply-bg-body: #___;\n --ply-bg-surface: #___;\n --ply-bg-surface-alt: #___;\n --ply-bg-muted: #___;\n\n /* Text */\n --ply-color-body: #___;\n --ply-color-headings: #___;\n --ply-color-secondary: #___;\n --ply-color-muted: #___;\n --ply-color-placeholder: #___;\n --ply-color-text-inverse: #___;\n\n /* Borders */\n --ply-border-color: #___;\n --ply-border-strong: #___;\n\n /* Interactive */\n --ply-color-accent: #___;\n --ply-color-focus: #___;\n --ply-color-link-hover: #___;\n\n /* Buttons */\n --ply-btn-default-bg: #___;\n --ply-btn-default-color: #___;\n --ply-btn-default-bg-hover: #___;\n --ply-btn-default-bg-active: #___;\n --ply-btn-secondary-bg: #___;\n --ply-btn-secondary-color: #___;\n --ply-btn-secondary-bg-hover: #___;\n --ply-btn-secondary-bg-active: #___;\n --ply-btn-border-radius: 2rem;\n\n /* Forms */\n --ply-color-input-bg: #___;\n --ply-color-input-border: #___;\n\n /* Navigation */\n --ply-nav-bg: #___;\n --ply-nav-color: #___;\n --ply-nav-border: #___;\n --ply-nav-hover: #___;\n\n /* Code */\n --ply-color-code-bg: #___;\n --ply-color-code-border: #___;\n\n /* Tables */\n --ply-color-table-border: #___;\n --ply-color-table-stripped: #___;\n\n /* Elevation */\n --ply-layer-0: #___;\n --ply-layer-1: #___;\n --ply-layer-2: #___;\n --ply-layer-3: #___;\n --ply-shadow-1: rgba(0, 0, 0, 0.08);\n --ply-shadow-2: rgba(0, 0, 0, 0.1);\n --ply-shadow-3: rgba(0, 0, 0, 0.12);\n\n /* Typography (optional) */\n --ply-font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n --ply-font-heading: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n --ply-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n}"
64
+ "css": "[data-theme=\"my-theme\"] {\n /* Background */\n --ply-bg-body: #___;\n --ply-bg-surface: #___;\n --ply-bg-surface-alt: #___;\n --ply-bg-muted: #___;\n\n /* Text */\n --ply-color-body: #___;\n --ply-color-headings: #___;\n --ply-color-secondary: #___;\n --ply-color-muted: #___;\n --ply-color-placeholder: #___;\n --ply-color-text-inverse: #___;\n\n /* Borders */\n --ply-border-color: #___;\n --ply-border-strong: #___;\n --ply-border-radius: 0.25rem;\n\n /* Interactive */\n --ply-color-accent: #___;\n --ply-color-focus: #___;\n --ply-color-link-hover: #___;\n\n /* Buttons */\n --ply-btn-default-bg: #___;\n --ply-btn-default-color: #___;\n --ply-btn-default-bg-hover: #___;\n --ply-btn-default-bg-active: #___;\n --ply-btn-secondary-bg: #___;\n --ply-btn-secondary-color: #___;\n --ply-btn-secondary-bg-hover: #___;\n --ply-btn-secondary-bg-active: #___;\n --ply-btn-border-radius: 2rem;\n --ply-btn-font-size: 1em;\n --ply-btn-gap: 0.5em;\n\n /* Forms */\n --ply-color-input-bg: #___;\n --ply-color-input-border: #___;\n\n /* Navigation */\n --ply-nav-bg: #___;\n --ply-nav-color: #___;\n --ply-nav-border: #___;\n --ply-nav-hover: #___;\n\n /* Code */\n --ply-color-code-bg: #___;\n --ply-color-code-border: #___;\n\n /* Tables */\n --ply-color-table-border: #___;\n --ply-color-table-stripped: #___;\n\n /* Elevation */\n --ply-layer-0: #___;\n --ply-layer-1: #___;\n --ply-layer-2: #___;\n --ply-layer-3: #___;\n --ply-shadow-1: rgba(0, 0, 0, 0.08);\n --ply-shadow-2: rgba(0, 0, 0, 0.1);\n --ply-shadow-3: rgba(0, 0, 0, 0.12);\n\n /* Typography (optional) */\n --ply-font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n --ply-font-heading: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n --ply-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n}"
63
65
  },
64
66
  "classes": {
65
67
  "units-container": {
@@ -494,7 +496,7 @@
494
496
  },
495
497
  "split": {
496
498
  "category": "grid",
497
- "description": "Remove gap between child units. Applied to units-row.",
499
+ "description": "Remove gap between child units. Applied to units-row. Kept for backwards compatibility — prefer joined.",
498
500
  "example": "<div class=\"units-row split\">...</div>"
499
501
  },
500
502
  "centered-content": {
@@ -1497,7 +1499,7 @@
1497
1499
  },
1498
1500
  "border-radius": {
1499
1501
  "category": "helpers",
1500
- "description": "Apply default border-radius."
1502
+ "description": "Apply border-radius using var(--ply-border-radius). Default 0.25rem, themeable."
1501
1503
  },
1502
1504
  "color-black": {
1503
1505
  "category": "helpers",
@@ -1610,6 +1612,11 @@
1610
1612
  "description": "Round the outer corners of a btn-group.",
1611
1613
  "parent": "btn-group"
1612
1614
  },
1615
+ "joined": {
1616
+ "category": "buttons",
1617
+ "description": "Remove gap so children connect as a single visual unit. On btn-group: buttons touch with a 1px divider, connected border-radius on outer edges. On units-row: removes column gutters (alias for split, which is kept for backwards compatibility).",
1618
+ "example": "<div class=\"btn-group joined\"><button class=\"btn\">Left</button><button class=\"btn\">Middle</button><button class=\"btn\">Right</button></div>\n<div class=\"units-row joined\"><div class=\"unit-50\">...</div><div class=\"unit-50\">...</div></div>"
1619
+ },
1613
1620
  "unit-role-right": {
1614
1621
  "category": "grid",
1615
1622
  "description": "Float a grid unit to the right."
@@ -1748,11 +1755,11 @@
1748
1755
  },
1749
1756
  "border-radius-lg": {
1750
1757
  "category": "helpers",
1751
- "description": "Large border radius (0.75rem)."
1758
+ "description": "Large border radius (3x --ply-border-radius)."
1752
1759
  },
1753
1760
  "border-radius-xl": {
1754
1761
  "category": "helpers",
1755
- "description": "Extra large border radius (1.5rem)."
1762
+ "description": "Extra large border radius (6x --ply-border-radius)."
1756
1763
  },
1757
1764
  "spinning": {
1758
1765
  "category": "helpers",
@@ -2461,7 +2468,8 @@
2461
2468
  },
2462
2469
  "borders": {
2463
2470
  "--ply-border-color": "Standard border. Light: #e0e0e0, Dark: #525252",
2464
- "--ply-border-strong": "Emphasized border. Light: #8d8d8d, Dark: #6f6f6f"
2471
+ "--ply-border-strong": "Emphasized border. Light: #8d8d8d, Dark: #6f6f6f",
2472
+ "--ply-border-radius": "Global border-radius for inputs, cards, dialogs, details, notifications, and other components. Default: 0.25rem. Override to change the overall shape language (e.g., 0 for sharp, 0.5rem for softer)."
2465
2473
  },
2466
2474
  "interactive": {
2467
2475
  "--ply-color-accent": "Brand accent color for icons, badges, and section accents. Independent of button color and focus rings. Light: #0353e9, Dark: #4589ff. Override in custom themes without affecting buttons.",
@@ -2487,7 +2495,9 @@
2487
2495
  "buttons": {
2488
2496
  "--ply-btn-default-bg": "Primary button background. Controls btn-primary color and link colors. Light: #0353e9, Dark: #78a9ff. Override in custom themes to change primary + links together.",
2489
2497
  "--ply-btn-secondary-bg": "Secondary button background. Controls btn, btn-secondary color. Light: #393939, Dark: #4c4c4c.",
2490
- "--ply-btn-default-color": "Default button text color. Light: inherits --ply-color-text-inverse (#fff), Dark: #f4f4f4"
2498
+ "--ply-btn-default-color": "Default button text color. Light: inherits --ply-color-text-inverse (#fff), Dark: #f4f4f4",
2499
+ "--ply-btn-font-size": "Button font size. Default: 1em (inherits from context). Override to set a fixed size for all buttons in a theme.",
2500
+ "--ply-btn-gap": "Gap between icon and text inside a button. Default: 0.5em. Applies to all btn variants via inline-flex layout."
2491
2501
  },
2492
2502
  "navigation": {
2493
2503
  "--ply-nav-bg": "Navbar background. Light: #ffffff, Dark: #262626",
@@ -39,6 +39,7 @@
39
39
  /* Borders */
40
40
  --ply-border-color: #334155;
41
41
  --ply-border-strong: #475569;
42
+ --ply-border-radius: 0.5rem;
42
43
 
43
44
  /* Interactive */
44
45
  --ply-color-link: #60a5fa;
@@ -102,6 +103,7 @@
102
103
  /* Borders */
103
104
  --ply-border-color: #d6d3d1;
104
105
  --ply-border-strong: #a8a29e;
106
+ --ply-border-radius: 0.375rem;
105
107
 
106
108
  /* Interactive */
107
109
  --ply-color-link: #b45309;
@@ -259,6 +261,7 @@
259
261
  <tr><td><code>--ply-color-text-inverse</code></td><td>Text on dark buttons</td></tr>
260
262
  <tr><td><code>--ply-border-color</code></td><td>Default borders</td></tr>
261
263
  <tr><td><code>--ply-border-strong</code></td><td>Prominent borders</td></tr>
264
+ <tr><td><code>--ply-border-radius</code></td><td>Global border radius (inputs, cards, dialogs)</td></tr>
262
265
  <tr><td><code>--ply-color-link</code></td><td>Link color</td></tr>
263
266
  <tr><td><code>--ply-color-link-hover</code></td><td>Link hover</td></tr>
264
267
  <tr><td><code>--ply-color-focus</code></td><td>Focus ring</td></tr>
@@ -12,16 +12,18 @@ input[type="reset"].btn,
12
12
  button.btn {
13
13
  transition: all 150ms ease-in-out, transform 50ms ease, background 150ms ease-in-out;
14
14
 
15
- display: inline-block;
15
+ display: inline-flex;
16
16
  vertical-align: top;
17
+ align-items: center;
18
+ justify-content: center;
19
+ gap: var(--ply-btn-gap, 0.5em);
17
20
 
18
21
  font-family: var(--ply-font-body, #{variables.$font-family-controls});
19
- font-size: 1em;
22
+ font-size: var(--ply-btn-font-size, 1em);
20
23
  font-weight: 400;
21
24
 
22
25
  line-height: variables.$base-line;
23
26
 
24
- text-align: center;
25
27
  text-decoration: none;
26
28
  color: var(--ply-btn-secondary-color, var(--ply-color-text-inverse, #fff));
27
29
 
@@ -431,21 +433,26 @@ button.btn-white {
431
433
  border-radius: 0;
432
434
 
433
435
  &:first-child {
434
- border-radius: (variables.$border-radius * 0.5) 0 0 (variables.$border-radius * 0.5);
436
+ border-radius: calc(var(--ply-border-radius) * 0.5) 0 0 calc(var(--ply-border-radius) * 0.5);
435
437
  }
436
438
  &:last-child {
437
- border-radius: 0 (variables.$border-radius * 0.5) (variables.$border-radius * 0.5) 0;
439
+ border-radius: 0 calc(var(--ply-border-radius) * 0.5) calc(var(--ply-border-radius) * 0.5) 0;
438
440
  }
439
441
  }
440
442
 
443
+ // Joined — no gap between buttons, connected as a single unit
444
+ &.joined {
445
+ gap: 0;
446
+ }
447
+
441
448
  &.rounded {
442
449
  .btn,
443
450
  .input-search {
444
451
  &:first-child {
445
- border-radius: (variables.$border-radius * 2) 0 0 (variables.$border-radius * 2);
452
+ border-radius: calc(var(--ply-border-radius) * 2) 0 0 calc(var(--ply-border-radius) * 2);
446
453
  }
447
454
  &:last-child {
448
- border-radius: 0 (variables.$border-radius * 2) (variables.$border-radius * 2) 0;
455
+ border-radius: 0 calc(var(--ply-border-radius) * 2) calc(var(--ply-border-radius) * 2) 0;
449
456
  }
450
457
  }
451
458
  }
@@ -78,6 +78,7 @@ $btn-secondary-dark-active: #bebebe;
78
78
  --ply-btn-secondary-bg-hover: color-mix(in oklch, var(--ply-btn-secondary-bg), black 15%);
79
79
  --ply-btn-secondary-bg-active: #{$btn-secondary-light-active};
80
80
  --ply-btn-secondary-bg-active: color-mix(in oklch, var(--ply-btn-secondary-bg), black 25%);
81
+ --ply-border-radius: #{variables.$border-radius};
81
82
  --ply-btn-border-radius: #{variables.$button-radius};
82
83
 
83
84
  // Navigation
@@ -203,9 +204,9 @@ $btn-secondary-dark-active: #bebebe;
203
204
  --ply-border-strong: #6f6f6f;
204
205
 
205
206
  // Interactive
206
- --ply-color-link: var(--ply-btn-default-bg);
207
+ --ply-color-link: #{$btn-primary-dark};
207
208
  --ply-color-link-hover: #{$btn-primary-dark-hover};
208
- --ply-color-link-hover: color-mix(in oklch, var(--ply-btn-default-bg), white 15%);
209
+ --ply-color-link-hover: color-mix(in oklch, #{$btn-primary-dark}, white 15%);
209
210
  --ply-color-focus: #0f62fe;
210
211
 
211
212
  // Fields
@@ -61,7 +61,7 @@ dialog {
61
61
  color: var(--ply-color-secondary);
62
62
  font-size: variables.$font-size-xl;
63
63
  cursor: pointer;
64
- border-radius: variables.$border-radius;
64
+ border-radius: var(--ply-border-radius);
65
65
  transition: background-color 0.15s ease;
66
66
 
67
67
  &:hover {
@@ -71,7 +71,7 @@
71
71
  input[type="datetime-local"],
72
72
  textarea,
73
73
  select {
74
- border-radius: variables.$border-radius;
74
+ border-radius: var(--ply-border-radius);
75
75
  display: block;
76
76
  width: 100%;
77
77
  padding: 0.5em 0.75em;
@@ -161,7 +161,7 @@ textarea {
161
161
 
162
162
  // Fieldset
163
163
  fieldset {
164
- border-radius: variables.$border-radius;
164
+ border-radius: var(--ply-border-radius);
165
165
 
166
166
  background-color: var(--ply-bg-surface);
167
167
  padding: variables.$base-line;
@@ -308,7 +308,7 @@ select.input-xs {
308
308
  min-width: 0;
309
309
  display: block !important;
310
310
  margin-bottom: 0;
311
- border-radius: variables.$border-radius;
311
+ border-radius: var(--ply-border-radius);
312
312
  }
313
313
 
314
314
  // Zero out joining edges
@@ -316,13 +316,13 @@ select.input-xs {
316
316
  textarea:not(:last-child),
317
317
  select:not(:last-child) {
318
318
  border-right: none;
319
- border-radius: variables.$border-radius 0 0 variables.$border-radius;
319
+ border-radius: var(--ply-border-radius) 0 0 var(--ply-border-radius);
320
320
  }
321
321
 
322
322
  input:not(:first-child),
323
323
  textarea:not(:first-child),
324
324
  select:not(:first-child) {
325
- border-radius: 0 variables.$border-radius variables.$border-radius 0;
325
+ border-radius: 0 var(--ply-border-radius) var(--ply-border-radius) 0;
326
326
  }
327
327
 
328
328
  // Middle element (both prepend and append)
@@ -348,12 +348,12 @@ select.input-xs {
348
348
 
349
349
  .input-prepend {
350
350
  border-right: none;
351
- border-radius: variables.$border-radius 0 0 variables.$border-radius;
351
+ border-radius: var(--ply-border-radius) 0 0 var(--ply-border-radius);
352
352
  }
353
353
 
354
354
  .input-append {
355
355
  border-left: none;
356
- border-radius: 0 variables.$border-radius variables.$border-radius 0;
356
+ border-radius: 0 var(--ply-border-radius) var(--ply-border-radius) 0;
357
357
 
358
358
  &:has(.btn) {
359
359
  padding: 0;
@@ -363,7 +363,7 @@ select.input-xs {
363
363
  .btn {
364
364
  display: flex;
365
365
  align-items: center;
366
- border-radius: 0 variables.$border-radius variables.$border-radius 0;
366
+ border-radius: 0 var(--ply-border-radius) var(--ply-border-radius) 0;
367
367
  margin: 0;
368
368
  border-left: none;
369
369
  white-space: nowrap;
@@ -383,7 +383,7 @@ select.input-xs {
383
383
  .btn {
384
384
  display: flex;
385
385
  align-items: center;
386
- border-radius: 0 variables.$border-radius variables.$border-radius 0;
386
+ border-radius: 0 var(--ply-border-radius) var(--ply-border-radius) 0;
387
387
  margin: 0;
388
388
  white-space: nowrap;
389
389
 
@@ -428,7 +428,7 @@ select.select-outlined {
428
428
  background-size: 0.75em;
429
429
  padding: 0.5em 2.5em 0.5em 0.75em;
430
430
  border: 1px solid var(--ply-border-strong, colors.$color-neutral-300);
431
- border-radius: variables.$border-radius;
431
+ border-radius: var(--ply-border-radius);
432
432
  color: var(--ply-color-body);
433
433
  font-size: 1em;
434
434
  line-height: variables.$base-line;
@@ -31,6 +31,7 @@
31
31
  flex-direction: row-reverse;
32
32
  }
33
33
 
34
+ &.joined,
34
35
  &.split {
35
36
  --units-gap: 0px;
36
37
  gap: 0;
@@ -211,7 +211,7 @@
211
211
  }
212
212
 
213
213
  .border-radius {
214
- border-radius: variables.$border-radius;
214
+ border-radius: var(--ply-border-radius);
215
215
  }
216
216
 
217
217
  // UX Helpers
@@ -276,11 +276,11 @@ $width-breakpoints: (
276
276
  }
277
277
 
278
278
  .border-radius-lg {
279
- border-radius: 0.75rem;
279
+ border-radius: calc(var(--ply-border-radius) * 3);
280
280
  }
281
281
 
282
282
  .border-radius-xl {
283
- border-radius: 1.5rem;
283
+ border-radius: calc(var(--ply-border-radius) * 6);
284
284
  }
285
285
 
286
286
  // Text color helpers (theme-compatible)
@@ -386,7 +386,7 @@ $width-breakpoints: (
386
386
 
387
387
  .code {
388
388
  border: 1px solid colors.$color-gray-light;
389
- border-radius: variables.$border-radius;
389
+ border-radius: var(--ply-border-radius);
390
390
  display: inline-block;
391
391
  font-size: .8rem;
392
392
  font-family: variables.$font-family-code;
@@ -16,7 +16,7 @@
16
16
  }
17
17
 
18
18
  &.active input {
19
- border-radius: variables.$border-radius variables.$border-radius 0 0;
19
+ border-radius: var(--ply-border-radius) var(--ply-border-radius) 0 0;
20
20
  border-bottom-color: var(--ply-border-color, colors.$color-gray);
21
21
  }
22
22
  }
@@ -35,7 +35,7 @@
35
35
  background: var(--ply-bg-surface, colors.$color-white);
36
36
  border: 1px solid var(--ply-color-input-border, colors.$color-input-border);
37
37
  border-top: none;
38
- border-radius: 0 0 variables.$border-radius variables.$border-radius;
38
+ border-radius: 0 0 var(--ply-border-radius) var(--ply-border-radius);
39
39
  box-shadow: 0 4px 8px rgba(0, 0, 0, .1);
40
40
  max-height: 240px;
41
41
  overflow-y: auto;
@@ -98,7 +98,7 @@
98
98
  min-height: 2.5rem;
99
99
  background: var(--ply-color-input-bg, colors.$color-white);
100
100
  border: 1px solid var(--ply-color-input-border, colors.$color-input-border);
101
- border-radius: variables.$border-radius;
101
+ border-radius: var(--ply-border-radius);
102
102
  cursor: text;
103
103
  transition: border-color 0.15s ease;
104
104
  align-items: center;
@@ -109,7 +109,7 @@
109
109
  }
110
110
 
111
111
  .multiselect.active & {
112
- border-radius: variables.$border-radius variables.$border-radius 0 0;
112
+ border-radius: var(--ply-border-radius) var(--ply-border-radius) 0 0;
113
113
  border-bottom-color: var(--ply-border-color, colors.$color-gray);
114
114
  }
115
115
 
@@ -138,7 +138,7 @@
138
138
  padding: 0.125rem 0.375rem;
139
139
  background: var(--ply-bg-muted, colors.$color-gray);
140
140
  color: var(--ply-color-body, colors.$color-body);
141
- border-radius: variables.$border-radius;
141
+ border-radius: var(--ply-border-radius);
142
142
  font-size: variables.$font-size-sm;
143
143
  line-height: 1.5;
144
144
  white-space: nowrap;
@@ -191,7 +191,7 @@
191
191
  background: var(--ply-bg-surface, colors.$color-white);
192
192
  border: 1px solid var(--ply-color-input-border, colors.$color-input-border);
193
193
  border-top: none;
194
- border-radius: 0 0 variables.$border-radius variables.$border-radius;
194
+ border-radius: 0 0 var(--ply-border-radius) var(--ply-border-radius);
195
195
  box-shadow: 0 4px 8px rgba(0, 0, 0, .1);
196
196
  max-height: 240px;
197
197
  overflow-y: auto;
@@ -291,7 +291,7 @@ nav {
291
291
  display: block;
292
292
  padding: 0.25rem 0.75rem;
293
293
  font-size: variables.$font-size-sm;
294
- border-radius: var(--ply-nav-stacked-radius, 0.25rem);
294
+ border-radius: var(--ply-nav-stacked-radius, var(--ply-border-radius));
295
295
  }
296
296
 
297
297
  & a {
@@ -505,7 +505,7 @@ nav {
505
505
  height: variables.$base-line * 1.5;
506
506
  padding: variables.$grid-gutter-width * 0.5 variables.$padding;
507
507
  border: 1px solid var(--ply-border-color);
508
- border-radius: variables.$border-radius;
508
+ border-radius: var(--ply-border-radius);
509
509
  background: var(--ply-bg-surface, #fff);
510
510
  color: var(--ply-color-body);
511
511
  text-decoration: none;
@@ -19,7 +19,7 @@ $alert-colors: (
19
19
  background: var(--ply-bg-surface-alt, colors.$color-gray-pastel);
20
20
  color: var(--ply-color-body, colors.$color-black);
21
21
  margin-bottom: variables.$base-line;
22
- border-radius: variables.$border-radius;
22
+ border-radius: var(--ply-border-radius);
23
23
  border-left: 4px solid colors.$color-gray-dark;
24
24
  display: flex;
25
25
  align-items: flex-start;
@@ -63,7 +63,7 @@ $alert-colors: (
63
63
  align-items: center;
64
64
  justify-content: center;
65
65
  margin: -0.5rem -0.375rem -0.5rem 0;
66
- border-radius: variables.$border-radius;
66
+ border-radius: var(--ply-border-radius);
67
67
 
68
68
  &:hover {
69
69
  opacity: 1;
@@ -265,7 +265,7 @@ img {
265
265
  /* Native <details>/<summary> — Swiss/Modernist accordion */
266
266
  details {
267
267
  border: 1px solid var(--ply-border-color, #e0e0e0);
268
- border-radius: 0.25rem;
268
+ border-radius: var(--ply-border-radius);
269
269
  padding: 0.75rem 1rem;
270
270
  margin-bottom: 1.5rem;
271
271
  }
@@ -303,7 +303,7 @@ details[open] > summary {
303
303
  /* Native <dialog> — modal styling */
304
304
  dialog {
305
305
  border: none;
306
- border-radius: 0.25rem;
306
+ border-radius: var(--ply-border-radius);
307
307
  padding: 1.5rem;
308
308
  max-width: 32rem;
309
309
  width: 90%;
@@ -322,23 +322,23 @@ progress {
322
322
  width: 100%;
323
323
  height: 0.5rem;
324
324
  border: none;
325
- border-radius: 0.25rem;
325
+ border-radius: var(--ply-border-radius);
326
326
  background: var(--ply-bg-muted, #e0e0e0);
327
327
  margin-bottom: 1.5rem;
328
328
 
329
329
  &::-webkit-progress-bar {
330
330
  background: var(--ply-bg-muted, #e0e0e0);
331
- border-radius: 0.25rem;
331
+ border-radius: var(--ply-border-radius);
332
332
  }
333
333
 
334
334
  &::-webkit-progress-value {
335
335
  background: var(--ply-color-link, #0f62fe);
336
- border-radius: 0.25rem;
336
+ border-radius: var(--ply-border-radius);
337
337
  }
338
338
 
339
339
  &::-moz-progress-bar {
340
340
  background: var(--ply-color-link, #0f62fe);
341
- border-radius: 0.25rem;
341
+ border-radius: var(--ply-border-radius);
342
342
  }
343
343
  }
344
344
 
@@ -347,7 +347,7 @@ meter {
347
347
  width: 100%;
348
348
  height: 0.5rem;
349
349
  border: none;
350
- border-radius: 0.25rem;
350
+ border-radius: var(--ply-border-radius);
351
351
  background: var(--ply-bg-muted, #e0e0e0);
352
352
  margin-bottom: 1.5rem;
353
353
  }
@@ -104,25 +104,25 @@
104
104
  select:not(:last-child) {
105
105
  border-right: initial;
106
106
  border-left: none;
107
- border-radius: 0 variables.$border-radius variables.$border-radius 0;
107
+ border-radius: 0 var(--ply-border-radius) var(--ply-border-radius) 0;
108
108
  }
109
109
 
110
110
  input:not(:first-child),
111
111
  textarea:not(:first-child),
112
112
  select:not(:first-child) {
113
- border-radius: variables.$border-radius 0 0 variables.$border-radius;
113
+ border-radius: var(--ply-border-radius) 0 0 var(--ply-border-radius);
114
114
  }
115
115
 
116
116
  .input-prepend {
117
117
  border-right: initial;
118
118
  border-left: none;
119
- border-radius: 0 variables.$border-radius variables.$border-radius 0;
119
+ border-radius: 0 var(--ply-border-radius) var(--ply-border-radius) 0;
120
120
  }
121
121
 
122
122
  .input-append {
123
123
  border-left: initial;
124
124
  border-right: none;
125
- border-radius: variables.$border-radius 0 0 variables.$border-radius;
125
+ border-radius: var(--ply-border-radius) 0 0 var(--ply-border-radius);
126
126
  }
127
127
  }
128
128