mgv-backoffice 1.47.0 → 1.49.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 (43) hide show
  1. package/README.md +2099 -2072
  2. package/dist/components/BaseBooleanIcon.vue.d.ts +14 -0
  3. package/dist/components/BaseDetailList.vue.d.ts +13 -1
  4. package/dist/components/BasePageHeader.vue.d.ts +1 -1
  5. package/dist/components/BasePhotoViewer.vue.d.ts +24 -0
  6. package/dist/components/BaseRating.vue.d.ts +9 -0
  7. package/dist/components/BaseRowButton.vue.d.ts +18 -0
  8. package/dist/components/BaseSelect.vue.d.ts +15 -3
  9. package/dist/components/BaseSidebarUser.vue.d.ts +3 -0
  10. package/dist/components/BaseStatCard.vue.d.ts +6 -4
  11. package/dist/components/BaseTextarea.vue.d.ts +12 -0
  12. package/dist/composables/useRefreshOnReturn.d.ts +7 -0
  13. package/dist/index.d.ts +8 -1
  14. package/dist/types/photoViewer.d.ts +6 -0
  15. package/dist/ui-lib.css +1 -1
  16. package/dist/ui-lib.js +1050 -851
  17. package/dist/ui-lib.umd.cjs +1 -1
  18. package/dist/utils/format.d.ts +9 -0
  19. package/package.json +1 -1
  20. package/src/components/BaseBadge.vue +7 -7
  21. package/src/components/BaseBooleanIcon.vue +22 -0
  22. package/src/components/BaseDetailList.vue +50 -47
  23. package/src/components/BaseField.label.test.ts +30 -0
  24. package/src/components/BaseField.vue +19 -3
  25. package/src/components/BasePageHeader.test.ts +29 -0
  26. package/src/components/BasePageHeader.vue +137 -131
  27. package/src/components/BasePhotoViewer.test.ts +22 -0
  28. package/src/components/BasePhotoViewer.vue +93 -0
  29. package/src/components/BaseRating.test.ts +19 -0
  30. package/src/components/BaseRating.vue +21 -0
  31. package/src/components/BaseRowButton.vue +24 -0
  32. package/src/components/BaseSelect.vue +4 -2
  33. package/src/components/BaseSidebarUser.vue +85 -75
  34. package/src/components/BaseStatCard.vue +11 -3
  35. package/src/components/BaseTextarea.test.ts +17 -0
  36. package/src/components/BaseTextarea.vue +24 -0
  37. package/src/composables/useRefreshOnReturn.test.ts +47 -0
  38. package/src/composables/useRefreshOnReturn.ts +24 -0
  39. package/src/index.ts +10 -0
  40. package/src/style.css +132 -36
  41. package/src/types/photoViewer.ts +6 -0
  42. package/src/utils/format.test.ts +342 -322
  43. package/src/utils/format.ts +23 -0
package/src/style.css CHANGED
@@ -31,10 +31,106 @@
31
31
  over plain base utilities like bg-slate-50 on a cascade tie. */
32
32
  @custom-variant dark (&:is(.dark, .dark *));
33
33
 
