ply-css 1.4.1 → 1.6.0

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 (~20KB gzipped). 421 utility classes, 60+ 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
 
@@ -41,7 +41,7 @@ Core bundle (no labels, dropdowns, loaders, print):
41
41
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/ply-css@1/dist/css/ply-core.min.css">
42
42
  ```
43
43
 
44
- Bundles: `ply.min.css` (~20KB gzip, everything), `ply-core.min.css` (~17KB, grid+buttons+forms+nav+alerts+tables+typography+helpers), `ply-essentials.min.css` (~6KB, grid+helpers), `ply-helpers.min.css` (~4KB, helpers only).
44
+ Bundles: `ply.min.css` (~21KB gzip, everything), `ply-core.min.css` (~17KB, grid+buttons+forms+nav+alerts+tables+typography+helpers), `ply-essentials.min.css` (~7KB, grid+helpers), `ply-helpers.min.css` (~5KB, helpers only).
45
45
 
46
46
  ---
47
47
 
@@ -262,10 +262,40 @@ Override `--ply-*` custom properties to theme the entire app with one CSS block:
262
262
  <html data-theme="brand">
263
263
  ```
264
264
 
265
- Setting any `data-theme` value prevents auto dark mode from interfering. All 60+ `--ply-*` variables are listed in the `customProperties` section of `ply-classes.json`.
265
+ Setting any `data-theme` value prevents auto dark mode from interfering. All 120+ `--ply-*` variables are listed in the `customProperties` section of `ply-classes.json`.
266
266
 
267
267
  **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
268
 
269
+ ### Third-Party Components & Dark Mode
270
+
271
+ When integrating third-party components that don't use `--ply-*` variables, map ply's variables to their styling:
272
+
273
+ ```css
274
+ /* Map ply variables to a third-party date picker */
275
+ .third-party-datepicker {
276
+ background: var(--ply-bg-surface);
277
+ color: var(--ply-color-body);
278
+ border-color: var(--ply-border-color);
279
+ }
280
+ .third-party-datepicker .selected {
281
+ background: var(--ply-btn-default-bg);
282
+ color: var(--ply-color-text-inverse);
283
+ }
284
+ .third-party-datepicker .header {
285
+ background: var(--ply-bg-surface-alt);
286
+ color: var(--ply-color-headings);
287
+ }
288
+ ```
289
+
290
+ Key variables for mapping:
291
+ - Backgrounds: `--ply-bg-body`, `--ply-bg-surface`, `--ply-bg-surface-alt`, `--ply-bg-muted`
292
+ - Text: `--ply-color-body`, `--ply-color-secondary`, `--ply-color-muted`
293
+ - Borders: `--ply-border-color`, `--ply-border-strong`
294
+ - Interactive: `--ply-btn-default-bg`, `--ply-color-link`, `--ply-color-focus`
295
+ - Inverse text: `--ply-color-text-inverse` (white in light, dark in dark)
296
+
297
+ This ensures third-party components follow ply's theme automatically, including dark mode and custom themes.
298
+
269
299
  ---
270
300
 
271
301
  ## Navigation — Semantic and Responsive
@@ -454,6 +484,48 @@ Outline buttons in input groups automatically match the input border. Button sca
454
484
 
455
485
  ---
456
486
 
487
+ ## Tables
488
+
489
+ ply auto-styles `<table>` with borders, padding, and readable spacing. No classes needed for a basic table.
490
+
491
+ | Class | Effect |
492
+ |---|---|
493
+ | `table-bordered` | Borders on all cells |
494
+ | `table-stroked` | Bottom borders only |
495
+ | `table-stripped` | Striped odd rows |
496
+ | `table-hovered` | Row highlight on hover |
497
+ | `table-simple` | Remove borders and left padding |
498
+ | `table-flat` | Remove all borders and padding |
499
+ | `table-container` | Responsive horizontal scroll wrapper |
500
+ | `sortable` | Sort arrows on `<th>` (add to individual headers) |
501
+ | `sort-asc` / `sort-desc` | Active sort direction indicator |
502
+ | `table-filter` | Auto-size selects for filter bars |
503
+ | `table-actions` | Right-aligned toolbar above table |
504
+
505
+ ```html
506
+ <div class="table-container">
507
+ <table class="table-stripped table-hovered">
508
+ <thead>
509
+ <tr>
510
+ <th class="sortable sort-asc">Name</th>
511
+ <th class="sortable">Email</th>
512
+ <th>Role</th>
513
+ </tr>
514
+ </thead>
515
+ <tbody>
516
+ <tr><td>Jane Doe</td><td>jane@example.com</td><td>Admin</td></tr>
517
+ <tr><td>John Smith</td><td>john@example.com</td><td>Editor</td></tr>
518
+ </tbody>
519
+ </table>
520
+ </div>
521
+ ```
522
+
523
+ 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.
524
+
525
+ Wrap any table in `<div class="table-container">` to get horizontal scrolling on small screens instead of layout overflow.
526
+
527
+ ---
528
+
457
529
  ## Alerts and Notifications
