qdadm 0.13.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 (82) hide show
  1. package/CHANGELOG.md +270 -0
  2. package/LICENSE +21 -0
  3. package/README.md +166 -0
  4. package/package.json +48 -0
  5. package/src/assets/logo.svg +6 -0
  6. package/src/components/BoolCell.vue +28 -0
  7. package/src/components/dialogs/BulkStatusDialog.vue +43 -0
  8. package/src/components/dialogs/MultiStepDialog.vue +321 -0
  9. package/src/components/dialogs/SimpleDialog.vue +108 -0
  10. package/src/components/dialogs/UnsavedChangesDialog.vue +87 -0
  11. package/src/components/display/CardsGrid.vue +155 -0
  12. package/src/components/display/CopyableId.vue +92 -0
  13. package/src/components/display/EmptyState.vue +114 -0
  14. package/src/components/display/IntensityBar.vue +171 -0
  15. package/src/components/display/RichCardsGrid.vue +220 -0
  16. package/src/components/editors/JsonEditorFoldable.vue +467 -0
  17. package/src/components/editors/JsonStructuredField.vue +218 -0
  18. package/src/components/editors/JsonViewer.vue +91 -0
  19. package/src/components/editors/KeyValueEditor.vue +314 -0
  20. package/src/components/editors/LanguageEditor.vue +245 -0
  21. package/src/components/editors/ScopeEditor.vue +341 -0
  22. package/src/components/editors/VanillaJsonEditor.vue +185 -0
  23. package/src/components/forms/FormActions.vue +104 -0
  24. package/src/components/forms/FormField.vue +64 -0
  25. package/src/components/forms/FormTab.vue +217 -0
  26. package/src/components/forms/FormTabs.vue +108 -0
  27. package/src/components/index.js +44 -0
  28. package/src/components/layout/AppLayout.vue +430 -0
  29. package/src/components/layout/Breadcrumb.vue +106 -0
  30. package/src/components/layout/PageHeader.vue +75 -0
  31. package/src/components/layout/PageLayout.vue +93 -0
  32. package/src/components/lists/ActionButtons.vue +41 -0
  33. package/src/components/lists/ActionColumn.vue +37 -0
  34. package/src/components/lists/FilterBar.vue +53 -0
  35. package/src/components/lists/ListPage.vue +319 -0
  36. package/src/composables/index.js +19 -0
  37. package/src/composables/useApp.js +43 -0
  38. package/src/composables/useAuth.js +49 -0
  39. package/src/composables/useBareForm.js +143 -0
  40. package/src/composables/useBreadcrumb.js +221 -0
  41. package/src/composables/useDirtyState.js +103 -0
  42. package/src/composables/useEntityTitle.js +121 -0
  43. package/src/composables/useForm.js +254 -0
  44. package/src/composables/useGuardStore.js +37 -0
  45. package/src/composables/useJsonSyntax.js +101 -0
  46. package/src/composables/useListPageBuilder.js +1176 -0
  47. package/src/composables/useNavigation.js +89 -0
  48. package/src/composables/usePageBuilder.js +334 -0
  49. package/src/composables/useStatus.js +146 -0
  50. package/src/composables/useSubEditor.js +165 -0
  51. package/src/composables/useTabSync.js +110 -0
  52. package/src/composables/useUnsavedChangesGuard.js +122 -0
  53. package/src/entity/EntityManager.js +540 -0
  54. package/src/entity/index.js +11 -0
  55. package/src/entity/storage/ApiStorage.js +146 -0
  56. package/src/entity/storage/LocalStorage.js +220 -0
  57. package/src/entity/storage/MemoryStorage.js +201 -0
  58. package/src/entity/storage/index.js +10 -0
  59. package/src/index.js +29 -0
  60. package/src/kernel/Kernel.js +234 -0
  61. package/src/kernel/index.js +7 -0
  62. package/src/module/index.js +16 -0
  63. package/src/module/moduleRegistry.js +222 -0
  64. package/src/orchestrator/Orchestrator.js +141 -0
  65. package/src/orchestrator/index.js +8 -0
  66. package/src/orchestrator/useOrchestrator.js +61 -0
  67. package/src/plugin.js +142 -0
  68. package/src/styles/_alerts.css +48 -0
  69. package/src/styles/_code.css +33 -0
  70. package/src/styles/_dialogs.css +17 -0
  71. package/src/styles/_markdown.css +82 -0
  72. package/src/styles/_show-pages.css +84 -0
  73. package/src/styles/index.css +16 -0
  74. package/src/styles/main.css +845 -0
  75. package/src/styles/theme/components.css +286 -0
  76. package/src/styles/theme/index.css +10 -0
  77. package/src/styles/theme/tokens.css +125 -0
  78. package/src/styles/theme/utilities.css +172 -0
  79. package/src/utils/debugInjector.js +261 -0
  80. package/src/utils/formatters.js +165 -0
  81. package/src/utils/index.js +35 -0
  82. package/src/utils/transformers.js +105 -0
