@camp2gether/c2g-ui 0.0.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.
- package/README.md +95 -0
- package/charts/index.d.ts +199 -0
- package/fesm2022/camp2gether-c2g-ui-beach-animation-ipi3OoKW.mjs +54156 -0
- package/fesm2022/camp2gether-c2g-ui-beach-animation-ipi3OoKW.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-camping-animation-DY6XWXyF.mjs +35807 -0
- package/fesm2022/camp2gether-c2g-ui-camping-animation-DY6XWXyF.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-car-animation-DnDp7WfG.mjs +45189 -0
- package/fesm2022/camp2gether-c2g-ui-car-animation-DnDp7WfG.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-car-driving-landscape-animation-CawNeMKD.mjs +43833 -0
- package/fesm2022/camp2gether-c2g-ui-car-driving-landscape-animation-CawNeMKD.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-cat-love-animation-ewC7fZyY.mjs +30789 -0
- package/fesm2022/camp2gether-c2g-ui-cat-love-animation-ewC7fZyY.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-charts.mjs +404 -0
- package/fesm2022/camp2gether-c2g-ui-charts.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-checklist-animation-DqUkcLqI.mjs +19868 -0
- package/fesm2022/camp2gether-c2g-ui-checklist-animation-DqUkcLqI.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-coffee-time-animation-DQilaE0A.mjs +6816 -0
- package/fesm2022/camp2gether-c2g-ui-coffee-time-animation-DQilaE0A.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-error-404-pdjg-EHb.mjs +49742 -0
- package/fesm2022/camp2gether-c2g-ui-error-404-pdjg-EHb.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-fishing-animation-DwE3IF-V.mjs +38941 -0
- package/fesm2022/camp2gether-c2g-ui-fishing-animation-DwE3IF-V.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-layout.mjs +768 -0
- package/fesm2022/camp2gether-c2g-ui-layout.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-maps.mjs +223 -0
- package/fesm2022/camp2gether-c2g-ui-maps.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-mountain-search-animation-TebM1gS4.mjs +69245 -0
- package/fesm2022/camp2gether-c2g-ui-mountain-search-animation-TebM1gS4.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-planning-animation-D8QSsZk6.mjs +28330 -0
- package/fesm2022/camp2gether-c2g-ui-planning-animation-D8QSsZk6.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-presets.mjs +2855 -0
- package/fesm2022/camp2gether-c2g-ui-presets.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-share-animation-qgqs-k59.mjs +59129 -0
- package/fesm2022/camp2gether-c2g-ui-share-animation-qgqs-k59.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-summer-camp-animation-DPzirVNH.mjs +89317 -0
- package/fesm2022/camp2gether-c2g-ui-summer-camp-animation-DPzirVNH.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-theme.mjs +479 -0
- package/fesm2022/camp2gether-c2g-ui-theme.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-thinking-animation--X3er_pf.mjs +27929 -0
- package/fesm2022/camp2gether-c2g-ui-thinking-animation--X3er_pf.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-walking-avocado-animation-CQMU2C9-.mjs +4064 -0
- package/fesm2022/camp2gether-c2g-ui-walking-avocado-animation-CQMU2C9-.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-walking-orange-animation-CTJniCsF.mjs +3113 -0
- package/fesm2022/camp2gether-c2g-ui-walking-orange-animation-CTJniCsF.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui-weather-partly-cloudy-animation-Cnw3W4cS.mjs +1731 -0
- package/fesm2022/camp2gether-c2g-ui-weather-partly-cloudy-animation-Cnw3W4cS.mjs.map +1 -0
- package/fesm2022/camp2gether-c2g-ui.mjs +2099 -0
- package/fesm2022/camp2gether-c2g-ui.mjs.map +1 -0
- package/index.d.ts +578 -0
- package/layout/index.d.ts +443 -0
- package/maps/index.d.ts +62 -0
- package/package.json +51 -0
- package/presets/index.d.ts +1437 -0
- package/src/lib/styles/design-tokens.css +153 -0
- package/src/lib/styles/themes.scss +346 -0
- package/theme/index.d.ts +63 -0
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, PLATFORM_ID, DestroyRef, signal, computed, effect, Injectable, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { isPlatformBrowser, CommonModule } from '@angular/common';
|
|
4
|
+
import * as i1 from '@angular/material/button';
|
|
5
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
+
import * as i2 from '@angular/material/icon';
|
|
7
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
8
|
+
import * as i3 from '@angular/material/menu';
|
|
9
|
+
import { MatMenuModule } from '@angular/material/menu';
|
|
10
|
+
import * as i4 from '@angular/material/tooltip';
|
|
11
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
12
|
+
import * as i5 from '@ngx-translate/core';
|
|
13
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
14
|
+
import { HighContrastModeDetector } from '@angular/cdk/a11y';
|
|
15
|
+
|
|
16
|
+
class ThemeService {
|
|
17
|
+
platformId = inject(PLATFORM_ID);
|
|
18
|
+
destroyRef = inject(DestroyRef);
|
|
19
|
+
// Initialize signals in the injection context
|
|
20
|
+
_currentTheme = signal(this.getInitialTheme(), ...(ngDevMode ? [{ debugName: "_currentTheme" }] : []));
|
|
21
|
+
_isSystemDark = signal(this.getInitialSystemPreference(), ...(ngDevMode ? [{ debugName: "_isSystemDark" }] : []));
|
|
22
|
+
// Media query listener cleanup
|
|
23
|
+
mediaQueryCleanup;
|
|
24
|
+
// Public signals
|
|
25
|
+
currentTheme = this._currentTheme.asReadonly();
|
|
26
|
+
isSystemDark = this._isSystemDark.asReadonly();
|
|
27
|
+
// Computed signal for effective theme
|
|
28
|
+
effectiveTheme = computed(() => {
|
|
29
|
+
const current = this._currentTheme();
|
|
30
|
+
if (current === 'auto') {
|
|
31
|
+
return this._isSystemDark() ? 'dark' : 'light';
|
|
32
|
+
}
|
|
33
|
+
return current;
|
|
34
|
+
}, ...(ngDevMode ? [{ debugName: "effectiveTheme" }] : []));
|
|
35
|
+
// Computed signals for theme checks
|
|
36
|
+
isLightTheme = computed(() => this.effectiveTheme() === 'light', ...(ngDevMode ? [{ debugName: "isLightTheme" }] : []));
|
|
37
|
+
isDarkTheme = computed(() => this.effectiveTheme() === 'dark', ...(ngDevMode ? [{ debugName: "isDarkTheme" }] : []));
|
|
38
|
+
isHighContrastTheme = computed(() => this._currentTheme() === 'high-contrast', ...(ngDevMode ? [{ debugName: "isHighContrastTheme" }] : []));
|
|
39
|
+
constructor() {
|
|
40
|
+
// Set up effects and watchers only in browser environment
|
|
41
|
+
if (isPlatformBrowser(this.platformId)) {
|
|
42
|
+
this.initializeBrowserFeatures();
|
|
43
|
+
}
|
|
44
|
+
// Register cleanup on destroy
|
|
45
|
+
this.destroyRef.onDestroy(() => {
|
|
46
|
+
this.cleanup();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
initializeBrowserFeatures() {
|
|
50
|
+
// Effect to apply theme changes to DOM
|
|
51
|
+
effect(() => {
|
|
52
|
+
const theme = this._currentTheme();
|
|
53
|
+
this.applyThemeToDOM(theme);
|
|
54
|
+
});
|
|
55
|
+
// Effect to persist theme changes to localStorage
|
|
56
|
+
effect(() => {
|
|
57
|
+
const theme = this._currentTheme();
|
|
58
|
+
localStorage.setItem('c2g-theme', theme);
|
|
59
|
+
});
|
|
60
|
+
// Watch for system preference changes
|
|
61
|
+
this.watchSystemPreference();
|
|
62
|
+
}
|
|
63
|
+
getInitialTheme() {
|
|
64
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
65
|
+
return 'light';
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
const stored = localStorage.getItem('c2g-theme');
|
|
69
|
+
return ['light', 'dark', 'auto', 'high-contrast'].includes(stored) ? stored : 'light';
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return 'light';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
getInitialSystemPreference() {
|
|
76
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
return window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
watchSystemPreference() {
|
|
87
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
92
|
+
const handler = (event) => {
|
|
93
|
+
this._isSystemDark.set(event.matches);
|
|
94
|
+
};
|
|
95
|
+
// Set initial value
|
|
96
|
+
this._isSystemDark.set(mediaQuery.matches);
|
|
97
|
+
// Listen for changes
|
|
98
|
+
mediaQuery.addEventListener('change', handler);
|
|
99
|
+
// Store cleanup function
|
|
100
|
+
this.mediaQueryCleanup = () => {
|
|
101
|
+
mediaQuery.removeEventListener('change', handler);
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.warn('Failed to watch system preference changes:', error);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
applyThemeToDOM(theme) {
|
|
109
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
const body = document.body;
|
|
114
|
+
// Remove all theme classes
|
|
115
|
+
body.classList.remove('theme-light', 'theme-dark', 'theme-auto', 'theme-high-contrast');
|
|
116
|
+
// Add the new theme class
|
|
117
|
+
body.classList.add(`theme-${theme}`);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.warn('Failed to apply theme to DOM:', error);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Public methods
|
|
124
|
+
setTheme(theme) {
|
|
125
|
+
this._currentTheme.set(theme);
|
|
126
|
+
}
|
|
127
|
+
toggleTheme() {
|
|
128
|
+
const current = this._currentTheme();
|
|
129
|
+
const next = current === 'light' ? 'dark' : 'light';
|
|
130
|
+
this.setTheme(next);
|
|
131
|
+
}
|
|
132
|
+
resetToSystemPreference() {
|
|
133
|
+
this.setTheme('auto');
|
|
134
|
+
}
|
|
135
|
+
// Legacy method compatibility (if needed)
|
|
136
|
+
getCurrentTheme() {
|
|
137
|
+
return this._currentTheme();
|
|
138
|
+
}
|
|
139
|
+
getEffectiveTheme() {
|
|
140
|
+
return this.effectiveTheme();
|
|
141
|
+
}
|
|
142
|
+
cleanup() {
|
|
143
|
+
// Clean up media query listeners
|
|
144
|
+
if (this.mediaQueryCleanup) {
|
|
145
|
+
this.mediaQueryCleanup();
|
|
146
|
+
this.mediaQueryCleanup = undefined;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
150
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ThemeService, providedIn: 'root' });
|
|
151
|
+
}
|
|
152
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ThemeService, decorators: [{
|
|
153
|
+
type: Injectable,
|
|
154
|
+
args: [{
|
|
155
|
+
providedIn: 'root'
|
|
156
|
+
}]
|
|
157
|
+
}], ctorParameters: () => [] });
|
|
158
|
+
|
|
159
|
+
class ThemeSwitcherComponent {
|
|
160
|
+
themeService = inject(ThemeService);
|
|
161
|
+
// Use signals for reactive updates
|
|
162
|
+
currentTheme = this.themeService.currentTheme;
|
|
163
|
+
// Computed signal for theme icon
|
|
164
|
+
themeIcon = computed(() => {
|
|
165
|
+
const current = this.currentTheme();
|
|
166
|
+
const option = this.themeOptions.find(opt => opt.value === current);
|
|
167
|
+
return option?.icon || 'brightness_auto';
|
|
168
|
+
}, ...(ngDevMode ? [{ debugName: "themeIcon" }] : []));
|
|
169
|
+
themeOptions = [
|
|
170
|
+
{
|
|
171
|
+
value: 'light',
|
|
172
|
+
label: 'theme.options.light',
|
|
173
|
+
icon: 'light_mode'
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
value: 'dark',
|
|
177
|
+
label: 'theme.options.dark',
|
|
178
|
+
icon: 'dark_mode'
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
value: 'auto',
|
|
182
|
+
label: 'theme.options.auto',
|
|
183
|
+
icon: 'brightness_auto'
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
value: 'high-contrast',
|
|
187
|
+
label: 'theme.options.highContrast',
|
|
188
|
+
icon: 'contrast'
|
|
189
|
+
}
|
|
190
|
+
];
|
|
191
|
+
selectTheme(theme) {
|
|
192
|
+
this.themeService.setTheme(theme);
|
|
193
|
+
}
|
|
194
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ThemeSwitcherComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
195
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: ThemeSwitcherComponent, isStandalone: true, selector: "c2g-theme-switcher", ngImport: i0, template: `
|
|
196
|
+
<button
|
|
197
|
+
mat-icon-button
|
|
198
|
+
[matMenuTriggerFor]="themeMenu"
|
|
199
|
+
[matTooltip]="'theme.switcher.tooltip' | translate"
|
|
200
|
+
class="theme-switcher-button"
|
|
201
|
+
aria-label="Choose theme">
|
|
202
|
+
<mat-icon>{{ themeIcon() }}</mat-icon>
|
|
203
|
+
</button>
|
|
204
|
+
|
|
205
|
+
<mat-menu #themeMenu="matMenu" class="theme-menu">
|
|
206
|
+
@for (option of themeOptions; track option.value) {
|
|
207
|
+
<button
|
|
208
|
+
mat-menu-item
|
|
209
|
+
(click)="selectTheme(option.value)"
|
|
210
|
+
[class.active]="currentTheme() === option.value">
|
|
211
|
+
<mat-icon>{{ option.icon }}</mat-icon>
|
|
212
|
+
<span>{{ option.label | translate }}</span>
|
|
213
|
+
@if (currentTheme() === option.value) {
|
|
214
|
+
<mat-icon class="selected-indicator">
|
|
215
|
+
check
|
|
216
|
+
</mat-icon>
|
|
217
|
+
}
|
|
218
|
+
</button>
|
|
219
|
+
}
|
|
220
|
+
</mat-menu>
|
|
221
|
+
`, isInline: true, styles: [".theme-switcher-button{color:var(--c2g-color-text-primary);transition:color var(--c2g-transition-fast)}.theme-switcher-button:hover{color:var(--c2g-color-primary)}.theme-menu .mat-mdc-menu-item{display:flex;align-items:center;gap:var(--c2g-space-2);color:var(--c2g-color-text-primary)}.theme-menu .mat-mdc-menu-item.active{background-color:var(--c2g-color-primary-container);color:var(--c2g-color-on-primary-container)}.theme-menu .mat-mdc-menu-item:hover{background-color:var(--c2g-color-surface-container-high)}.theme-menu .mat-mdc-menu-item .selected-indicator{margin-left:auto;color:var(--c2g-color-primary)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
222
|
+
}
|
|
223
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ThemeSwitcherComponent, decorators: [{
|
|
224
|
+
type: Component,
|
|
225
|
+
args: [{ selector: 'c2g-theme-switcher', standalone: true, imports: [
|
|
226
|
+
CommonModule,
|
|
227
|
+
MatButtonModule,
|
|
228
|
+
MatIconModule,
|
|
229
|
+
MatMenuModule,
|
|
230
|
+
MatTooltipModule,
|
|
231
|
+
TranslateModule
|
|
232
|
+
], template: `
|
|
233
|
+
<button
|
|
234
|
+
mat-icon-button
|
|
235
|
+
[matMenuTriggerFor]="themeMenu"
|
|
236
|
+
[matTooltip]="'theme.switcher.tooltip' | translate"
|
|
237
|
+
class="theme-switcher-button"
|
|
238
|
+
aria-label="Choose theme">
|
|
239
|
+
<mat-icon>{{ themeIcon() }}</mat-icon>
|
|
240
|
+
</button>
|
|
241
|
+
|
|
242
|
+
<mat-menu #themeMenu="matMenu" class="theme-menu">
|
|
243
|
+
@for (option of themeOptions; track option.value) {
|
|
244
|
+
<button
|
|
245
|
+
mat-menu-item
|
|
246
|
+
(click)="selectTheme(option.value)"
|
|
247
|
+
[class.active]="currentTheme() === option.value">
|
|
248
|
+
<mat-icon>{{ option.icon }}</mat-icon>
|
|
249
|
+
<span>{{ option.label | translate }}</span>
|
|
250
|
+
@if (currentTheme() === option.value) {
|
|
251
|
+
<mat-icon class="selected-indicator">
|
|
252
|
+
check
|
|
253
|
+
</mat-icon>
|
|
254
|
+
}
|
|
255
|
+
</button>
|
|
256
|
+
}
|
|
257
|
+
</mat-menu>
|
|
258
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".theme-switcher-button{color:var(--c2g-color-text-primary);transition:color var(--c2g-transition-fast)}.theme-switcher-button:hover{color:var(--c2g-color-primary)}.theme-menu .mat-mdc-menu-item{display:flex;align-items:center;gap:var(--c2g-space-2);color:var(--c2g-color-text-primary)}.theme-menu .mat-mdc-menu-item.active{background-color:var(--c2g-color-primary-container);color:var(--c2g-color-on-primary-container)}.theme-menu .mat-mdc-menu-item:hover{background-color:var(--c2g-color-surface-container-high)}.theme-menu .mat-mdc-menu-item .selected-indicator{margin-left:auto;color:var(--c2g-color-primary)}\n"] }]
|
|
259
|
+
}] });
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Providers for the C2G Theme system that includes all necessary CDK dependencies
|
|
263
|
+
*/
|
|
264
|
+
const C2G_THEME_PROVIDERS = [
|
|
265
|
+
HighContrastModeDetector,
|
|
266
|
+
];
|
|
267
|
+
/**
|
|
268
|
+
* Mock providers for testing or SSR environments where CDK might not be needed
|
|
269
|
+
*/
|
|
270
|
+
const C2G_THEME_MOCK_PROVIDERS = [
|
|
271
|
+
{
|
|
272
|
+
provide: HighContrastModeDetector,
|
|
273
|
+
useValue: {
|
|
274
|
+
_platform: { isBrowser: false },
|
|
275
|
+
isHighContrast: () => false
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
];
|
|
279
|
+
/**
|
|
280
|
+
* Smart provider factory that chooses appropriate providers based on environment
|
|
281
|
+
*/
|
|
282
|
+
function getC2GThemeProviders() {
|
|
283
|
+
try {
|
|
284
|
+
// Try to create HighContrastModeDetector - if it fails, use mock
|
|
285
|
+
return C2G_THEME_PROVIDERS;
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
return C2G_THEME_MOCK_PROVIDERS;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const de = {
|
|
293
|
+
c2g: {
|
|
294
|
+
loader: { label: 'Laden...' },
|
|
295
|
+
skeleton: { loading: 'Inhalt wird geladen...' },
|
|
296
|
+
alert: {
|
|
297
|
+
close: 'Schliessen',
|
|
298
|
+
demo: {
|
|
299
|
+
info_title: 'Reisehinweis',
|
|
300
|
+
info_message: 'Deine Packliste wurde mit den aktuellen Wetterdaten synchronisiert.',
|
|
301
|
+
success_title: 'Liste gespeichert',
|
|
302
|
+
success_message: 'Deine Packliste wurde erfolgreich gespeichert.',
|
|
303
|
+
warning_title: 'Reisepass erforderlich',
|
|
304
|
+
warning_message: 'Denke daran, deine Reisedokumente einzupacken.',
|
|
305
|
+
danger_title: 'Artikel fehlt',
|
|
306
|
+
danger_message: 'Drei erforderliche Artikel sind noch nicht eingepackt.',
|
|
307
|
+
},
|
|
308
|
+
},
|
|
309
|
+
progress: { label: 'Fortschritt' },
|
|
310
|
+
lottie: { label: 'Ladeanimation' },
|
|
311
|
+
button: {
|
|
312
|
+
submit: 'Absenden',
|
|
313
|
+
cancel: 'Abbrechen',
|
|
314
|
+
save: 'Speichern',
|
|
315
|
+
add_item: 'Artikel hinzufügen',
|
|
316
|
+
invite: 'Mitglied einladen',
|
|
317
|
+
},
|
|
318
|
+
danger_zone: {
|
|
319
|
+
default: { heading: 'Gefahrenzone' },
|
|
320
|
+
group: {
|
|
321
|
+
transfer_ownership: { title: 'Eigentümerschaft übertragen', description: 'Gruppe an ein anderes Mitglied übergeben', action: 'Übertragen', aria_label: 'Eigentümerschaft übertragen' },
|
|
322
|
+
delete_group: { title: 'Gruppe löschen', description: 'Löscht die Gruppe dauerhaft. Diese Aktion kann nicht rückgängig gemacht werden.', action: 'Löschen', aria_label: 'Gruppe löschen' },
|
|
323
|
+
leave_group: { title: 'Gruppe verlassen', description: 'Du verlässt diese Gruppe. Du kannst später wieder beitreten.', action: 'Verlassen', aria_label: 'Gruppe verlassen' },
|
|
324
|
+
},
|
|
325
|
+
},
|
|
326
|
+
input: {
|
|
327
|
+
destination: { label: 'Reiseziel', placeholder: 'z.B. Barcelona', hint: 'Gib die Stadt oder Region deiner Reise ein' },
|
|
328
|
+
email: { label: 'E-Mail-Adresse', placeholder: 'du@beispiel.com', hint: 'Wir senden deine Reisebestätigung hierher' },
|
|
329
|
+
},
|
|
330
|
+
textarea: {
|
|
331
|
+
notes: { label: 'Packnotizen', placeholder: 'Notizen zur Packliste hinzufügen...', hint: 'Wird mit allen Gruppenmitgliedern geteilt' },
|
|
332
|
+
},
|
|
333
|
+
badge: { new: 'Neu', required: 'Pflichtangabe', optional: 'Optional', packed: 'Eingepackt', missing: 'Fehlt' },
|
|
334
|
+
chip: { remove_label: 'Entfernen' },
|
|
335
|
+
tag: { clothing: 'Kleidung', documents: 'Dokumente', electronics: 'Elektronik', toiletries: 'Pflegeartikel' },
|
|
336
|
+
switch: { label: 'Aktiv', notifications: 'Reise-Benachrichtigungen', shared: 'Geteilte Liste' },
|
|
337
|
+
checkbox: { packed: 'Als eingepackt markieren', agree: 'Ich stimme den Bedingungen zu', required: 'Pflichtartikel' },
|
|
338
|
+
radio: {
|
|
339
|
+
legend: 'Optionen',
|
|
340
|
+
trip_type: { legend: 'Reiseart', beach: 'Strand', city: 'Städtereise', hiking: 'Wandern', business: 'Geschäftsreise' },
|
|
341
|
+
},
|
|
342
|
+
segmented_toggle: { view_list: 'Liste', view_grid: 'Raster', view_map: 'Karte' },
|
|
343
|
+
},
|
|
344
|
+
packingList: {
|
|
345
|
+
search: { placeholder: 'Artikel suchen...' },
|
|
346
|
+
filters: {
|
|
347
|
+
essentialsOnly: 'Nur Pflichtartikel',
|
|
348
|
+
visibility: { all: 'Alle', shared: 'Geteilt', personal: 'Persönlich', private: 'Privat' },
|
|
349
|
+
},
|
|
350
|
+
private: { title: 'Private Artikel' },
|
|
351
|
+
empty: 'Keine Artikel vorhanden',
|
|
352
|
+
category: { stats: '{{packed}}/{{total}} eingepackt' },
|
|
353
|
+
delete: { confirm: 'Artikel wirklich löschen?' },
|
|
354
|
+
addItem: 'Artikel hinzufügen',
|
|
355
|
+
createItem: 'Artikel erstellen',
|
|
356
|
+
itemName: 'Bezeichnung',
|
|
357
|
+
category_label: 'Kategorie',
|
|
358
|
+
visibility: 'Sichtbarkeit',
|
|
359
|
+
essential: 'Pflichtartikel',
|
|
360
|
+
quantity: 'Menge',
|
|
361
|
+
weight: 'Gewicht (kg)',
|
|
362
|
+
volume: 'Volumen (L)',
|
|
363
|
+
hint: 'Hinweis',
|
|
364
|
+
cancel: 'Abbrechen',
|
|
365
|
+
create: 'Erstellen',
|
|
366
|
+
categories: {
|
|
367
|
+
shelter: 'Unterkunft',
|
|
368
|
+
sleeping: 'Schlafen',
|
|
369
|
+
cooking: 'Kochen',
|
|
370
|
+
clothing: 'Kleidung',
|
|
371
|
+
safety: 'Sicherheit',
|
|
372
|
+
navigation: 'Navigation',
|
|
373
|
+
hygiene: 'Hygiene',
|
|
374
|
+
medical: 'Medizin',
|
|
375
|
+
electronics: 'Elektronik',
|
|
376
|
+
documents: 'Dokumente',
|
|
377
|
+
entertainment: 'Unterhaltung',
|
|
378
|
+
other: 'Sonstiges',
|
|
379
|
+
},
|
|
380
|
+
},
|
|
381
|
+
};
|
|
382
|
+
const en = {
|
|
383
|
+
c2g: {
|
|
384
|
+
loader: { label: 'Loading...' },
|
|
385
|
+
skeleton: { loading: 'Content loading...' },
|
|
386
|
+
alert: {
|
|
387
|
+
close: 'Dismiss',
|
|
388
|
+
demo: {
|
|
389
|
+
info_title: 'Trip Update',
|
|
390
|
+
info_message: 'Your packing list has been synced with the latest weather data.',
|
|
391
|
+
success_title: 'List Saved',
|
|
392
|
+
success_message: 'Your packing list was saved successfully.',
|
|
393
|
+
warning_title: 'Passport Required',
|
|
394
|
+
warning_message: 'Remember to pack your travel documents.',
|
|
395
|
+
danger_title: 'Item Missing',
|
|
396
|
+
danger_message: 'Three required items are still unpacked.',
|
|
397
|
+
},
|
|
398
|
+
},
|
|
399
|
+
progress: { label: 'Progress' },
|
|
400
|
+
lottie: { label: 'Loading animation' },
|
|
401
|
+
button: {
|
|
402
|
+
submit: 'Submit',
|
|
403
|
+
cancel: 'Cancel',
|
|
404
|
+
save: 'Save',
|
|
405
|
+
add_item: 'Add Item',
|
|
406
|
+
invite: 'Invite Member',
|
|
407
|
+
},
|
|
408
|
+
danger_zone: {
|
|
409
|
+
default: { heading: 'Danger Zone' },
|
|
410
|
+
group: {
|
|
411
|
+
transfer_ownership: { title: 'Transfer ownership', description: 'Hand the group over to another member.', action: 'Transfer', aria_label: 'Transfer ownership' },
|
|
412
|
+
delete_group: { title: 'Delete group', description: 'Deletes the group permanently. This action cannot be undone.', action: 'Delete', aria_label: 'Delete group' },
|
|
413
|
+
leave_group: { title: 'Leave group', description: 'You leave this group. You can join again later.', action: 'Leave', aria_label: 'Leave group' },
|
|
414
|
+
},
|
|
415
|
+
},
|
|
416
|
+
input: {
|
|
417
|
+
destination: { label: 'Destination', placeholder: 'e.g. Barcelona', hint: 'Enter the city or region of your trip' },
|
|
418
|
+
email: { label: 'Email address', placeholder: 'you@example.com', hint: 'We will send your trip confirmation here' },
|
|
419
|
+
},
|
|
420
|
+
textarea: {
|
|
421
|
+
notes: { label: 'Packing notes', placeholder: 'Add notes about your packing list...', hint: 'Shared with all group members' },
|
|
422
|
+
},
|
|
423
|
+
badge: { new: 'New', required: 'Required', optional: 'Optional', packed: 'Packed', missing: 'Missing' },
|
|
424
|
+
chip: { remove_label: 'Remove' },
|
|
425
|
+
tag: { clothing: 'Clothing', documents: 'Documents', electronics: 'Electronics', toiletries: 'Toiletries' },
|
|
426
|
+
switch: { label: 'Active', notifications: 'Trip notifications', shared: 'Shared list' },
|
|
427
|
+
checkbox: { packed: 'Marked as packed', agree: 'I agree to the terms', required: 'Required item' },
|
|
428
|
+
radio: {
|
|
429
|
+
legend: 'Options',
|
|
430
|
+
trip_type: { legend: 'Trip type', beach: 'Beach', city: 'City trip', hiking: 'Hiking', business: 'Business' },
|
|
431
|
+
},
|
|
432
|
+
segmented_toggle: { view_list: 'List', view_grid: 'Grid', view_map: 'Map' },
|
|
433
|
+
},
|
|
434
|
+
packingList: {
|
|
435
|
+
search: { placeholder: 'Search items...' },
|
|
436
|
+
filters: {
|
|
437
|
+
essentialsOnly: 'Essentials only',
|
|
438
|
+
visibility: { all: 'All', shared: 'Shared', personal: 'Personal', private: 'Private' },
|
|
439
|
+
},
|
|
440
|
+
private: { title: 'Private Items' },
|
|
441
|
+
empty: 'No items yet',
|
|
442
|
+
category: { stats: '{{packed}}/{{total}} packed' },
|
|
443
|
+
delete: { confirm: 'Delete this item?' },
|
|
444
|
+
addItem: 'Add item',
|
|
445
|
+
createItem: 'Create item',
|
|
446
|
+
itemName: 'Name',
|
|
447
|
+
category_label: 'Category',
|
|
448
|
+
visibility: 'Visibility',
|
|
449
|
+
essential: 'Essential',
|
|
450
|
+
quantity: 'Quantity',
|
|
451
|
+
weight: 'Weight (kg)',
|
|
452
|
+
volume: 'Volume (L)',
|
|
453
|
+
hint: 'Hint',
|
|
454
|
+
cancel: 'Cancel',
|
|
455
|
+
create: 'Create',
|
|
456
|
+
categories: {
|
|
457
|
+
shelter: 'Shelter',
|
|
458
|
+
sleeping: 'Sleeping',
|
|
459
|
+
cooking: 'Cooking',
|
|
460
|
+
clothing: 'Clothing',
|
|
461
|
+
safety: 'Safety',
|
|
462
|
+
navigation: 'Navigation',
|
|
463
|
+
hygiene: 'Hygiene',
|
|
464
|
+
medical: 'Medical',
|
|
465
|
+
electronics: 'Electronics',
|
|
466
|
+
documents: 'Documents',
|
|
467
|
+
entertainment: 'Entertainment',
|
|
468
|
+
other: 'Other',
|
|
469
|
+
},
|
|
470
|
+
},
|
|
471
|
+
};
|
|
472
|
+
const C2G_TRANSLATIONS = { de, en };
|
|
473
|
+
|
|
474
|
+
/**
|
|
475
|
+
* Generated bundle index. Do not edit.
|
|
476
|
+
*/
|
|
477
|
+
|
|
478
|
+
export { C2G_THEME_MOCK_PROVIDERS, C2G_THEME_PROVIDERS, C2G_TRANSLATIONS, ThemeService, ThemeSwitcherComponent, getC2GThemeProviders };
|
|
479
|
+
//# sourceMappingURL=camp2gether-c2g-ui-theme.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camp2gether-c2g-ui-theme.mjs","sources":["../../../projects/c2g-ui/theme/theme/theme.service.ts","../../../projects/c2g-ui/theme/theme/theme-switcher.component.ts","../../../projects/c2g-ui/theme/theme/theme.providers.ts","../../../projects/c2g-ui/theme/i18n/translations.ts","../../../projects/c2g-ui/theme/camp2gether-c2g-ui-theme.ts"],"sourcesContent":["import { Injectable, PLATFORM_ID, inject, signal, computed, effect, DestroyRef } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\nexport type ThemeMode = 'light' | 'dark' | 'auto' | 'high-contrast';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemeService {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n \n // Initialize signals in the injection context\n private readonly _currentTheme = signal<ThemeMode>(this.getInitialTheme());\n private readonly _isSystemDark = signal<boolean>(this.getInitialSystemPreference());\n \n // Media query listener cleanup\n private mediaQueryCleanup?: () => void;\n\n // Public signals\n readonly currentTheme = this._currentTheme.asReadonly();\n readonly isSystemDark = this._isSystemDark.asReadonly();\n\n // Computed signal for effective theme\n readonly effectiveTheme = computed<ThemeMode>(() => {\n const current = this._currentTheme();\n if (current === 'auto') {\n return this._isSystemDark() ? 'dark' : 'light';\n }\n return current;\n });\n\n // Computed signals for theme checks\n readonly isLightTheme = computed(() => this.effectiveTheme() === 'light');\n readonly isDarkTheme = computed(() => this.effectiveTheme() === 'dark');\n readonly isHighContrastTheme = computed(() => this._currentTheme() === 'high-contrast');\n\n constructor() {\n // Set up effects and watchers only in browser environment\n if (isPlatformBrowser(this.platformId)) {\n this.initializeBrowserFeatures();\n }\n \n // Register cleanup on destroy\n this.destroyRef.onDestroy(() => {\n this.cleanup();\n });\n }\n\n private initializeBrowserFeatures(): void {\n // Effect to apply theme changes to DOM\n effect(() => {\n const theme = this._currentTheme();\n this.applyThemeToDOM(theme);\n });\n\n // Effect to persist theme changes to localStorage\n effect(() => {\n const theme = this._currentTheme();\n localStorage.setItem('c2g-theme', theme);\n });\n\n // Watch for system preference changes\n this.watchSystemPreference();\n }\n\n private getInitialTheme(): ThemeMode {\n if (!isPlatformBrowser(this.platformId)) {\n return 'light';\n }\n \n try {\n const stored = localStorage.getItem('c2g-theme') as ThemeMode;\n return ['light', 'dark', 'auto', 'high-contrast'].includes(stored) ? stored : 'light';\n } catch {\n return 'light';\n }\n }\n\n private getInitialSystemPreference(): boolean {\n if (!isPlatformBrowser(this.platformId)) {\n return false;\n }\n \n try {\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n } catch {\n return false;\n }\n }\n\n private watchSystemPreference(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n try {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n \n const handler = (event: MediaQueryListEvent) => {\n this._isSystemDark.set(event.matches);\n };\n\n // Set initial value\n this._isSystemDark.set(mediaQuery.matches);\n \n // Listen for changes\n mediaQuery.addEventListener('change', handler);\n \n // Store cleanup function\n this.mediaQueryCleanup = () => {\n mediaQuery.removeEventListener('change', handler);\n };\n } catch (error) {\n console.warn('Failed to watch system preference changes:', error);\n }\n }\n\n private applyThemeToDOM(theme: ThemeMode): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n try {\n const body = document.body;\n \n // Remove all theme classes\n body.classList.remove('theme-light', 'theme-dark', 'theme-auto', 'theme-high-contrast');\n \n // Add the new theme class\n body.classList.add(`theme-${theme}`);\n } catch (error) {\n console.warn('Failed to apply theme to DOM:', error);\n }\n }\n\n // Public methods\n setTheme(theme: ThemeMode): void {\n this._currentTheme.set(theme);\n }\n\n toggleTheme(): void {\n const current = this._currentTheme();\n const next = current === 'light' ? 'dark' : 'light';\n this.setTheme(next);\n }\n\n resetToSystemPreference(): void {\n this.setTheme('auto');\n }\n\n // Legacy method compatibility (if needed)\n getCurrentTheme(): ThemeMode {\n return this._currentTheme();\n }\n\n getEffectiveTheme(): ThemeMode {\n return this.effectiveTheme();\n }\n\n private cleanup(): void {\n // Clean up media query listeners\n if (this.mediaQueryCleanup) {\n this.mediaQueryCleanup();\n this.mediaQueryCleanup = undefined;\n }\n }\n}","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ThemeService, ThemeMode } from './theme.service';\n\n@Component({\n selector: 'c2g-theme-switcher',\n standalone: true,\n imports: [\n CommonModule,\n MatButtonModule,\n MatIconModule,\n MatMenuModule,\n MatTooltipModule,\n TranslateModule\n ],\n template: `\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"themeMenu\"\n [matTooltip]=\"'theme.switcher.tooltip' | translate\"\n class=\"theme-switcher-button\"\n aria-label=\"Choose theme\">\n <mat-icon>{{ themeIcon() }}</mat-icon>\n </button>\n\n <mat-menu #themeMenu=\"matMenu\" class=\"theme-menu\">\n @for (option of themeOptions; track option.value) {\n <button\n mat-menu-item\n (click)=\"selectTheme(option.value)\"\n [class.active]=\"currentTheme() === option.value\">\n <mat-icon>{{ option.icon }}</mat-icon>\n <span>{{ option.label | translate }}</span>\n @if (currentTheme() === option.value) {\n <mat-icon class=\"selected-indicator\">\n check\n </mat-icon>\n }\n </button>\n }\n </mat-menu>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`\n .theme-switcher-button {\n color: var(--c2g-color-text-primary);\n transition: color var(--c2g-transition-fast);\n }\n\n .theme-switcher-button:hover {\n color: var(--c2g-color-primary);\n }\n\n .theme-menu {\n .mat-mdc-menu-item {\n display: flex;\n align-items: center;\n gap: var(--c2g-space-2);\n color: var(--c2g-color-text-primary);\n \n &.active {\n background-color: var(--c2g-color-primary-container);\n color: var(--c2g-color-on-primary-container);\n }\n\n &:hover {\n background-color: var(--c2g-color-surface-container-high);\n }\n\n .selected-indicator {\n margin-left: auto;\n color: var(--c2g-color-primary);\n }\n }\n }\n `]\n})\nexport class ThemeSwitcherComponent {\n protected readonly themeService = inject(ThemeService);\n\n // Use signals for reactive updates\n protected readonly currentTheme = this.themeService.currentTheme;\n \n // Computed signal for theme icon\n protected readonly themeIcon = computed(() => {\n const current = this.currentTheme();\n const option = this.themeOptions.find(opt => opt.value === current);\n return option?.icon || 'brightness_auto';\n });\n\n protected readonly themeOptions = [\n { \n value: 'light' as ThemeMode, \n label: 'theme.options.light', \n icon: 'light_mode' \n },\n { \n value: 'dark' as ThemeMode, \n label: 'theme.options.dark', \n icon: 'dark_mode' \n },\n { \n value: 'auto' as ThemeMode, \n label: 'theme.options.auto', \n icon: 'brightness_auto' \n },\n { \n value: 'high-contrast' as ThemeMode, \n label: 'theme.options.highContrast', \n icon: 'contrast' \n }\n ];\n\n protected selectTheme(theme: ThemeMode): void {\n this.themeService.setTheme(theme);\n }\n}","import { Provider } from '@angular/core';\nimport { HighContrastModeDetector } from '@angular/cdk/a11y';\n\n/**\n * Providers for the C2G Theme system that includes all necessary CDK dependencies\n */\nexport const C2G_THEME_PROVIDERS: Provider[] = [\n HighContrastModeDetector,\n];\n\n/**\n * Mock providers for testing or SSR environments where CDK might not be needed\n */\nexport const C2G_THEME_MOCK_PROVIDERS: Provider[] = [\n {\n provide: HighContrastModeDetector,\n useValue: {\n _platform: { isBrowser: false },\n isHighContrast: () => false\n }\n }\n];\n\n/**\n * Smart provider factory that chooses appropriate providers based on environment\n */\nexport function getC2GThemeProviders(): Provider[] {\n try {\n // Try to create HighContrastModeDetector - if it fails, use mock\n return C2G_THEME_PROVIDERS;\n } catch {\n return C2G_THEME_MOCK_PROVIDERS;\n }\n}","const de = {\n c2g: {\n loader: { label: 'Laden...' },\n skeleton: { loading: 'Inhalt wird geladen...' },\n alert: {\n close: 'Schliessen',\n demo: {\n info_title: 'Reisehinweis',\n info_message: 'Deine Packliste wurde mit den aktuellen Wetterdaten synchronisiert.',\n success_title: 'Liste gespeichert',\n success_message: 'Deine Packliste wurde erfolgreich gespeichert.',\n warning_title: 'Reisepass erforderlich',\n warning_message: 'Denke daran, deine Reisedokumente einzupacken.',\n danger_title: 'Artikel fehlt',\n danger_message: 'Drei erforderliche Artikel sind noch nicht eingepackt.',\n },\n },\n progress: { label: 'Fortschritt' },\n lottie: { label: 'Ladeanimation' },\n button: {\n submit: 'Absenden',\n cancel: 'Abbrechen',\n save: 'Speichern',\n add_item: 'Artikel hinzufügen',\n invite: 'Mitglied einladen',\n },\n danger_zone: {\n default: { heading: 'Gefahrenzone' },\n group: {\n transfer_ownership: { title: 'Eigentümerschaft übertragen', description: 'Gruppe an ein anderes Mitglied übergeben', action: 'Übertragen', aria_label: 'Eigentümerschaft übertragen' },\n delete_group: { title: 'Gruppe löschen', description: 'Löscht die Gruppe dauerhaft. Diese Aktion kann nicht rückgängig gemacht werden.', action: 'Löschen', aria_label: 'Gruppe löschen' },\n leave_group: { title: 'Gruppe verlassen', description: 'Du verlässt diese Gruppe. Du kannst später wieder beitreten.', action: 'Verlassen', aria_label: 'Gruppe verlassen' },\n },\n },\n input: {\n destination: { label: 'Reiseziel', placeholder: 'z.B. Barcelona', hint: 'Gib die Stadt oder Region deiner Reise ein' },\n email: { label: 'E-Mail-Adresse', placeholder: 'du@beispiel.com', hint: 'Wir senden deine Reisebestätigung hierher' },\n },\n textarea: {\n notes: { label: 'Packnotizen', placeholder: 'Notizen zur Packliste hinzufügen...', hint: 'Wird mit allen Gruppenmitgliedern geteilt' },\n },\n badge: { new: 'Neu', required: 'Pflichtangabe', optional: 'Optional', packed: 'Eingepackt', missing: 'Fehlt' },\n chip: { remove_label: 'Entfernen' },\n tag: { clothing: 'Kleidung', documents: 'Dokumente', electronics: 'Elektronik', toiletries: 'Pflegeartikel' },\n switch: { label: 'Aktiv', notifications: 'Reise-Benachrichtigungen', shared: 'Geteilte Liste' },\n checkbox: { packed: 'Als eingepackt markieren', agree: 'Ich stimme den Bedingungen zu', required: 'Pflichtartikel' },\n radio: {\n legend: 'Optionen',\n trip_type: { legend: 'Reiseart', beach: 'Strand', city: 'Städtereise', hiking: 'Wandern', business: 'Geschäftsreise' },\n },\n segmented_toggle: { view_list: 'Liste', view_grid: 'Raster', view_map: 'Karte' },\n },\n packingList: {\n search: { placeholder: 'Artikel suchen...' },\n filters: {\n essentialsOnly: 'Nur Pflichtartikel',\n visibility: { all: 'Alle', shared: 'Geteilt', personal: 'Persönlich', private: 'Privat' },\n },\n private: { title: 'Private Artikel' },\n empty: 'Keine Artikel vorhanden',\n category: { stats: '{{packed}}/{{total}} eingepackt' },\n delete: { confirm: 'Artikel wirklich löschen?' },\n addItem: 'Artikel hinzufügen',\n createItem: 'Artikel erstellen',\n itemName: 'Bezeichnung',\n category_label: 'Kategorie',\n visibility: 'Sichtbarkeit',\n essential: 'Pflichtartikel',\n quantity: 'Menge',\n weight: 'Gewicht (kg)',\n volume: 'Volumen (L)',\n hint: 'Hinweis',\n cancel: 'Abbrechen',\n create: 'Erstellen',\n categories: {\n shelter: 'Unterkunft',\n sleeping: 'Schlafen',\n cooking: 'Kochen',\n clothing: 'Kleidung',\n safety: 'Sicherheit',\n navigation: 'Navigation',\n hygiene: 'Hygiene',\n medical: 'Medizin',\n electronics: 'Elektronik',\n documents: 'Dokumente',\n entertainment: 'Unterhaltung',\n other: 'Sonstiges',\n },\n },\n};\n\nconst en = {\n c2g: {\n loader: { label: 'Loading...' },\n skeleton: { loading: 'Content loading...' },\n alert: {\n close: 'Dismiss',\n demo: {\n info_title: 'Trip Update',\n info_message: 'Your packing list has been synced with the latest weather data.',\n success_title: 'List Saved',\n success_message: 'Your packing list was saved successfully.',\n warning_title: 'Passport Required',\n warning_message: 'Remember to pack your travel documents.',\n danger_title: 'Item Missing',\n danger_message: 'Three required items are still unpacked.',\n },\n },\n progress: { label: 'Progress' },\n lottie: { label: 'Loading animation' },\n button: {\n submit: 'Submit',\n cancel: 'Cancel',\n save: 'Save',\n add_item: 'Add Item',\n invite: 'Invite Member',\n },\n danger_zone: {\n default: { heading: 'Danger Zone' },\n group: {\n transfer_ownership: { title: 'Transfer ownership', description: 'Hand the group over to another member.', action: 'Transfer', aria_label: 'Transfer ownership' },\n delete_group: { title: 'Delete group', description: 'Deletes the group permanently. This action cannot be undone.', action: 'Delete', aria_label: 'Delete group' },\n leave_group: { title: 'Leave group', description: 'You leave this group. You can join again later.', action: 'Leave', aria_label: 'Leave group' },\n },\n },\n input: {\n destination: { label: 'Destination', placeholder: 'e.g. Barcelona', hint: 'Enter the city or region of your trip' },\n email: { label: 'Email address', placeholder: 'you@example.com', hint: 'We will send your trip confirmation here' },\n },\n textarea: {\n notes: { label: 'Packing notes', placeholder: 'Add notes about your packing list...', hint: 'Shared with all group members' },\n },\n badge: { new: 'New', required: 'Required', optional: 'Optional', packed: 'Packed', missing: 'Missing' },\n chip: { remove_label: 'Remove' },\n tag: { clothing: 'Clothing', documents: 'Documents', electronics: 'Electronics', toiletries: 'Toiletries' },\n switch: { label: 'Active', notifications: 'Trip notifications', shared: 'Shared list' },\n checkbox: { packed: 'Marked as packed', agree: 'I agree to the terms', required: 'Required item' },\n radio: {\n legend: 'Options',\n trip_type: { legend: 'Trip type', beach: 'Beach', city: 'City trip', hiking: 'Hiking', business: 'Business' },\n },\n segmented_toggle: { view_list: 'List', view_grid: 'Grid', view_map: 'Map' },\n },\n packingList: {\n search: { placeholder: 'Search items...' },\n filters: {\n essentialsOnly: 'Essentials only',\n visibility: { all: 'All', shared: 'Shared', personal: 'Personal', private: 'Private' },\n },\n private: { title: 'Private Items' },\n empty: 'No items yet',\n category: { stats: '{{packed}}/{{total}} packed' },\n delete: { confirm: 'Delete this item?' },\n addItem: 'Add item',\n createItem: 'Create item',\n itemName: 'Name',\n category_label: 'Category',\n visibility: 'Visibility',\n essential: 'Essential',\n quantity: 'Quantity',\n weight: 'Weight (kg)',\n volume: 'Volume (L)',\n hint: 'Hint',\n cancel: 'Cancel',\n create: 'Create',\n categories: {\n shelter: 'Shelter',\n sleeping: 'Sleeping',\n cooking: 'Cooking',\n clothing: 'Clothing',\n safety: 'Safety',\n navigation: 'Navigation',\n hygiene: 'Hygiene',\n medical: 'Medical',\n electronics: 'Electronics',\n documents: 'Documents',\n entertainment: 'Entertainment',\n other: 'Other',\n },\n },\n};\n\nexport const C2G_TRANSLATIONS: Record<string, Record<string, unknown>> = { de, en };\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|