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 +4 -1
- package/PLY.md +67 -9
- package/README.md +5 -4
- package/dist/css/ply-core.css +45 -38
- package/dist/css/ply-core.min.css +1 -1
- package/dist/css/ply-essentials.min.css +1 -1
- package/dist/css/ply-helpers.min.css +1 -1
- package/dist/css/ply.css +56 -49
- package/dist/css/ply.min.css +1 -1
- package/dist/css/styles.css +56 -49
- package/dist/css/styles.min.css +1 -1
- package/llms-full.txt +76 -3
- package/llms.txt +2 -2
- package/package.json +1 -1
- package/ply-classes.json +18 -8
- package/snippets/custom-theme.html +3 -0
- package/src/scss/components/_buttons.scss +14 -7
- package/src/scss/components/_colors.scss +3 -2
- package/src/scss/components/_dialog-patterns.scss +1 -1
- package/src/scss/components/_forms.scss +10 -10
- package/src/scss/components/_grid.scss +1 -0
- package/src/scss/components/_helpers-core.scss +1 -1
- package/src/scss/components/_helpers.scss +3 -3
- package/src/scss/components/_livesearch.scss +6 -6
- package/src/scss/components/_navigation.scss +2 -2
- package/src/scss/components/_notifications.scss +2 -2
- package/src/scss/components/_reset.scss +7 -7
- package/src/scss/components/_rtl.scss +4 -4
- package/src/scss/components/_typography.scss +1 -1
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).
|
|
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`
|
|
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. **
|
|
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).
|
|
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
|
|
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
package/ply-classes.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.
|
|
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
|
|
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 (
|
|
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 (
|
|
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-
|
|
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: (
|
|
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 (
|
|
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: (
|
|
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 (
|
|
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:
|
|
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,
|
|
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
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
input[type="datetime-local"],
|
|
72
72
|
textarea,
|
|
73
73
|
select {
|
|
74
|
-
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:
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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;
|
|
@@ -276,11 +276,11 @@ $width-breakpoints: (
|
|
|
276
276
|
}
|
|
277
277
|
|
|
278
278
|
.border-radius-lg {
|
|
279
|
-
border-radius:
|
|
279
|
+
border-radius: calc(var(--ply-border-radius) * 3);
|
|
280
280
|
}
|
|
281
281
|
|
|
282
282
|
.border-radius-xl {
|
|
283
|
-
border-radius:
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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,
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
125
|
+
border-radius: var(--ply-border-radius) 0 0 var(--ply-border-radius);
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
|