34
+ /* Design system ("Night Terminal"): remapping the gray/slate/emerald ramps
35
+ restyles every lib component and every consumer utility, since they all
36
+ resolve colours via var() at runtime.
37
+ - gray/slate: one blue-tinted ramp (deep navy dark mode, cool paper light mode)
38
+ - emerald: terminal green, the brand accent
39
+ Deliberately a plain block, NOT `@theme`: `@theme` output lands in
40
+ `@layer theme`, where whichever stylesheet loads last wins, so a consumer
41
+ importing this file before its own `@import "tailwindcss"` would silently
42
+ get the default palette back. An unlayered rule beats every layer in any
43
+ import order. Consumers re-brand with their own plain `:root` block loaded
44
+ after this stylesheet. */
45
+ :root, :host {
46
+ --color-gray-50: #f6f8fc;
47
+ --color-gray-100: #eef1f8;
48
+ --color-gray-200: #dee4ef;
49
+ --color-gray-300: #c4cede;
50
+ --color-gray-400: #94a3bd;
51
+ --color-gray-500: #65748f;
52
+ --color-gray-600: #475572;
53
+ --color-gray-700: #33415c;
54
+ --color-gray-800: #1c2942;
55
+ --color-gray-900: #101a30;
56
+ --color-gray-950: #070d1d;
57
+
58
+ --color-slate-50: #f6f8fc;
59
+ --color-slate-100: #eef1f8;
60
+ --color-slate-200: #dee4ef;
61
+ --color-slate-300: #c4cede;
62
+ --color-slate-400: #94a3bd;
63
+ --color-slate-500: #65748f;
64
+ --color-slate-600: #475572;
65
+ --color-slate-700: #33415c;
66
+ --color-slate-800: #1c2942;
67
+ --color-slate-900: #101a30;
68
+ --color-slate-950: #070d1d;
69
+
70
+ --color-emerald-50: #eafbf4;
71
+ --color-emerald-100: #d0f7e6;
72
+ --color-emerald-200: #a4efd0;
73
+ --color-emerald-300: #6fe3b5;
74
+ --color-emerald-400: #3ad597;
75
+ --color-emerald-500: #16c784;
76
+ --color-emerald-600: #0e9f68;
77
+ --color-emerald-700: #0b7d52;
78
+ --color-emerald-800: #0c6343;
79
+ --color-emerald-900: #0a5138;
80
+ --color-emerald-950: #042e1f;
81
+
82
+ --radius-lg: 0.625rem;
83
+ --radius-xl: 0.875rem;
84
+ }
85
+
34
86
  /* Apply the brand font app-wide. Plain body rule (not preflight-dependent) so
35
- it also styles consumers whose own Tailwind preflight came earlier. */
87
+ it also styles consumers whose own Tailwind preflight came earlier.
88
+ Tabular numerals line up digits in KPI cards and tables. */
36
89
  body {
37
90
  font-family: var(--font-sans);
91
+ font-variant-numeric: tabular-nums;
92
+ text-rendering: optimizeLegibility;
93
+ }
94
+
95
+ /* Global polish. In `base` so component utilities (focus:outline-none,
96
+ cursor-*) still win. */
97
+ @layer base {
98
+ /* Keyboard-focus affordance in the accent colour (mouse clicks stay clean). */
99
+ :focus-visible {
100
+ outline: 2px solid var(--color-emerald-500);
101
+ outline-offset: 2px;
102
+ }
103
+
104
+ ::selection {
105
+ background: color-mix(in srgb, var(--color-emerald-500) 30%, transparent);
106
+ }
107
+
108
+ /* Slim, theme-aware scrollbars for data-dense tables and logs. */
109
+ * {
110
+ scrollbar-width: thin;
111
+ scrollbar-color: var(--color-gray-300) transparent;
112
+ }
113
+
114
+ .dark * {
115
+ scrollbar-color: var(--color-gray-700) transparent;
116
+ }
117
+
118
+ /* Tailwind v4 dropped the pointer cursor on buttons; restore it everywhere. */
119
+ button:not(:disabled),
120
+ [role="button"]:not([aria-disabled="true"]),
121
+ input[type="button"]:not(:disabled),
122
+ input[type="submit"]:not(:disabled),
123
+ input[type="reset"]:not(:disabled) {
124
+ cursor: pointer;
125
+ }
126
+
127
+ button:disabled,
128
+ [role="button"][aria-disabled="true"],
129
+ input[type="button"]:disabled,
130
+ input[type="submit"]:disabled,
131
+ input[type="reset"]:disabled {
132
+ cursor: not-allowed;
133
+ }
38
134
  }
39
135
 
40
136
  /* BaseDateTimePicker skin: re-point @vuepic/vue-datepicker's CSS variables at
@@ -53,46 +149,46 @@ html .dp--theme-dark {
53
149
  }
54
150
  html .dp--theme-light {
55
151
  --dp-background-color: #fff; /* white, like BaseInput */
