@getvitops/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +29 -0
  2. package/css/animation.css +526 -0
  3. package/css/global.css +17 -0
  4. package/css/index.css +58 -0
  5. package/css/layout.css +723 -0
  6. package/css/patterns/anchor-link.css +66 -0
  7. package/css/patterns/banner.css +64 -0
  8. package/css/patterns/carousel.css +269 -0
  9. package/css/patterns/cluster.css +64 -0
  10. package/css/patterns/code.css +17 -0
  11. package/css/patterns/combobox.css +97 -0
  12. package/css/patterns/comment.css +88 -0
  13. package/css/patterns/copy.css +82 -0
  14. package/css/patterns/details.css +87 -0
  15. package/css/patterns/dialog.css +99 -0
  16. package/css/patterns/drawer.css +108 -0
  17. package/css/patterns/dropdown.css +45 -0
  18. package/css/patterns/forms.css +335 -0
  19. package/css/patterns/grouped.css +86 -0
  20. package/css/patterns/horizontal-scroll.css +40 -0
  21. package/css/patterns/icon.css +72 -0
  22. package/css/patterns/lightbox.css +156 -0
  23. package/css/patterns/list.css +272 -0
  24. package/css/patterns/marquee.css +68 -0
  25. package/css/patterns/masonry.css +40 -0
  26. package/css/patterns/media.css +70 -0
  27. package/css/patterns/nav.css +241 -0
  28. package/css/patterns/notification.css +114 -0
  29. package/css/patterns/overlay.css +28 -0
  30. package/css/patterns/popover.css +68 -0
  31. package/css/patterns/pull-quote.css +71 -0
  32. package/css/patterns/scroll-based.css +227 -0
  33. package/css/patterns/scroll-target.css +124 -0
  34. package/css/patterns/separator.css +130 -0
  35. package/css/patterns/sitenav.css +582 -0
  36. package/css/patterns/split-link.css +113 -0
  37. package/css/patterns/splitter.css +212 -0
  38. package/css/patterns/stack.css +67 -0
  39. package/css/patterns/sticky.css +127 -0
  40. package/css/patterns/subgrid.css +178 -0
  41. package/css/patterns/svg.css +166 -0
  42. package/css/patterns/table.css +106 -0
  43. package/css/patterns/tag.css +75 -0
  44. package/css/patterns/text-effects.css +317 -0
  45. package/css/patterns/tooltip.css +68 -0
  46. package/css/patterns/tree.css +126 -0
  47. package/css/utilities.css +351 -0
  48. package/dist/deferred.js +1 -0
  49. package/dist/elements.js +887 -0
  50. package/dist/polyfills/adoptedStyleSheets.js +1 -0
  51. package/dist/polyfills/css-anchor-positioning-fn.js +17 -0
  52. package/dist/polyfills/global.esm.js +1 -0
  53. package/dist/polyfills/popover.js +63 -0
  54. package/dist/polyfills/template-shadowroot.js +24 -0
  55. package/dist/polyfills/webcomponents-bundle.js +27 -0
  56. package/dist/polyfills.js +1 -0
  57. package/package.json +33 -0
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Notification — pattern partial migrated from old-css-lib.
3
+ * Consumes the generated token cascade (src/css/generated/tokens.css).
4
+ */
5
+
6
+ /* ── Notification — toast with entry/exit + auto-dismiss progress bar ──────── */
7
+ .notification {
8
+ --_p: var(--p-notification, var(--p-notification-group, var(--p-default)));
9
+ --_br: var(--br-notification, var(--br-notification-group, var(--br-default)));
10
+ --_ds: var(--ds-notification, var(--ds-notification-group, var(--ds-default)));
11
+ --_b: var(--b-notification, var(--b-notification-group, var(--b-default)));
12
+
13
+ position: relative;
14
+ display: flex;
15
+ align-items: flex-start;
16
+ gap: 0.75rem;
17
+ padding: var(--_p);
18
+ border: var(--_b);
19
+ border-radius: var(--_br);
20
+ box-shadow: var(--_ds);
21
+ background: var(--color-surface-xxl);
22
+ color: var(--color-surface-xxd);
23
+ animation: notification-enter 0.3s ease;
24
+
25
+ &.notification--exiting {
26
+ animation: notification-exit 0.2s ease forwards;
27
+
28
+ @media (prefers-reduced-motion: reduce) {
29
+ opacity: 0;
30
+ }
31
+ }
32
+
33
+ .notification__icon {
34
+ flex-shrink: 0;
35
+ inline-size: 1.25rem;
36
+ block-size: 1.25rem;
37
+ }
38
+
39
+ .notification__content {
40
+ flex: 1;
41
+ min-inline-size: 0;
42
+ }
43
+
44
+ .notification__title {
45
+ font-weight: 600;
46
+ margin: 0 0 0.25em;
47
+ }
48
+
49
+ .notification__message {
50
+ margin: 0;
51
+ font-size: 0.875em;
52
+ }
53
+
54
+ .notification__actions {
55
+ display: flex;
56
+ gap: 0.5rem;
57
+ margin-block-start: 0.5rem;
58
+ }
59
+
60
+ .notification__close {
61
+ flex-shrink: 0;
62
+ align-self: flex-start;
63
+ padding: 0.25rem;
64
+ background: transparent;
65
+ border: none;
66
+ cursor: pointer;
67
+ opacity: 0.5;
68
+ transition: opacity 0.15s ease;
69
+
70
+ &:hover {
71
+ opacity: 1;
72
+ }
73
+ }
74
+
75
+ .notification__progress {
76
+ position: absolute;
77
+ inset-block-end: 0;
78
+ inset-inline: 0;
79
+ block-size: 3px;
80
+ background: var(--color-brand-primary);
81
+ border-radius: 0 0 var(--_br) var(--_br);
82
+ transform-origin: left;
83
+ animation: notification-progress var(--notification-duration, 5s) linear forwards;
84
+ }
85
+ }
86
+
87
+ @keyframes notification-enter {
88
+ from {
89
+ opacity: 0;
90
+ translate: 1rem 0;
91
+ }
92
+ to {
93
+ opacity: 1;
94
+ translate: 0 0;
95
+ }
96
+ }
97
+ @keyframes notification-exit {
98
+ from {
99
+ opacity: 1;
100
+ translate: 0 0;
101
+ }
102
+ to {
103
+ opacity: 0;
104
+ translate: 1rem 0;
105
+ }
106
+ }
107
+ @keyframes notification-progress {
108
+ from {
109
+ scale: 1 1;
110
+ }
111
+ to {
112
+ scale: 0 1;
113
+ }
114
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Overlay — decorative tint/filter layer that sits behind sibling content.
3
+ * Not one of the interactive overlay-family patterns (dialog/drawer/popover/
4
+ * tooltip/dropdown/notification/lightbox); this is a z-index:-1 backdrop tint.
5
+ * Ported from old-css-lib. Colour via --overlay, filter via --overlay-filter.
6
+ */
7
+
8
+ .overlay {
9
+ position: absolute;
10
+ inset: 0;
11
+ isolation: isolate;
12
+ z-index: -1;
13
+ inline-size: 100%;
14
+
15
+ > * {
16
+ inline-size: 100%;
17
+ block-size: 100%;
18
+ }
19
+
20
+ &::before {
21
+ content: '';
22
+ position: absolute;
23
+ inset: 0;
24
+ background: var(--overlay, transparent);
25
+ filter: var(--overlay-filter, none);
26
+ pointer-events: none;
27
+ }
28
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Popover — pattern partial migrated from old-css-lib.
3
+ * Consumes the generated token cascade (src/css/generated/tokens.css).
4
+ */
5
+
6
+ /* ── Popover — native Popover API reset + anchored position variants ───────── */
7
+ [popover] {
8
+ padding: 0;
9
+ border: none;
10
+ background: transparent;
11
+ color: inherit;
12
+ overflow: visible;
13
+ inset: auto;
14
+
15
+ &:popover-open {
16
+ opacity: 1;
17
+ }
18
+
19
+ &:not(:popover-open):not([open]) {
20
+ display: none;
21
+ }
22
+
23
+ @starting-style {
24
+ &:popover-open {
25
+ opacity: 0;
26
+ }
27
+ }
28
+ }
29
+
30
+ .popover-anchor {
31
+ anchor-name: --popover-anchor;
32
+ position: relative;
33
+
34
+ [popover] {
35
+ position: absolute;
36
+ position-anchor: --popover-anchor;
37
+ inset: auto;
38
+ }
39
+
40
+ [popover].popover--top {
41
+ position-area: block-start center;
42
+ margin-block-end: 0.5rem;
43
+ }
44
+ [popover].popover--bottom {
45
+ position-area: block-end center;
46
+ margin-block-start: 0.5rem;
47
+ }
48
+ [popover].popover--left {
49
+ position-area: center inline-start;
50
+ margin-inline-end: 0.5rem;
51
+ }
52
+ [popover].popover--right {
53
+ position-area: center inline-end;
54
+ margin-inline-start: 0.5rem;
55
+ }
56
+ [popover].popover--top-start {
57
+ position-area: block-start span-inline-end;
58
+ }
59
+ [popover].popover--top-end {
60
+ position-area: block-start span-inline-start;
61
+ }
62
+ [popover].popover--bottom-start {
63
+ position-area: block-end span-inline-end;
64
+ }
65
+ [popover].popover--bottom-end {
66
+ position-area: block-end span-inline-start;
67
+ }
68
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Pull Quote — pattern partial migrated from old-css-lib.
3
+ * Consumes the generated token cascade (src/css/generated/tokens.css).
4
+ */
5
+
6
+ /* ── Pull quote — highlighted inline quote (not a blockquote) ─────────────── */
7
+ .pull-quote {
8
+ --_fs: var(--fs-pull-quote, var(--fs-pull-quote-group, var(--fs-default)));
9
+ --_p: var(--p-pull-quote, var(--p-pull-quote-group, var(--p-default)));
10
+ --_br: var(--br-pull-quote, var(--br-pull-quote-group, var(--br-default)));
11
+ --_b: var(--b-pull-quote, var(--b-pull-quote-group, var(--b-default)));
12
+ --_ds: var(--ds-pull-quote, var(--ds-pull-quote-group, var(--ds-default)));
13
+
14
+ position: relative;
15
+ padding: var(--_p);
16
+ font-size: var(--_fs);
17
+ line-height: 1.4;
18
+ border: var(--_b);
19
+ border-radius: var(--_br);
20
+ box-shadow: var(--_ds);
21
+ font-style: italic;
22
+
23
+ &::before {
24
+ content: '\201C';
25
+ position: absolute;
26
+ inset-block-start: 0;
27
+ inset-inline-start: 0;
28
+ font-size: 4em;
29
+ line-height: 1;
30
+ opacity: 0.3;
31
+ font-style: normal;
32
+ font-family: Georgia, serif;
33
+ }
34
+
35
+ .pull-quote__attribution {
36
+ display: block;
37
+ margin-block-start: 1rem;
38
+ font-size: 0.875rem;
39
+ font-style: normal;
40
+ opacity: 0.7;
41
+
42
+ &::before {
43
+ content: '— ';
44
+ }
45
+ }
46
+
47
+ &.pull-quote--border {
48
+ border-inline-start: 4px solid currentColor;
49
+ padding-inline-start: 1.5rem;
50
+
51
+ &::before {
52
+ display: none;
53
+ }
54
+ }
55
+ }
56
+
57
+ figure.pull-quote-figure {
58
+ .pull-quote {
59
+ margin: 0;
60
+ }
61
+
62
+ figcaption {
63
+ font-size: 0.875rem;
64
+ opacity: 0.7;
65
+ margin-block-start: 0.75rem;
66
+
67
+ &::before {
68
+ content: '— ';
69
+ }
70
+ }
71
+ }
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Scroll Based — pattern partial migrated from old-css-lib.
3
+ * Consumes the generated token cascade (src/css/generated/tokens.css).
4
+ */
5
+
6
+ /* ── Scroll snap ──────────────────────────────────────────────────────────── */
7
+ .scroll-snap {
8
+ --_snap-type: var(--snap-type, both mandatory);
9
+ --_snap-padding: var(--snap-padding, 0);
10
+
11
+ overflow: auto;
12
+ scroll-snap-type: var(--_snap-type);
13
+ scroll-padding: var(--_snap-padding);
14
+ overscroll-behavior: contain;
15
+
16
+ &.scroll-snap--x {
17
+ --_snap-type: x mandatory;
18
+ overflow-x: auto;
19
+ overflow-y: hidden;
20
+ display: flex;
21
+ flex-wrap: nowrap;
22
+ }
23
+
24
+ &.scroll-snap--y {
25
+ --_snap-type: y mandatory;
26
+ overflow-x: hidden;
27
+ overflow-y: auto;
28
+ }
29
+
30
+ &.scroll-snap--proximity {
31
+ --_snap-type: both proximity;
32
+ }
33
+
34
+ > * {
35
+ scroll-snap-align: var(--snap-align, start);
36
+ scroll-snap-stop: var(--snap-stop, normal);
37
+ }
38
+
39
+ &.scroll-snap--center > * {
40
+ scroll-snap-align: center;
41
+ }
42
+ &.scroll-snap--end > * {
43
+ scroll-snap-align: end;
44
+ }
45
+ &.scroll-snap--always > * {
46
+ scroll-snap-stop: always;
47
+ }
48
+
49
+ &.scroll-snap--hide-scrollbar {
50
+ scrollbar-width: none;
51
+
52
+ &::-webkit-scrollbar {
53
+ display: none;
54
+ }
55
+ }
56
+ }
57
+
58
+ /* ── Scroll spy — highlight nav via scroll-state() ────────────────────────── */
59
+ .scroll-spy {
60
+ container-type: scroll-state;
61
+
62
+ .scroll-spy__section {
63
+ container-type: scroll-state;
64
+ }
65
+
66
+ @container scroll-state(snapped: block) {
67
+ .scroll-spy__link[data-active] {
68
+ color: var(--scroll-spy-active-color, currentColor);
69
+ font-weight: 600;
70
+ }
71
+ }
72
+ }
73
+
74
+ /* ── Parallax — scroll-driven layer offset ────────────────────────────────── */
75
+ .parallax {
76
+ --_parallax-speed: var(--parallax-speed, 0.5);
77
+
78
+ overflow: hidden;
79
+ position: relative;
80
+
81
+ .parallax__layer {
82
+ position: absolute;
83
+ inset: calc(-50% * var(--_parallax-speed)) 0;
84
+ animation: parallax-scroll linear;
85
+ animation-timeline: scroll(root);
86
+
87
+ @media (prefers-reduced-motion: reduce) {
88
+ inset: 0;
89
+ animation: none;
90
+ }
91
+ }
92
+
93
+ .parallax__layer > img {
94
+ inline-size: 100%;
95
+ block-size: 100%;
96
+ object-fit: cover;
97
+ }
98
+
99
+ .parallax__content {
100
+ position: relative;
101
+ z-index: 1;
102
+ }
103
+ }
104
+
105
+ @keyframes parallax-scroll {
106
+ from {
107
+ translate: 0 calc(-25% * var(--_parallax-speed, 0.5));
108
+ }
109
+ to {
110
+ translate: 0 calc(25% * var(--_parallax-speed, 0.5));
111
+ }
112
+ }
113
+
114
+ /* ── Scroll progress bar ──────────────────────────────────────────────────── */
115
+ .scroll-progress {
116
+ --_progress-height: var(--scroll-progress-height, 3px);
117
+
118
+ position: fixed;
119
+ inset-block-start: 0;
120
+ inset-inline: 0;
121
+ block-size: var(--_progress-height);
122
+ z-index: var(--z-tier-top);
123
+
124
+ .scroll-progress__bar {
125
+ block-size: 100%;
126
+ background: var(--scroll-progress-color, var(--color-brand-primary));
127
+ transform-origin: left;
128
+ animation: scroll-progress-grow linear;
129
+ animation-timeline: scroll(root);
130
+ }
131
+ }
132
+
133
+ @keyframes scroll-progress-grow {
134
+ from {
135
+ scale: 0 1;
136
+ }
137
+ to {
138
+ scale: 1 1;
139
+ }
140
+ }
141
+
142
+ /* ── Scroll reveal — view()-driven entrance ───────────────────────────────── */
143
+ .scroll-reveal {
144
+ animation: scroll-reveal linear both;
145
+ animation-timeline: view();
146
+ animation-range: entry 0% cover 40%;
147
+
148
+ @media (prefers-reduced-motion: reduce) {
149
+ animation: none;
150
+ opacity: 1;
151
+ }
152
+
153
+ &.scroll-reveal--up {
154
+ animation-name: scroll-reveal-up;
155
+ }
156
+ &.scroll-reveal--down {
157
+ animation-name: scroll-reveal-down;
158
+ }
159
+ &.scroll-reveal--left {
160
+ animation-name: scroll-reveal-left;
161
+ }
162
+ &.scroll-reveal--right {
163
+ animation-name: scroll-reveal-right;
164
+ }
165
+ &.scroll-reveal--scale {
166
+ animation-name: scroll-reveal-scale;
167
+ }
168
+ }
169
+
170
+ @keyframes scroll-reveal {
171
+ from {
172
+ opacity: 0;
173
+ }
174
+ to {
175
+ opacity: 1;
176
+ }
177
+ }
178
+ @keyframes scroll-reveal-up {
179
+ from {
180
+ opacity: 0;
181
+ translate: 0 2rem;
182
+ }
183
+ to {
184
+ opacity: 1;
185
+ translate: 0 0;
186
+ }
187
+ }
188
+ @keyframes scroll-reveal-down {
189
+ from {
190
+ opacity: 0;
191
+ translate: 0 -2rem;
192
+ }
193
+ to {
194
+ opacity: 1;
195
+ translate: 0 0;
196
+ }
197
+ }
198
+ @keyframes scroll-reveal-left {
199
+ from {
200
+ opacity: 0;
201
+ translate: -2rem 0;
202
+ }
203
+ to {
204
+ opacity: 1;
205
+ translate: 0 0;
206
+ }
207
+ }
208
+ @keyframes scroll-reveal-right {
209
+ from {
210
+ opacity: 0;
211
+ translate: 2rem 0;
212
+ }
213
+ to {
214
+ opacity: 1;
215
+ translate: 0 0;
216
+ }
217
+ }
218
+ @keyframes scroll-reveal-scale {
219
+ from {
220
+ opacity: 0;
221
+ scale: 0.9;
222
+ }
223
+ to {
224
+ opacity: 1;
225
+ scale: 1;
226
+ }
227
+ }
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Scroll Target — pattern partial migrated from old-css-lib.
3
+ * Consumes the generated token cascade (src/css/generated/tokens.css).
4
+ */
5
+
6
+ /* ── Scroll-target group — :target-current scroll-spy + TOC layout ────────── */
7
+ .scroll-target-group {
8
+ scroll-target-group: auto;
9
+ }
10
+
11
+ .scroll-target-group a {
12
+ transition: var(--scroll-target-transition, color 0.3s ease, background-color 0.3s ease);
13
+ text-decoration: none;
14
+ color: var(--scroll-target-inactive-color, currentColor);
15
+ }
16
+
17
+ /* `.is-current` mirrors `:target-current` for the JS scroll-spy fallback
18
+ (deferred.ts) on engines without `scroll-target-group` support. */
19
+ .scroll-target-group a:target-current,
20
+ .scroll-target-group a.is-current {
21
+ color: var(--scroll-target-active-color, var(--color-brand-primary));
22
+ }
23
+
24
+ .scroll-target-group--indicator a {
25
+ position: relative;
26
+ padding-inline-start: calc(var(--scroll-target-indicator-size, 3px) * 3);
27
+ }
28
+
29
+ .scroll-target-group--indicator a::before,
30
+ .scroll-target-group--bar a::before {
31
+ content: '';
32
+ position: absolute;
33
+ inset-inline-start: 0;
34
+ background-color: transparent;
35
+ transition: var(--scroll-target-transition, color 0.3s ease, background-color 0.3s ease);
36
+ }
37
+
38
+ .scroll-target-group--indicator a::before {
39
+ top: 50%;
40
+ transform: translateY(-50%);
41
+ width: var(--scroll-target-indicator-size, 3px);
42
+ height: var(--scroll-target-indicator-size, 3px);
43
+ border-radius: 50%;
44
+ }
45
+
46
+ .scroll-target-group--indicator a:target-current::before,
47
+ .scroll-target-group--bar a:target-current::before,
48
+ .scroll-target-group--indicator a.is-current::before,
49
+ .scroll-target-group--bar a.is-current::before {
50
+ background-color: var(--scroll-target-active-color, var(--color-brand-primary));
51
+ }
52
+
53
+ .scroll-target-group--bar a {
54
+ position: relative;
55
+ padding-inline-start: calc(var(--scroll-target-indicator-size, 3px) + 0.75rem);
56
+ }
57
+
58
+ .scroll-target-group--bar a::before {
59
+ top: 0;
60
+ bottom: 0;
61
+ width: var(--scroll-target-indicator-size, 3px);
62
+ }
63
+
64
+ @supports not (scroll-target-group: auto) {
65
+ .scroll-target-group--hide-unsupported {
66
+ display: none;
67
+ }
68
+ }
69
+
70
+ .toc-layout {
71
+ display: grid;
72
+ grid-template-columns: 1fr;
73
+
74
+ @container body (inline-size >= 64rem) {
75
+ grid-template-columns: 16rem 1fr;
76
+ gap: var(--gutter, 2rem);
77
+ }
78
+ }
79
+
80
+ .toc-sidebar {
81
+ display: none;
82
+
83
+ @container body (inline-size >= 64rem) {
84
+ display: block;
85
+ position: sticky;
86
+ top: calc(var(--top-offset, 0px) + var(--sticky-offset, 1rem));
87
+ height: fit-content;
88
+ max-height: calc(100svh - calc(var(--top-offset, 0px) + var(--sticky-offset, 1rem)) * 2);
89
+ overflow-y: auto;
90
+ padding-block: 1rem;
91
+ }
92
+ }
93
+
94
+ .toc-sidebar nav {
95
+ display: flex;
96
+ flex-direction: column;
97
+ gap: 0.25rem;
98
+ }
99
+
100
+ .toc-sidebar a {
101
+ display: block;
102
+ padding: 0.375rem 0.75rem;
103
+ border-radius: 0.25rem;
104
+ font-size: 0.875rem;
105
+ transition: var(--scroll-target-transition, color 0.3s ease, background-color 0.3s ease);
106
+ }
107
+
108
+ .toc-sidebar a:target-current,
109
+ .toc-sidebar a.is-current {
110
+ color: var(--scroll-target-active-color, var(--color-brand-primary));
111
+ font-weight: 500;
112
+ }
113
+
114
+ .toc-inline {
115
+ position: sticky;
116
+ top: var(--top-offset, 0);
117
+ z-index: var(--z-tier-sticky);
118
+ overflow-x: auto;
119
+ overscroll-behavior-x: contain;
120
+
121
+ @container body (inline-size >= 64rem) {
122
+ display: none;
123
+ }
124
+ }