@vanduo-oss/framework 1.2.6 → 1.2.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.
Files changed (52) hide show
  1. package/README.md +31 -5
  2. package/css/components/affix.css +53 -0
  3. package/css/components/bubble.css +165 -0
  4. package/css/components/datepicker.css +216 -0
  5. package/css/components/fab.css +225 -0
  6. package/css/components/flow.css +265 -0
  7. package/css/components/rating.css +112 -0
  8. package/css/components/ripple.css +63 -0
  9. package/css/components/sidenav.css +70 -0
  10. package/css/components/spotlight.css +119 -0
  11. package/css/components/stepper.css +176 -0
  12. package/css/components/suggest.css +119 -0
  13. package/css/components/timeline.css +201 -0
  14. package/css/components/timepicker.css +80 -0
  15. package/css/components/transfer.css +165 -0
  16. package/css/components/tree.css +173 -0
  17. package/css/components/waypoint.css +59 -0
  18. package/css/vanduo.css +17 -0
  19. package/dist/build-info.json +3 -3
  20. package/dist/vanduo.cjs.js +2152 -4
  21. package/dist/vanduo.cjs.js.map +4 -4
  22. package/dist/vanduo.cjs.min.js +5 -5
  23. package/dist/vanduo.cjs.min.js.map +4 -4
  24. package/dist/vanduo.css +1943 -1
  25. package/dist/vanduo.css.map +1 -1
  26. package/dist/vanduo.esm.js +2152 -4
  27. package/dist/vanduo.esm.js.map +4 -4
  28. package/dist/vanduo.esm.min.js +5 -5
  29. package/dist/vanduo.esm.min.js.map +4 -4
  30. package/dist/vanduo.js +2152 -4
  31. package/dist/vanduo.js.map +4 -4
  32. package/dist/vanduo.min.css +2 -2
  33. package/dist/vanduo.min.css.map +1 -1
  34. package/dist/vanduo.min.js +5 -5
  35. package/dist/vanduo.min.js.map +4 -4
  36. package/js/components/affix.js +129 -0
  37. package/js/components/bubble.js +203 -0
  38. package/js/components/datepicker.js +287 -0
  39. package/js/components/flow.js +264 -0
  40. package/js/components/rating.js +160 -0
  41. package/js/components/ripple.js +74 -0
  42. package/js/components/sidenav.js +9 -2
  43. package/js/components/spotlight.js +295 -0
  44. package/js/components/stepper.js +97 -0
  45. package/js/components/suggest.js +219 -0
  46. package/js/components/timepicker.js +142 -0
  47. package/js/components/transfer.js +206 -0
  48. package/js/components/tree.js +191 -0
  49. package/js/components/validate.js +185 -0
  50. package/js/components/waypoint.js +120 -0
  51. package/js/index.js +16 -0
  52. package/package.json +1 -1
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Vanduo Framework - Transfer (Dual-list)
3
+ * Source/target list transfer panel
4
+ */
5
+
6
+ :root {
7
+ --transfer-bg: var(--card-bg, #fff);
8
+ --transfer-border-color: var(--border-color, #dee2e6);
9
+ --transfer-item-hover-bg: var(--bg-secondary, #f8f9fa);
10
+ --transfer-item-selected-bg: var(--color-primary-alpha-10, rgba(13, 110, 253, 0.1));
11
+ --transfer-header-bg: var(--bg-secondary, #f8f9fa);
12
+ --transfer-padding: 0.5rem;
13
+ --transfer-list-height: 15rem;
14
+ --transfer-border-radius: var(--border-radius, 0.5rem);
15
+ --transfer-gap: 0.8125rem; /* 13px - fib */
16
+ }
17
+
18
+ [data-theme="dark"] {
19
+ --transfer-bg: var(--card-bg, #2d2d44);
20
+ --transfer-border-color: var(--border-color, #3d3d5c);
21
+ --transfer-item-hover-bg: var(--bg-primary, #1a1a2e);
22
+ --transfer-header-bg: var(--bg-primary, #1a1a2e);
23
+ }
24
+
25
+ @media (prefers-color-scheme: dark) {
26
+ :root:not([data-theme]) {
27
+ --transfer-bg: var(--card-bg, #2d2d44);
28
+ --transfer-border-color: var(--border-color, #3d3d5c);
29
+ --transfer-item-hover-bg: var(--bg-primary, #1a1a2e);
30
+ --transfer-header-bg: var(--bg-primary, #1a1a2e);
31
+ }
32
+ }
33
+
34
+ /* ========== Layout ========== */
35
+
36
+ .vd-transfer {
37
+ display: flex;
38
+ align-items: stretch;
39
+ gap: var(--transfer-gap);
40
+ }
41
+
42
+ .vd-transfer-panel {
43
+ flex: 1;
44
+ border: 1px solid var(--transfer-border-color);
45
+ border-radius: var(--transfer-border-radius);
46
+ background: var(--transfer-bg);
47
+ display: flex;
48
+ flex-direction: column;
49
+ min-width: 10rem;
50
+ }
51
+
52
+ /* ========== Panel Header ========== */
53
+
54
+ .vd-transfer-header {
55
+ display: flex;
56
+ align-items: center;
57
+ justify-content: space-between;
58
+ padding: var(--transfer-padding) 0.8125rem;
59
+ background: var(--transfer-header-bg);
60
+ border-bottom: 1px solid var(--transfer-border-color);
61
+ border-radius: var(--transfer-border-radius) var(--transfer-border-radius) 0 0;
62
+ font-size: 0.8125rem;
63
+ font-weight: 600;
64
+ }
65
+
66
+ .vd-transfer-count {
67
+ font-weight: 400;
68
+ color: var(--text-muted, #6c757d);
69
+ }
70
+
71
+ /* ========== Search ========== */
72
+
73
+ .vd-transfer-search {
74
+ padding: var(--transfer-padding);
75
+ border-bottom: 1px solid var(--transfer-border-color);
76
+ }
77
+
78
+ .vd-transfer-search input {
79
+ width: 100%;
80
+ padding: 0.3125rem 0.5rem;
81
+ border: 1px solid var(--transfer-border-color);
82
+ border-radius: 0.25rem;
83
+ font-size: 0.8125rem;
84
+ background: var(--transfer-bg);
85
+ color: var(--text-primary, #212529);
86
+ }
87
+
88
+ /* ========== List ========== */
89
+
90
+ .vd-transfer-list {
91
+ flex: 1;
92
+ overflow-y: auto;
93
+ max-height: var(--transfer-list-height);
94
+ list-style: none;
95
+ margin: 0;
96
+ padding: 0;
97
+ }
98
+
99
+ .vd-transfer-item {
100
+ display: flex;
101
+ align-items: center;
102
+ padding: 0.3125rem 0.8125rem; /* 5px 13px - fib */
103
+ cursor: pointer;
104
+ font-size: 0.875rem;
105
+ transition: background 0.15s ease;
106
+ gap: 0.5rem;
107
+ }
108
+
109
+ .vd-transfer-item:hover {
110
+ background: var(--transfer-item-hover-bg);
111
+ }
112
+
113
+ .vd-transfer-item.is-selected {
114
+ background: var(--transfer-item-selected-bg);
115
+ }
116
+
117
+ .vd-transfer-item input[type="checkbox"] {
118
+ margin: 0;
119
+ }
120
+
121
+ /* ========== Actions ========== */
122
+
123
+ .vd-transfer-actions {
124
+ display: flex;
125
+ flex-direction: column;
126
+ align-items: center;
127
+ justify-content: center;
128
+ gap: 0.3125rem; /* 5px - fib */
129
+ }
130
+
131
+ .vd-transfer-btn {
132
+ display: flex;
133
+ align-items: center;
134
+ justify-content: center;
135
+ width: 2rem;
136
+ height: 2rem;
137
+ border: 1px solid var(--transfer-border-color);
138
+ border-radius: 0.25rem;
139
+ background: var(--transfer-bg);
140
+ cursor: pointer;
141
+ font-size: 0.875rem;
142
+ transition: background 0.15s ease;
143
+ padding: 0;
144
+ }
145
+
146
+ .vd-transfer-btn:hover {
147
+ background: var(--transfer-item-hover-bg);
148
+ }
149
+
150
+ .vd-transfer-btn:disabled {
151
+ opacity: 0.4;
152
+ cursor: not-allowed;
153
+ }
154
+
155
+ /* ========== Responsive ========== */
156
+
157
+ @media (max-width: 576px) {
158
+ .vd-transfer {
159
+ flex-direction: column;
160
+ }
161
+
162
+ .vd-transfer-actions {
163
+ flex-direction: row;
164
+ }
165
+ }
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Vanduo Framework - Tree View
3
+ * Hierarchical collapsible tree structure with checkbox selection
4
+ */
5
+
6
+ :root {
7
+ --tree-indent: 1.3125rem; /* 21px - fib */
8
+ --tree-line-color: var(--border-color, #dee2e6);
9
+ --tree-line-width: 1px;
10
+ --tree-item-padding: 0.25rem 0.3125rem; /* 4px 5px */
11
+ --tree-item-hover-bg: var(--bg-secondary, #f8f9fa);
12
+ --tree-icon-size: 1rem;
13
+ --tree-toggle-size: 1.125rem;
14
+ }
15
+
16
+ [data-theme="dark"] {
17
+ --tree-line-color: var(--color-gray-600, #6c757d);
18
+ --tree-item-hover-bg: var(--bg-primary, #1a1a2e);
19
+ }
20
+
21
+ @media (prefers-color-scheme: dark) {
22
+ :root:not([data-theme]) {
23
+ --tree-line-color: var(--color-gray-600, #6c757d);
24
+ --tree-item-hover-bg: var(--bg-primary, #1a1a2e);
25
+ }
26
+ }
27
+
28
+ /* ========== Base ========== */
29
+
30
+ .vd-tree {
31
+ list-style: none;
32
+ padding: 0;
33
+ margin: 0;
34
+ }
35
+
36
+ .vd-tree .vd-tree {
37
+ padding-left: var(--tree-indent);
38
+ }
39
+
40
+ /* ========== Node ========== */
41
+
42
+ .vd-tree-node {
43
+ position: relative;
44
+ }
45
+
46
+ .vd-tree-node-content {
47
+ display: flex;
48
+ align-items: center;
49
+ gap: 0.3125rem; /* 5px - fib */
50
+ padding: var(--tree-item-padding);
51
+ border-radius: 0.25rem;
52
+ cursor: default;
53
+ font-size: 0.875rem;
54
+ transition: background 0.15s ease;
55
+ }
56
+
57
+ .vd-tree-node-content:hover {
58
+ background: var(--tree-item-hover-bg);
59
+ }
60
+
61
+ /* ========== Toggle ========== */
62
+
63
+ .vd-tree-toggle {
64
+ display: inline-flex;
65
+ align-items: center;
66
+ justify-content: center;
67
+ width: var(--tree-toggle-size);
68
+ height: var(--tree-toggle-size);
69
+ border: none;
70
+ background: none;
71
+ padding: 0;
72
+ cursor: pointer;
73
+ font-size: 0.625rem;
74
+ color: var(--text-muted, #6c757d);
75
+ transition: transform 0.2s ease;
76
+ flex-shrink: 0;
77
+ }
78
+
79
+ .vd-tree-toggle::before {
80
+ content: '\25B6'; /* right-pointing triangle */
81
+ }
82
+
83
+ .vd-tree-node.is-open > .vd-tree-node-content .vd-tree-toggle {
84
+ transform: rotate(90deg);
85
+ }
86
+
87
+ /* Placeholder for leaf nodes (no children) */
88
+ .vd-tree-toggle-placeholder {
89
+ width: var(--tree-toggle-size);
90
+ flex-shrink: 0;
91
+ }
92
+
93
+ /* ========== Checkbox ========== */
94
+
95
+ .vd-tree-checkbox {
96
+ margin: 0;
97
+ flex-shrink: 0;
98
+ }
99
+
100
+ /* ========== Icon ========== */
101
+
102
+ .vd-tree-icon {
103
+ font-size: var(--tree-icon-size);
104
+ flex-shrink: 0;
105
+ color: var(--text-muted, #6c757d);
106
+ }
107
+
108
+ .vd-tree-node.is-open > .vd-tree-node-content .vd-tree-icon-folder::before {
109
+ content: '\1F4C2'; /* open folder */
110
+ }
111
+
112
+ .vd-tree-icon-folder::before {
113
+ content: '\1F4C1'; /* closed folder */
114
+ }
115
+
116
+ .vd-tree-icon-file::before {
117
+ content: '\1F4C4'; /* file */
118
+ }
119
+
120
+ /* ========== Label ========== */
121
+
122
+ .vd-tree-label {
123
+ flex: 1;
124
+ min-width: 0;
125
+ overflow: hidden;
126
+ text-overflow: ellipsis;
127
+ white-space: nowrap;
128
+ }
129
+
130
+ .vd-tree-node.is-selected > .vd-tree-node-content .vd-tree-label {
131
+ font-weight: 600;
132
+ color: var(--color-primary, #0d6efd);
133
+ }
134
+
135
+ /* ========== Children Container ========== */
136
+
137
+ .vd-tree-children {
138
+ display: none;
139
+ list-style: none;
140
+ padding: 0;
141
+ margin: 0;
142
+ padding-left: var(--tree-indent);
143
+ }
144
+
145
+ .vd-tree-node.is-open > .vd-tree-children {
146
+ display: block;
147
+ }
148
+
149
+ /* ========== Connection Lines ========== */
150
+
151
+ .vd-tree-lines .vd-tree-children {
152
+ position: relative;
153
+ }
154
+
155
+ .vd-tree-lines .vd-tree-children::before {
156
+ content: '';
157
+ position: absolute;
158
+ top: 0;
159
+ left: calc(var(--tree-toggle-size) / 2);
160
+ bottom: 0.75rem;
161
+ width: var(--tree-line-width);
162
+ background: var(--tree-line-color);
163
+ }
164
+
165
+ .vd-tree-lines .vd-tree-children .vd-tree-node::before {
166
+ content: '';
167
+ position: absolute;
168
+ top: 50%;
169
+ left: calc(var(--tree-toggle-size) / 2 - var(--tree-indent));
170
+ width: 0.5rem;
171
+ height: var(--tree-line-width);
172
+ background: var(--tree-line-color);
173
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Vanduo Framework - Waypoint (Scrollspy)
3
+ * Scroll-position-aware navigation highlighting
4
+ * Primary: .vd-waypoint | Alias: .vd-scrollspy
5
+ */
6
+
7
+ :root {
8
+ /* Waypoint active indicator */
9
+ --waypoint-active-color: var(--color-primary, #0d6efd);
10
+ --waypoint-active-bg: transparent;
11
+ --waypoint-active-border-width: 2px;
12
+ --waypoint-transition: color 0.2s ease, background-color 0.2s ease, border-color 0.2s ease;
13
+ }
14
+
15
+ [data-theme="dark"] {
16
+ --waypoint-active-color: var(--color-primary-light, #6ea8fe);
17
+ }
18
+
19
+ @media (prefers-color-scheme: dark) {
20
+ :root:not([data-theme]) {
21
+ --waypoint-active-color: var(--color-primary-light, #6ea8fe);
22
+ }
23
+ }
24
+
25
+ /* ========== Nav Link Active State ========== */
26
+
27
+ [data-vd-waypoint-nav] a.is-active,
28
+ [data-vd-scrollspy-nav] a.is-active,
29
+ .vd-waypoint-nav a.is-active {
30
+ color: var(--waypoint-active-color);
31
+ font-weight: 600;
32
+ transition: var(--waypoint-transition);
33
+ }
34
+
35
+ /* Sidebar variant: left border indicator */
36
+ .vd-sidenav [data-vd-waypoint-nav] a.is-active,
37
+ .vd-waypoint-nav.vd-waypoint-border a.is-active {
38
+ border-left: var(--waypoint-active-border-width) solid var(--waypoint-active-color);
39
+ padding-left: calc(0.8125rem - var(--waypoint-active-border-width)); /* 13px - border */
40
+ }
41
+
42
+ /* Pill variant */
43
+ .vd-waypoint-nav.vd-waypoint-pill a.is-active {
44
+ background-color: var(--waypoint-active-color);
45
+ color: #fff;
46
+ border-radius: 1rem;
47
+ padding: 0.25rem 0.8125rem; /* 4px 13px */
48
+ }
49
+
50
+ /* Underline variant (for horizontal navs) */
51
+ .vd-waypoint-nav.vd-waypoint-underline a.is-active {
52
+ border-bottom: var(--waypoint-active-border-width) solid var(--waypoint-active-color);
53
+ }
54
+
55
+ /* ========== Smooth Scroll Target ========== */
56
+
57
+ [data-vd-waypoint-section] {
58
+ scroll-margin-top: 5rem; /* offset for fixed headers */
59
+ }
package/css/vanduo.css CHANGED
@@ -79,5 +79,22 @@
79
79
  /* Components - Phase 9 (New) */
80
80
  @import url('components/draggable.css');
81
81
 
82
+ /* Components - Phase 10 (v1.2.7) */
83
+ @import url('components/flow.css');
84
+ @import url('components/bubble.css');
85
+ @import url('components/waypoint.css');
86
+ @import url('components/ripple.css');
87
+ @import url('components/fab.css');
88
+ @import url('components/affix.css');
89
+ @import url('components/suggest.css');
90
+ @import url('components/datepicker.css');
91
+ @import url('components/timepicker.css');
92
+ @import url('components/stepper.css');
93
+ @import url('components/timeline.css');
94
+ @import url('components/rating.css');
95
+ @import url('components/transfer.css');
96
+ @import url('components/tree.css');
97
+ @import url('components/spotlight.css');
98
+
82
99
  /* Print Styles */
83
100
  @import url('utilities/print.css');
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.2.6",
3
- "builtAt": "2026-03-11T06:15:19.191Z",
4
- "commit": "3283a0d",
2
+ "version": "1.2.7",
3
+ "builtAt": "2026-03-12T16:17:38.253Z",
4
+ "commit": "2c1277a",
5
5
  "mode": "development+production"
6
6
  }