@anyblades/blades 3.1.0-beta.7 → 3.1.0-rc.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.
Files changed (74) hide show
  1. package/README.md +128 -134
  2. package/css/blades.css +4 -4
  3. package/css/blades.min.css +4 -4
  4. package/css/blades.ninja.css +4 -4
  5. package/css/blades.ninja.min.css +4 -4
  6. package/css/float-label.css +1 -1
  7. package/css/float-label.min.css +1 -1
  8. package/css/layered/README.md +164 -0
  9. package/css/layered/_compact.css +30 -0
  10. package/css/layered/_utilities.css +23 -0
  11. package/css/layered/_variables-blades.css +8 -0
  12. package/css/layered/_variables.css +258 -0
  13. package/css/layered/blades.layered.css +4 -4
  14. package/css/layered/blades.layered.min.css +4 -4
  15. package/css/layered/components/_accordion.css +93 -0
  16. package/css/layered/components/_card.css +37 -0
  17. package/css/layered/components/_dropdown-popover.css +89 -0
  18. package/css/layered/components/_dropdown.css +188 -0
  19. package/css/layered/components/_group.css +89 -0
  20. package/css/layered/components/_index.css +950 -0
  21. package/css/layered/components/_loading.css +51 -0
  22. package/css/layered/components/_modal-modern.css +17 -0
  23. package/css/layered/components/_modal.css +144 -0
  24. package/css/layered/components/_nav.css +114 -0
  25. package/css/layered/components/_progress.css +68 -0
  26. package/css/layered/components/_timeline.css +7 -0
  27. package/css/layered/components/_tooltip.css +158 -0
  28. package/css/layered/content/_button.css +125 -0
  29. package/css/layered/content/_code-block.css +17 -0
  30. package/css/layered/content/_code.css +46 -0
  31. package/css/layered/content/_embedded-content.css +33 -0
  32. package/css/layered/content/_figure.css +10 -0
  33. package/css/layered/content/_icon.css +30 -0
  34. package/css/layered/content/_index.css +456 -0
  35. package/css/layered/content/_link.css +59 -0
  36. package/css/layered/content/_misc.css +15 -0
  37. package/css/layered/content/_table.css +24 -0
  38. package/css/layered/content/_typography.css +137 -0
  39. package/css/layered/forms/_basics.css +257 -0
  40. package/css/layered/forms/_checkbox-radio-switch.css +132 -0
  41. package/css/layered/forms/_index.css +617 -0
  42. package/css/layered/forms/_input-color.css +17 -0
  43. package/css/layered/forms/_input-datetime.css +37 -0
  44. package/css/layered/forms/_input-file.css +25 -0
  45. package/css/layered/forms/_input-range.css +111 -0
  46. package/css/layered/forms/_input-search.css +32 -0
  47. package/css/layered/forms/float-label/_core.css +28 -0
  48. package/css/layered/forms/float-label/_index.css +54 -0
  49. package/css/layered/forms/float-label/_theme.css +25 -0
  50. package/css/layered/forms/float-label/core.css +1 -1
  51. package/css/layered/forms/float-label.css +1 -1
  52. package/css/layered/layout/_columns.css +7 -0
  53. package/css/layered/layout/_container.css +39 -0
  54. package/css/layered/layout/_document.css +37 -0
  55. package/css/layered/layout/_grid.css +17 -0
  56. package/css/layered/layout/_index.css +103 -0
  57. package/css/layered/layout/_landmarks.css +3 -0
  58. package/css/layered/layout/_overflow-auto.css +3 -0
  59. package/css/layered/layout/_section.css +3 -0
  60. package/css/pico.canonical.css +2512 -0
  61. package/css/pico.canonical.min.css +1 -0
  62. package/css/pico.canonical.unmin.css +2512 -0
  63. package/css/pico.canonical.unmin.min.css +1 -0
  64. package/css/pico.conditional.css +1 -1
  65. package/css/pico.conditional.min.css +1 -1
  66. package/css/pico.css +1 -1
  67. package/css/pico.min.css +1 -1
  68. package/css/pico.unmin.css +2365 -0
  69. package/css/pico.unmin.min.css +7 -0
  70. package/package.json +10 -7
  71. package/src/blades/_index.css +1 -1
  72. package/src/blades/forms/float-label/_core.css +1 -1
  73. package/src/blades.css +1 -1
  74. package/src/pico/_index.css +1 -1
