@vanduo-oss/framework 1.3.4 → 1.3.7
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/LICENSE +0 -14
- package/README.md +34 -176
- package/css/components/cards.css +11 -1
- package/css/components/datepicker.css +10 -1
- package/css/components/expanding-cards.css +215 -0
- package/css/components/spotlight.css +8 -3
- package/css/components/timeline.css +47 -0
- package/css/components/tooltips.css +8 -8
- package/css/effects/morph.css +247 -0
- package/css/vanduo.css +2 -0
- package/dist/build-info.json +3 -3
- package/dist/vanduo.cjs.js +754 -59
- package/dist/vanduo.cjs.js.map +3 -3
- package/dist/vanduo.cjs.min.js +4 -4
- package/dist/vanduo.cjs.min.js.map +4 -4
- package/dist/vanduo.css +477 -14
- package/dist/vanduo.css.map +1 -1
- package/dist/vanduo.esm.js +754 -59
- package/dist/vanduo.esm.js.map +3 -3
- package/dist/vanduo.esm.min.js +4 -4
- package/dist/vanduo.esm.min.js.map +4 -4
- package/dist/vanduo.js +754 -59
- package/dist/vanduo.js.map +3 -3
- package/dist/vanduo.min.css +2 -2
- package/dist/vanduo.min.css.map +1 -1
- package/dist/vanduo.min.js +4 -4
- package/dist/vanduo.min.js.map +4 -4
- package/js/components/datepicker.js +392 -70
- package/js/components/expanding-cards.js +136 -0
- package/js/components/morph.js +134 -0
- package/js/components/timeline.js +226 -0
- package/js/index.js +4 -1
- package/package.json +1 -1
package/LICENSE
CHANGED
|
@@ -19,17 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
19
19
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
20
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
SOFTWARE.
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
Third-Party Licenses:
|
|
26
|
-
|
|
27
|
-
Open Color
|
|
28
|
-
Copyright (c) 2016 Heeyeun Jeong
|
|
29
|
-
MIT License
|
|
30
|
-
https://yeun.github.io/open-color/
|
|
31
|
-
|
|
32
|
-
Phosphor Icons
|
|
33
|
-
Copyright (c) 2020 Phosphor Icons
|
|
34
|
-
MIT License
|
|
35
|
-
https://phosphoricons.com/
|
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Vanduo Framework v1.3.
|
|
1
|
+
# Vanduo Framework v1.3.7
|
|
2
2
|
|
|
3
3
|
<p align="center">
|
|
4
4
|
<img src="vanduo-banner.svg" alt="Vanduo Framework Banner" width="100%">
|
|
@@ -7,115 +7,35 @@
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
<a href="https://www.npmjs.com/package/@vanduo-oss/framework"><img src="https://img.shields.io/npm/v/@vanduo-oss/framework?style=flat-square&color=3b82f6" alt="NPM Version"></a>
|
|
9
9
|
<a href="https://github.com/vanduo-oss/framework/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/vanduo-oss/framework/ci.yml?branch=main&style=flat-square&color=10b981" alt="Build Status"></a>
|
|
10
|
-
<a href="https://github.com/vanduo-oss/framework/blob/main/dist/vanduo.min.css"><img src="https://img.shields.io/badge/minified_size-~110kb-8b5cf6?style=flat-square" alt="Minified Size"></a>
|
|
11
10
|
<a href="https://github.com/vanduo-oss/framework/blob/main/LICENSE"><img src="https://img.shields.io/github/license/vanduo-oss/framework?style=flat-square&color=64748b" alt="License"></a>
|
|
12
11
|
</p>
|
|
13
12
|
|
|
14
|
-
**Essential just like water is.**
|
|
13
|
+
**Essential just like water is.**
|
|
15
14
|
|
|
16
|
-
-
|
|
17
|
-
- **No third party dependencies**
|
|
18
|
-
- **Free and open source.**
|
|
15
|
+
Vanduo is a lightweight, zero-dependency UI framework built with pure HTML, CSS, and JavaScript. It ships 47+ components, responsive utilities, dark mode support, and a flexible theming system.
|
|
19
16
|
|
|
20
|
-
|
|
17
|
+
[Browse Docs](https://vanduo.dev/#docs)
|
|
21
18
|
|
|
22
|
-
|
|
19
|
+
## Highlights
|
|
23
20
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
- 📱 **Responsive** - Mobile-first design approach
|
|
31
|
-
- 🎯 **Utility-First** - Flexible utility classes for rapid development
|
|
32
|
-
- 🧩 **Modular** - Import only what you need
|
|
33
|
-
- ♿ **Accessible** - Built with accessibility in mind (WCAG 2.1 AA)
|
|
34
|
-
- 🌙 **Dark Mode** - Automatic OS preference detection + manual toggle
|
|
35
|
-
- 🌗 **Theme Switcher** - Lightweight light/dark/system toggle with shared preference storage
|
|
36
|
-
- 🎛️ **Theme Customizer** - Real-time color, radius, font, and mode customization
|
|
37
|
-
- 🔍 **SEO-Ready** - Comprehensive meta tags, structured data, and sitemap
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## What's New in v1.3.4
|
|
42
|
-
|
|
43
|
-
v1.3.4 introduces the Glass Effects system — no breaking changes:
|
|
44
|
-
|
|
45
|
-
- **New `effects/glass.css` module.** Core `.vd-glass` class with `backdrop-filter` blur, translucent background, specular highlight, and noise texture. Size variants (`vd-glass-sm / md / lg / xl`), modifiers (`vd-glass-tinted`, `vd-glass-floating`, `vd-glass-contrast`), and full `prefers-reduced-transparency` / `@supports not (backdrop-filter)` fallbacks.
|
|
46
|
-
- **Glass design tokens.** `--vd-glass-blur`, `--vd-glass-saturate`, `--vd-glass-bg-opacity`, `--vd-glass-bg-light/dark`, `--vd-glass-border-light/dark`, `--vd-glass-shadow`, `--vd-glass-highlight-alpha`, `--vd-glass-noise-opacity` — all with automatic dark-mode overrides and `--vd-glass-*` aliases.
|
|
47
|
-
- **Component glass variants.** Opt-in `.vd-*-glass` modifier added to Navbar, Modal, Dropdown, Tooltip, Toast, Card, and FAB.
|
|
48
|
-
- **Scroll-activated glass.** `initScrollWatcher()` in `navbar.js` activates `.vd-navbar-glass` transparently at rest and frosted on scroll (configurable via `data-scroll-threshold`). Generic `data-glass-scroll` + `data-glass-sentinel` attribute API (new `glass.js`, `IntersectionObserver`) brings the same pattern to any element via `.is-glass-active`.
|
|
49
|
-
- **vd-hex selection fix.** `VdHexGrid` re-syncs `selectedHex` references after grid regeneration, preventing stale coordinates during rotation.
|
|
50
|
-
|
|
51
|
-
## What's New in v1.3.3
|
|
52
|
-
|
|
53
|
-
v1.3.3 is a maintenance release with no breaking changes:
|
|
54
|
-
|
|
55
|
-
- **Theme default primary alignment.** `ThemeCustomizer` and `ThemeSwitcher` normalize stale `black`/`amber` primary pairs against `localStorage` and `prefers-color-scheme`, so light, dark, and system modes stay consistent with `data-primary` after reloads and OS theme changes.
|
|
56
|
-
- **Documentation site.** Theme customizer demo storage keys align with framework (`vanduo-radius`, `vanduo-font-preference`); changelog and CDN pins updated to v1.3.3.
|
|
57
|
-
|
|
58
|
-
---
|
|
59
|
-
|
|
60
|
-
## What's New in v1.3.2
|
|
61
|
-
|
|
62
|
-
v1.3.2 is a component release centered on audio playback, with no breaking changes:
|
|
63
|
-
|
|
64
|
-
- **New Music Player component.** Ships a zero-dependency HTML5 audio player with play/pause, previous/next, volume, track title, and optional progress, shuffle, and playlist controls.
|
|
65
|
-
- **Framework-friendly API.** Accepts a plain JavaScript tracks array (`[{ name, url }]`), exposes custom events, and supports programmatic control through `window.VanduoMusicPlayer`.
|
|
66
|
-
- **Responsive player layout.** Control wrapping and volume sizing were tuned so the component stays usable across compact, inline, and mobile layouts.
|
|
67
|
-
- **Release coverage and artifacts updated.** Package metadata, generated bundles, `llms.txt`, and release-facing README examples now point at v1.3.2.
|
|
68
|
-
|
|
69
|
-
The framework now ships **46+ components**, including the new Music Player and the additions below.
|
|
70
|
-
|
|
71
|
-
| Component | Vanduo Name | Type |
|
|
72
|
-
|---|---|---|
|
|
73
|
-
| Carousel | Flow | CSS + JS |
|
|
74
|
-
| Music Player | Music Player | CSS + JS |
|
|
75
|
-
| Popover | Bubble | CSS + JS |
|
|
76
|
-
| Scrollspy | Waypoint | CSS + JS |
|
|
77
|
-
| Offcanvas | — (enhanced Sidenav) | CSS + JS |
|
|
78
|
-
| Ripple / Waves | Ripple | CSS + JS |
|
|
79
|
-
| Floating Action Button | FAB | CSS-only |
|
|
80
|
-
| Sticky | Affix | CSS + JS |
|
|
81
|
-
| Autocomplete | Suggest | CSS + JS |
|
|
82
|
-
| Form Validation | Validate | JS |
|
|
83
|
-
| Date Picker | Datepicker | CSS + JS |
|
|
84
|
-
| Time Picker | Timepicker | CSS + JS |
|
|
85
|
-
| Stepper | Stepper | CSS + JS |
|
|
86
|
-
| Timeline | Timeline | CSS-only |
|
|
87
|
-
| Rating | Rating | CSS + JS |
|
|
88
|
-
| Transfer / Multi-select | Transfer | CSS + JS |
|
|
89
|
-
| Tree View | Tree | CSS + JS |
|
|
90
|
-
| Spotlight / Feature Discovery | Spotlight | CSS + JS |
|
|
91
|
-
|
|
92
|
-
---
|
|
21
|
+
- Pure CSS/JS with no runtime dependencies
|
|
22
|
+
- Modular architecture with optional per-component imports
|
|
23
|
+
- 47+ components, including Expanding Cards and animated Timeline controls in v1.3.7
|
|
24
|
+
- Built-in dark/light/system theme switching
|
|
25
|
+
- Runtime Theme Customizer for color, font, and radius tokens
|
|
26
|
+
- Accessibility-focused components and utilities
|
|
93
27
|
|
|
94
28
|
## Quick Start
|
|
95
29
|
|
|
96
|
-
###
|
|
97
|
-
|
|
98
|
-
The quickest way to get started — no install, no build step. Add two lines to any HTML file:
|
|
30
|
+
### CDN (recommended)
|
|
99
31
|
|
|
100
32
|
```html
|
|
101
|
-
|
|
102
|
-
<
|
|
103
|
-
|
|
104
|
-
<!-- Vanduo JS -->
|
|
105
|
-
<script src="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@main/dist/vanduo.min.js"></script>
|
|
33
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.3.7/dist/vanduo.min.css">
|
|
34
|
+
<script src="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.3.7/dist/vanduo.min.js"></script>
|
|
106
35
|
<script>Vanduo.init();</script>
|
|
107
36
|
```
|
|
108
37
|
|
|
109
|
-
|
|
110
|
-
```html
|
|
111
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.3.4/dist/vanduo.min.css">
|
|
112
|
-
<script src="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.3.4/dist/vanduo.min.js"></script>
|
|
113
|
-
<script>Vanduo.init();</script>
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### Option 2: Download
|
|
117
|
-
|
|
118
|
-
[**Download the dist/ folder**](https://github.com/vanduo-oss/framework/tree/main/dist) and include locally — no internet connection required at runtime:
|
|
38
|
+
### Local dist files
|
|
119
39
|
|
|
120
40
|
```html
|
|
121
41
|
<link rel="stylesheet" href="dist/vanduo.min.css">
|
|
@@ -123,97 +43,37 @@ The quickest way to get started — no install, no build step. Add two lines to
|
|
|
123
43
|
<script>Vanduo.init();</script>
|
|
124
44
|
```
|
|
125
45
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
### Option 3: Source Files
|
|
129
|
-
|
|
130
|
-
For development or when you need more control, use the unminified source:
|
|
131
|
-
|
|
132
|
-
```html
|
|
133
|
-
<link rel="stylesheet" href="css/vanduo.css">
|
|
134
|
-
<script src="js/vanduo.js"></script>
|
|
135
|
-
<script>Vanduo.init();</script>
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### Option 4: With a Bundler (Vite)
|
|
139
|
-
|
|
140
|
-
> **Requires a build tool.** The imports below use bare module specifiers (`@vanduo-oss/framework`) which browsers cannot resolve on their own. For static HTML files, use the CDN or Download options above.
|
|
141
|
-
|
|
142
|
-
Scaffold a Vite project and install Vanduo:
|
|
46
|
+
### Package install (bundlers)
|
|
143
47
|
|
|
144
48
|
```bash
|
|
145
|
-
pnpm create vite my-app --template vanilla
|
|
146
|
-
cd my-app
|
|
147
49
|
pnpm add @vanduo-oss/framework
|
|
148
50
|
```
|
|
149
51
|
|
|
150
|
-
Import in your entry file (e.g. `main.js`):
|
|
151
|
-
|
|
152
52
|
```js
|
|
153
53
|
import '@vanduo-oss/framework/css';
|
|
154
54
|
import { Vanduo } from '@vanduo-oss/framework';
|
|
155
|
-
Vanduo.init();
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
**Why pnpm?** pnpm enforces a strict lockfile and creates an isolated `node_modules` structure. Vanduo's `.npmrc` security policies work best with pnpm out of the box.
|
|
159
|
-
|
|
160
|
-
*(Note: `npm install @vanduo-oss/framework` and `yarn add @vanduo-oss/framework` will also work, but they do not enforce the same strict lockfile and isolated `node_modules` security guarantees.)*
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
## LLM Access
|
|
165
|
-
|
|
166
|
-
This project includes an [`llms.txt`](llms.txt) file — a structured markdown summary designed for AI assistants and LLM-powered code editors. It provides quick access to framework documentation, component references, and usage patterns.
|
|
167
55
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
## Release Assets (Maintainers)
|
|
171
|
-
|
|
172
|
-
Use the hardened upload script to attach only approved bundle artifacts from `dist/`:
|
|
173
|
-
|
|
174
|
-
```bash
|
|
175
|
-
pnpm run release:assets -- v1.3.4
|
|
56
|
+
Vanduo.init();
|
|
176
57
|
```
|
|
177
58
|
|
|
178
|
-
|
|
179
|
-
- If tag is omitted, it defaults to `v` + version from `package.json`.
|
|
180
|
-
- Use `--dry-run` to preview files without uploading.
|
|
181
|
-
|
|
182
|
-
---
|
|
183
|
-
|
|
184
|
-
## Documentation
|
|
59
|
+
## Docs and Resources
|
|
185
60
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
[
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
* **Dark Mode**: Works automatically with system preferences. Can be forced via `data-theme="dark"` on `<html>`.
|
|
193
|
-
* **Theme Switcher**: Lightweight light/dark/system toggle that can coexist with Theme Customizer.
|
|
194
|
-
* **Theme Customizer**: Built-in runtime tool to change colors, fonts, and radius.
|
|
195
|
-
* **Modular Imports**: Import only specific components (e.g., `css/components/buttons.css`) to keep your site lean.
|
|
196
|
-
* **Icons**: Includes [Phosphor Icons](https://phosphoricons.com) (Regular + Fill weights bundled).
|
|
197
|
-
|
|
198
|
-
---
|
|
61
|
+
- Website: [vanduo.dev](https://vanduo.dev)
|
|
62
|
+
- Docs: [vanduo.dev/#docs](https://vanduo.dev/#docs)
|
|
63
|
+
- npm: [@vanduo-oss/framework](https://www.npmjs.com/package/@vanduo-oss/framework)
|
|
64
|
+
- Releases: [GitHub Releases](https://github.com/vanduo-oss/framework/releases)
|
|
65
|
+
- LLM reference: [`llms.txt`](llms.txt)
|
|
199
66
|
|
|
200
67
|
## Project Structure
|
|
201
68
|
|
|
202
|
-
```
|
|
69
|
+
```text
|
|
203
70
|
vanduo-framework/
|
|
204
|
-
├── dist/
|
|
205
|
-
├── css/
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
│ └── effects/ # Visual effects
|
|
211
|
-
├── js/
|
|
212
|
-
│ ├── vanduo.js # Main entry point
|
|
213
|
-
│ └── components/ # Component logic
|
|
214
|
-
├── icons/ # Phosphor Icons
|
|
215
|
-
├── fonts/ # Web fonts
|
|
216
|
-
└── tests/ # Framework test suite
|
|
71
|
+
├── dist/ # Production bundles
|
|
72
|
+
├── css/ # Core, components, utilities, effects
|
|
73
|
+
├── js/ # Framework runtime and components
|
|
74
|
+
├── fonts/ # Bundled web fonts
|
|
75
|
+
├── icons/ # Phosphor icons bundle
|
|
76
|
+
└── tests/ # Playwright + linting
|
|
217
77
|
```
|
|
218
78
|
|
|
219
79
|
## Browser Support
|
|
@@ -225,12 +85,10 @@ vanduo-framework/
|
|
|
225
85
|
|
|
226
86
|
## License
|
|
227
87
|
|
|
228
|
-
MIT
|
|
88
|
+
MIT - see [LICENSE](LICENSE).
|
|
89
|
+
Third-party notices are listed in [THIRD-PARTY-LICENSES](THIRD-PARTY-LICENSES).
|
|
229
90
|
|
|
230
91
|
## Credits
|
|
231
92
|
|
|
232
|
-
-
|
|
233
|
-
-
|
|
234
|
-
|
|
235
|
-
---
|
|
236
|
-
Vanduo Framework - Built with ❤️ for the web.
|
|
93
|
+
- [Open Color](https://yeun.github.io/open-color/) (MIT)
|
|
94
|
+
- [Phosphor Icons](https://phosphoricons.com/) (MIT)
|
package/css/components/cards.css
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
/* Card Shadow */
|
|
25
25
|
--card-shadow: var(--shadow-sm);
|
|
26
|
-
--card-shadow-elevated: var(--shadow-
|
|
26
|
+
--card-shadow-elevated: var(--shadow-md);
|
|
27
27
|
|
|
28
28
|
/* Card Glow Effect - uses primary color scale */
|
|
29
29
|
--card-glow-color: var(--primary-2);
|
|
@@ -34,6 +34,8 @@
|
|
|
34
34
|
[data-theme="dark"] {
|
|
35
35
|
--card-bg: var(--bg-secondary);
|
|
36
36
|
--card-bg-filled: var(--bg-primary);
|
|
37
|
+
/* Stronger elevation on dark surfaces */
|
|
38
|
+
--card-shadow-elevated: var(--shadow-lg);
|
|
37
39
|
/* Glow uses lighter primary shades for dark mode visibility */
|
|
38
40
|
--card-glow-color: var(--primary-3);
|
|
39
41
|
--card-glow-border-color: var(--primary-4);
|
|
@@ -43,6 +45,7 @@
|
|
|
43
45
|
:root:not([data-theme]) {
|
|
44
46
|
--card-bg: var(--bg-secondary);
|
|
45
47
|
--card-bg-filled: var(--bg-primary);
|
|
48
|
+
--card-shadow-elevated: var(--shadow-lg);
|
|
46
49
|
/* Glow uses lighter primary shades for dark mode visibility */
|
|
47
50
|
--card-glow-color: var(--primary-3);
|
|
48
51
|
--card-glow-border-color: var(--primary-4);
|
|
@@ -75,6 +78,13 @@
|
|
|
75
78
|
.vd-card-elevated,
|
|
76
79
|
.vd-card {
|
|
77
80
|
box-shadow: var(--card-shadow-elevated);
|
|
81
|
+
transition: box-shadow 0.2s ease, transform 0.2s ease;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* Subtle lift on hover — skip links (they have their own hover) and non-elevated variants */
|
|
85
|
+
.vd-card:not(a):not(.vd-card-outlined):not(.vd-card-filled):not(.vd-card-glass):not(.vd-card-glow):hover {
|
|
86
|
+
box-shadow: var(--shadow-lg);
|
|
87
|
+
transform: translateY(-1px);
|
|
78
88
|
}
|
|
79
89
|
|
|
80
90
|
/* Card Variants - Outlined */
|
|
@@ -103,6 +103,14 @@
|
|
|
103
103
|
background: var(--dp-day-hover-bg);
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
+
/* ========== Calendar grid (weekday row + week rows) ========== */
|
|
107
|
+
|
|
108
|
+
.vd-datepicker-grid {
|
|
109
|
+
display: flex;
|
|
110
|
+
flex-direction: column;
|
|
111
|
+
gap: var(--dp-gap);
|
|
112
|
+
}
|
|
113
|
+
|
|
106
114
|
/* ========== Weekday Headers ========== */
|
|
107
115
|
|
|
108
116
|
.vd-datepicker-weekdays {
|
|
@@ -118,7 +126,8 @@
|
|
|
118
126
|
|
|
119
127
|
/* ========== Days Grid ========== */
|
|
120
128
|
|
|
121
|
-
.vd-datepicker-days
|
|
129
|
+
.vd-datepicker-days,
|
|
130
|
+
.vd-datepicker-row {
|
|
122
131
|
display: grid;
|
|
123
132
|
grid-template-columns: repeat(7, 1fr);
|
|
124
133
|
gap: var(--dp-gap);
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vanduo Framework — Expanding flex cards
|
|
3
|
+
*
|
|
4
|
+
* Adapted from MIT-licensed CodePen "Expanding flex cards" by Zed Dash:
|
|
5
|
+
* https://codepen.io/z-/pen/OBPJKK
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* <div class="vd-expanding-cards" data-vd-expanding-cards>
|
|
9
|
+
* <div class="vd-expanding-card is-active" style="--vd-expanding-card-bg: url(...)">
|
|
10
|
+
* <div class="vd-expanding-card-shadow"></div>
|
|
11
|
+
* <div class="vd-expanding-card-label">...</div>
|
|
12
|
+
* </div>
|
|
13
|
+
* </div>
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
.vd-expanding-cards {
|
|
17
|
+
display: flex;
|
|
18
|
+
flex-direction: row;
|
|
19
|
+
align-items: stretch;
|
|
20
|
+
overflow: hidden;
|
|
21
|
+
min-width: 600px;
|
|
22
|
+
max-width: 900px;
|
|
23
|
+
width: calc(100% - 100px);
|
|
24
|
+
height: 400px;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.vd-expanding-card {
|
|
28
|
+
position: relative;
|
|
29
|
+
overflow: hidden;
|
|
30
|
+
min-width: 60px;
|
|
31
|
+
margin: 10px;
|
|
32
|
+
flex-grow: 1;
|
|
33
|
+
border-radius: 30px;
|
|
34
|
+
cursor: pointer;
|
|
35
|
+
background: var(--vd-expanding-card-bg, var(--vd-expanding-card-bg-default, #e6e9ed));
|
|
36
|
+
background-size: auto 120%;
|
|
37
|
+
background-position: center;
|
|
38
|
+
transition: 0.5s cubic-bezier(0.05, 0.61, 0.41, 0.95);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.vd-expanding-card:nth-child(1) {
|
|
42
|
+
--vd-expanding-card-bg-default: #ed5565;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.vd-expanding-card:nth-child(2) {
|
|
46
|
+
--vd-expanding-card-bg-default: #fc6e51;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.vd-expanding-card:nth-child(3) {
|
|
50
|
+
--vd-expanding-card-bg-default: #ffce54;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.vd-expanding-card:nth-child(4) {
|
|
54
|
+
--vd-expanding-card-bg-default: #2ecc71;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.vd-expanding-card:nth-child(5) {
|
|
58
|
+
--vd-expanding-card-bg-default: #5d9cec;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.vd-expanding-card:nth-child(6) {
|
|
62
|
+
--vd-expanding-card-bg-default: #ac92ec;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.vd-expanding-card.is-active {
|
|
66
|
+
flex-grow: 10000;
|
|
67
|
+
transform: scale(1);
|
|
68
|
+
max-width: 600px;
|
|
69
|
+
margin: 0;
|
|
70
|
+
border-radius: 40px;
|
|
71
|
+
background-size: auto 100%;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.vd-expanding-card.is-active .vd-expanding-card-shadow {
|
|
75
|
+
box-shadow:
|
|
76
|
+
inset 0 -120px 120px -120px black,
|
|
77
|
+
inset 0 -120px 120px -100px black;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.vd-expanding-card.is-active .vd-expanding-card-label {
|
|
81
|
+
bottom: 20px;
|
|
82
|
+
left: 20px;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.vd-expanding-card.is-active .vd-expanding-card-info > div {
|
|
86
|
+
left: 0;
|
|
87
|
+
opacity: 1;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.vd-expanding-card:not(.is-active) {
|
|
91
|
+
flex-grow: 1;
|
|
92
|
+
border-radius: 30px;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.vd-expanding-card:not(.is-active) .vd-expanding-card-shadow {
|
|
96
|
+
bottom: -40px;
|
|
97
|
+
box-shadow:
|
|
98
|
+
inset 0 -120px 0 -120px black,
|
|
99
|
+
inset 0 -120px 0 -100px black;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.vd-expanding-card:not(.is-active) .vd-expanding-card-label {
|
|
103
|
+
bottom: 10px;
|
|
104
|
+
left: 10px;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.vd-expanding-card:not(.is-active) .vd-expanding-card-info > div {
|
|
108
|
+
left: 20px;
|
|
109
|
+
opacity: 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.vd-expanding-card-shadow {
|
|
113
|
+
position: absolute;
|
|
114
|
+
bottom: 0;
|
|
115
|
+
left: 0;
|
|
116
|
+
right: 0;
|
|
117
|
+
height: 120px;
|
|
118
|
+
transition: 0.5s cubic-bezier(0.05, 0.61, 0.41, 0.95);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.vd-expanding-card-label {
|
|
122
|
+
display: flex;
|
|
123
|
+
position: absolute;
|
|
124
|
+
right: 0;
|
|
125
|
+
height: 40px;
|
|
126
|
+
transition: 0.5s cubic-bezier(0.05, 0.61, 0.41, 0.95);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.vd-expanding-card-icon {
|
|
130
|
+
display: flex;
|
|
131
|
+
flex-direction: row;
|
|
132
|
+
justify-content: center;
|
|
133
|
+
align-items: center;
|
|
134
|
+
min-width: 40px;
|
|
135
|
+
max-width: 40px;
|
|
136
|
+
height: 40px;
|
|
137
|
+
border-radius: 100%;
|
|
138
|
+
background-color: #fff;
|
|
139
|
+
color: var(--vd-expanding-card-bg-default, var(--color-primary, #3b82f6));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.vd-expanding-card-info {
|
|
143
|
+
display: flex;
|
|
144
|
+
flex-direction: column;
|
|
145
|
+
justify-content: center;
|
|
146
|
+
margin-left: 10px;
|
|
147
|
+
color: #fff;
|
|
148
|
+
white-space: pre;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.vd-expanding-card-info > div {
|
|
152
|
+
position: relative;
|
|
153
|
+
transition:
|
|
154
|
+
0.5s cubic-bezier(0.05, 0.61, 0.41, 0.95),
|
|
155
|
+
opacity 0.5s ease-out;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.vd-expanding-card-title {
|
|
159
|
+
font-weight: bold;
|
|
160
|
+
font-size: 1.2rem;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.vd-expanding-card-subtitle {
|
|
164
|
+
transition-delay: 0.1s;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* Progressive hide: narrow viewports hide rightmost cards (matches original) */
|
|
168
|
+
@media screen and (max-width: 718px) {
|
|
169
|
+
.vd-expanding-cards {
|
|
170
|
+
min-width: 520px;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.vd-expanding-card:nth-child(5) {
|
|
174
|
+
display: none;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
@media screen and (max-width: 638px) {
|
|
179
|
+
.vd-expanding-cards {
|
|
180
|
+
min-width: 440px;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.vd-expanding-card:nth-child(4) {
|
|
184
|
+
display: none;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
@media screen and (max-width: 558px) {
|
|
189
|
+
.vd-expanding-cards {
|
|
190
|
+
min-width: 360px;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.vd-expanding-card:nth-child(3) {
|
|
194
|
+
display: none;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
@media screen and (max-width: 478px) {
|
|
199
|
+
.vd-expanding-cards {
|
|
200
|
+
min-width: 280px;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.vd-expanding-card:nth-child(2) {
|
|
204
|
+
display: none;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
@media (prefers-reduced-motion: reduce) {
|
|
209
|
+
.vd-expanding-card,
|
|
210
|
+
.vd-expanding-card-shadow,
|
|
211
|
+
.vd-expanding-card-label,
|
|
212
|
+
.vd-expanding-card-info > div {
|
|
213
|
+
transition: none !important;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
@@ -9,9 +9,11 @@
|
|
|
9
9
|
--spotlight-tooltip-color: var(--text-primary, #212529);
|
|
10
10
|
--spotlight-tooltip-shadow: 0 0.5rem 1.3125rem rgba(0, 0, 0, 0.15);
|
|
11
11
|
--spotlight-tooltip-padding: 1.3125rem; /* 21px - fib */
|
|
12
|
-
--spotlight-tooltip-radius: var(--border-radius, 0.5rem);
|
|
12
|
+
--spotlight-tooltip-radius: var(--card-border-radius, var(--btn-border-radius-lg, 0.5rem));
|
|
13
13
|
--spotlight-tooltip-max-width: 21rem; /* 336px - fib×16 */
|
|
14
14
|
--spotlight-highlight-padding: 0.5rem; /* 8px - fib */
|
|
15
|
+
/* Match card/modal surfaces so the cutout reads like other rounded UI (not the smaller base button token). */
|
|
16
|
+
--spotlight-target-radius: var(--card-border-radius, var(--btn-border-radius-lg, var(--btn-border-radius, 0.25rem)));
|
|
15
17
|
--spotlight-z-index: 1080;
|
|
16
18
|
}
|
|
17
19
|
|
|
@@ -87,7 +89,7 @@
|
|
|
87
89
|
.vd-spotlight-btn {
|
|
88
90
|
padding: 0.3125rem 0.8125rem; /* 5px 13px - fib */
|
|
89
91
|
border: 1px solid var(--border-color, #dee2e6);
|
|
90
|
-
border-radius: 0.25rem;
|
|
92
|
+
border-radius: var(--btn-border-radius-sm, 0.25rem);
|
|
91
93
|
background: transparent;
|
|
92
94
|
cursor: pointer;
|
|
93
95
|
font-size: 0.8125rem;
|
|
@@ -113,7 +115,10 @@
|
|
|
113
115
|
.vd-spotlight-target {
|
|
114
116
|
position: relative;
|
|
115
117
|
z-index: calc(var(--spotlight-z-index) + 1);
|
|
118
|
+
isolation: isolate;
|
|
119
|
+
overflow: visible;
|
|
120
|
+
/* box-shadow cutout follows border-radius; !important wins over consumer utilities (e.g. docs demos) */
|
|
121
|
+
border-radius: var(--spotlight-target-radius) !important;
|
|
116
122
|
box-shadow: 0 0 0 var(--spotlight-highlight-padding) rgba(13, 110, 253, 0.25),
|
|
117
123
|
0 0 0 9999px var(--spotlight-overlay-bg);
|
|
118
|
-
border-radius: 0.25rem;
|
|
119
124
|
}
|
|
@@ -199,3 +199,50 @@
|
|
|
199
199
|
right: auto;
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
|
+
|
|
203
|
+
/* ========== Animated reveal (opt-in) ========== */
|
|
204
|
+
|
|
205
|
+
.vd-timeline-animated .vd-timeline-item {
|
|
206
|
+
opacity: 0;
|
|
207
|
+
transform: translateY(12px);
|
|
208
|
+
transition:
|
|
209
|
+
opacity 0.55s ease,
|
|
210
|
+
transform 0.55s cubic-bezier(0.2, 0.8, 0.35, 1);
|
|
211
|
+
transition-delay: var(--vd-timeline-reveal-delay, 0s);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.vd-timeline-animated .vd-timeline-item .vd-timeline-marker {
|
|
215
|
+
transform: scale(0.4);
|
|
216
|
+
transform-origin: center center;
|
|
217
|
+
transition: transform 0.45s cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
218
|
+
transition-delay: calc(var(--vd-timeline-reveal-delay, 0s) + 0.12s);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.vd-timeline-animated .vd-timeline-item.is-revealed {
|
|
222
|
+
opacity: 1;
|
|
223
|
+
transform: none;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.vd-timeline-animated .vd-timeline-item.is-revealed .vd-timeline-marker {
|
|
227
|
+
transform: scale(1);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* Alternating + animated: entrance from each side (desktop only; narrow uses base vertical slide) */
|
|
231
|
+
@media (min-width: 769px) {
|
|
232
|
+
.vd-timeline-alternating.vd-timeline-animated .vd-timeline-item:nth-child(odd):not(.is-revealed) {
|
|
233
|
+
transform: translate(-12px, 12px);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.vd-timeline-alternating.vd-timeline-animated .vd-timeline-item:nth-child(even):not(.is-revealed) {
|
|
237
|
+
transform: translate(12px, 12px);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
@media (prefers-reduced-motion: reduce) {
|
|
242
|
+
.vd-timeline-animated .vd-timeline-item,
|
|
243
|
+
.vd-timeline-animated .vd-timeline-item .vd-timeline-marker {
|
|
244
|
+
opacity: 1;
|
|
245
|
+
transform: none;
|
|
246
|
+
transition: none;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
:root {
|
|
7
7
|
/* Tooltip Colors */
|
|
8
|
-
--tooltip-bg: var(--color-
|
|
9
|
-
--tooltip-bg-light: var(--color-
|
|
8
|
+
--tooltip-bg: var(--color-white);
|
|
9
|
+
--tooltip-bg-light: var(--color-gray-100);
|
|
10
10
|
--tooltip-bg-dark: var(--color-gray-900);
|
|
11
|
-
--tooltip-text-color: var(--color-
|
|
12
|
-
--tooltip-text-color-light: var(--color-gray-
|
|
11
|
+
--tooltip-text-color: var(--color-gray-900);
|
|
12
|
+
--tooltip-text-color-light: var(--color-gray-800);
|
|
13
13
|
--tooltip-text-color-dark: var(--color-white);
|
|
14
14
|
|
|
15
15
|
/* Tooltip Spacing (Fibonacci pairs: x/y ratio ~ phi) */
|
|
@@ -39,16 +39,16 @@
|
|
|
39
39
|
|
|
40
40
|
/* Dark Theme Overrides */
|
|
41
41
|
[data-theme="dark"] {
|
|
42
|
-
--tooltip-bg: var(--color-gray-
|
|
43
|
-
--tooltip-text-color: var(--color-
|
|
42
|
+
--tooltip-bg: var(--color-gray-900);
|
|
43
|
+
--tooltip-text-color: var(--color-white);
|
|
44
44
|
--tooltip-bg-light: var(--color-gray-800);
|
|
45
45
|
--tooltip-text-color-light: var(--color-gray-100);
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
@media (prefers-color-scheme: dark) {
|
|
49
49
|
:root:not([data-theme]) {
|
|
50
|
-
--tooltip-bg: var(--color-gray-
|
|
51
|
-
--tooltip-text-color: var(--color-
|
|
50
|
+
--tooltip-bg: var(--color-gray-900);
|
|
51
|
+
--tooltip-text-color: var(--color-white);
|
|
52
52
|
--tooltip-bg-light: var(--color-gray-800);
|
|
53
53
|
--tooltip-text-color-light: var(--color-gray-100);
|
|
54
54
|
}
|