56
- --dp-text-color: #0f172a; /* slate-900 */
57
- --dp-hover-color: #f1f5f9; /* slate-100 */
58
- --dp-hover-text-color: #0f172a;
59
- --dp-hover-icon-color: #64748b; /* slate-500 */
60
- --dp-icon-color: #94a3b8; /* slate-400 */
61
- --dp-primary-color: #059669; /* emerald-600 */
62
- --dp-primary-disabled-color: #6ee7b7; /* emerald-300 */
63
- --dp-secondary-color: #94a3b8;
64
- --dp-border-color: #cbd5e1; /* slate-300 */
65
- --dp-menu-border-color: #cbd5e1;
66
- --dp-border-color-hover: #94a3b8;
67
- --dp-border-color-focus: #10b981; /* emerald-500 */
68
- --dp-highlight-color: rgb(16 185 129 / 0.12);
69
- --dp-success-color: #10b981;
152
+ --dp-text-color: var(--color-slate-900);
153
+ --dp-hover-color: var(--color-slate-100);
154
+ --dp-hover-text-color: var(--color-slate-900);
155
+ --dp-hover-icon-color: var(--color-slate-500);
156
+ --dp-icon-color: var(--color-slate-400);
157
+ --dp-primary-color: var(--color-emerald-600);
158
+ --dp-primary-disabled-color: var(--color-emerald-300);
159
+ --dp-secondary-color: var(--color-slate-400);
160
+ --dp-border-color: var(--color-slate-300);
161
+ --dp-menu-border-color: var(--color-slate-300);
162
+ --dp-border-color-hover: var(--color-slate-400);
163
+ --dp-border-color-focus: var(--color-emerald-500);
164
+ --dp-highlight-color: color-mix(in srgb, var(--color-emerald-500) 12%, transparent);
165
+ --dp-success-color: var(--color-emerald-500);
70
166
  --dp-danger-color: #ef4444; /* red-500 */
71
167
  --dp-marker-color: #ef4444;
72
168
  }
73
169
  html .dp--theme-dark {
74
- --dp-background-color: #0f172a; /* slate-900 */
75
- --dp-text-color: #f1f5f9; /* slate-100 */
76
- --dp-hover-color: #1e293b; /* slate-800 */
77
- --dp-hover-text-color: #f1f5f9;
78
- --dp-hover-icon-color: #cbd5e1; /* slate-300 */
79
- --dp-icon-color: #64748b; /* slate-500 */
80
- --dp-primary-color: #059669; /* emerald-600 */
81
- --dp-primary-disabled-color: #065f46; /* emerald-800 */
82
- --dp-secondary-color: #64748b;
83
- --dp-border-color: #475569; /* slate-600 */
84
- --dp-menu-border-color: #334155; /* slate-700 */
85
- --dp-border-color-hover: #64748b;
86
- --dp-border-color-focus: #10b981; /* emerald-500 */
87
- --dp-highlight-color: rgb(16 185 129 / 0.2);
88
- --dp-disabled-color: #1e293b;
89
- --dp-disabled-color-text: #64748b;
90
- --dp-scroll-bar-background: #0f172a;
91
- --dp-scroll-bar-color: #334155;
92
- --dp-success-color: #10b981;
170
+ --dp-background-color: var(--color-slate-900);
171
+ --dp-text-color: var(--color-slate-100);
172
+ --dp-hover-color: var(--color-slate-800);
173
+ --dp-hover-text-color: var(--color-slate-100);
174
+ --dp-hover-icon-color: var(--color-slate-300);
175
+ --dp-icon-color: var(--color-slate-500);
176
+ --dp-primary-color: var(--color-emerald-600);
177
+ --dp-primary-disabled-color: var(--color-emerald-800);
178
+ --dp-secondary-color: var(--color-slate-500);
179
+ --dp-border-color: var(--color-slate-600);
180
+ --dp-menu-border-color: var(--color-slate-700);
181
+ --dp-border-color-hover: var(--color-slate-500);
182
+ --dp-border-color-focus: var(--color-emerald-500);
183
+ --dp-highlight-color: color-mix(in srgb, var(--color-emerald-500) 20%, transparent);
184
+ --dp-disabled-color: var(--color-slate-800);
185
+ --dp-disabled-color-text: var(--color-slate-500);
186
+ --dp-scroll-bar-background: var(--color-slate-900);
187
+ --dp-scroll-bar-color: var(--color-slate-700);
188
+ --dp-success-color: var(--color-emerald-500);
93
189
  --dp-danger-color: #ef4444;
94
190
  --dp-marker-color: #ef4444;
95
- --dp-tooltip-color: #1e293b;
191
+ --dp-tooltip-color: var(--color-slate-800);
96
192
  }
97
193
 
98
194
  /* BaseSelect: rounded, themed dropdown panel. Opt-in customizable <select>
@@ -161,7 +257,7 @@ html .dp--theme-dark {
161
257
  }
162
258
 
163
259
  .dark .base-select option:checked {
164
- background-color: rgb(16 185 129 / 0.15);
260
+ background-color: color-mix(in srgb, var(--color-emerald-500) 15%, transparent);
165
261
  color: var(--color-emerald-300);
166
262
  }
167
263
  }
@@ -0,0 +1,6 @@
1
+ /** One photo in a BasePhotoViewer. */
2
+ export interface ViewerPhoto {
3
+ src: string
4
+ label: string
5
+ caption?: string | null
6
+ }