@openvoxproject/voxblocks 0.9.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 (97) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +66 -0
  3. package/dist/cdn/voxblocks.css +1 -0
  4. package/dist/cdn/voxblocks.js +5057 -0
  5. package/dist/types/components/accordion/vox-accordion.d.ts +32 -0
  6. package/dist/types/components/alert/vox-alert.d.ts +23 -0
  7. package/dist/types/components/avatar/vox-avatar.d.ts +18 -0
  8. package/dist/types/components/badge/vox-badge.d.ts +17 -0
  9. package/dist/types/components/billboard/vox-billboard.d.ts +22 -0
  10. package/dist/types/components/breadcrumbs/vox-breadcrumbs.d.ts +24 -0
  11. package/dist/types/components/button/vox-button.d.ts +24 -0
  12. package/dist/types/components/calendar-tile/vox-calendar-tile.d.ts +18 -0
  13. package/dist/types/components/callout/vox-callout.d.ts +20 -0
  14. package/dist/types/components/card/vox-card.d.ts +28 -0
  15. package/dist/types/components/checkbox/vox-checkbox.d.ts +20 -0
  16. package/dist/types/components/cta/vox-cta.d.ts +17 -0
  17. package/dist/types/components/cta-band/vox-cta-band.d.ts +22 -0
  18. package/dist/types/components/dialog/vox-dialog.d.ts +30 -0
  19. package/dist/types/components/disclosure/vox-disclosure.d.ts +19 -0
  20. package/dist/types/components/dropdown/vox-dropdown.d.ts +29 -0
  21. package/dist/types/components/empty-state/vox-empty-state.d.ts +18 -0
  22. package/dist/types/components/file-input/vox-file-input.d.ts +22 -0
  23. package/dist/types/components/footer/vox-footer.d.ts +28 -0
  24. package/dist/types/components/grid/vox-grid.d.ts +22 -0
  25. package/dist/types/components/header/vox-header.d.ts +23 -0
  26. package/dist/types/components/hero/vox-hero.d.ts +21 -0
  27. package/dist/types/components/input/vox-input.d.ts +24 -0
  28. package/dist/types/components/input-group/vox-input-group.d.ts +25 -0
  29. package/dist/types/components/link-hub/vox-link-hub.d.ts +27 -0
  30. package/dist/types/components/loader/vox-loader.d.ts +16 -0
  31. package/dist/types/components/pagination/vox-pagination.d.ts +25 -0
  32. package/dist/types/components/quote/vox-quote.d.ts +18 -0
  33. package/dist/types/components/radio/vox-radio-group.d.ts +23 -0
  34. package/dist/types/components/radio/vox-radio.d.ts +21 -0
  35. package/dist/types/components/select/vox-select.d.ts +27 -0
  36. package/dist/types/components/series-nav/vox-series-nav.d.ts +18 -0
  37. package/dist/types/components/sidenav/vox-sidenav.d.ts +50 -0
  38. package/dist/types/components/sponsor/vox-sponsor.d.ts +35 -0
  39. package/dist/types/components/stat/vox-stat.d.ts +17 -0
  40. package/dist/types/components/step-indicator/vox-step-indicator.d.ts +28 -0
  41. package/dist/types/components/subnav/vox-subnav.d.ts +18 -0
  42. package/dist/types/components/switch/vox-switch.d.ts +20 -0
  43. package/dist/types/components/tabs/vox-tabs.d.ts +57 -0
  44. package/dist/types/components/textarea/vox-textarea.d.ts +22 -0
  45. package/dist/types/components/theme-toggle/vox-theme-toggle.d.ts +35 -0
  46. package/dist/types/components/timeline/vox-timeline.d.ts +27 -0
  47. package/dist/types/index.d.ts +51 -0
  48. package/dist/types/internal/field.d.ts +27 -0
  49. package/dist/voxblocks.css +1 -0
  50. package/dist/voxblocks.js +4350 -0
  51. package/package.json +59 -0
  52. package/src/components/accordion/vox-accordion.ts +150 -0
  53. package/src/components/alert/vox-alert.ts +155 -0
  54. package/src/components/avatar/vox-avatar.ts +80 -0
  55. package/src/components/badge/vox-badge.ts +67 -0
  56. package/src/components/billboard/vox-billboard.ts +109 -0
  57. package/src/components/breadcrumbs/vox-breadcrumbs.ts +68 -0
  58. package/src/components/button/vox-button.ts +165 -0
  59. package/src/components/calendar-tile/vox-calendar-tile.ts +74 -0
  60. package/src/components/callout/vox-callout.ts +97 -0
  61. package/src/components/card/vox-card.ts +147 -0
  62. package/src/components/checkbox/vox-checkbox.ts +101 -0
  63. package/src/components/cta/vox-cta.ts +69 -0
  64. package/src/components/cta-band/vox-cta-band.ts +105 -0
  65. package/src/components/dialog/vox-dialog.ts +176 -0
  66. package/src/components/disclosure/vox-disclosure.ts +98 -0
  67. package/src/components/dropdown/vox-dropdown.ts +186 -0
  68. package/src/components/empty-state/vox-empty-state.ts +76 -0
  69. package/src/components/file-input/vox-file-input.ts +127 -0
  70. package/src/components/footer/vox-footer.ts +109 -0
  71. package/src/components/grid/vox-grid.ts +54 -0
  72. package/src/components/header/vox-header.ts +109 -0
  73. package/src/components/hero/vox-hero.ts +100 -0
  74. package/src/components/input/vox-input.ts +72 -0
  75. package/src/components/input-group/vox-input-group.ts +85 -0
  76. package/src/components/link-hub/vox-link-hub.ts +108 -0
  77. package/src/components/loader/vox-loader.ts +82 -0
  78. package/src/components/pagination/vox-pagination.ts +76 -0
  79. package/src/components/quote/vox-quote.ts +82 -0
  80. package/src/components/radio/vox-radio-group.ts +117 -0
  81. package/src/components/radio/vox-radio.ts +102 -0
  82. package/src/components/select/vox-select.ts +89 -0
  83. package/src/components/series-nav/vox-series-nav.ts +94 -0
  84. package/src/components/sidenav/vox-sidenav.ts +192 -0
  85. package/src/components/sponsor/vox-sponsor.ts +187 -0
  86. package/src/components/stat/vox-stat.ts +55 -0
  87. package/src/components/step-indicator/vox-step-indicator.ts +152 -0
  88. package/src/components/subnav/vox-subnav.ts +64 -0
  89. package/src/components/switch/vox-switch.ts +90 -0
  90. package/src/components/tabs/vox-tabs.ts +201 -0
  91. package/src/components/textarea/vox-textarea.ts +75 -0
  92. package/src/components/theme-toggle/vox-theme-toggle.ts +164 -0
  93. package/src/components/timeline/vox-timeline.ts +100 -0
  94. package/src/index.ts +65 -0
  95. package/src/internal/field.ts +165 -0
  96. package/src/styles/utilities.css +409 -0
  97. package/src/tokens/tokens.css +161 -0