@@ -1,22 +1,22 @@
1
1
  /*!
2
2
  * Blades CSS v3 with Pico CSS 🥷✨
3
- * Copyright 2026 (https://blades.ninja/)
3
+ * Copyright 2026 (https://blades.dev/)
4
4
  * Licensed under MIT
5
5
  */
6
6
  /*!
7
7
  * Blades CSS' Pico fork v2.5 🥷✨
8
8
  * Copyright 2019-2025 (https://picocss.com)
9
- * Copyright 2026 (https://blades.ninja/css/pico/)
9
+ * Copyright 2026 (https://blades.dev/css/pico/)
10
10
  * Licensed under MIT
11
11
  */
12
12
  /*!
13
13
  * Blades CSS standalone kit v3 🥷
14
- * Copyright 2026 (https://blades.ninja/css/standalone/)
14
+ * Copyright 2026 (https://blades.dev/css/standalone/)
15
15
  * Licensed under MIT
16
16
  */
17
17
  /*!
18
18
  * Float Label CSS v2 by Blades CSS 🥷🏷️
19
- * Copyright 2016–2026 (https://blades.ninja/css/float-label/)
19
+ * Copyright 2016–2026 (https://blades.dev/css/float-label/)
20
20
  * Licensed under MIT
21
21
  */
22
22
  /*!
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * Float Label CSS v2 by Blades CSS 🥷🏷️
3
- * Copyright 2016–2026 (https://blades.ninja/css/float-label/)
3
+ * Copyright 2016–2026 (https://blades.dev/css/float-label/)
4
4
  * Licensed under MIT
5
5
  */