@@ -0,0 +1,286 @@
1
+ /**
2
+ * Component Styles
3
+ *
4
+ * Reusable component classes that can be used directly in templates
5
+ * or as base styles for Vue components.
6
+ */
7
+
8
+ /* ==========================================================================
9
+ * Cards
10
+ * ========================================================================== */
11
+
12
+ .fad-card {
13
+ background: var(--fad-surface-card);
14
+ border: var(--fad-border-width) solid var(--fad-border-color);
15
+ border-radius: var(--fad-radius-lg);
16
+ padding: var(--fad-space-lg);
17
+ }
18
+
19
+ .fad-card-header {
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: space-between;
23
+ margin-bottom: var(--fad-space-md);
24
+ padding-bottom: var(--fad-space-md);
25
+ border-bottom: var(--fad-border-width) solid var(--fad-border-color);
26
+ }
27
+
28
+ .fad-card-title {
29
+ font-size: var(--fad-font-size-lg);
30
+ font-weight: var(--fad-font-weight-semibold);
31
+ color: var(--fad-text-primary);
32
+ margin: 0;
33
+ }
34
+
35
+ .fad-card-body {
36
+ color: var(--fad-text-primary);
37
+ }
38
+
39
+ .fad-card-footer {
40
+ display: flex;
41
+ align-items: center;
42
+ justify-content: flex-end;
43
+ gap: var(--fad-space-sm);
44
+ margin-top: var(--fad-space-md);
45
+ padding-top: var(--fad-space-md);
46
+ border-top: var(--fad-border-width) solid var(--fad-border-color);
47
+ }
48
+
49
+ /* ==========================================================================
50
+ * Form Elements
51
+ * ========================================================================== */
52
+
53
+ .fad-form-field {
54
+ display: flex;
55
+ flex-direction: column;
56
+ gap: var(--fad-space-sm);
57
+ margin-bottom: var(--fad-space-lg);
58
+ }
59
+
60
+ .fad-form-label {
61
+ font-weight: var(--fad-font-weight-medium);
62
+ color: var(--fad-text-primary);
63
+ font-size: var(--fad-font-size-sm);
64
+ }
65
+
66
+ .fad-form-label-required::after {
67
+ content: " *";
68
+ color: var(--fad-danger);
69
+ }
70
+
71
+ .fad-form-help {
72
+ font-size: var(--fad-font-size-xs);
73
+ color: var(--fad-text-secondary);
74
+ }
75
+
76
+ .fad-form-error {
77
+ font-size: var(--fad-font-size-xs);
78
+ color: var(--fad-danger);
79
+ }
80
+
81
+ .fad-form-row {
82
+ display: grid;
83
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
84
+ gap: var(--fad-space-md);
85
+ }
86
+
87
+ .fad-form-section-title {
88
+ font-size: var(--fad-font-size-lg);
89
+ font-weight: var(--fad-font-weight-semibold);
90
+ color: var(--fad-text-primary);
91
+ margin: var(--fad-space-xl) 0 var(--fad-space-md) 0;
92
+ padding-bottom: var(--fad-space-sm);
93
+ border-bottom: var(--fad-border-width) solid var(--fad-border-color);
94
+ }
95
+
96
+ .fad-form-section-title:first-child {
97
+ margin-top: 0;
98
+ }
99
+
100
+ /* ==========================================================================
101
+ * Form Field States
102
+ * ========================================================================== */
103
+
104
+ .fad-form-field--dirty {
105
+ position: relative;
106
+ }
107
+
108
+ .fad-form-field--dirty::before {
109
+ content: "";
110
+ position: absolute;
111
+ left: -8px;
112
+ top: 0;
113
+ bottom: 0;
114
+ width: 3px;
115
+ background: var(--fad-warning);
116
+ border-radius: var(--fad-radius-full);
117
+ }
118
+
119
+ .fad-form-field--error .fad-form-label {
120
+ color: var(--fad-danger);
121
+ }
122
+
123
+ /* ==========================================================================
124
+ * Page Header
125
+ * ========================================================================== */
126
+
127
+ .fad-page-header {
128
+ display: flex;
129
+ align-items: center;
130
+ justify-content: space-between;
131
+ margin-bottom: var(--fad-space-lg);
132
+ padding-bottom: var(--fad-space-md);
133
+ }
134
+
135
+ .fad-page-title {
136
+ font-size: var(--fad-font-size-2xl);
137
+ font-weight: var(--fad-font-weight-semibold);
138
+ color: var(--fad-text-primary);
139
+ margin: 0;
140
+ }
141
+
142
+ .fad-page-actions {
143
+ display: flex;
144
+ gap: var(--fad-space-sm);
145
+ }
146
+
147
+ /* ==========================================================================
148
+ * Empty State
149
+ * ========================================================================== */
150
+
151
+ .fad-empty-state {
152
+ display: flex;
153
+ flex-direction: column;
154
+ align-items: center;
155
+ justify-content: center;
156
+ padding: var(--fad-space-2xl) var(--fad-space-md);
157
+ text-align: center;
158
+ color: var(--fad-text-secondary);
159
+ }
160
+
161
+ .fad-empty-state-icon {
162
+ font-size: 3rem;
163
+ opacity: 0.5;
164
+ margin-bottom: var(--fad-space-md);
165
+ }
166
+
167
+ .fad-empty-state-title {
168
+ font-size: var(--fad-font-size-lg);
169
+ font-weight: var(--fad-font-weight-medium);
170
+ color: var(--fad-text-primary);
171
+ margin: 0 0 var(--fad-space-sm) 0;
172
+ }
173
+
174
+ .fad-empty-state-description {
175
+ font-size: var(--fad-font-size-sm);
176
+ max-width: 400px;
177
+ }
178
+
179
+ /* ==========================================================================
180
+ * Loading State
181
+ * ========================================================================== */
182
+
183
+ .fad-loading {
184
+ display: flex;
185
+ align-items: center;
186
+ justify-content: center;
187
+ padding: var(--fad-space-2xl);
188
+ }
189
+
190
+ .fad-loading-spinner {
191
+ animation: fad-spin 1s linear infinite;
192
+ }
193
+
194
+ @keyframes fad-spin {
195
+ from { transform: rotate(0deg); }
196
+ to { transform: rotate(360deg); }
197
+ }
198
+
199
+ /* ==========================================================================
200
+ * Status Badges
201
+ * ========================================================================== */
202
+
203
+ .fad-badge {
204
+ display: inline-flex;
205
+ align-items: center;
206
+ padding: var(--fad-space-xs) var(--fad-space-sm);
207
+ font-size: var(--fad-font-size-xs);
208
+ font-weight: var(--fad-font-weight-medium);
209
+ border-radius: var(--fad-radius-full);
210
+ text-transform: uppercase;
211
+ letter-spacing: 0.025em;
212
+ }
213
+
214
+ .fad-badge--success {
215
+ background: var(--p-green-100);
216
+ color: var(--p-green-700);
217
+ }
218
+
219
+ .fad-badge--warning {
220
+ background: var(--p-orange-100);
221
+ color: var(--p-orange-700);
222
+ }
223
+
224
+ .fad-badge--danger {
225
+ background: var(--p-red-100);
226
+ color: var(--p-red-700);
227
+ }
228
+
229
+ .fad-badge--info {
230
+ background: var(--p-blue-100);
231
+ color: var(--p-blue-700);
232
+ }
233
+
234
+ .fad-badge--neutral {
235
+ background: var(--p-surface-100);
236
+ color: var(--p-surface-600);
237
+ }
238
+
239
+ /* ==========================================================================
240
+ * Tabs (for form tabs)
241
+ * ========================================================================== */
242
+
243
+ .fad-tabs {
244
+ display: flex;
245
+ gap: var(--fad-space-xs);
246
+ border-bottom: var(--fad-border-width) solid var(--fad-border-color);
247
+ margin-bottom: var(--fad-space-lg);
248
+ }
249
+
250
+ .fad-tab {
251
+ display: flex;
252
+ align-items: center;
253
+ gap: var(--fad-space-xs);
254
+ padding: var(--fad-space-sm) var(--fad-space-md);
255
+ font-size: var(--fad-font-size-sm);
256
+ font-weight: var(--fad-font-weight-medium);
257
+ color: var(--fad-text-secondary);
258
+ background: transparent;
259
+ border: none;
260
+ border-bottom: 2px solid transparent;
261
+ cursor: pointer;
262
+ transition: all var(--fad-transition-fast);
263
+ margin-bottom: -1px;
264
+ }
265
+
266
+ .fad-tab:hover {
267
+ color: var(--fad-text-primary);
268
+ }
269
+
270
+ .fad-tab--active {
271
+ color: var(--fad-primary);
272
+ border-bottom-color: var(--fad-primary);
273
+ }
274
+
275
+ .fad-tab-count {
276
+ background: var(--p-surface-100);
277
+ color: var(--fad-text-secondary);
278
+ padding: 0.125rem 0.375rem;
279
+ border-radius: var(--fad-radius-full);
280
+ font-size: var(--fad-font-size-xs);
281
+ }
282
+
283
+ .fad-tab--active .fad-tab-count {
284
+ background: var(--p-primary-100);
285
+ color: var(--fad-primary);
286
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Faketual Admin Design System - Theme
3
+ *
4
+ * Import this file to get all theme styles.
5
+ * Use the fad-* classes in your components.
6
+ */
7
+
8
+ @import './tokens.css';
9
+ @import './utilities.css';
10
+ @import './components.css';
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Design Tokens - Semantic CSS Variables
3
+ *
4
+ * Maps to PrimeVue theme variables for consistency.
5
+ * Use these tokens in components instead of PrimeVue variables directly.
6
+ */
7
+
8
+ :root {
9
+ /* ==========================================================================
10
+ * Colors - Semantic
11
+ * ========================================================================== */
12
+
13
+ /* Text */
14
+ --fad-text-primary: var(--p-text-color);
15
+ --fad-text-secondary: var(--p-text-muted-color);
16
+ --fad-text-disabled: var(--p-surface-400);
17
+ --fad-text-inverse: var(--p-surface-0);
18
+
19
+ /* Surfaces */
20
+ --fad-surface-ground: var(--p-surface-ground);
21
+ --fad-surface-card: var(--p-surface-card);
22
+ --fad-surface-overlay: var(--p-surface-overlay);
23
+ --fad-surface-border: var(--p-surface-200);
24
+ --fad-surface-hover: var(--p-surface-100);
25
+
26
+ /* Primary */
27
+ --fad-primary: var(--p-primary-color);
28
+ --fad-primary-hover: var(--p-primary-600);
29
+ --fad-primary-text: var(--p-primary-contrast-color);
30
+
31
+ /* Status */
32
+ --fad-success: var(--p-green-500);
33
+ --fad-warning: var(--p-orange-500);
34
+ --fad-danger: var(--p-red-500);
35
+ --fad-info: var(--p-blue-500);
36
+
37
+ /* ==========================================================================
38
+ * Spacing
39
+ * ========================================================================== */
40
+
41
+ --fad-space-xs: 0.25rem; /* 4px */
42
+ --fad-space-sm: 0.5rem; /* 8px */
43
+ --fad-space-md: 1rem; /* 16px */
44
+ --fad-space-lg: 1.5rem; /* 24px */
45
+ --fad-space-xl: 2rem; /* 32px */
46
+ --fad-space-2xl: 3rem; /* 48px */
47
+
48
+ /* ==========================================================================
49
+ * Typography
50
+ * ========================================================================== */
51
+
52
+ --fad-font-family: var(--p-font-family);
53
+ --fad-font-size-xs: 0.75rem; /* 12px */
54
+ --fad-font-size-sm: 0.875rem; /* 14px */
55
+ --fad-font-size-md: 1rem; /* 16px */
56
+ --fad-font-size-lg: 1.125rem; /* 18px */
57
+ --fad-font-size-xl: 1.25rem; /* 20px */
58
+ --fad-font-size-2xl: 1.5rem; /* 24px */
59
+
60
+ --fad-font-weight-normal: 400;
61
+ --fad-font-weight-medium: 500;
62
+ --fad-font-weight-semibold: 600;
63
+ --fad-font-weight-bold: 700;
64
+
65
+ --fad-line-height-tight: 1.25;
66
+ --fad-line-height-normal: 1.5;
67
+ --fad-line-height-relaxed: 1.75;
68
+
69
+ /* ==========================================================================
70
+ * Borders & Radius
71
+ * ========================================================================== */
72
+
73
+ --fad-border-width: 1px;
74
+ --fad-border-color: var(--fad-surface-border);
75
+
76
+ --fad-radius-sm: 0.25rem;
77
+ --fad-radius-md: 0.375rem;
78
+ --fad-radius-lg: 0.5rem;
79
+ --fad-radius-xl: 0.75rem;
80
+ --fad-radius-full: 9999px;
81
+
82
+ /* ==========================================================================
83
+ * Shadows
84
+ * ========================================================================== */
85
+
86
+ --fad-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
87
+ --fad-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
88
+ --fad-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
89
+ --fad-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
90
+
91
+ /* ==========================================================================
92
+ * Transitions
93
+ * ========================================================================== */
94
+
95
+ --fad-transition-fast: 150ms ease;
96
+ --fad-transition-normal: 200ms ease;
97
+ --fad-transition-slow: 300ms ease;
98
+
99
+ /* ==========================================================================
100
+ * Z-Index
101
+ * ========================================================================== */
102
+
103
+ --fad-z-dropdown: 1000;
104
+ --fad-z-sticky: 1020;
105
+ --fad-z-fixed: 1030;
106
+ --fad-z-modal-backdrop: 1040;
107
+ --fad-z-modal: 1050;
108
+ --fad-z-popover: 1060;
109
+ --fad-z-tooltip: 1070;
110
+
111
+ /* ==========================================================================
112
+ * Layout
113
+ * ========================================================================== */
114
+
115
+ --fad-sidebar-width: 15rem;
116
+ --fad-header-height: 3.75rem;
117
+ --fad-content-max-width: 87.5rem;
118
+ }
119
+
120
+ /* Dark mode overrides */
121
+ .dark-mode {
122
+ --fad-surface-border: var(--p-surface-700);
123
+ --fad-surface-hover: var(--p-surface-800);
124
+ --fad-text-disabled: var(--p-surface-500);
125
+ }
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Utility Classes
3
+ *
4
+ * Minimal utility classes for common patterns.
5
+ * Keep it small - use components for complex layouts.
6
+ */
7
+
8
+ /* ==========================================================================
9
+ * Display
10
+ * ========================================================================== */
11
+
12
+ .d-none { display: none !important; }
13
+ .d-block { display: block !important; }
14
+ .d-flex { display: flex !important; }
15
+ .d-inline-flex { display: inline-flex !important; }
16
+ .d-grid { display: grid !important; }
17
+
18
+ /* ==========================================================================
19
+ * Flexbox
20
+ * ========================================================================== */
21
+
22
+ .flex-row { flex-direction: row; }
23
+ .flex-column { flex-direction: column; }
24
+ .flex-wrap { flex-wrap: wrap; }
25
+ .flex-1 { flex: 1; }
26
+ .flex-auto { flex: auto; }
27
+ .flex-none { flex: none; }
28
+
29
+ .items-start { align-items: flex-start; }
30
+ .items-center { align-items: center; }
31
+ .items-end { align-items: flex-end; }
32
+ .items-stretch { align-items: stretch; }
33
+
34
+ .justify-start { justify-content: flex-start; }
35
+ .justify-center { justify-content: center; }
36
+ .justify-end { justify-content: flex-end; }
37
+ .justify-between { justify-content: space-between; }
38
+ .justify-around { justify-content: space-around; }
39
+
40
+ .gap-xs { gap: var(--fad-space-xs); }
41
+ .gap-sm { gap: var(--fad-space-sm); }
42
+ .gap-md { gap: var(--fad-space-md); }
43
+ .gap-lg { gap: var(--fad-space-lg); }
44
+ .gap-xl { gap: var(--fad-space-xl); }
45
+
46
+ /* ==========================================================================
47
+ * Width
48
+ * ========================================================================== */
49
+
50
+ .w-full { width: 100% !important; }
51
+ .w-auto { width: auto !important; }
52
+ .w-50 { width: 50%; }
53
+ .max-w-full { max-width: 100%; }
54
+
55
+ /* ==========================================================================
56
+ * Spacing (margin/padding)
57
+ * ========================================================================== */
58
+
59
+ /* Margin */
60
+ .m-0 { margin: 0; }
61
+ .m-auto { margin: auto; }
62
+ .mt-0 { margin-top: 0; }
63
+ .mt-xs { margin-top: var(--fad-space-xs); }
64
+ .mt-sm { margin-top: var(--fad-space-sm); }
65
+ .mt-md { margin-top: var(--fad-space-md); }
66
+ .mt-lg { margin-top: var(--fad-space-lg); }
67
+ .mt-xl { margin-top: var(--fad-space-xl); }
68
+
69
+ .mb-0 { margin-bottom: 0; }
70
+ .mb-xs { margin-bottom: var(--fad-space-xs); }
71
+ .mb-sm { margin-bottom: var(--fad-space-sm); }
72
+ .mb-md { margin-bottom: var(--fad-space-md); }
73
+ .mb-lg { margin-bottom: var(--fad-space-lg); }
74
+ .mb-xl { margin-bottom: var(--fad-space-xl); }
75
+
76
+ .ml-auto { margin-left: auto; }
77
+ .mr-auto { margin-right: auto; }
78
+ .mx-auto { margin-left: auto; margin-right: auto; }
79
+
80
+ /* Padding */
81
+ .p-0 { padding: 0; }
82
+ .p-xs { padding: var(--fad-space-xs); }
83
+ .p-sm { padding: var(--fad-space-sm); }
84
+ .p-md { padding: var(--fad-space-md); }
85
+ .p-lg { padding: var(--fad-space-lg); }
86
+ .p-xl { padding: var(--fad-space-xl); }
87
+
88
+ .px-md { padding-left: var(--fad-space-md); padding-right: var(--fad-space-md); }
89
+ .py-md { padding-top: var(--fad-space-md); padding-bottom: var(--fad-space-md); }
90
+
91
+ /* ==========================================================================
92
+ * Text
93
+ * ========================================================================== */
94
+
95
+ .text-left { text-align: left; }
96
+ .text-center { text-align: center; }
97
+ .text-right { text-align: right; }
98
+
99
+ .text-xs { font-size: var(--fad-font-size-xs); }
100
+ .text-sm { font-size: var(--fad-font-size-sm); }
101
+ .text-md { font-size: var(--fad-font-size-md); }
102
+ .text-lg { font-size: var(--fad-font-size-lg); }
103
+ .text-xl { font-size: var(--fad-font-size-xl); }
104
+ .text-2xl { font-size: var(--fad-font-size-2xl); }
105
+
106
+ .font-normal { font-weight: var(--fad-font-weight-normal); }
107
+ .font-medium { font-weight: var(--fad-font-weight-medium); }
108
+ .font-semibold { font-weight: var(--fad-font-weight-semibold); }
109
+ .font-bold { font-weight: var(--fad-font-weight-bold); }
110
+
111
+ .text-primary { color: var(--fad-text-primary); }
112
+ .text-secondary { color: var(--fad-text-secondary); }
113
+ .text-muted { color: var(--fad-text-secondary); }
114
+ .text-success { color: var(--fad-success); }
115
+ .text-warning { color: var(--fad-warning); }
116
+ .text-danger { color: var(--fad-danger); }
117
+
118
+ .truncate {
119
+ overflow: hidden;
120
+ text-overflow: ellipsis;
121
+ white-space: nowrap;
122
+ }
123
+
124
+ /* ==========================================================================
125
+ * Visibility
126
+ * ========================================================================== */
127
+
128
+ .visible { visibility: visible; }
129
+ .invisible { visibility: hidden; }
130
+ .opacity-0 { opacity: 0; }
131
+ .opacity-50 { opacity: 0.5; }
132
+ .opacity-100 { opacity: 1; }
133
+
134
+ /* ==========================================================================
135
+ * Borders
136
+ * ========================================================================== */
137
+
138
+ .border { border: var(--fad-border-width) solid var(--fad-border-color); }
139
+ .border-0 { border: none; }
140
+ .border-top { border-top: var(--fad-border-width) solid var(--fad-border-color); }
141
+ .border-bottom { border-bottom: var(--fad-border-width) solid var(--fad-border-color); }
142
+
143
+ .rounded-sm { border-radius: var(--fad-radius-sm); }
144
+ .rounded-md { border-radius: var(--fad-radius-md); }
145
+ .rounded-lg { border-radius: var(--fad-radius-lg); }
146
+ .rounded-full { border-radius: var(--fad-radius-full); }
147
+
148
+ /* ==========================================================================
149
+ * Cursor
150
+ * ========================================================================== */
151
+
152
+ .cursor-pointer { cursor: pointer; }
153
+ .cursor-default { cursor: default; }
154
+ .cursor-not-allowed { cursor: not-allowed; }
155
+
156
+ /* ==========================================================================
157
+ * Overflow
158
+ * ========================================================================== */
159
+
160
+ .overflow-hidden { overflow: hidden; }
161
+ .overflow-auto { overflow: auto; }
162
+ .overflow-y-auto { overflow-y: auto; }
163
+ .overflow-x-auto { overflow-x: auto; }
164
+
165
+ /* ==========================================================================
166
+ * Position
167
+ * ========================================================================== */
168
+
169
+ .relative { position: relative; }
170
+ .absolute { position: absolute; }
171
+ .fixed { position: fixed; }
172
+ .sticky { position: sticky; }