458
530
 
459
531
  ```html
@@ -799,7 +871,7 @@ ply is built for AI code generation:
799
871
 
800
872
  1. **Single-dash class names** read like English — `units-row`, `equal-height`, `padding`, `border-radius`
801
873
  2. **No abbreviation guessing** — `padding-lg` not `pl-6`, `margin-top` not `mt-4`
802
- 3. **421 documented classes** in `ply-classes.json` — machine-readable reference
874
+ 3. **458 documented classes** in `ply-classes.json` — machine-readable reference
803
875
  4. **Semantic HTML first** — auto-styled elements reduce class clutter
804
876
  5. **AI-friendly aliases** — `btn-lg`/`btn-big`, `btn-sm`/`btn-small`, `alert`/`tools-alert` all work
805
877
 
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 (~20KB gzipped). 421 utility classes, 60+ 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 421 classes, 60+ 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.4.1",
3
+ "version": "1.6.0",
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.4.1",
2
+ "version": "1.6.0",
3
3
  "framework": "ply",
4
4
  "totalClasses": 457,
5
5
  "uniqueClasses": 457,
@@ -59,7 +59,7 @@
59
59
  },
60
60
  "themeTemplate": {
61
61
  "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}"
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 --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
63
  },
64
64
  "classes": {
65
65
  "units-container": {
@@ -494,7 +494,7 @@
494
494
  },
495
495
  "split": {
496
496
  "category": "grid",
497
- "description": "Remove gap between child units. Applied to units-row.",
497
+ "description": "Remove gap between child units. Applied to units-row. Kept for backwards compatibility — prefer joined.",
498
498
  "example": "<div class=\"units-row split\">...</div>"
499
499
  },
500
500
  "centered-content": {
@@ -1610,6 +1610,11 @@
1610
1610
  "description": "Round the outer corners of a btn-group.",
1611
1611
  "parent": "btn-group"
1612
1612
  },
1613
+ "joined": {
1614
+ "category": "buttons",
1615
+ "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).",
1616
+ "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>"
1617
+ },
1613
1618
  "unit-role-right": {
1614
1619
  "category": "grid",
1615
1620
  "description": "Float a grid unit to the right."
@@ -2487,7 +2492,9 @@
2487
2492
  "buttons": {
2488
2493
  "--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
2494
  "--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"
2495
+ "--ply-btn-default-color": "Default button text color. Light: inherits --ply-color-text-inverse (#fff), Dark: #f4f4f4",
2496
+ "--ply-btn-font-size": "Button font size. Default: 1em (inherits from context). Override to set a fixed size for all buttons in a theme.",
2497
+ "--ply-btn-gap": "Gap between icon and text inside a button. Default: 0.5em. Applies to all btn variants via inline-flex layout."
2491
2498
  },
2492
2499
  "navigation": {
2493
2500
  "--ply-nav-bg": "Navbar background. Light: #ffffff, Dark: #262626",
@@ -2520,16 +2527,16 @@
2520
2527
  "--ply-bg-yellow-active": "Yellow active. #b28600"
2521
2528
  },
2522
2529
  "palette": {
2523
- "--ply-blue-1 / -2 / -3": "Blue palette: base, light, pastel",
2524
- "--ply-red-1 / -2 / -3": "Red palette: base, light, pastel",
2525
- "--ply-green-1 / -2 / -3": "Green palette: base, light, pastel",
2526
- "--ply-yellow-1 / -2 / -3": "Yellow palette: base, light, pastel",
2527
- "--ply-indigo-1 / -2 / -3": "Indigo palette: base, light, pastel",
2528
- "--ply-purple-1 / -2 / -3": "Purple palette: base, light, pastel",
2529
- "--ply-pink-1 / -2 / -3": "Pink palette: base, light, pastel",
2530
- "--ply-orange-1 / -2 / -3": "Orange palette: base, light, pastel",
2531
- "--ply-teal-1 / -2 / -3": "Teal palette: base, light, pastel",
2532
- "--ply-cyan-1 / -2 / -3": "Cyan palette: base, light, pastel"
2530
+ "--ply-blue-1 / -2 / -3": "Blue palette: base, darker, darkest",
2531
+ "--ply-red-1 / -2 / -3": "Red palette: base, darker, darkest",
2532
+ "--ply-green-1 / -2 / -3": "Green palette: base, darker, darkest",
2533
+ "--ply-yellow-1 / -2 / -3": "Yellow palette: base, darker, darkest",
2534
+ "--ply-indigo-1 / -2 / -3": "Indigo palette: base, darker, darkest",
2535
+ "--ply-purple-1 / -2 / -3": "Purple palette: base, darker, darkest",
2536
+ "--ply-pink-1 / -2 / -3": "Pink palette: base, darker, darkest",
2537
+ "--ply-orange-1 / -2 / -3": "Orange palette: base, darker, darkest",
2538
+ "--ply-teal-1 / -2 / -3": "Teal palette: base, darker, darkest",
2539
+ "--ply-cyan-1 / -2 / -3": "Cyan palette: base, darker, darkest"
2533
2540
  },
2534
2541
  "spacing": {
2535
2542
  "--ply-space-xs": "Extra-small spacing unit. Default: 0.25rem",
@@ -2538,7 +2545,30 @@
2538
2545
  "--ply-space-lg": "Large spacing unit. Default: 1.5rem",
2539
2546
  "--ply-space-xl": "Extra-large spacing unit. Default: 2rem",
2540
2547
  "--ply-space-xxl": "Extra extra large spacing unit. Default: 3rem"
2541
- }
2548
+ },
2549
+ "colorSurfaces": {
2550
+ "--ply-blue-surface": "Theme-aware blue pastel background. Light: blue pastel, Dark: dark muted blue. For cards, badges, alerts.",
2551
+ "--ply-blue-border": "Theme-aware blue border. Light: light blue tint, Dark: medium-dark blue. For colored card borders.",
2552
+ "--ply-red-surface": "Theme-aware red pastel background. Light: red pastel, Dark: dark muted red. For cards, badges, alerts.",
2553
+ "--ply-red-border": "Theme-aware red border. Light: light red tint, Dark: medium-dark red. For colored card borders.",
2554
+ "--ply-green-surface": "Theme-aware green pastel background. Light: green pastel, Dark: dark muted green. For cards, badges, alerts.",
2555
+ "--ply-green-border": "Theme-aware green border. Light: light green tint, Dark: medium-dark green. For colored card borders.",
2556
+ "--ply-yellow-surface": "Theme-aware yellow pastel background. Light: yellow pastel, Dark: dark muted yellow. For cards, badges, alerts.",
2557
+ "--ply-yellow-border": "Theme-aware yellow border. Light: light yellow tint, Dark: medium-dark yellow. For colored card borders.",
2558
+ "--ply-indigo-surface": "Theme-aware indigo pastel background. Light: indigo pastel, Dark: dark muted indigo. For cards, badges, alerts.",
2559
+ "--ply-indigo-border": "Theme-aware indigo border. Light: light indigo tint, Dark: medium-dark indigo. For colored card borders.",
2560
+ "--ply-purple-surface": "Theme-aware purple pastel background. Light: purple pastel, Dark: dark muted purple. For cards, badges, alerts.",
2561
+ "--ply-purple-border": "Theme-aware purple border. Light: light purple tint, Dark: medium-dark purple. For colored card borders.",
2562
+ "--ply-pink-surface": "Theme-aware pink pastel background. Light: pink pastel, Dark: dark muted pink. For cards, badges, alerts.",
2563
+ "--ply-pink-border": "Theme-aware pink border. Light: light pink tint, Dark: medium-dark pink. For colored card borders.",
2564
+ "--ply-orange-surface": "Theme-aware orange pastel background. Light: orange pastel, Dark: dark muted orange. For cards, badges, alerts.",
2565
+ "--ply-orange-border": "Theme-aware orange border. Light: light orange tint, Dark: medium-dark orange. For colored card borders.",
2566
+ "--ply-teal-surface": "Theme-aware teal pastel background. Light: teal pastel, Dark: dark muted teal. For cards, badges, alerts.",
2567
+ "--ply-teal-border": "Theme-aware teal border. Light: light teal tint, Dark: medium-dark teal. For colored card borders.",
2568
+ "--ply-cyan-surface": "Theme-aware cyan pastel background. Light: cyan pastel, Dark: dark muted cyan. For cards, badges, alerts.",
2569
+ "--ply-cyan-border": "Theme-aware cyan border. Light: light cyan tint, Dark: medium-dark cyan. For colored card borders."
2570
+ },
2571
+ "totalCustomProperties": 92
2542
2572
  },
2543
2573
  "semanticElements": {
2544
2574
  "dialog": {
@@ -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
 
@@ -438,6 +440,11 @@ button.btn-white {
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 {
@@ -113,6 +113,30 @@ $btn-secondary-dark-active: #bebebe;
113
113
  --ply-bg-yellow-hover: #d2a106;
114
114
  --ply-bg-yellow-active: #b28600;
115
115
 
116
+ // Color surfaces — pastel bg for cards, badges, alerts (theme-aware)
117
+ --ply-blue-surface: #d3e3fb;
118
+ --ply-red-surface: #f8d5d8;
119
+ --ply-green-surface: #d5ecd9;
120
+ --ply-yellow-surface: #fff4cc;
121
+ --ply-indigo-surface: #e0e7ff;
122
+ --ply-purple-surface: #ede9fe;
123
+ --ply-pink-surface: #fce7f3;
124
+ --ply-orange-surface: #ffedd5;
125
+ --ply-teal-surface: #ccfbf1;
126
+ --ply-cyan-surface: #cffafe;
127
+
128
+ // Color borders — light tint borders for colored cards (theme-aware)
129
+ --ply-blue-border: #92baf6;
130
+ --ply-red-border: #ef969d;
131
+ --ply-green-border: #96cfa1;
132
+ --ply-yellow-border: #ffe480;
133
+ --ply-indigo-border: #a5b4fc;
134
+ --ply-purple-border: #c4b5fd;
135
+ --ply-pink-border: #f9a8d4;
136
+ --ply-orange-border: #fdba74;
137
+ --ply-teal-border: #5eead4;
138
+ --ply-cyan-border: #67e8f9;
139
+
116
140
  // Brand palette (WCAG AA — 4.5:1 vs text-inverse per mode)
117
141
  --ply-blue-1: #0f62fe;
118
142
  --ply-blue-2: #0043ce;
@@ -179,9 +203,9 @@ $btn-secondary-dark-active: #bebebe;
179
203
  --ply-border-strong: #6f6f6f;
180
204
 
181
205
  // Interactive
182
- --ply-color-link: var(--ply-btn-default-bg);
206
+ --ply-color-link: #{$btn-primary-dark};
183
207
  --ply-color-link-hover: #{$btn-primary-dark-hover};
184
- --ply-color-link-hover: color-mix(in oklch, var(--ply-btn-default-bg), white 15%);
208
+ --ply-color-link-hover: color-mix(in oklch, #{$btn-primary-dark}, white 15%);
185
209
  --ply-color-focus: #0f62fe;
186
210
 
187
211
  // Fields
@@ -235,6 +259,30 @@ $btn-secondary-dark-active: #bebebe;
235
259
  // Glass
236
260
  --ply-bg-glass: rgba(38, 38, 38, 0.25);
237
261
 
262
+ // Color surfaces — dark muted bg for cards, badges, alerts
263
+ --ply-blue-surface: #1a2744;
264
+ --ply-red-surface: #3b1c1e;
265
+ --ply-green-surface: #1a2e1e;
266
+ --ply-yellow-surface: #332b10;
267
+ --ply-indigo-surface: #1e1b4b;
268
+ --ply-purple-surface: #2e1065;
269
+ --ply-pink-surface: #3b0a2a;
270
+ --ply-orange-surface: #331a08;
271
+ --ply-teal-surface: #132f2e;
272
+ --ply-cyan-surface: #133040;
273
+
274
+ // Color borders — medium-dark borders for colored cards
275
+ --ply-blue-border: #1a52a5;
276
+ --ply-red-border: #b2232f;
277
+ --ply-green-border: #237f35;
278
+ --ply-yellow-border: #cca000;
279
+ --ply-indigo-border: #3730a3;
280
+ --ply-purple-border: #5b21b6;
281
+ --ply-pink-border: #9d174d;
282
+ --ply-orange-border: #c2410c;
283
+ --ply-teal-border: #0f766e;
284
+ --ply-cyan-border: #0e7490;
285
+
238
286
  // Brand backgrounds (dark mode — same as light, saturated for contrast with white text)
239
287
  --ply-bg-blue: #0f62fe;
240
288
  --ply-bg-blue-hover: #0043ce;
@@ -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;