6
6
  label:has( > span):has(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select), .has-float-label {
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * Float Label CSS v2 by Blades CSS 🥷🏷️
3
- * Copyright 2016–2026 (https://blades.ninja/css/float-label/)
3
+ * Copyright 2016–2026 (https://blades.dev/css/float-label/)
4
4
  * Licensed under MIT
5
5
  */
6
6
  label:has(>span):has(input:not([type=checkbox],[type=radio],[type=range]),textarea,select),.has-float-label{display:block;position:relative;&>span,& label{cursor:text;font-size:75%;position:absolute;top:0;left:0}& :placeholder-shown:not(:focus)::placeholder{opacity:0}&:has(:placeholder-shown:not(:focus)){&>span,& label{font-size:inherit;opacity:.5}}}label:has(>span):has(input:not([type=checkbox],[type=radio],[type=range]),textarea,select),.has-float-label{&>span,& label{opacity:.75;padding-block-start:.25rem;padding-inline-start:calc(1rem + 1px);transition:all .25s}& input,& textarea,& select{margin-block-start:0;padding-block:1.125rem .375rem;padding-inline-start:1rem;&::placeholder{opacity:1;transition:all .25s}}&:has(:placeholder-shown:not(:focus)){&>span,& label{padding-block:.75rem}}}
@@ -0,0 +1,164 @@
1
+ # Layered modules
2
+
3
+ <!--section:docs-->
4
+
5
+ Blades CSS, whole or part by part, is also available wrapped in `@layer blades { }`, so any unlayered styles of yours win over it without specificity fights.
6
+
7
+ ## Whole framework
8
+
9
+ `blades.layered.css` / `blades.layered.min.css` is `blades.css` wrapped in `@layer blades { }`:
10
+
11
+ <!--prettier-ignore-->
12
+ ```html
13
+ <link rel="stylesheet" href="
14
+ https://cdn.jsdelivr.net/npm/@anyblades/blades@3/css/layered/blades.layered.min.css
15
+ "/>
16
+ ```
17
+
18
+ When you can use `@import`, `@import url("…/blades.min.css") layer(blades);` does the same without this file.
19
+
20
+ ## Per-part imports
21
+
22
+ ### With bundlers and component frameworks (SvelteKit, Next.js, Nuxt, Astro, …)
23
+
24
+ Import the parts from JavaScript, i.e. the root layout and the components that use them, rather than with `@import` inside a component's `<style>` block. The parts, `@anyblades/blades/<part>`, come wrapped in `@layer blades`, which a JS `import` can't add by itself.
25
+
26
+ ```js
27
+ // root layout, once: the base and every part that others build on
28
+ import "@anyblades/blades/variables";
29
+ import "@anyblades/blades/layout/document";
30
+ import "@anyblades/blades/content/typography";
31
+ import "@anyblades/blades/content/button";
32
+ import "@anyblades/blades/forms/basics";
33
+
34
+ // in the component that renders a <dialog>
35
+ import "@anyblades/blades/components/card";
36
+ import "@anyblades/blades/components/modal";
37
+ import "@anyblades/blades/components/modal-modern"; // optional: open animation without JS
38
+ ```
39
+
40
+ ```html
41
+ <style>
42
+ /* unlayered, so it wins over Blades whatever the specificity (except Blades' !important) */
43
+ article {
44
+ max-width: 40rem;
45
+ }
46
+ </style>
47
+ ```
48
+
49
+ - Bundlers dedupe JS-side CSS imports and split them per route, so each part is downloaded and cached once and only where it's used.
50
+ - An `@import` inside a scoped `<style>` (Svelte, Astro, Vue `scoped`) is processed as that component's own styles. The rules get scoped to the component's markup (Svelte also prunes the unused ones) and are duplicated in every component that imports them.
51
+
52
+ ### Framework examples
53
+
54
+ A confirm dialog component, with the root layout importing the base parts as above. The component imports `card` and `modal` and overrides Blades in its own styles. Blades' `dialog > article > footer button:not(:first-of-type)` is more specific than the component's rules, but it is in `@layer blades`, so the component's rules win. With the non-layered source (`@anyblades/blades/src/components/modal`), the second button would keep Blades' `margin-left`.
55
+
56
+ Svelte, `Confirm.svelte`:
57
+
58
+ ```svelte
59
+ <script>
60
+ import "@anyblades/blades/components/card";
61
+ import "@anyblades/blades/components/modal";
62
+ </script>
63
+
64
+ <dialog open>
65
+ <article>
66
+ <p>Delete this item?</p>
67
+ <footer>
68
+ <button class="secondary">Cancel</button>
69
+ <button>Delete</button>
70
+ </footer>
71
+ </article>
72
+ </dialog>
73
+
74
+ <style>
75
+ footer {
76
+ display: flex;
77
+ justify-content: flex-end;
78
+ gap: 0.5rem;
79
+ }
80
+ button {
81
+ margin: 0;
82
+ }
83
+ </style>
84
+ ```
85
+
86
+ Vue (`<script setup>` and `<style scoped>`) and Astro (the imports in the frontmatter, `<style>` in the component) work the same way.
87
+
88
+ React, `Confirm.jsx` with a CSS module:
89
+
90
+ ```jsx
91
+ import "@anyblades/blades/components/card";
92
+ import "@anyblades/blades/components/modal";
93
+ import styles from "./Confirm.module.css";
94
+
95
+ export default function Confirm() {
96
+ return (
97
+ <dialog open>
98
+ <article>
99
+ <p>Delete this item?</p>
100
+ <footer className={styles.footer}>
101
+ <button className="secondary">Cancel</button>
102
+ <button>Delete</button>
103
+ </footer>
104
+ </article>
105
+ </dialog>
106
+ );
107
+ }
108
+ ```
109
+
110
+ ```css
111
+ /* Confirm.module.css */
112
+ .footer {
113
+ display: flex;
114
+ justify-content: flex-end;
115
+ gap: 0.5rem;
116
+ }
117
+ .footer button {
118
+ margin: 0;
119
+ }
120
+ ```
121
+
122
+ Per-page CSS in a SvelteKit production build of this example, next to the whole `blades.layered.min.css` (gzip sizes in parentheses):
123
+
124
+ | | CSS |
125
+ | ------------------------------------------------------------------------ | ------------------- |
126
+ | `blades.layered.min.css`, for comparison | 76.9 kB (12.4 kB) |
127
+ | Every page: the root layout's parts | 25.5 kB (4.7 kB) |
128
+ | The page with `Confirm`: plus `card`, `modal` and the component's styles | + 4.7 kB (+ 1.4 kB) |
129
+
130
+ The sizes are from a build with `build: { cssTarget: "esnext" }` in `vite.config.js`. With Vite's default browser targets, `light-dark()` is lowered to fallback custom properties, which adds about 4 kB to the root layout's CSS.
131
+
132
+ ### Available parts
133
+
134
+ `@anyblades/blades/<part>` is the file under [`css/layered/`](https://github.com/anyblades/blades/tree/main/css/layered):
135
+
136
+ - Pico's parts: `variables`, `layout/*`, `content/*`, `forms/*`, `components/*` and `utilities`. A whole category is one import, e.g. `@anyblades/blades/components` (Pico's parts of that category only; `layout` without `landmarks`).
137
+ - Blades' own parts, mostly in the same folders as Pico's:
138
+ - `components/modal-modern` adds the CSS-only open animation for `showModal()` on top of `components/modal` ([No-JS transitions](//blades.dev/css/modal/#no-js-transitions-new))
139
+ - `components/dropdown-popover` styles `<ul popover>` / `<menu popover>` menus opened by a button ([Modern Popover API](//blades.dev/css/dropdown/#modern-popover-api-new))
140
+ - `variables-blades`, `layout/columns`, `content/code-block`, `content/icon`, `forms/float-label`, `components/timeline`
141
+ - `compact`: import it last (see [Compact sizing](https://github.com/anyblades/blades#compact-sizing-opt-in))
142
+ - The same names under `@anyblades/blades/src/…` are the sources without the layer, e.g. `@anyblades/blades/src/components/card`, to put them in a layer of your own (`@import "@anyblades/blades/src/components/card" layer(ui);`) or to run your own build. `@anyblades/blades/src` on its own is the source of the whole `blades.css`.
143
+
144
+ ### Order and dependencies
145
+
146
+ - `variables` and `layout/document` are the minimum. Inside the layer, later parts still win over earlier ones, so keep the order of [`src/pico/_index.css`](https://github.com/anyblades/blades/blob/main/src/pico/_index.css) (variables → layout → content → forms → components → utilities). Blades' own parts come after Pico's, in the order of [`src/blades/_index.css`](https://github.com/anyblades/blades/blob/main/src/blades/_index.css), with `compact` last.
147
+ - Parts don't `@import` the parts they build on:
148
+ - `components/modal` expects `components/card`
149
+ - `components/group` and `components/dropdown` expect `content/button` and `forms/basics`
150
+ - `components/modal-modern` expects `components/modal`
151
+ - `components/dropdown-popover` expects `components/dropdown`
152
+ - the `forms/*` extras expect `forms/basics`
153
+
154
+ If they did, every route chunk would carry its own copy. Import those shared parts once, at the root or next to the part that needs them; bundlers dedupe the imports.
155
+
156
+ - Landmark padding: `pico.css` and `blades.ninja.css` pad `body > header`, `body > main` and `body > footer` like Pico, which doesn't match when the framework wraps the page in an element (SvelteKit's `<div style="display: contents">`, Next.js pages router `#__next`, Nuxt `#__nuxt`, a SPA's `#root` / `#app`). `blades.css` doesn't pad them; add `layout/landmarks` for Pico's `body >` padding.
157
+
158
+ ## Overrides and caveats
159
+
160
+ Override in your component's `<style>` or `app.css`, or set `--pico-*` variables on `:root` or on an element. Unlayered CSS always wins over `@layer blades`. The usual layer caveats apply:
161
+
162
+ - Blades' own `!important` declarations (form validation, reduced motion) beat your unlayered `!important`.
163
+ - Your `@keyframes` of the same name as Blades' win regardless of load order.
164
+ - If you use other layered CSS, declare the order once, before anything else is loaded, because the first `@layer` the browser sees fixes the order. For Tailwind v4 that is `@layer theme, base, blades, components, utilities;` at the top of the CSS file you import first (before `@import "tailwindcss"`), and that file has to be imported before any Blades part.
@@ -0,0 +1,30 @@
1
+ [data-compact], [data-compact] :is([data-theme], .pico), .pico[data-compact], :host([data-compact]), :host([data-compact]) [data-theme] {
2
+ --pico-border-radius: .5rem;
3
+ --pico-outline-width: .1875rem;
4
+ --pico-block-spacing-vertical: 1.5rem;
5
+ --pico-block-spacing-horizontal: 1.5rem;
6
+ --pico-form-element-spacing-vertical: .375rem;
7
+ --pico-form-element-spacing-horizontal: .75rem;
8
+ --pico-form-label-font-weight: 500;
9
+ --pico-button-font-weight: 500;
10
+ --pico-form-element-background-color: light-dark(#fff, #1c212c);
11
+ --pico-card-border-color: var(--pico-muted-border-color);
12
+ --pico-card-box-shadow: 0 0 0 var(--pico-border-width) var(--pico-card-border-color), 0 1px 2px #0000000d;
13
+ --pico-card-sectioning-background-color: var(--pico-card-background-color);
14
+ }
15
+
16
+ [data-compact]:is([role="search"], [type="search"]) {
17
+ --pico-border-radius: 5rem;
18
+ }
19
+
20
+ :root[data-compact], :host([data-compact]) {
21
+ --pico-font-size: 100%;
22
+ }
23
+
24
+ [data-compact] :is(h1, h2, h3, h4, h5, h6), :host([data-compact]) :is(h1, h2, h3, h4, h5, h6) {
25
+ --pico-font-weight: 600;
26
+ }
27
+
28
+ [data-compact] :where(input, select, textarea, fieldset, .grid) + small, :host([data-compact]) :where(input, select, textarea, fieldset, .grid) + small {
29
+ font-weight: var(--pico-font-weight);
30
+ }
@@ -0,0 +1,23 @@
1
+ [aria-controls] {
2
+ cursor: pointer;
3
+ }
4
+
5
+ [aria-disabled="true"], [disabled] {
6
+ cursor: not-allowed;
7
+ }
8
+
9
+ [dir="rtl"] {
10
+ direction: rtl;
11
+ }
12
+
13
+ @media (prefers-reduced-motion: reduce) {
14
+ :not([aria-busy="true"]):not(.unreduce-motion), :not([aria-busy="true"]):before, :not([aria-busy="true"]):after {
15
+ background-attachment: initial !important;
16
+ scroll-behavior: auto !important;
17
+ transition-duration: 0s !important;
18
+ transition-delay: 0s !important;
19
+ animation-duration: 1ms !important;
20
+ animation-iteration-count: 1 !important;
21
+ animation-delay: -1ms !important;
22
+ }
23
+ }
@@ -0,0 +1,8 @@
1
+ :scope, :host {
2
+ --blades-token-primary: var(--pico-primary, dodgerblue);
3
+ --in-pico: #969eaf;
4
+ --blades-token-secondary: var(--pico-secondary, lightslategray);
5
+ --blades-timeline-border-color: color-mix(in srgb,
6
+ var(--blades-token-secondary) 50%,
7
+ transparent);
8
+ }
@@ -0,0 +1,258 @@
1
+ :scope, :host {
2
+ --pico-font-family-emoji: "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
3
+ --pico-font-family-sans-serif: system-ui, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, Helvetica, Arial, "Helvetica Neue",
4
+ sans-serif, var(--pico-font-family-emoji);
5
+ --pico-font-family-monospace: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace,
6
+ var(--pico-font-family-emoji);
7
+ --pico-font-family: var(--pico-font-family-sans-serif);
8
+ --pico-line-height: 1.5;
9
+ --pico-font-weight: 400;
10
+ --pico-font-size: 100%;
11
+ --pico-text-underline-offset: .1rem;
12
+ --pico-border-radius: .25rem;
13
+ --pico-border-width: .0625rem;
14
+ --pico-outline-width: .125rem;
15
+ --pico-transition: .2s ease-in-out;
16
+ --pico-spacing: 1rem;
17
+ --pico-typography-spacing-vertical: 1rem;
18
+ --pico-block-spacing-vertical: var(--pico-spacing);
19
+ --pico-block-spacing-horizontal: var(--pico-spacing);
20
+ --pico-grid-column-gap: var(--pico-spacing);
21
+ --pico-grid-row-gap: var(--pico-spacing);
22
+ --pico-form-element-spacing-vertical: .75rem;
23
+ --pico-form-element-spacing-horizontal: 1rem;
24
+ --pico-nav-element-spacing-vertical: 1rem;
25
+ --pico-nav-link-spacing-vertical: .5rem;
26
+ --pico-nav-link-spacing-horizontal: .5rem;
27
+ --pico-icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
28
+ }
29
+
30
+ @media (width >= 576px) {
31
+ :scope, :host {
32
+ --pico-font-size: 106.25%;
33
+ }
34
+ }
35
+
36
+ @media (width >= 768px) {
37
+ :scope, :host {
38
+ --pico-font-size: 112.5%;
39
+ }
40
+ }
41
+
42
+ @media (width >= 1024px) {
43
+ :scope, :host {
44
+ --pico-font-size: 118.75%;
45
+ }
46
+ }
47
+
48
+ @media (width >= 1280px) {
49
+ :scope, :host {
50
+ --pico-font-size: 125%;
51
+ }
52
+ }
53
+
54
+ @media (width >= 1536px) {
55
+ :scope, :host {
56
+ --pico-font-size: 131.25%;
57
+ }
58
+ }
59
+
60
+ a, a.secondary, a.contrast {
61
+ --pico-text-decoration: underline;
62
+ }
63
+
64
+ small {
65
+ --pico-font-size: .875em;
66
+ }
67
+
68
+ h1, h2, h3, h4, h5, h6 {
69
+ --pico-font-weight: 700;
70
+ }
71
+
72
+ h1 {
73
+ --pico-font-size: 2rem;
74
+ --pico-line-height: 1.125;
75
+ --pico-typography-spacing-top: 3rem;
76
+ }
77
+
78
+ h2 {
79
+ --pico-font-size: 1.75rem;
80
+ --pico-line-height: 1.15;
81
+ --pico-typography-spacing-top: 2.625rem;
82
+ }
83
+
84
+ h3 {
85
+ --pico-font-size: 1.5rem;
86
+ --pico-line-height: 1.175;
87
+ --pico-typography-spacing-top: 2.25rem;
88
+ }
89
+
90
+ h4 {
91
+ --pico-font-size: 1.25rem;
92
+ --pico-line-height: 1.2;
93
+ --pico-typography-spacing-top: 1.874rem;
94
+ }
95
+
96
+ h5 {
97
+ --pico-font-size: 1.125rem;
98
+ --pico-line-height: 1.225;
99
+ --pico-typography-spacing-top: 1.6875rem;
100
+ }
101
+
102
+ h6 {
103
+ --pico-font-size: 1rem;
104
+ --pico-line-height: 1.25;
105
+ --pico-typography-spacing-top: 1.5rem;
106
+ }
107
+
108
+ thead th, thead td, tfoot th, tfoot td {
109
+ --pico-font-weight: 600;
110
+ --pico-border-width: .1875rem;
111
+ }
112
+
113
+ pre, code, kbd, samp {
114
+ --pico-font-family: var(--pico-font-family-monospace);
115
+ }
116
+
117
+ kbd {
118
+ --pico-font-weight: bolder;
119
+ }
120
+
121
+ input:not([type="submit"], [type="button"], [type="reset"], [type="checkbox"], [type="radio"], [type="file"]), :where(select, textarea) {
122
+ --pico-outline-width: .0625rem;
123
+ }
124
+
125
+ [type="search"] {
126
+ --pico-border-radius: 5rem;
127
+ }
128
+
129
+ [type="checkbox"], [type="radio"] {
130
+ --pico-border-width: .125rem;
131
+ }
132
+
133
+ [type="checkbox"][role="switch"] {
134
+ --pico-border-width: .1875rem;
135
+ }
136
+
137
+ details.dropdown summary:not([role="button"]) {
138
+ --pico-outline-width: .0625rem;
139
+ }
140
+
141
+ nav details.dropdown summary:focus-visible {
142
+ --pico-outline-width: .125rem;
143
+ }
144
+
145
+ [role="search"] {
146
+ --pico-border-radius: 5rem;
147
+ }
148
+
149
+ [role="search"] button, [role="search"] [type="submit"], [role="search"] [type="button"], [role="search"] [role="button"], [role="group"] button, [role="group"] [type="submit"], [role="group"] [type="button"], [role="group"] [role="button"] {
150
+ --pico-form-element-spacing-horizontal: 2rem;
151
+ }
152
+
153
+ details summary[role="button"]:not(.outline):after, [aria-busy="true"]:not(input, select, textarea):is(button, [type="submit"], [type="button"], [type="reset"], [role="button"]):not(.outline):before {
154
+ filter: brightness(0) invert();
155
+ }
156
+
157
+ :scope, :host, [data-theme="light"], [data-theme="dark"] {
158
+ color-scheme: light;
159
+ --pico-background-color: light-dark(#fff, #13171f);
160
+ --pico-color: light-dark(#373c44, #c2c7d0);
161
+ --pico-text-selection-color: light-dark(#029ae840, #01aaff30);
162
+ --pico-muted-color: light-dark(#646b79, #7b8495);
163
+ --pico-muted-border-color: light-dark(#e7eaf0, #202632);
164
+ --pico-primary: light-dark(#0172ad, #01aaff);
165
+ --pico-primary-background: #0172ad;
166
+ --pico-primary-border: var(--pico-primary-background);
167
+ --pico-primary-underline: light-dark(#0172ad80, #01aaff80);
168
+ --pico-primary-hover: light-dark(#015887, #79c0ff);
169
+ --pico-primary-hover-background: light-dark(#02659a, #017fc0);
170
+ --pico-primary-hover-border: var(--pico-primary-hover-background);
171
+ --pico-primary-hover-underline: var(--pico-primary-hover);
172
+ --pico-primary-focus: light-dark(#028ad4, #01aaff);
173
+ --pico-primary-inverse: #fff;
174
+ --pico-secondary: light-dark(#5d6b89, #969eaf);
175
+ --pico-secondary-background: #525f7a;
176
+ --pico-secondary-border: var(--pico-secondary-background);
177
+ --pico-secondary-underline: light-dark(#5d6b8980, #969eaf80);
178
+ --pico-secondary-hover: light-dark(#48536b, #b3b9c5);
179
+ --pico-secondary-hover-background: light-dark(#48536b, #5d6b89);
180
+ --pico-secondary-hover-border: var(--pico-secondary-hover-background);
181
+ --pico-secondary-hover-underline: var(--pico-secondary-hover);
182
+ --pico-secondary-focus: light-dark(#5d6b89, #909ebe);
183
+ --pico-secondary-inverse: #fff;
184
+ --pico-contrast: light-dark(#181c25, #dfe3eb);
185
+ --pico-contrast-background: light-dark(#181c25, #eff1f4);
186
+ --pico-contrast-border: var(--pico-contrast-background);
187
+ --pico-contrast-underline: light-dark(#181c2580, #dfe3eb80);
188
+ --pico-contrast-hover: light-dark(#000, #fff);
189
+ --pico-contrast-hover-background: light-dark(#000, #fff);
190
+ --pico-contrast-hover-border: var(--pico-contrast-hover-background);
191
+ --pico-contrast-hover-underline: light-dark(var(--pico-secondary-hover), var(--pico-contrast-hover));
192
+ --pico-contrast-focus: light-dark(#5d6b89, #cfd5e2);
193
+ --pico-contrast-inverse: light-dark(#fff, #000);
194
+ --pico-box-shadow: 0 .5rem 2.5rem light-dark(#8191b533, #07090c33);
195
+ --pico-h1-color: light-dark(#2d3138, #f0f1f3);
196
+ --pico-h2-color: light-dark(#373c44, #e0e3e7);
197
+ --pico-h3-color: light-dark(#424751, #c2c7d0);
198
+ --pico-h4-color: light-dark(#4d535e, #b3b9c5);
199
+ --pico-h5-color: light-dark(#5c6370, #a4acba);
200
+ --pico-h6-color: light-dark(#646b79, #8891a4);
201
+ --pico-mark-background-color: light-dark(#fde7c0, #014063);
202
+ --pico-mark-color: light-dark(#0f1114, #fff);
203
+ --pico-ins-color: light-dark(#1d6a54, #62af9a);
204
+ --pico-del-color: light-dark(#883935, #ce7e7b);
205
+ --pico-blockquote-border-color: var(--pico-muted-border-color);
206
+ --pico-blockquote-footer-color: var(--pico-muted-color);
207
+ --pico-button-box-shadow: 0 0 0 #0000;
208
+ --pico-button-hover-box-shadow: 0 0 0 #0000;
209
+ --pico-table-border-color: var(--pico-muted-border-color);
210
+ --pico-table-row-stripped-background-color: #6f78870a;
211
+ --pico-code-background-color: light-dark(#f3f5f7, #1a1f28);
212
+ --pico-code-color: light-dark(#646b79, #8891a4);
213
+ --pico-code-kbd-background-color: var(--pico-color);
214
+ --pico-code-kbd-color: var(--pico-background-color);
215
+ --pico-form-element-background-color: light-dark(#fbfcfc, #1c212c);
216
+ --pico-form-element-selected-background-color: light-dark(#dfe3eb, #2a3140);
217
+ --pico-form-element-border-color: light-dark(#cfd5e2, #2a3140);
218
+ --pico-form-element-color: light-dark(#23262c, #e0e3e7);
219
+ --pico-form-element-placeholder-color: light-dark(var(--pico-muted-color), #8891a4);
220
+ --pico-form-element-active-background-color: light-dark(#fff, #1a1f28);
221
+ --pico-form-element-active-border-color: var(--pico-primary-border);
222
+ --pico-form-element-focus-color: var(--pico-primary-border);
223
+ --pico-form-element-disabled-opacity: .5;
224
+ --pico-form-element-invalid-border-color: light-dark(#b86a6b, #c84f48);
225
+ --pico-form-element-invalid-active-border-color: light-dark(#c84f48, #d65c56);
226
+ --pico-form-element-invalid-focus-color: var(--pico-form-element-invalid-active-border-color);
227
+ --pico-form-element-valid-border-color: light-dark(#4c9b8a, #2a7b6f);
228
+ --pico-form-element-valid-active-border-color: light-dark(#279977, #16896a);
229
+ --pico-form-element-valid-focus-color: var(--pico-form-element-valid-active-border-color);
230
+ --pico-icon-valid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(76, 154.5, 137.5)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
231
+ --pico-icon-invalid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(200.25, 79.25, 72.25)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");
232
+ }
233
+
234
+ input:is([type="submit"], [type="button"], [type="reset"], [type="checkbox"], [type="radio"], [type="file"]) {
235
+ --pico-form-element-focus-color: var(--pico-primary-focus);
236
+ }
237
+
238
+ @media only screen and (prefers-color-scheme: dark) {
239
+ :scope:not([data-theme]), :host(:not([data-theme])) {
240
+ color-scheme: dark;
241
+ }
242
+
243
+ :scope:not([data-theme]) details summary[role="button"].contrast:not(.outline):after, :host(:not([data-theme])) details summary[role="button"].contrast:not(.outline):after, :scope:not([data-theme]) [aria-busy="true"]:not(input, select, textarea).contrast:is(button, [type="submit"], [type="button"], [type="reset"], [role="button"]):not(.outline):before, :host(:not([data-theme])) [aria-busy="true"]:not(input, select, textarea).contrast:is(button, [type="submit"], [type="button"], [type="reset"], [role="button"]):not(.outline):before {
244
+ filter: brightness(0);
245
+ }
246
+ }
247
+
248
+ [data-theme="dark"] {
249
+ color-scheme: dark;
250
+ }
251
+
252
+ [data-theme="dark"] details summary[role="button"].contrast:not(.outline):after, [data-theme="dark"] [aria-busy="true"]:not(input, select, textarea).contrast:is(button, [type="submit"], [type="button"], [type="reset"], [role="button"]):not(.outline):before {
253
+ filter: brightness(0);
254
+ }
255
+
256
+ progress, [type="checkbox"], [type="radio"], [type="range"] {
257
+ accent-color: var(--pico-primary);
258
+ }
@@ -1,23 +1,23 @@
1
1
  @layer blades {
2
2
  /*!
3
3
  * Blades CSS v3 with Pico CSS 🥷✨
4
- * Copyright 2026 (https://blades.ninja/)
4
+ * Copyright 2026 (https://blades.dev/)
5
5
  * Licensed under MIT
6
6
  */
7
7
  /*!
8
8
  * Blades CSS' Pico fork v2.5 🥷✨
9
9
  * Copyright 2019-2025 (https://picocss.com)
10
- * Copyright 2026 (https://blades.ninja/css/pico/)
10
+ * Copyright 2026 (https://blades.dev/css/pico/)
11
11
  * Licensed under MIT
12
12
  */
13
13
  /*!
14
14
  * Blades CSS standalone kit v3 🥷
15
- * Copyright 2026 (https://blades.ninja/css/standalone/)
15
+ * Copyright 2026 (https://blades.dev/css/standalone/)
16
16
  * Licensed under MIT
17
17
  */
18
18
  /*!
19
19
  * Float Label CSS v2 by Blades CSS 🥷🏷️
20
- * Copyright 2016–2026 (https://blades.ninja/css/float-label/)
20
+ * Copyright 2016–2026 (https://blades.dev/css/float-label/)
21
21
  * Licensed under MIT
22
22
  */
23
23
  :scope, :host {