package/src/index.ts ADDED
@@ -0,0 +1,65 @@
1
+ import './tokens/tokens.css';
2
+ import './styles/utilities.css';
3
+
4
+ // Actions
5
+ export { VoxButton } from './components/button/vox-button.js';
6
+ export { VoxCta } from './components/cta/vox-cta.js';
7
+ export { VoxThemeToggle } from './components/theme-toggle/vox-theme-toggle.js';
8
+
9
+ // Forms
10
+ export { VoxCheckbox } from './components/checkbox/vox-checkbox.js';
11
+ export { VoxFileInput } from './components/file-input/vox-file-input.js';
12
+ export { VoxInput } from './components/input/vox-input.js';
13
+ export { VoxInputGroup } from './components/input-group/vox-input-group.js';
14
+ export { VoxRadio } from './components/radio/vox-radio.js';
15
+ export { VoxRadioGroup } from './components/radio/vox-radio-group.js';
16
+ export { VoxSelect } from './components/select/vox-select.js';
17
+ export { VoxSwitch } from './components/switch/vox-switch.js';
18
+ export { VoxTextarea } from './components/textarea/vox-textarea.js';
19
+
20
+ // Images
21
+ export { VoxAvatar } from './components/avatar/vox-avatar.js';
22
+ export { VoxBillboard } from './components/billboard/vox-billboard.js';
23
+
24
+ // Navigation
25
+ export { VoxBreadcrumbs } from './components/breadcrumbs/vox-breadcrumbs.js';
26
+ export { VoxHeader } from './components/header/vox-header.js';
27
+ export { VoxSeriesNav } from './components/series-nav/vox-series-nav.js';
28
+ export { VoxSidenav, VoxSidenavGroup, VoxSidenavItem } from './components/sidenav/vox-sidenav.js';
29
+ export { VoxSubnav } from './components/subnav/vox-subnav.js';
30
+ export { VoxTabs, VoxTab, VoxTabPanel } from './components/tabs/vox-tabs.js';
31
+
32
+ // Overlays
33
+ export { VoxDialog } from './components/dialog/vox-dialog.js';
34
+ export { VoxDisclosure } from './components/disclosure/vox-disclosure.js';
35
+ export { VoxDropdown } from './components/dropdown/vox-dropdown.js';
36
+
37
+ // Page content
38
+ export { VoxAccordion, VoxAccordionItem } from './components/accordion/vox-accordion.js';
39
+ export { VoxAlert } from './components/alert/vox-alert.js';
40
+ export { VoxBadge } from './components/badge/vox-badge.js';
41
+ export { VoxCalendarTile } from './components/calendar-tile/vox-calendar-tile.js';
42
+ export { VoxCallout } from './components/callout/vox-callout.js';
43
+ export { VoxCard } from './components/card/vox-card.js';
44
+ export { VoxCtaBand } from './components/cta-band/vox-cta-band.js';
45
+ export { VoxEmptyState } from './components/empty-state/vox-empty-state.js';
46
+ export { VoxFooter, VoxFooterColumn } from './components/footer/vox-footer.js';
47
+ export { VoxGrid } from './components/grid/vox-grid.js';
48
+ export { VoxHero } from './components/hero/vox-hero.js';
49
+ export { VoxLinkHub, VoxLinkHubItem } from './components/link-hub/vox-link-hub.js';
50
+ export { VoxLoader } from './components/loader/vox-loader.js';
51
+ export { VoxPagination } from './components/pagination/vox-pagination.js';
52
+ export { VoxQuote } from './components/quote/vox-quote.js';
53
+ export { VoxSponsor, VoxSponsorTier } from './components/sponsor/vox-sponsor.js';
54
+ export { VoxStat } from './components/stat/vox-stat.js';
55
+ export { VoxStepIndicator, VoxStep } from './components/step-indicator/vox-step-indicator.js';
56
+ export { VoxTimeline, VoxTimelineItem } from './components/timeline/vox-timeline.js';
57
+
58
+ // Types
59
+ export type { ButtonVariant, ButtonSize } from './components/button/vox-button.js';
60
+ export type { CalloutVariant } from './components/callout/vox-callout.js';
61
+ export type { BadgeVariant } from './components/badge/vox-badge.js';
62
+ export type { AlertVariant } from './components/alert/vox-alert.js';
63
+ export type { AvatarSize } from './components/avatar/vox-avatar.js';
64
+ export type { LoaderSize } from './components/loader/vox-loader.js';
65
+ export type { StepState } from './components/step-indicator/vox-step-indicator.js';
@@ -0,0 +1,165 @@
1
+ import { LitElement, html, css, nothing } from 'lit';
2
+ import { property } from 'lit/decorators.js';
3
+
4
+ /**
5
+ * Shared base for form-associated VoxBlocks controls. Uses ElementInternals
6
+ * so controls participate in native <form> submission and validation.
7
+ */
8
+ export class VoxFieldElement extends LitElement {
9
+ static formAssociated = true;
10
+
11
+ protected internals: ElementInternals;
12
+
13
+ @property() name = '';
14
+ @property() label = '';
15
+ @property() note = '';
16
+ @property({ type: Boolean, reflect: true }) disabled = false;
17
+ @property({ type: Boolean, reflect: true }) required = false;
18
+
19
+ constructor() {
20
+ super();
21
+ this.internals = this.attachInternals();
22
+ }
23
+
24
+ get form(): HTMLFormElement | null {
25
+ return this.internals.form;
26
+ }
27
+
28
+ get validity(): ValidityState {
29
+ return this.internals.validity;
30
+ }
31
+
32
+ get validationMessage(): string {
33
+ return this.internals.validationMessage;
34
+ }
35
+
36
+ checkValidity(): boolean {
37
+ return this.internals.checkValidity();
38
+ }
39
+
40
+ reportValidity(): boolean {
41
+ return this.internals.reportValidity();
42
+ }
43
+
44
+ /** Mirror a native inner control's validity onto the host element. */
45
+ protected syncValidity(
46
+ inner: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement,
47
+ ) {
48
+ this.internals.setValidity(inner.validity, inner.validationMessage, inner);
49
+ }
50
+
51
+ protected renderLabel(forId: string) {
52
+ if (!this.label) return nothing;
53
+ return html`
54
+ <label class="label" for=${forId}>
55
+ ${this.label}${this.required
56
+ ? html`<span class="required-mark" aria-hidden="true"> *</span>`
57
+ : nothing}
58
+ </label>
59
+ `;
60
+ }
61
+
62
+ protected renderNote() {
63
+ return this.note ? html`<p class="note">${this.note}</p>` : nothing;
64
+ }
65
+ }
66
+
67
+ export const fieldStyles = css`
68
+ :host {
69
+ display: block;
70
+ font-family: var(--vox-font-family-base);
71
+ }
72
+
73
+ :host([disabled]) {
74
+ opacity: 0.6;
75
+ pointer-events: none;
76
+ }
77
+
78
+ .field {
79
+ display: flex;
80
+ flex-direction: column;
81
+ gap: var(--vox-space-1);
82
+ }
83
+
84
+ .label {
85
+ font-size: 14px;
86
+ font-weight: 600;
87
+ color: var(--vox-color-text-1);
88
+ }
89
+
90
+ .required-mark {
91
+ color: var(--vox-color-danger-1);
92
+ }
93
+
94
+ .note {
95
+ margin: 0;
96
+ font-size: 12px;
97
+ color: var(--vox-color-text-2);
98
+ }
99
+
100
+ .control {
101
+ box-sizing: border-box;
102
+ width: 100%;
103
+ background-color: var(--vox-color-bg);
104
+ border: 1px solid var(--vox-color-border);
105
+ border-radius: var(--vox-radius-md);
106
+ color: var(--vox-color-text-1);
107
+ font-family: inherit;
108
+ font-size: 14px;
109
+ line-height: 1.5;
110
+ padding: var(--vox-space-2) var(--vox-space-3);
111
+ transition:
112
+ border-color var(--vox-transition-fast),
113
+ box-shadow var(--vox-transition-fast);
114
+ }
115
+
116
+ .control:focus {
117
+ outline: none;
118
+ border-color: var(--vox-color-brand-1);
119
+ box-shadow: 0 0 0 3px var(--vox-color-brand-soft);
120
+ }
121
+
122
+ /* Corner flattening when placed inside a <vox-input-group>. */
123
+ :host([data-vox-group]) .control {
124
+ border-radius: 0;
125
+ }
126
+
127
+ :host([data-vox-group='start']) .control {
128
+ border-radius: var(--vox-radius-md) 0 0 var(--vox-radius-md);
129
+ }
130
+
131
+ :host([data-vox-group='end']) .control {
132
+ border-radius: 0 var(--vox-radius-md) var(--vox-radius-md) 0;
133
+ }
134
+ `;
135
+
136
+ /** Styles shared by the checkbox-like controls (checkbox, radio, switch). */
137
+ export const checkableStyles = css`
138
+ :host {
139
+ display: block;
140
+ font-family: var(--vox-font-family-base);
141
+ }
142
+
143
+ :host([disabled]) {
144
+ opacity: 0.6;
145
+ pointer-events: none;
146
+ }
147
+
148
+ .check {
149
+ display: inline-flex;
150
+ align-items: flex-start;
151
+ gap: var(--vox-space-2);
152
+ cursor: pointer;
153
+ font-size: 14px;
154
+ line-height: 1.5;
155
+ color: var(--vox-color-text-1);
156
+ }
157
+
158
+ input {
159
+ position: absolute;
160
+ width: 1px;
161
+ height: 1px;
162
+ opacity: 0;
163
+ margin: 0;
164
+ }
165
+ `;
@@ -0,0 +1,409 @@
1
+ /**
2
+ * VoxBlocks utility classes, applied to light-DOM elements.
3
+ * All values derive from the --vox-* design tokens,
4
+ * so utilities follow theme overrides and dark mode automatically.
5
+ *
6
+ * Declarations use !important so a utility always wins over component
7
+ * or page styles, which is the whole point of a utility class.
8
+ *
9
+ * Size scale (spacing, gap): none 0 / xs .25rem / sm .5rem / md 1rem /
10
+ * lg 1.5rem / xl 2rem / xxl 3rem.
11
+ */
12
+
13
+ /* Table -------------------------------------------------------------- */
14
+
15
+ .vox-table {
16
+ width: 100%;
17
+ border-collapse: collapse;
18
+ font-family: var(--vox-font-family-base);
19
+ font-size: 14px;
20
+ color: var(--vox-color-text-1);
21
+ }
22
+
23
+ .vox-table caption {
24
+ margin-bottom: 0.5rem;
25
+ font-weight: 600;
26
+ text-align: left;
27
+ color: var(--vox-color-text-1);
28
+ }
29
+
30
+ .vox-table th {
31
+ padding: 0.6rem 0.9rem;
32
+ border-bottom: 2px solid var(--vox-color-divider);
33
+ font-weight: 600;
34
+ text-align: left;
35
+ white-space: nowrap;
36
+ color: var(--vox-color-text-1);
37
+ background-color: var(--vox-color-bg-soft);
38
+ }
39
+
40
+ .vox-table td {
41
+ padding: 0.6rem 0.9rem;
42
+ border-bottom: 1px solid var(--vox-color-divider);
43
+ color: var(--vox-color-text-2);
44
+ }
45
+
46
+ .vox-table--striped tbody tr:nth-child(odd) {
47
+ background-color: var(--vox-color-bg-soft);
48
+ }
49
+
50
+ .vox-table--compact th,
51
+ .vox-table--compact td {
52
+ padding: 0.35rem 0.6rem;
53
+ }
54
+
55
+ /* Wrap a .vox-table in this for a bordered, rounded, horizontally
56
+ scrollable container — the pattern any wide comparison table needs.
57
+ The last row's own border is dropped since the wrapper's border
58
+ already closes off the bottom edge. */
59
+ .vox-table-wrap {
60
+ overflow-x: auto;
61
+ border: 1px solid var(--vox-color-divider);
62
+ border-radius: var(--vox-radius-lg);
63
+ }
64
+
65
+ .vox-table-wrap .vox-table tbody tr:last-child th,
66
+ .vox-table-wrap .vox-table tbody tr:last-child td {
67
+ border-bottom: none;
68
+ }
69
+
70
+ /* List --------------------------------------------------------------- */
71
+
72
+ .vox-list {
73
+ font-family: var(--vox-font-family-base);
74
+ font-size: 14px;
75
+ line-height: 1.7;
76
+ color: var(--vox-color-text-2);
77
+ padding-left: 1.25rem;
78
+ }
79
+
80
+ .vox-list li + li {
81
+ margin-top: 0.25rem;
82
+ }
83
+
84
+ .vox-list--plain {
85
+ list-style: none;
86
+ padding-left: 0;
87
+ }
88
+
89
+ .vox-list--inline {
90
+ list-style: none;
91
+ padding-left: 0;
92
+ display: flex;
93
+ flex-wrap: wrap;
94
+ gap: 0.25rem 1.25rem;
95
+ }
96
+
97
+ .vox-list--inline li + li {
98
+ margin-top: 0;
99
+ }
100
+
101
+ /* Prose ---------------------------------------------------------------- */
102
+
103
+ /* A block of readable body copy: a comfortable measure (44rem, ~75-80
104
+ characters at 16px) plus the font size/line-height/color for long-form
105
+ text. Stack multiple blocks and they space themselves apart. */
106
+ .vox-prose {
107
+ max-width: 44rem;
108
+ font-family: var(--vox-font-family-base);
109
+ font-size: 16px;
110
+ line-height: 1.75;
111
+ color: var(--vox-color-text-2);
112
+ }
113
+
114
+ .vox-prose + .vox-prose {
115
+ margin-top: var(--vox-space-4);
116
+ }
117
+
118
+ .vox-prose a {
119
+ color: var(--vox-color-brand-1);
120
+ text-decoration: underline;
121
+ }
122
+
123
+ .vox-prose a:hover {
124
+ color: var(--vox-color-brand-2);
125
+ }
126
+
127
+ /* Spacing: margin ---------------------------------------------------- */
128
+
129
+ .vox-m-all-none { margin: 0 !important; }
130
+ .vox-m-all-xs { margin: 0.25rem !important; }
131
+ .vox-m-all-sm { margin: 0.5rem !important; }
132
+ .vox-m-all-md { margin: 1rem !important; }
133
+ .vox-m-all-lg { margin: 1.5rem !important; }
134
+ .vox-m-all-xl { margin: 2rem !important; }
135
+ .vox-m-all-xxl { margin: 3rem !important; }
136
+
137
+ .vox-m-top-none { margin-top: 0 !important; }
138
+ .vox-m-top-xs { margin-top: 0.25rem !important; }
139
+ .vox-m-top-sm { margin-top: 0.5rem !important; }
140
+ .vox-m-top-md { margin-top: 1rem !important; }
141
+ .vox-m-top-lg { margin-top: 1.5rem !important; }
142
+ .vox-m-top-xl { margin-top: 2rem !important; }
143
+ .vox-m-top-xxl { margin-top: 3rem !important; }
144
+
145
+ .vox-m-right-none { margin-right: 0 !important; }
146
+ .vox-m-right-xs { margin-right: 0.25rem !important; }
147
+ .vox-m-right-sm { margin-right: 0.5rem !important; }
148
+ .vox-m-right-md { margin-right: 1rem !important; }
149
+ .vox-m-right-lg { margin-right: 1.5rem !important; }
150
+ .vox-m-right-xl { margin-right: 2rem !important; }
151
+ .vox-m-right-xxl { margin-right: 3rem !important; }
152
+
153
+ .vox-m-bottom-none { margin-bottom: 0 !important; }
154
+ .vox-m-bottom-xs { margin-bottom: 0.25rem !important; }
155
+ .vox-m-bottom-sm { margin-bottom: 0.5rem !important; }
156
+ .vox-m-bottom-md { margin-bottom: 1rem !important; }
157
+ .vox-m-bottom-lg { margin-bottom: 1.5rem !important; }
158
+ .vox-m-bottom-xl { margin-bottom: 2rem !important; }
159
+ .vox-m-bottom-xxl { margin-bottom: 3rem !important; }
160
+
161
+ .vox-m-left-none { margin-left: 0 !important; }
162
+ .vox-m-left-xs { margin-left: 0.25rem !important; }
163
+ .vox-m-left-sm { margin-left: 0.5rem !important; }
164
+ .vox-m-left-md { margin-left: 1rem !important; }
165
+ .vox-m-left-lg { margin-left: 1.5rem !important; }
166
+ .vox-m-left-xl { margin-left: 2rem !important; }
167
+ .vox-m-left-xxl { margin-left: 3rem !important; }
168
+
169
+ .vox-m-x-none { margin-left: 0 !important; margin-right: 0 !important; }
170
+ .vox-m-x-xs { margin-left: 0.25rem !important; margin-right: 0.25rem !important; }
171
+ .vox-m-x-sm { margin-left: 0.5rem !important; margin-right: 0.5rem !important; }
172
+ .vox-m-x-md { margin-left: 1rem !important; margin-right: 1rem !important; }
173
+ .vox-m-x-lg { margin-left: 1.5rem !important; margin-right: 1.5rem !important; }
174
+ .vox-m-x-xl { margin-left: 2rem !important; margin-right: 2rem !important; }
175
+ .vox-m-x-xxl { margin-left: 3rem !important; margin-right: 3rem !important; }
176
+ .vox-m-x-auto { margin-left: auto !important; margin-right: auto !important; }
177
+
178
+ .vox-m-y-none { margin-top: 0 !important; margin-bottom: 0 !important; }
179
+ .vox-m-y-xs { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; }
180
+ .vox-m-y-sm { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; }
181
+ .vox-m-y-md { margin-top: 1rem !important; margin-bottom: 1rem !important; }
182
+ .vox-m-y-lg { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; }
183
+ .vox-m-y-xl { margin-top: 2rem !important; margin-bottom: 2rem !important; }
184
+ .vox-m-y-xxl { margin-top: 3rem !important; margin-bottom: 3rem !important; }
185
+
186
+ /* Spacing: padding --------------------------------------------------- */
187
+
188
+ .vox-p-all-none { padding: 0 !important; }
189
+ .vox-p-all-xs { padding: 0.25rem !important; }
190
+ .vox-p-all-sm { padding: 0.5rem !important; }
191
+ .vox-p-all-md { padding: 1rem !important; }
192
+ .vox-p-all-lg { padding: 1.5rem !important; }
193
+ .vox-p-all-xl { padding: 2rem !important; }
194
+ .vox-p-all-xxl { padding: 3rem !important; }
195
+
196
+ .vox-p-top-none { padding-top: 0 !important; }
197
+ .vox-p-top-xs { padding-top: 0.25rem !important; }
198
+ .vox-p-top-sm { padding-top: 0.5rem !important; }
199
+ .vox-p-top-md { padding-top: 1rem !important; }
200
+ .vox-p-top-lg { padding-top: 1.5rem !important; }
201
+ .vox-p-top-xl { padding-top: 2rem !important; }
202
+ .vox-p-top-xxl { padding-top: 3rem !important; }
203
+
204
+ .vox-p-right-none { padding-right: 0 !important; }
205
+ .vox-p-right-xs { padding-right: 0.25rem !important; }
206
+ .vox-p-right-sm { padding-right: 0.5rem !important; }
207
+ .vox-p-right-md { padding-right: 1rem !important; }
208
+ .vox-p-right-lg { padding-right: 1.5rem !important; }
209
+ .vox-p-right-xl { padding-right: 2rem !important; }
210
+ .vox-p-right-xxl { padding-right: 3rem !important; }
211
+
212
+ .vox-p-bottom-none { padding-bottom: 0 !important; }
213
+ .vox-p-bottom-xs { padding-bottom: 0.25rem !important; }
214
+ .vox-p-bottom-sm { padding-bottom: 0.5rem !important; }
215
+ .vox-p-bottom-md { padding-bottom: 1rem !important; }
216
+ .vox-p-bottom-lg { padding-bottom: 1.5rem !important; }
217
+ .vox-p-bottom-xl { padding-bottom: 2rem !important; }
218
+ .vox-p-bottom-xxl { padding-bottom: 3rem !important; }
219
+
220
+ .vox-p-left-none { padding-left: 0 !important; }
221
+ .vox-p-left-xs { padding-left: 0.25rem !important; }
222
+ .vox-p-left-sm { padding-left: 0.5rem !important; }
223
+ .vox-p-left-md { padding-left: 1rem !important; }
224
+ .vox-p-left-lg { padding-left: 1.5rem !important; }
225
+ .vox-p-left-xl { padding-left: 2rem !important; }
226
+ .vox-p-left-xxl { padding-left: 3rem !important; }
227
+
228
+ .vox-p-x-none { padding-left: 0 !important; padding-right: 0 !important; }
229
+ .vox-p-x-xs { padding-left: 0.25rem !important; padding-right: 0.25rem !important; }
230
+ .vox-p-x-sm { padding-left: 0.5rem !important; padding-right: 0.5rem !important; }
231
+ .vox-p-x-md { padding-left: 1rem !important; padding-right: 1rem !important; }
232
+ .vox-p-x-lg { padding-left: 1.5rem !important; padding-right: 1.5rem !important; }
233
+ .vox-p-x-xl { padding-left: 2rem !important; padding-right: 2rem !important; }
234
+ .vox-p-x-xxl { padding-left: 3rem !important; padding-right: 3rem !important; }
235
+
236
+ .vox-p-y-none { padding-top: 0 !important; padding-bottom: 0 !important; }
237
+ .vox-p-y-xs { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; }
238
+ .vox-p-y-sm { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; }
239
+ .vox-p-y-md { padding-top: 1rem !important; padding-bottom: 1rem !important; }
240
+ .vox-p-y-lg { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; }
241
+ .vox-p-y-xl { padding-top: 2rem !important; padding-bottom: 2rem !important; }
242
+ .vox-p-y-xxl { padding-top: 3rem !important; padding-bottom: 3rem !important; }
243
+
244
+ /* Typography --------------------------------------------------------- */
245
+
246
+ .vox-ts-xs { font-size: 12px !important; }
247
+ .vox-ts-sm { font-size: 14px !important; }
248
+ .vox-ts-md { font-size: 16px !important; }
249
+ .vox-ts-lg { font-size: 18px !important; }
250
+ .vox-ts-xl { font-size: 22px !important; }
251
+ .vox-ts-xxl { font-size: 28px !important; }
252
+ .vox-ts-3xl { font-size: 36px !important; }
253
+
254
+ .vox-text-regular { font-weight: 400 !important; }
255
+ .vox-text-medium { font-weight: 500 !important; }
256
+ .vox-text-semibold { font-weight: 600 !important; }
257
+ .vox-text-bold { font-weight: 700 !important; }
258
+
259
+ .vox-text-left { text-align: left !important; }
260
+ .vox-text-center { text-align: center !important; }
261
+ .vox-text-right { text-align: right !important; }
262
+
263
+ .vox-text-uppercase { text-transform: uppercase !important; letter-spacing: 0.05em !important; }
264
+ .vox-text-mono { font-family: var(--vox-font-family-mono) !important; }
265
+
266
+ .vox-lh-tight { line-height: 1.25 !important; }
267
+ .vox-lh-base { line-height: 1.5 !important; }
268
+ .vox-lh-loose { line-height: 1.75 !important; }
269
+
270
+ /* Color: text -------------------------------------------------------- */
271
+
272
+ .vox-color-text-1 { color: var(--vox-color-text-1) !important; }
273
+ .vox-color-text-2 { color: var(--vox-color-text-2) !important; }
274
+ .vox-color-text-3 { color: var(--vox-color-text-3) !important; }
275
+ .vox-color-brand { color: var(--vox-color-brand-1) !important; }
276
+ .vox-color-tip { color: var(--vox-color-tip-1) !important; }
277
+ .vox-color-warning { color: var(--vox-color-warning-1) !important; }
278
+ .vox-color-danger { color: var(--vox-color-danger-1) !important; }
279
+
280
+ /* Color: background -------------------------------------------------- */
281
+
282
+ .vox-bg { background-color: var(--vox-color-bg) !important; }
283
+ .vox-bg-alt { background-color: var(--vox-color-bg-alt) !important; }
284
+ .vox-bg-soft { background-color: var(--vox-color-bg-soft) !important; }
285
+ .vox-bg-elv { background-color: var(--vox-color-bg-elv) !important; }
286
+ .vox-bg-brand { background-color: var(--vox-color-brand-3) !important; color: var(--vox-color-text-inverse) !important; }
287
+ .vox-bg-brand-soft { background-color: var(--vox-color-brand-soft) !important; }
288
+ .vox-bg-tip-soft { background-color: var(--vox-color-tip-soft) !important; }
289
+ .vox-bg-warning-soft { background-color: var(--vox-color-warning-soft) !important; }
290
+ .vox-bg-danger-soft { background-color: var(--vox-color-danger-soft) !important; }
291
+
292
+ /* Border ------------------------------------------------------------- */
293
+
294
+ .vox-border-all { border: 1px solid var(--vox-color-divider) !important; }
295
+ .vox-border-top { border-top: 1px solid var(--vox-color-divider) !important; }
296
+ .vox-border-right { border-right: 1px solid var(--vox-color-divider) !important; }
297
+ .vox-border-bottom { border-bottom: 1px solid var(--vox-color-divider) !important; }
298
+ .vox-border-left { border-left: 1px solid var(--vox-color-divider) !important; }
299
+ .vox-border-none { border: none !important; }
300
+
301
+ .vox-radius-sm { border-radius: var(--vox-radius-sm) !important; }
302
+ .vox-radius-md { border-radius: var(--vox-radius-md) !important; }
303
+ .vox-radius-lg { border-radius: var(--vox-radius-lg) !important; }
304
+ .vox-radius-full { border-radius: var(--vox-radius-full) !important; }
305
+
306
+ /* Display ------------------------------------------------------------ */
307
+
308
+ .vox-display-block { display: block !important; }
309
+ .vox-display-inline { display: inline !important; }
310
+ .vox-display-inline-block { display: inline-block !important; }
311
+ .vox-display-flex { display: flex !important; }
312
+ .vox-display-inline-flex { display: inline-flex !important; }
313
+ .vox-display-grid { display: grid !important; }
314
+
315
+ /* Flex --------------------------------------------------------------- */
316
+
317
+ .vox-flex-row { flex-direction: row !important; }
318
+ .vox-flex-column { flex-direction: column !important; }
319
+ .vox-flex-wrap { flex-wrap: wrap !important; }
320
+ .vox-flex-nowrap { flex-wrap: nowrap !important; }
321
+
322
+ .vox-justify-start { justify-content: flex-start !important; }
323
+ .vox-justify-center { justify-content: center !important; }
324
+ .vox-justify-end { justify-content: flex-end !important; }
325
+ .vox-justify-between { justify-content: space-between !important; }
326
+
327
+ .vox-items-start { align-items: flex-start !important; }
328
+ .vox-items-center { align-items: center !important; }
329
+ .vox-items-end { align-items: flex-end !important; }
330
+ .vox-items-stretch { align-items: stretch !important; }
331
+
332
+ .vox-grow-0 { flex-grow: 0 !important; }
333
+ .vox-grow-1 { flex-grow: 1 !important; }
334
+ .vox-shrink-0 { flex-shrink: 0 !important; }
335
+
336
+ /* Gap ---------------------------------------------------------------- */
337
+
338
+ .vox-gap-none { gap: 0 !important; }
339
+ .vox-gap-xs { gap: 0.25rem !important; }
340
+ .vox-gap-sm { gap: 0.5rem !important; }
341
+ .vox-gap-md { gap: 1rem !important; }
342
+ .vox-gap-lg { gap: 1.5rem !important; }
343
+ .vox-gap-xl { gap: 2rem !important; }
344
+ .vox-gap-xxl { gap: 3rem !important; }
345
+
346
+ /* Shadow ------------------------------------------------------------- */
347
+
348
+ .vox-shadow-1 { box-shadow: var(--vox-shadow-1) !important; }
349
+ .vox-shadow-2 { box-shadow: var(--vox-shadow-2) !important; }
350
+ .vox-shadow-none { box-shadow: none !important; }
351
+
352
+ /* Visibility --------------------------------------------------------- */
353
+
354
+ .vox-hide { display: none !important; }
355
+
356
+ /* Visually hidden but available to assistive technology. */
357
+ .vox-sr-only {
358
+ position: absolute !important;
359
+ width: 1px !important;
360
+ height: 1px !important;
361
+ padding: 0 !important;
362
+ margin: -1px !important;
363
+ overflow: hidden !important;
364
+ clip: rect(0 0 0 0) !important;
365
+ white-space: nowrap !important;
366
+ border: 0 !important;
367
+ }
368
+
369
+ /* Responsive hiding. Breakpoints: sm 480px / md 768px / lg 1024px. */
370
+ @media (max-width: 479.98px) {
371
+ .vox-hide-sm-down { display: none !important; }
372
+ }
373
+ @media (max-width: 767.98px) {
374
+ .vox-hide-md-down { display: none !important; }
375
+ }
376
+ @media (max-width: 1023.98px) {
377
+ .vox-hide-lg-down { display: none !important; }
378
+ }
379
+ @media (min-width: 480px) {
380
+ .vox-hide-sm-up { display: none !important; }
381
+ }
382
+ @media (min-width: 768px) {
383
+ .vox-hide-md-up { display: none !important; }
384
+ }
385
+ @media (min-width: 1024px) {
386
+ .vox-hide-lg-up { display: none !important; }
387
+ }
388
+
389
+ /* Width -------------------------------------------------------------- */
390
+
391
+ .vox-width-full { width: 100% !important; }
392
+ .vox-width-auto { width: auto !important; }
393
+ .vox-width-sm { width: 20rem !important; }
394
+ .vox-width-md { width: 30rem !important; }
395
+ .vox-width-lg { width: 40rem !important; }
396
+ .vox-width-xl { width: 50rem !important; }
397
+
398
+ .vox-max-width-sm { max-width: 20rem !important; }
399
+ .vox-max-width-md { max-width: 30rem !important; }
400
+ .vox-max-width-lg { max-width: 40rem !important; }
401
+ .vox-max-width-xl { max-width: 50rem !important; }
402
+ .vox-max-width-full { max-width: 100% !important; }
403
+
404
+ /* Z-index ------------------------------------------------------------ */
405
+
406
+ .vox-z-0 { z-index: 0 !important; }
407
+ .vox-z-10 { z-index: 10 !important; }
408
+ .vox-z-100 { z-index: 100 !important; }
409
+ .vox-z-1000 { z-index: 1000 !important; }