@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.
Files changed (56) hide show
  1. package/README.md +95 -0
  2. package/charts/index.d.ts +199 -0
  3. package/fesm2022/camp2gether-c2g-ui-beach-animation-ipi3OoKW.mjs +54156 -0
  4. package/fesm2022/camp2gether-c2g-ui-beach-animation-ipi3OoKW.mjs.map +1 -0
  5. package/fesm2022/camp2gether-c2g-ui-camping-animation-DY6XWXyF.mjs +35807 -0
  6. package/fesm2022/camp2gether-c2g-ui-camping-animation-DY6XWXyF.mjs.map +1 -0
  7. package/fesm2022/camp2gether-c2g-ui-car-animation-DnDp7WfG.mjs +45189 -0
  8. package/fesm2022/camp2gether-c2g-ui-car-animation-DnDp7WfG.mjs.map +1 -0
  9. package/fesm2022/camp2gether-c2g-ui-car-driving-landscape-animation-CawNeMKD.mjs +43833 -0
  10. package/fesm2022/camp2gether-c2g-ui-car-driving-landscape-animation-CawNeMKD.mjs.map +1 -0
  11. package/fesm2022/camp2gether-c2g-ui-cat-love-animation-ewC7fZyY.mjs +30789 -0
  12. package/fesm2022/camp2gether-c2g-ui-cat-love-animation-ewC7fZyY.mjs.map +1 -0
  13. package/fesm2022/camp2gether-c2g-ui-charts.mjs +404 -0
  14. package/fesm2022/camp2gether-c2g-ui-charts.mjs.map +1 -0
  15. package/fesm2022/camp2gether-c2g-ui-checklist-animation-DqUkcLqI.mjs +19868 -0
  16. package/fesm2022/camp2gether-c2g-ui-checklist-animation-DqUkcLqI.mjs.map +1 -0
  17. package/fesm2022/camp2gether-c2g-ui-coffee-time-animation-DQilaE0A.mjs +6816 -0
  18. package/fesm2022/camp2gether-c2g-ui-coffee-time-animation-DQilaE0A.mjs.map +1 -0
  19. package/fesm2022/camp2gether-c2g-ui-error-404-pdjg-EHb.mjs +49742 -0
  20. package/fesm2022/camp2gether-c2g-ui-error-404-pdjg-EHb.mjs.map +1 -0
  21. package/fesm2022/camp2gether-c2g-ui-fishing-animation-DwE3IF-V.mjs +38941 -0
  22. package/fesm2022/camp2gether-c2g-ui-fishing-animation-DwE3IF-V.mjs.map +1 -0
  23. package/fesm2022/camp2gether-c2g-ui-layout.mjs +768 -0
  24. package/fesm2022/camp2gether-c2g-ui-layout.mjs.map +1 -0
  25. package/fesm2022/camp2gether-c2g-ui-maps.mjs +223 -0
  26. package/fesm2022/camp2gether-c2g-ui-maps.mjs.map +1 -0
  27. package/fesm2022/camp2gether-c2g-ui-mountain-search-animation-TebM1gS4.mjs +69245 -0
  28. package/fesm2022/camp2gether-c2g-ui-mountain-search-animation-TebM1gS4.mjs.map +1 -0
  29. package/fesm2022/camp2gether-c2g-ui-planning-animation-D8QSsZk6.mjs +28330 -0
  30. package/fesm2022/camp2gether-c2g-ui-planning-animation-D8QSsZk6.mjs.map +1 -0
  31. package/fesm2022/camp2gether-c2g-ui-presets.mjs +2855 -0
  32. package/fesm2022/camp2gether-c2g-ui-presets.mjs.map +1 -0
  33. package/fesm2022/camp2gether-c2g-ui-share-animation-qgqs-k59.mjs +59129 -0
  34. package/fesm2022/camp2gether-c2g-ui-share-animation-qgqs-k59.mjs.map +1 -0
  35. package/fesm2022/camp2gether-c2g-ui-summer-camp-animation-DPzirVNH.mjs +89317 -0
  36. package/fesm2022/camp2gether-c2g-ui-summer-camp-animation-DPzirVNH.mjs.map +1 -0
  37. package/fesm2022/camp2gether-c2g-ui-theme.mjs +479 -0
  38. package/fesm2022/camp2gether-c2g-ui-theme.mjs.map +1 -0
  39. package/fesm2022/camp2gether-c2g-ui-thinking-animation--X3er_pf.mjs +27929 -0
  40. package/fesm2022/camp2gether-c2g-ui-thinking-animation--X3er_pf.mjs.map +1 -0
  41. package/fesm2022/camp2gether-c2g-ui-walking-avocado-animation-CQMU2C9-.mjs +4064 -0
  42. package/fesm2022/camp2gether-c2g-ui-walking-avocado-animation-CQMU2C9-.mjs.map +1 -0
  43. package/fesm2022/camp2gether-c2g-ui-walking-orange-animation-CTJniCsF.mjs +3113 -0
  44. package/fesm2022/camp2gether-c2g-ui-walking-orange-animation-CTJniCsF.mjs.map +1 -0
  45. package/fesm2022/camp2gether-c2g-ui-weather-partly-cloudy-animation-Cnw3W4cS.mjs +1731 -0
  46. package/fesm2022/camp2gether-c2g-ui-weather-partly-cloudy-animation-Cnw3W4cS.mjs.map +1 -0
  47. package/fesm2022/camp2gether-c2g-ui.mjs +2099 -0
  48. package/fesm2022/camp2gether-c2g-ui.mjs.map +1 -0
  49. package/index.d.ts +578 -0
  50. package/layout/index.d.ts +443 -0
  51. package/maps/index.d.ts +62 -0
  52. package/package.json +51 -0
  53. package/presets/index.d.ts +1437 -0
  54. package/src/lib/styles/design-tokens.css +153 -0
  55. package/src/lib/styles/themes.scss +346 -0
  56. package/theme/index.d.ts +63 -0
@@ -0,0 +1,1437 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { OnDestroy } from '@angular/core';
3
+ import * as _camp2gether_c2g_ui_presets from '@camp2gether/c2g-ui/presets';
4
+ import { C2gAvatarBadge } from '@humbeldore/c2g-ui';
5
+ import { AnimationOptions } from 'ngx-lottie';
6
+
7
+ type C2gPackingVisibility = 'shared' | 'personal' | 'private';
8
+ type C2gPackingAssignmentStatus = 'assigned' | 'packed' | 'confirmed';
9
+ interface C2gPackingListAssignment {
10
+ itemId: string;
11
+ memberId: string;
12
+ memberName?: string;
13
+ packedBy?: string;
14
+ packedByName?: string;
15
+ status: C2gPackingAssignmentStatus;
16
+ quantity?: number;
17
+ }
18
+ interface C2gPackingItemAssignedEvent {
19
+ itemId: string;
20
+ memberId: string;
21
+ assigned: boolean;
22
+ quantity?: number;
23
+ }
24
+ interface C2gPackingListItem {
25
+ id: string;
26
+ name: string;
27
+ category: string;
28
+ essential?: boolean;
29
+ visibility: C2gPackingVisibility;
30
+ quantity?: number;
31
+ weightKg?: number;
32
+ packedVolumeL?: number;
33
+ priority?: string;
34
+ reason?: string;
35
+ weather?: boolean;
36
+ hint?: string;
37
+ confirmed?: boolean;
38
+ createdBy?: string;
39
+ privateOwnerVisible?: boolean;
40
+ assignments?: C2gPackingListAssignment[];
41
+ }
42
+ interface C2gPackingListMember {
43
+ id: string;
44
+ name: string;
45
+ initials?: string;
46
+ color?: string;
47
+ type?: 'adult' | 'child' | 'baby' | 'pet';
48
+ hasAccount?: boolean;
49
+ }
50
+ interface C2gPackingCategoryInfo {
51
+ key: string;
52
+ labelKey: string;
53
+ label?: string;
54
+ icon: string;
55
+ }
56
+ interface C2gPackingListFilterState {
57
+ query: string;
58
+ visibility: 'all' | C2gPackingVisibility;
59
+ essentialsOnly: boolean;
60
+ memberIds: string[];
61
+ }
62
+ interface C2gPackingListMemberStatus {
63
+ memberId: string;
64
+ memberName: string;
65
+ initials?: string;
66
+ checked: boolean;
67
+ canToggle: boolean;
68
+ }
69
+ interface C2gPackingListMemberOverlayRequest {
70
+ itemId: string;
71
+ itemName: string;
72
+ members: C2gPackingListMemberStatus[];
73
+ }
74
+ interface C2gPackingListLabels {
75
+ searchPlaceholderKey: string;
76
+ essentialsOnlyKey: string;
77
+ showAllVisibilityKey: string;
78
+ sharedVisibilityKey: string;
79
+ personalVisibilityKey: string;
80
+ privateVisibilityKey: string;
81
+ privateSectionTitleKey: string;
82
+ emptyStateKey: string;
83
+ categoryStatsKey: string;
84
+ deleteConfirmKey: string;
85
+ addItemKey?: string;
86
+ createItemKey?: string;
87
+ itemNameKey?: string;
88
+ categoryKey?: string;
89
+ visibilityKey?: string;
90
+ essentialKey?: string;
91
+ quantityKey?: string;
92
+ weightKey?: string;
93
+ volumeKey?: string;
94
+ hintKey?: string;
95
+ cancelKey?: string;
96
+ createKey?: string;
97
+ }
98
+ declare const DEFAULT_PACKING_LIST_LABEL_KEYS: C2gPackingListLabels;
99
+ interface C2gPackingListPermissions {
100
+ isOrganizer: boolean;
101
+ isGuest: boolean;
102
+ isSolo: boolean;
103
+ readOnly: boolean;
104
+ canManageAssignments?: boolean;
105
+ canMembersManageSharedItems?: boolean;
106
+ canMembersAddSharedItems?: boolean;
107
+ }
108
+ /**
109
+ * Feature flags (like GridOptions booleans).
110
+ * Applied globally to all rows.
111
+ */
112
+ interface C2gPackingListFeatures {
113
+ search?: boolean;
114
+ filters?: boolean;
115
+ stats?: boolean;
116
+ create?: boolean;
117
+ editItem?: boolean;
118
+ deleteItem?: boolean;
119
+ assignments?: boolean;
120
+ privateSection?: boolean;
121
+ expandAllOnLoad?: boolean;
122
+ }
123
+ /**
124
+ * Column definition - generic over host-defined field type.
125
+ * Host specifies which fields are available via TField generic.
126
+ */
127
+ interface C2gPackingListColumnDef<TField extends string = string> {
128
+ field: TField;
129
+ visible?: boolean;
130
+ editable?: boolean;
131
+ sortable?: boolean;
132
+ labelKey?: string;
133
+ }
134
+ /**
135
+ * Sort state - generic over host-defined field type.
136
+ */
137
+ type C2gPackingSortDir = 'asc' | 'desc';
138
+ interface C2gPackingListSortState<TField extends string = string> {
139
+ field: TField;
140
+ dir: C2gPackingSortDir;
141
+ }
142
+ /**
143
+ * Custom row action - host can trigger these via (rowActionTriggered).
144
+ */
145
+ interface C2gPackingListRowAction {
146
+ id: string;
147
+ labelKey: string;
148
+ icon?: string;
149
+ showWhen?: (item: C2gPackingListItem, permissions: C2gPackingListPermissions) => boolean;
150
+ }
151
+ /**
152
+ * Main config object - generic over host-defined field type.
153
+ * Like AgGrid GridOptions.
154
+ */
155
+ interface C2gPackingListConfig<TField extends string = string> {
156
+ features?: C2gPackingListFeatures;
157
+ columnDefs?: C2gPackingListColumnDef<TField>[];
158
+ sort?: C2gPackingListSortState<TField>;
159
+ rowActions?: C2gPackingListRowAction[];
160
+ initialFilter?: Partial<C2gPackingListFilterState>;
161
+ defaultExpandedCount?: number;
162
+ }
163
+ declare const DEFAULT_PACKING_LIST_CONFIG: C2gPackingListConfig;
164
+
165
+ declare const C2G_PACKING_CATEGORY_INFO: Record<string, C2gPackingCategoryInfo>;
166
+ declare function resolvePackingCategory(categoryKey: string): C2gPackingCategoryInfo;
167
+
168
+ declare class PackingListComponent<TField extends string = string> {
169
+ readonly items: _angular_core.InputSignal<C2gPackingListItem[]>;
170
+ readonly members: _angular_core.InputSignal<C2gPackingListMember[]>;
171
+ readonly currentUserId: _angular_core.InputSignal<string>;
172
+ readonly permissions: _angular_core.InputSignal<C2gPackingListPermissions>;
173
+ readonly labels: _angular_core.InputSignal<C2gPackingListLabels>;
174
+ readonly categories: _angular_core.InputSignal<C2gPackingCategoryInfo[]>;
175
+ readonly config: _angular_core.InputSignal<C2gPackingListConfig<TField>>;
176
+ readonly showPrivateAsSeparateList: _angular_core.InputSignal<boolean>;
177
+ readonly showStats: _angular_core.InputSignal<boolean>;
178
+ readonly itemChecked: _angular_core.OutputEmitterRef<{
179
+ itemId: string;
180
+ checked: boolean;
181
+ }>;
182
+ readonly itemAssigned: _angular_core.OutputEmitterRef<C2gPackingItemAssignedEvent>;
183
+ readonly itemDeleted: _angular_core.OutputEmitterRef<string>;
184
+ readonly itemEditRequested: _angular_core.OutputEmitterRef<string>;
185
+ readonly itemCreated: _angular_core.OutputEmitterRef<Partial<C2gPackingListItem>>;
186
+ readonly personalItemToggled: _angular_core.OutputEmitterRef<{
187
+ itemId: string;
188
+ memberId: string;
189
+ checked: boolean;
190
+ }>;
191
+ readonly memberOverlayRequested: _angular_core.OutputEmitterRef<C2gPackingListMemberOverlayRequest>;
192
+ readonly externalMemberViewRequested: _angular_core.OutputEmitterRef<void>;
193
+ readonly filterChanged: _angular_core.OutputEmitterRef<C2gPackingListFilterState>;
194
+ readonly sortChanged: _angular_core.OutputEmitterRef<C2gPackingListSortState<TField>>;
195
+ readonly rowActionTriggered: _angular_core.OutputEmitterRef<{
196
+ actionId: string;
197
+ item: C2gPackingListItem;
198
+ }>;
199
+ readonly mergedConfig: _angular_core.Signal<C2gPackingListConfig<TField>>;
200
+ readonly filter: _angular_core.WritableSignal<C2gPackingListFilterState>;
201
+ readonly expandedCategories: _angular_core.WritableSignal<Set<string>>;
202
+ readonly hasUserToggled: _angular_core.WritableSignal<boolean>;
203
+ readonly filteredItems: _angular_core.Signal<C2gPackingListItem[]>;
204
+ readonly categoryGroups: _angular_core.Signal<{
205
+ key: string;
206
+ items: C2gPackingListItem[];
207
+ }[]>;
208
+ constructor();
209
+ onFilterChange(next: C2gPackingListFilterState): void;
210
+ onExternalMemberViewRequested(): void;
211
+ onItemCreated(item: Partial<C2gPackingListItem>): void;
212
+ isCategoryExpanded(category: string): boolean;
213
+ toggleCategory(category: string): void;
214
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PackingListComponent<any>, never>;
215
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PackingListComponent<any>, "c2g-packing-list", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "members": { "alias": "members"; "required": true; "isSignal": true; }; "currentUserId": { "alias": "currentUserId"; "required": true; "isSignal": true; }; "permissions": { "alias": "permissions"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "categories": { "alias": "categories"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; "showPrivateAsSeparateList": { "alias": "showPrivateAsSeparateList"; "required": false; "isSignal": true; }; "showStats": { "alias": "showStats"; "required": false; "isSignal": true; }; }, { "itemChecked": "itemChecked"; "itemAssigned": "itemAssigned"; "itemDeleted": "itemDeleted"; "itemEditRequested": "itemEditRequested"; "itemCreated": "itemCreated"; "personalItemToggled": "personalItemToggled"; "memberOverlayRequested": "memberOverlayRequested"; "externalMemberViewRequested": "externalMemberViewRequested"; "filterChanged": "filterChanged"; "sortChanged": "sortChanged"; "rowActionTriggered": "rowActionTriggered"; }, never, never, true, never>;
216
+ }
217
+
218
+ declare class PackingListFiltersComponent {
219
+ readonly filter: _angular_core.InputSignal<C2gPackingListFilterState>;
220
+ readonly members: _angular_core.InputSignal<C2gPackingListMember[]>;
221
+ readonly labels: _angular_core.InputSignal<C2gPackingListLabels>;
222
+ readonly disabled: _angular_core.InputSignal<boolean>;
223
+ readonly filterChange: _angular_core.OutputEmitterRef<C2gPackingListFilterState>;
224
+ readonly overlayRequested: _angular_core.OutputEmitterRef<void>;
225
+ readonly membersPanelOpen: _angular_core.WritableSignal<boolean>;
226
+ readonly memberQuery: _angular_core.WritableSignal<string>;
227
+ readonly memberSelectionLabel: _angular_core.Signal<string>;
228
+ readonly filteredMembers: _angular_core.Signal<C2gPackingListMember[]>;
229
+ onQueryChange(event: Event): void;
230
+ onVisibilityChange(event: Event): void;
231
+ onEssentialsOnlyToggle(event: Event): void;
232
+ toggleMembersPanel(): void;
233
+ onMemberSearch(event: Event): void;
234
+ isMemberSelected(memberId: string): boolean;
235
+ toggleMember(memberId: string): void;
236
+ clearMemberSelection(): void;
237
+ selectAllMembers(): void;
238
+ requestExternalOverlay(): void;
239
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PackingListFiltersComponent, never>;
240
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PackingListFiltersComponent, "c2g-packing-list-filters", never, { "filter": { "alias": "filter"; "required": true; "isSignal": true; }; "members": { "alias": "members"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "filterChange": "filterChange"; "overlayRequested": "overlayRequested"; }, never, never, true, never>;
241
+ }
242
+
243
+ declare class PackingListStatsComponent {
244
+ readonly items: _angular_core.InputSignal<C2gPackingListItem[]>;
245
+ readonly stats: _angular_core.Signal<{
246
+ total: number;
247
+ packed: number;
248
+ essential: number;
249
+ }>;
250
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PackingListStatsComponent, never>;
251
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PackingListStatsComponent, "c2g-packing-list-stats", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
252
+ }
253
+
254
+ declare class PackingListCategoryComponent {
255
+ readonly categoryKey: _angular_core.InputSignal<string>;
256
+ readonly items: _angular_core.InputSignal<C2gPackingListItem[]>;
257
+ readonly members: _angular_core.InputSignal<C2gPackingListMember[]>;
258
+ readonly selectedMemberIds: _angular_core.InputSignal<string[]>;
259
+ readonly currentUserId: _angular_core.InputSignal<string>;
260
+ readonly permissions: _angular_core.InputSignal<C2gPackingListPermissions>;
261
+ readonly expanded: _angular_core.InputSignal<boolean>;
262
+ readonly toggle: _angular_core.OutputEmitterRef<string>;
263
+ readonly itemChecked: _angular_core.OutputEmitterRef<{
264
+ itemId: string;
265
+ checked: boolean;
266
+ }>;
267
+ readonly itemAssigned: _angular_core.OutputEmitterRef<C2gPackingItemAssignedEvent>;
268
+ readonly itemDeleted: _angular_core.OutputEmitterRef<string>;
269
+ readonly itemEditRequested: _angular_core.OutputEmitterRef<string>;
270
+ readonly personalItemToggled: _angular_core.OutputEmitterRef<{
271
+ itemId: string;
272
+ memberId: string;
273
+ checked: boolean;
274
+ }>;
275
+ readonly memberOverlayRequested: _angular_core.OutputEmitterRef<C2gPackingListMemberOverlayRequest>;
276
+ readonly category: _angular_core.Signal<_camp2gether_c2g_ui_presets.C2gPackingCategoryInfo>;
277
+ readonly stats: _angular_core.Signal<{
278
+ total: number;
279
+ essential: number;
280
+ packed: number;
281
+ }>;
282
+ onToggle(): void;
283
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PackingListCategoryComponent, never>;
284
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PackingListCategoryComponent, "c2g-packing-list-category", never, { "categoryKey": { "alias": "categoryKey"; "required": true; "isSignal": true; }; "items": { "alias": "items"; "required": true; "isSignal": true; }; "members": { "alias": "members"; "required": true; "isSignal": true; }; "selectedMemberIds": { "alias": "selectedMemberIds"; "required": false; "isSignal": true; }; "currentUserId": { "alias": "currentUserId"; "required": true; "isSignal": true; }; "permissions": { "alias": "permissions"; "required": true; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; }, { "toggle": "toggle"; "itemChecked": "itemChecked"; "itemAssigned": "itemAssigned"; "itemDeleted": "itemDeleted"; "itemEditRequested": "itemEditRequested"; "personalItemToggled": "personalItemToggled"; "memberOverlayRequested": "memberOverlayRequested"; }, never, never, true, never>;
285
+ }
286
+
287
+ declare class PackingListItemComponent {
288
+ readonly item: _angular_core.InputSignal<C2gPackingListItem>;
289
+ readonly members: _angular_core.InputSignal<C2gPackingListMember[]>;
290
+ readonly currentUserId: _angular_core.InputSignal<string>;
291
+ readonly permissions: _angular_core.InputSignal<C2gPackingListPermissions>;
292
+ readonly selectedMemberIds: _angular_core.InputSignal<string[]>;
293
+ readonly itemChecked: _angular_core.OutputEmitterRef<{
294
+ itemId: string;
295
+ checked: boolean;
296
+ }>;
297
+ readonly itemAssigned: _angular_core.OutputEmitterRef<C2gPackingItemAssignedEvent>;
298
+ readonly itemDeleted: _angular_core.OutputEmitterRef<string>;
299
+ readonly itemEditRequested: _angular_core.OutputEmitterRef<string>;
300
+ readonly personalItemToggled: _angular_core.OutputEmitterRef<{
301
+ itemId: string;
302
+ memberId: string;
303
+ checked: boolean;
304
+ }>;
305
+ readonly memberOverlayRequested: _angular_core.OutputEmitterRef<C2gPackingListMemberOverlayRequest>;
306
+ readonly overlayOpen: _angular_core.WritableSignal<boolean>;
307
+ readonly overlaySearch: _angular_core.WritableSignal<string>;
308
+ readonly ctaMenuOpen: _angular_core.WritableSignal<boolean>;
309
+ readonly quantityPickerOpen: _angular_core.WritableSignal<boolean>;
310
+ readonly quantityPickerValue: _angular_core.WritableSignal<number>;
311
+ readonly delegateDialogOpen: _angular_core.WritableSignal<boolean>;
312
+ readonly delegateMemberId: _angular_core.WritableSignal<string | null>;
313
+ readonly delegateQuantity: _angular_core.WritableSignal<number>;
314
+ readonly avatarDialogOpen: _angular_core.WritableSignal<boolean>;
315
+ readonly avatarDialogMemberId: _angular_core.WritableSignal<string | null>;
316
+ readonly avatarDialogQuantity: _angular_core.WritableSignal<number>;
317
+ readonly personalAssignDialogOpen: _angular_core.WritableSignal<boolean>;
318
+ readonly personalAssignSearch: _angular_core.WritableSignal<string>;
319
+ readonly personalAssignMemberId: _angular_core.WritableSignal<string | null>;
320
+ readonly applicableMembers: _angular_core.Signal<C2gPackingListMember[]>;
321
+ readonly visibleMembers: _angular_core.Signal<C2gPackingListMember[]>;
322
+ readonly packedCount: _angular_core.Signal<number>;
323
+ readonly isPacked: _angular_core.Signal<boolean>;
324
+ readonly requiredQuantity: _angular_core.Signal<number>;
325
+ readonly checkedMembers: _angular_core.Signal<C2gPackingListMember[]>;
326
+ readonly personalAssignedMembers: _angular_core.Signal<C2gPackingListMember[]>;
327
+ readonly missingMembers: _angular_core.Signal<C2gPackingListMember[]>;
328
+ readonly checkedPreview: _angular_core.Signal<C2gPackingListMember[]>;
329
+ readonly hiddenCheckedCount: _angular_core.Signal<number>;
330
+ readonly personalAssignedPreview: _angular_core.Signal<C2gPackingListMember[]>;
331
+ readonly personalHiddenAssignedCount: _angular_core.Signal<number>;
332
+ readonly missingPreview: _angular_core.Signal<C2gPackingListMember[]>;
333
+ readonly hiddenMissingCount: _angular_core.Signal<number>;
334
+ readonly currentUserMember: _angular_core.Signal<C2gPackingListMember | null>;
335
+ readonly isItemOwner: _angular_core.Signal<boolean>;
336
+ readonly canEditOrDeleteItem: _angular_core.Signal<boolean>;
337
+ readonly canShowAssignCta: _angular_core.Signal<boolean>;
338
+ readonly sharedAssignmentsCount: _angular_core.Signal<number>;
339
+ readonly sharedTotalAssignedCount: _angular_core.Signal<number>;
340
+ readonly sharedMissingSlots: _angular_core.Signal<number>;
341
+ readonly selfAssignableMaxQuantity: _angular_core.Signal<number>;
342
+ readonly delegateCandidates: _angular_core.Signal<C2gPackingListMember[]>;
343
+ readonly selfAssignedToShared: _angular_core.Signal<boolean>;
344
+ readonly isPlanner: _angular_core.Signal<boolean>;
345
+ readonly joinBtnLabel: _angular_core.Signal<"+ Eintragen" | "Menge anpassen" | "Meine Menge anpassen">;
346
+ readonly pickerLabel: _angular_core.Signal<"Wie viel wird mitgenommen?" | "Wie viel nimmst du mit?">;
347
+ readonly delegatePickerLabel: _angular_core.Signal<string>;
348
+ readonly canSelfAssignShared: _angular_core.Signal<boolean>;
349
+ readonly selectedDelegateMember: _angular_core.Signal<C2gPackingListMember | null>;
350
+ readonly canManagePersonalAssignments: _angular_core.Signal<boolean>;
351
+ readonly personalAssignableMembers: _angular_core.Signal<C2gPackingListMember[]>;
352
+ readonly filteredPersonalAssignableMembers: _angular_core.Signal<C2gPackingListMember[]>;
353
+ readonly selectedPersonalAssignMember: _angular_core.Signal<C2gPackingListMember | null>;
354
+ readonly completionText: _angular_core.Signal<string>;
355
+ readonly progressNumerator: _angular_core.Signal<number>;
356
+ readonly progressDenominator: _angular_core.Signal<number>;
357
+ readonly progressRatioText: _angular_core.Signal<string>;
358
+ readonly quantityBadge: _angular_core.Signal<{
359
+ readonly value: `${number}/${number}`;
360
+ readonly tone: "danger" | "warning" | "success";
361
+ } | null>;
362
+ readonly progressPercentage: _angular_core.Signal<number>;
363
+ readonly progressTone: _angular_core.Signal<"danger" | "warning" | "success">;
364
+ readonly needsPackLabel: _angular_core.Signal<string>;
365
+ readonly overlayMembers: _angular_core.Signal<C2gPackingListMemberStatus[]>;
366
+ readonly filteredOverlayMembers: _angular_core.Signal<C2gPackingListMemberStatus[]>;
367
+ readonly personalStatusBadges: _angular_core.Signal<{
368
+ key: string;
369
+ text: string;
370
+ tone: "success" | "warning";
371
+ dotColor: string;
372
+ }[]>;
373
+ readonly sharedCountChips: _angular_core.Signal<{
374
+ key: string;
375
+ text: string;
376
+ tone: "success" | "warning";
377
+ }[]>;
378
+ memberAssignmentStatus(memberId: string): 'confirmed' | 'packed' | 'assigned' | 'none';
379
+ memberAssignedQuantity(memberId: string): number;
380
+ memberRingTone(memberId: string): 'custom';
381
+ memberRingColor(memberId: string): string;
382
+ memberBadge(memberId: string): C2gAvatarBadge | null;
383
+ memberBackground(member: C2gPackingListMember): string;
384
+ isMemberChecked(memberId: string): boolean;
385
+ hasAnyAssignment(memberId: string): boolean;
386
+ canPackForMember(memberId: string): boolean;
387
+ isAssignmentChecked(memberId: string): boolean;
388
+ isSharedAssigned(memberId: string): boolean;
389
+ canAssignShared(memberId: string): boolean;
390
+ onSoloToggle(checked: boolean): void;
391
+ onPrivateToggle(checked: boolean): void;
392
+ onSharedToggle(memberId: string, quantity?: number): void;
393
+ private setSharedAssignment;
394
+ private setPersonalAssignment;
395
+ onPersonalToggle(memberId: string): void;
396
+ deleteItem(): void;
397
+ requestEdit(): void;
398
+ requestAssign(): void;
399
+ openPersonalAssignDialog(): void;
400
+ closePersonalAssignDialog(): void;
401
+ onPersonalAssignSearch(event: Event): void;
402
+ selectPersonalAssignMember(memberId: string): void;
403
+ confirmPersonalAssignment(): void;
404
+ onPersonalAvatarClick(memberId: string): void;
405
+ onAssignMeToggle(): void;
406
+ openDelegateDialog(): void;
407
+ closeDelegateDialog(): void;
408
+ onDelegateMemberChange(event: Event): void;
409
+ increaseDelegateQuantity(): void;
410
+ decreaseDelegateQuantity(): void;
411
+ confirmDelegateAssignment(): void;
412
+ onSharedAvatarClick(memberId: string): void;
413
+ closeAvatarDialog(): void;
414
+ increaseAvatarDialogQuantity(): void;
415
+ decreaseAvatarDialogQuantity(): void;
416
+ confirmAvatarDialogUpdate(): void;
417
+ increaseSelfAssignQuantity(): void;
418
+ decreaseSelfAssignQuantity(): void;
419
+ cancelSelfAssignQuantity(): void;
420
+ confirmSelfAssignQuantity(): void;
421
+ toggleCtaMenu(): void;
422
+ closeCtaMenu(): void;
423
+ onMenuAssign(): void;
424
+ onMenuEdit(): void;
425
+ onMenuDelete(): void;
426
+ openOverlay(): void;
427
+ closeOverlay(): void;
428
+ onOverlaySearch(event: Event): void;
429
+ toggleFromOverlay(memberId: string): void;
430
+ privateItemOwnerLabel(): string;
431
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PackingListItemComponent, never>;
432
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PackingListItemComponent, "c2g-packing-list-item", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "members": { "alias": "members"; "required": true; "isSignal": true; }; "currentUserId": { "alias": "currentUserId"; "required": true; "isSignal": true; }; "permissions": { "alias": "permissions"; "required": true; "isSignal": true; }; "selectedMemberIds": { "alias": "selectedMemberIds"; "required": false; "isSignal": true; }; }, { "itemChecked": "itemChecked"; "itemAssigned": "itemAssigned"; "itemDeleted": "itemDeleted"; "itemEditRequested": "itemEditRequested"; "personalItemToggled": "personalItemToggled"; "memberOverlayRequested": "memberOverlayRequested"; }, never, never, true, never>;
433
+ }
434
+
435
+ declare class PackingListItemCreateComponent {
436
+ readonly permissions: _angular_core.InputSignal<C2gPackingListPermissions>;
437
+ readonly labels: _angular_core.InputSignal<C2gPackingListLabels>;
438
+ readonly readOnly: _angular_core.InputSignal<boolean>;
439
+ readonly categories: _angular_core.InputSignal<C2gPackingCategoryInfo[]>;
440
+ readonly itemCreated: _angular_core.OutputEmitterRef<Partial<C2gPackingListItem>>;
441
+ readonly dialogOpen: _angular_core.WritableSignal<boolean>;
442
+ readonly formData: _angular_core.WritableSignal<{
443
+ name: string;
444
+ category: string;
445
+ visibility: C2gPackingVisibility;
446
+ essential: boolean;
447
+ quantity: number;
448
+ weightKg: number | undefined;
449
+ packedVolumeL: number | undefined;
450
+ hint: string;
451
+ }>;
452
+ readonly availableVisibilities: _angular_core.Signal<{
453
+ value: C2gPackingVisibility;
454
+ label: string;
455
+ }[]>;
456
+ readonly categoryOptions: _angular_core.Signal<{
457
+ value: string;
458
+ label: string;
459
+ }[]>;
460
+ openDialog(): void;
461
+ closeDialog(): void;
462
+ resetForm(): void;
463
+ submit(): void;
464
+ updateVisibility(visibility: C2gPackingVisibility): void;
465
+ getCategoryLabel(categoryKey: string): string;
466
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PackingListItemCreateComponent, never>;
467
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PackingListItemCreateComponent, "c2g-packing-list-item-create", never, { "permissions": { "alias": "permissions"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "categories": { "alias": "categories"; "required": false; "isSignal": true; }; }, { "itemCreated": "itemCreated"; }, never, never, true, never>;
468
+ }
469
+
470
+ declare class PackingListPrivateListComponent {
471
+ readonly items: _angular_core.InputSignal<C2gPackingListItem[]>;
472
+ readonly members: _angular_core.InputSignal<C2gPackingListMember[]>;
473
+ readonly selectedMemberIds: _angular_core.InputSignal<string[]>;
474
+ readonly currentUserId: _angular_core.InputSignal<string>;
475
+ readonly permissions: _angular_core.InputSignal<C2gPackingListPermissions>;
476
+ readonly labels: _angular_core.InputSignal<C2gPackingListLabels>;
477
+ readonly privateItems: _angular_core.Signal<C2gPackingListItem[]>;
478
+ readonly itemChecked: _angular_core.OutputEmitterRef<{
479
+ itemId: string;
480
+ checked: boolean;
481
+ }>;
482
+ readonly itemAssigned: _angular_core.OutputEmitterRef<C2gPackingItemAssignedEvent>;
483
+ readonly itemDeleted: _angular_core.OutputEmitterRef<string>;
484
+ readonly itemEditRequested: _angular_core.OutputEmitterRef<string>;
485
+ readonly personalItemToggled: _angular_core.OutputEmitterRef<{
486
+ itemId: string;
487
+ memberId: string;
488
+ checked: boolean;
489
+ }>;
490
+ readonly memberOverlayRequested: _angular_core.OutputEmitterRef<C2gPackingListMemberOverlayRequest>;
491
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PackingListPrivateListComponent, never>;
492
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PackingListPrivateListComponent, "c2g-packing-list-private-list", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "members": { "alias": "members"; "required": true; "isSignal": true; }; "selectedMemberIds": { "alias": "selectedMemberIds"; "required": false; "isSignal": true; }; "currentUserId": { "alias": "currentUserId"; "required": true; "isSignal": true; }; "permissions": { "alias": "permissions"; "required": true; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; }, { "itemChecked": "itemChecked"; "itemAssigned": "itemAssigned"; "itemDeleted": "itemDeleted"; "itemEditRequested": "itemEditRequested"; "personalItemToggled": "personalItemToggled"; "memberOverlayRequested": "memberOverlayRequested"; }, never, never, true, never>;
493
+ }
494
+
495
+ interface WeatherDay {
496
+ date: string;
497
+ icon: string;
498
+ description: string;
499
+ temperature: {
500
+ min: number;
501
+ max: number;
502
+ };
503
+ }
504
+
505
+ declare class WeatherWidgetComponent {
506
+ readonly currentDay: _angular_core.InputSignal<WeatherDay | null>;
507
+ readonly forecastSlots: _angular_core.InputSignal<WeatherDay[]>;
508
+ readonly destination: _angular_core.InputSignal<string>;
509
+ readonly dates: _angular_core.InputSignal<{
510
+ from: string;
511
+ to: string;
512
+ } | null>;
513
+ getWeatherIcon(icon: string): string;
514
+ formatDate(date: string): string;
515
+ formatShortDate(date: string): string;
516
+ getSlotLabel(index: number, total: number): string;
517
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WeatherWidgetComponent, never>;
518
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WeatherWidgetComponent, "c2g-weather-widget", never, { "currentDay": { "alias": "currentDay"; "required": false; "isSignal": true; }; "forecastSlots": { "alias": "forecastSlots"; "required": false; "isSignal": true; }; "destination": { "alias": "destination"; "required": false; "isSignal": true; }; "dates": { "alias": "dates"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
519
+ }
520
+
521
+ declare const WEATHER_ICON_MAP: Record<string, string>;
522
+ /**
523
+ * Resolves a backend weather icon string to an emoji.
524
+ * @param icon Raw icon string from the API (e.g. "partly-cloudy")
525
+ * @param fallback Emoji to return for unrecognised keys. Defaults to '🌤️'.
526
+ * Pass `icon` as fallback to preserve the raw string (useful
527
+ * for debugging in the full weather widget).
528
+ */
529
+ declare function resolveWeatherIcon(icon: string, fallback?: string): string;
530
+
531
+ type MemberRoleKey = 'organizer' | 'treasurer' | 'transport' | 'cook' | 'firstaid' | 'equipment' | null | undefined;
532
+ interface C2gMember {
533
+ id: string;
534
+ name: string;
535
+ avatarInitials: string;
536
+ type: string;
537
+ isCurrentUser?: boolean;
538
+ isRegistered?: boolean;
539
+ roleKey?: MemberRoleKey;
540
+ }
541
+
542
+ declare class MemberTagsComponent {
543
+ readonly isCurrentUser: _angular_core.InputSignal<boolean>;
544
+ readonly isRegistered: _angular_core.InputSignal<boolean>;
545
+ readonly roleKey: _angular_core.InputSignal<MemberRoleKey>;
546
+ getRoleLabel(roleKey: MemberRoleKey): string;
547
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MemberTagsComponent, never>;
548
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MemberTagsComponent, "c2g-member-tags", never, { "isCurrentUser": { "alias": "isCurrentUser"; "required": false; "isSignal": true; }; "isRegistered": { "alias": "isRegistered"; "required": false; "isSignal": true; }; "roleKey": { "alias": "roleKey"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
549
+ }
550
+
551
+ interface ActionMenuItem {
552
+ key: string;
553
+ label: string;
554
+ icon?: string;
555
+ variant?: 'default' | 'danger';
556
+ disabled?: boolean;
557
+ }
558
+
559
+ declare class MemberItemComponent {
560
+ readonly member: _angular_core.InputSignal<C2gMember>;
561
+ readonly remove: _angular_core.OutputEmitterRef<C2gMember>;
562
+ readonly invite: _angular_core.OutputEmitterRef<C2gMember>;
563
+ readonly edit: _angular_core.OutputEmitterRef<C2gMember>;
564
+ readonly avatarBackgroundColor: _angular_core.Signal<"#e8f0ea" | "#1a6044">;
565
+ readonly avatarTextColor: _angular_core.Signal<"#1a6044" | "#ffffff">;
566
+ readonly menuItems: _angular_core.Signal<ActionMenuItem[]>;
567
+ onMenuItemSelected(item: ActionMenuItem): void;
568
+ getMemberTypeLabel(type: string): string;
569
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MemberItemComponent, never>;
570
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MemberItemComponent, "c2g-member-item", never, { "member": { "alias": "member"; "required": true; "isSignal": true; }; }, { "remove": "remove"; "invite": "invite"; "edit": "edit"; }, never, never, true, never>;
571
+ }
572
+
573
+ declare class MemberListComponent {
574
+ readonly members: _angular_core.InputSignal<C2gMember[]>;
575
+ readonly memberRemove: _angular_core.OutputEmitterRef<C2gMember>;
576
+ readonly memberInvite: _angular_core.OutputEmitterRef<C2gMember>;
577
+ readonly memberEdit: _angular_core.OutputEmitterRef<C2gMember>;
578
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MemberListComponent, never>;
579
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MemberListComponent, "c2g-member-list", never, { "members": { "alias": "members"; "required": true; "isSignal": true; }; }, { "memberRemove": "memberRemove"; "memberInvite": "memberInvite"; "memberEdit": "memberEdit"; }, never, never, true, never>;
580
+ }
581
+
582
+ declare class MemberPanelComponent {
583
+ readonly members: _angular_core.InputSignal<C2gMember[]>;
584
+ readonly memberRemove: _angular_core.OutputEmitterRef<C2gMember>;
585
+ readonly memberInvite: _angular_core.OutputEmitterRef<C2gMember>;
586
+ readonly memberEdit: _angular_core.OutputEmitterRef<C2gMember>;
587
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MemberPanelComponent, never>;
588
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MemberPanelComponent, "c2g-member-panel", never, { "members": { "alias": "members"; "required": true; "isSignal": true; }; }, { "memberRemove": "memberRemove"; "memberInvite": "memberInvite"; "memberEdit": "memberEdit"; }, never, ["[slot=header-actions]"], true, never>;
589
+ }
590
+
591
+ declare class ActionMenuComponent {
592
+ readonly items: _angular_core.InputSignal<ActionMenuItem[]>;
593
+ readonly triggerLabel: _angular_core.InputSignal<string>;
594
+ readonly ariaLabel: _angular_core.InputSignal<string>;
595
+ readonly itemSelected: _angular_core.OutputEmitterRef<ActionMenuItem>;
596
+ select(item: ActionMenuItem): void;
597
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ActionMenuComponent, never>;
598
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ActionMenuComponent, "c2g-action-menu", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "triggerLabel": { "alias": "triggerLabel"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "itemSelected": "itemSelected"; }, never, never, true, never>;
599
+ }
600
+
601
+ interface C2gMenuItem {
602
+ key: string;
603
+ label: string;
604
+ icon?: string;
605
+ disabled?: boolean;
606
+ variant?: 'default' | 'danger';
607
+ children?: C2gMenuItem[];
608
+ }
609
+ interface C2gMenuSelection {
610
+ item: C2gMenuItem;
611
+ parent?: C2gMenuItem;
612
+ }
613
+ interface C2gSubmenuItem {
614
+ key: string;
615
+ label: string;
616
+ href?: string;
617
+ disabled?: boolean;
618
+ active?: boolean;
619
+ }
620
+ interface C2gMainNavigationItem {
621
+ key: string;
622
+ label: string;
623
+ href?: string;
624
+ disabled?: boolean;
625
+ active?: boolean;
626
+ subItems?: C2gSubmenuItem[];
627
+ }
628
+ interface C2gSubmenuSelection {
629
+ main: C2gMainNavigationItem;
630
+ sub: C2gSubmenuItem;
631
+ }
632
+
633
+ declare class MenuComponent {
634
+ readonly items: _angular_core.InputSignal<C2gMenuItem[]>;
635
+ readonly triggerLabel: _angular_core.InputSignal<string>;
636
+ readonly triggerAriaLabel: _angular_core.InputSignal<string>;
637
+ readonly itemSelected: _angular_core.OutputEmitterRef<C2gMenuSelection>;
638
+ readonly flatItems: _angular_core.Signal<C2gMenuItem[]>;
639
+ select(item: C2gMenuItem): void;
640
+ selectChild(parent: C2gMenuItem, child: C2gMenuItem): void;
641
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MenuComponent, never>;
642
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MenuComponent, "c2g-menu", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "triggerLabel": { "alias": "triggerLabel"; "required": false; "isSignal": true; }; "triggerAriaLabel": { "alias": "triggerAriaLabel"; "required": false; "isSignal": true; }; }, { "itemSelected": "itemSelected"; }, never, never, true, never>;
643
+ }
644
+
645
+ declare class MainNavigationComponent {
646
+ readonly items: _angular_core.InputSignal<C2gMainNavigationItem[]>;
647
+ readonly ariaLabel: _angular_core.InputSignal<string>;
648
+ readonly mainItemSelected: _angular_core.OutputEmitterRef<C2gMainNavigationItem>;
649
+ readonly subItemSelected: _angular_core.OutputEmitterRef<C2gSubmenuSelection>;
650
+ onMainItemSelected(item: C2gMainNavigationItem): void;
651
+ onSubItemSelected(selection: C2gSubmenuSelection): void;
652
+ trackByKey: (_index: number, item: C2gMainNavigationItem) => string;
653
+ trackSubByKey: (_index: number, item: C2gSubmenuItem) => string;
654
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MainNavigationComponent, never>;
655
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MainNavigationComponent, "c2g-main-navigation", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "mainItemSelected": "mainItemSelected"; "subItemSelected": "subItemSelected"; }, never, never, true, never>;
656
+ }
657
+
658
+ declare class MainNavigationItemComponent {
659
+ readonly item: _angular_core.InputSignal<C2gMainNavigationItem>;
660
+ readonly itemSelected: _angular_core.OutputEmitterRef<C2gMainNavigationItem>;
661
+ readonly subItemSelected: _angular_core.OutputEmitterRef<C2gSubmenuSelection>;
662
+ readonly submenuOpen: _angular_core.WritableSignal<boolean>;
663
+ readonly hasSubmenu: _angular_core.Signal<boolean>;
664
+ onItemClick(): void;
665
+ onMouseEnter(): void;
666
+ onMouseLeave(): void;
667
+ onSubItemSelected(sub: C2gSubmenuItem): void;
668
+ onItemKeydown(event: KeyboardEvent): void;
669
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MainNavigationItemComponent, never>;
670
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MainNavigationItemComponent, "c2g-main-navigation-item", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; }, { "itemSelected": "itemSelected"; "subItemSelected": "subItemSelected"; }, never, never, true, never>;
671
+ }
672
+
673
+ declare class SubmenuComponent {
674
+ readonly items: _angular_core.InputSignal<C2gSubmenuItem[]>;
675
+ readonly open: _angular_core.InputSignal<boolean>;
676
+ readonly itemSelected: _angular_core.OutputEmitterRef<C2gSubmenuItem>;
677
+ readonly activeIndex: _angular_core.WritableSignal<number>;
678
+ onItemSelected(item: C2gSubmenuItem): void;
679
+ setActiveIndex(index: number): void;
680
+ onKeydown(event: KeyboardEvent): void;
681
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SubmenuComponent, never>;
682
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SubmenuComponent, "c2g-submenu", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "itemSelected": "itemSelected"; }, never, never, true, never>;
683
+ }
684
+
685
+ declare class SubmenuItemComponent {
686
+ readonly item: _angular_core.InputSignal<C2gSubmenuItem>;
687
+ readonly active: _angular_core.InputSignal<boolean>;
688
+ readonly selected: _angular_core.OutputEmitterRef<C2gSubmenuItem>;
689
+ readonly mouseenter: _angular_core.OutputEmitterRef<void>;
690
+ onClick(): void;
691
+ onMouseEnter(): void;
692
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SubmenuItemComponent, never>;
693
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SubmenuItemComponent, "c2g-submenu-item", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; }, { "selected": "selected"; "mouseenter": "mouseenter"; }, never, never, true, never>;
694
+ }
695
+
696
+ interface DashboardWeatherDay {
697
+ date: string;
698
+ icon: string;
699
+ description: string;
700
+ tempMin: number;
701
+ tempMax: number;
702
+ }
703
+ interface NextAdventureData {
704
+ tourName: string;
705
+ destination: string;
706
+ fromDate: string;
707
+ toDate: string;
708
+ tourType?: string;
709
+ coverImage?: string;
710
+ weather?: DashboardWeatherDay[];
711
+ showPulse?: boolean;
712
+ }
713
+ interface PackStatusData {
714
+ totalItems: number;
715
+ completedItems: number;
716
+ criticalTotal: number;
717
+ criticalCompleted: number;
718
+ tourName?: string;
719
+ }
720
+ interface PackWeightData {
721
+ currentWeightG: number;
722
+ previousWeightG?: number;
723
+ tourName?: string;
724
+ }
725
+ interface MemberReadinessEntry {
726
+ name: string;
727
+ avatarUrl?: string;
728
+ initials: string;
729
+ totalItems: number;
730
+ completedItems: number;
731
+ isSelf?: boolean;
732
+ }
733
+ interface MemberReadinessData {
734
+ members: MemberReadinessEntry[];
735
+ groupName?: string;
736
+ }
737
+ interface StreakData {
738
+ streakDays: number;
739
+ level: number;
740
+ experiencePoints: number;
741
+ nextLevelXp: number;
742
+ favoriteSeason?: string;
743
+ totalDistanceKm?: number;
744
+ totalNightsCamped?: number;
745
+ }
746
+ interface CampingScoreFactor {
747
+ /** Display label e.g. 'Sonne', 'Regen', 'Wind' */
748
+ label: string;
749
+ /** Emoji or short icon string */
750
+ icon: string;
751
+ /** 0–10 */
752
+ score: number;
753
+ /** When true, high score = bad (e.g. Regen, Wind). Tier color is flipped. */
754
+ inverted?: boolean;
755
+ }
756
+ interface CampingScoreData {
757
+ /** 0–10 scale */
758
+ score: number;
759
+ label?: string;
760
+ highlights?: string[];
761
+ warnings?: string[];
762
+ tourName?: string;
763
+ fromDate?: string;
764
+ toDate?: string;
765
+ /** Optional structured sub-scores shown as factor tiles */
766
+ factors?: CampingScoreFactor[];
767
+ }
768
+ interface RainForecastDay {
769
+ /** ISO date string */
770
+ date: string;
771
+ /** 0–1 */
772
+ precipitationProbability: number;
773
+ /** mm */
774
+ precipitation: number;
775
+ icon?: string;
776
+ }
777
+ interface RainVisualizationData {
778
+ days: RainForecastDay[];
779
+ tourName?: string;
780
+ }
781
+ type MemberType = 'adult' | 'teen' | 'child' | 'toddler' | 'senior' | 'dog' | 'cat' | 'pet';
782
+ interface GroupMemberCompositionEntry {
783
+ type: MemberType;
784
+ count: number;
785
+ names?: string[];
786
+ }
787
+ interface GroupCompositionData {
788
+ members: GroupMemberCompositionEntry[];
789
+ groupName?: string;
790
+ groupType?: string;
791
+ }
792
+ interface CriticalItemAlertEntry {
793
+ name: string;
794
+ category?: string;
795
+ /**
796
+ * personal = every group member needs their own copy.
797
+ * shared = a minimum quantity must be covered, regardless of who brings it.
798
+ */
799
+ scope: 'personal' | 'shared';
800
+ /** For shared items: how many are needed in total */
801
+ neededCount?: number;
802
+ /** For shared items: how many are already covered */
803
+ coveredCount?: number;
804
+ /** For personal items: which members still haven't packed it */
805
+ missingFor?: string[];
806
+ /** For shared items: who is bringing it (if anyone) */
807
+ coveredBy?: string[];
808
+ }
809
+ type SuccessVisualType = 'lottie' | 'image' | 'icon';
810
+ interface SuccessVisual {
811
+ type: SuccessVisualType;
812
+ /** lottie: animationData object | image: URL string | icon: emoji or short text */
813
+ value: unknown;
814
+ /** Optional alt text for images */
815
+ alt?: string;
816
+ }
817
+ interface CriticalItemsAlertData {
818
+ openItems: CriticalItemAlertEntry[];
819
+ totalCritical: number;
820
+ /** ISO date string */
821
+ tourFromDate: string;
822
+ tourName?: string;
823
+ /** Optional visual shown in the all-clear success state */
824
+ successVisual?: SuccessVisual;
825
+ }
826
+ interface WindForecastDay {
827
+ date: string;
828
+ /** km/h */
829
+ windSpeed: number;
830
+ /** 0–360 degrees */
831
+ windDirection: number;
832
+ description?: string;
833
+ }
834
+ interface WindIndicatorData {
835
+ days: WindForecastDay[];
836
+ tourName?: string;
837
+ }
838
+ interface TotalKmSparkPoint {
839
+ /** ISO date (tour end date) */
840
+ date: string;
841
+ /** cumulative km at this point */
842
+ km: number;
843
+ }
844
+ interface TotalKmData {
845
+ totalKm: number;
846
+ yearKm?: number;
847
+ sparkline?: TotalKmSparkPoint[];
848
+ /** count of tours included */
849
+ tourCount?: number;
850
+ }
851
+ type TourType = 'hiking' | 'cycling' | 'paddling' | 'climbing' | 'skiing' | 'other';
852
+ interface TourTypeSplitEntry {
853
+ type: TourType;
854
+ count: number;
855
+ km?: number;
856
+ }
857
+ interface TourTypeSplitData {
858
+ entries: TourTypeSplitEntry[];
859
+ totalTours: number;
860
+ }
861
+ interface TourRhythmWeek {
862
+ /** ISO week start date (Monday) */
863
+ weekStart: string;
864
+ /** 0 = no activity, 1–4 = intensity level */
865
+ level: 0 | 1 | 2 | 3 | 4;
866
+ tourName?: string;
867
+ km?: number;
868
+ }
869
+ interface TourRhythmData {
870
+ /** 52 weeks, oldest first */
871
+ weeks: TourRhythmWeek[];
872
+ totalActiveDays?: number;
873
+ currentStreakWeeks?: number;
874
+ }
875
+ type Season = 'spring' | 'summer' | 'autumn' | 'winter';
876
+ interface SeasonDnaEntry {
877
+ season: Season;
878
+ tourCount: number;
879
+ km?: number;
880
+ nights?: number;
881
+ }
882
+ interface SeasonDnaData {
883
+ entries: SeasonDnaEntry[];
884
+ dominantSeason?: Season;
885
+ totalTours: number;
886
+ }
887
+ interface WeightHistoryPoint {
888
+ /** ISO date (tour end date) */
889
+ date: string;
890
+ /** total packed weight in grams */
891
+ weightG: number;
892
+ tourName?: string;
893
+ }
894
+ interface WeightHistoryData {
895
+ points: WeightHistoryPoint[];
896
+ /** personal best (lowest) in grams */
897
+ bestG?: number;
898
+ /** latest weight in grams */
899
+ latestG?: number;
900
+ }
901
+ interface GearValueData {
902
+ /** total value in base currency */
903
+ totalValue: number;
904
+ currency: string;
905
+ itemCount: number;
906
+ /** optional: breakdown by category */
907
+ categories?: {
908
+ label: string;
909
+ value: number;
910
+ count: number;
911
+ }[];
912
+ }
913
+ interface WeightBreakdownEntry {
914
+ category: string;
915
+ weightG: number;
916
+ itemCount: number;
917
+ color?: string;
918
+ }
919
+ interface WeightBreakdownData {
920
+ entries: WeightBreakdownEntry[];
921
+ totalG: number;
922
+ }
923
+ interface AdventureScoreData {
924
+ score: number;
925
+ /** 0–100 scale */
926
+ level: number;
927
+ levelLabel: string;
928
+ totalTours: number;
929
+ totalKm: number;
930
+ totalNights: number;
931
+ uniqueTypes: number;
932
+ sparkline?: {
933
+ date: string;
934
+ score: number;
935
+ }[];
936
+ }
937
+ interface TopGearEntry {
938
+ name: string;
939
+ category?: string;
940
+ usageCount: number;
941
+ totalTours: number;
942
+ imageUrl?: string;
943
+ weightG?: number;
944
+ }
945
+ interface TopGearData {
946
+ entries: TopGearEntry[];
947
+ }
948
+ interface GroupActivityEntry {
949
+ name: string;
950
+ initials: string;
951
+ avatarUrl?: string;
952
+ completedItems: number;
953
+ totalItems: number;
954
+ isSelf?: boolean;
955
+ }
956
+ interface GroupActivityData {
957
+ members: GroupActivityEntry[];
958
+ groupName?: string;
959
+ }
960
+ interface GearSharingData {
961
+ sharedItems: number;
962
+ totalItems: number;
963
+ memberCount: number;
964
+ /** kg saved per person through sharing */
965
+ savedWeightPerPersonG?: number;
966
+ }
967
+ interface AdventureRadiusData {
968
+ avgRadiusKm: number;
969
+ maxRadiusKm: number;
970
+ maxTourName?: string;
971
+ /** home coordinates label, e.g. "München" */
972
+ homeLabel?: string;
973
+ /** distribution buckets in km */
974
+ buckets?: {
975
+ labelKm: string;
976
+ count: number;
977
+ }[];
978
+ }
979
+ interface PackProgressRow {
980
+ label: string;
981
+ icon: string;
982
+ packed: number;
983
+ total: number;
984
+ /** Draws extra visual attention — use for baby/toddler and pet rows */
985
+ highlight?: boolean;
986
+ }
987
+ interface PackProgressData {
988
+ rows: PackProgressRow[];
989
+ tourName?: string;
990
+ }
991
+
992
+ declare class NextAdventureWidgetComponent {
993
+ readonly data: _angular_core.InputSignal<NextAdventureData>;
994
+ readonly countdown: _angular_core.Signal<number>;
995
+ readonly duration: _angular_core.Signal<number>;
996
+ readonly countdownLabel: _angular_core.Signal<string>;
997
+ readonly dateRange: _angular_core.Signal<string>;
998
+ readonly tourTypeIcon: _angular_core.Signal<string>;
999
+ readonly weatherSlots: _angular_core.Signal<_camp2gether_c2g_ui_presets.DashboardWeatherDay[]>;
1000
+ readonly urgencyClass: _angular_core.Signal<"" | "c2g-next-adventure--now" | "c2g-next-adventure--soon">;
1001
+ weatherIcon(icon: string): string;
1002
+ formatWeatherDate(date: string): string;
1003
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NextAdventureWidgetComponent, never>;
1004
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NextAdventureWidgetComponent, "c2g-next-adventure-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1005
+ }
1006
+
1007
+ declare class PackStatusWidgetComponent {
1008
+ readonly data: _angular_core.InputSignal<PackStatusData>;
1009
+ readonly percent: _angular_core.Signal<number>;
1010
+ readonly criticalOpen: _angular_core.Signal<number>;
1011
+ readonly statusColor: _angular_core.Signal<"warning" | "success" | "primary">;
1012
+ readonly statusLabel: _angular_core.Signal<"Alles gepackt!" | "Fast fertig" | "Gut dabei" | "Packen gestartet" | "Noch nicht gepackt">;
1013
+ readonly radius = 44;
1014
+ readonly strokeWidth = 8;
1015
+ readonly circumference: number;
1016
+ readonly strokeDashoffset: _angular_core.Signal<number>;
1017
+ readonly ticks: {
1018
+ x1: number;
1019
+ y1: number;
1020
+ x2: number;
1021
+ y2: number;
1022
+ }[];
1023
+ readonly itemDots: _angular_core.Signal<boolean[]>;
1024
+ readonly displayPercent: _angular_core.WritableSignal<number>;
1025
+ private raf;
1026
+ constructor();
1027
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PackStatusWidgetComponent, never>;
1028
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PackStatusWidgetComponent, "c2g-pack-status-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1029
+ }
1030
+
1031
+ declare class PackWeightWidgetComponent implements OnDestroy {
1032
+ readonly data: _angular_core.InputSignal<PackWeightData>;
1033
+ readonly zone: _angular_core.Signal<{
1034
+ readonly label: "Ultraleicht";
1035
+ readonly maxG: 7000;
1036
+ readonly color: "#22c55e";
1037
+ readonly bgColor: "rgba(34,197,94,0.18)";
1038
+ } | {
1039
+ readonly label: "Leicht";
1040
+ readonly maxG: 12000;
1041
+ readonly color: "#84cc16";
1042
+ readonly bgColor: "rgba(132,204,22,0.15)";
1043
+ } | {
1044
+ readonly label: "Mittel";
1045
+ readonly maxG: 18000;
1046
+ readonly color: "#f59e0b";
1047
+ readonly bgColor: "rgba(245,158,11,0.14)";
1048
+ } | {
1049
+ readonly label: "Schwer";
1050
+ readonly maxG: 25000;
1051
+ readonly color: "#f97316";
1052
+ readonly bgColor: "rgba(249,115,22,0.14)";
1053
+ } | {
1054
+ readonly label: "Sehr schwer";
1055
+ readonly maxG: 30000;
1056
+ readonly color: "#ef4444";
1057
+ readonly bgColor: "rgba(239,68,68,0.15)";
1058
+ }>;
1059
+ readonly scalePercent: _angular_core.Signal<number>;
1060
+ readonly prevScalePercent: _angular_core.Signal<number | null>;
1061
+ readonly diffG: _angular_core.Signal<number | null>;
1062
+ readonly diffKg: _angular_core.Signal<string | null>;
1063
+ readonly diffTrend: _angular_core.Signal<"better" | "worse" | "same" | null>;
1064
+ readonly animatedPercent: _angular_core.WritableSignal<number>;
1065
+ readonly displayKg: _angular_core.WritableSignal<string>;
1066
+ private rafMarker;
1067
+ private rafKg;
1068
+ constructor();
1069
+ readonly zoneSegments: _angular_core.Signal<{
1070
+ left: number;
1071
+ width: number;
1072
+ color: "#22c55e" | "#84cc16" | "#f59e0b" | "#f97316" | "#ef4444";
1073
+ bgColor: "rgba(34,197,94,0.18)" | "rgba(132,204,22,0.15)" | "rgba(245,158,11,0.14)" | "rgba(249,115,22,0.14)" | "rgba(239,68,68,0.15)";
1074
+ label: "Ultraleicht" | "Leicht" | "Mittel" | "Schwer" | "Sehr schwer";
1075
+ }[]>;
1076
+ readonly ticks: {
1077
+ pct: number;
1078
+ label: string;
1079
+ }[];
1080
+ ngOnDestroy(): void;
1081
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PackWeightWidgetComponent, never>;
1082
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PackWeightWidgetComponent, "c2g-pack-weight-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1083
+ }
1084
+
1085
+ interface ReadinessGroup {
1086
+ label: string;
1087
+ emoji: string;
1088
+ color: 'success' | 'warning' | 'danger' | 'neutral';
1089
+ min: number;
1090
+ max: number;
1091
+ members: MemberReadinessEntry[];
1092
+ }
1093
+ declare class MemberReadinessWidgetComponent {
1094
+ readonly members: _angular_core.InputSignal<MemberReadinessEntry[]>;
1095
+ readonly tourName: _angular_core.InputSignal<string | undefined>;
1096
+ readonly overallPercent: _angular_core.Signal<number>;
1097
+ readonly fullyReady: _angular_core.Signal<number>;
1098
+ readonly useGrouped: _angular_core.Signal<boolean>;
1099
+ readonly groups: _angular_core.Signal<ReadinessGroup[]>;
1100
+ readonly flatSorted: _angular_core.Signal<MemberReadinessEntry[]>;
1101
+ readyPercent(entry: MemberReadinessEntry): number;
1102
+ readyColor(entry: MemberReadinessEntry): 'success' | 'warning' | 'danger' | 'neutral';
1103
+ readonly collapsed: Map<number, boolean>;
1104
+ toggleGroup(index: number): void;
1105
+ isCollapsed(index: number): boolean;
1106
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MemberReadinessWidgetComponent, never>;
1107
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MemberReadinessWidgetComponent, "c2g-member-readiness-widget", never, { "members": { "alias": "members"; "required": true; "isSignal": true; }; "tourName": { "alias": "tourName"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1108
+ }
1109
+
1110
+ declare class StreakWidgetComponent {
1111
+ readonly data: _angular_core.InputSignal<StreakData>;
1112
+ readonly xpPercent: _angular_core.Signal<number>;
1113
+ readonly streakTier: _angular_core.Signal<"cold" | "warm" | "hot" | "legendary">;
1114
+ readonly streakEmoji: _angular_core.Signal<"🏆" | "🔥" | "⚡" | "🌱">;
1115
+ readonly levelLabel: _angular_core.Signal<"Legende" | "Experte" | "Erfahren" | "Fortgeschritten" | "Einsteiger">;
1116
+ readonly streakLabel: _angular_core.Signal<string>;
1117
+ readonly xpToNext: _angular_core.Signal<number>;
1118
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StreakWidgetComponent, never>;
1119
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StreakWidgetComponent, "c2g-streak-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1120
+ }
1121
+
1122
+ declare class CampingScoreWidgetComponent implements OnDestroy {
1123
+ readonly data: _angular_core.InputSignal<CampingScoreData>;
1124
+ readonly tier: _angular_core.Signal<"great" | "good" | "ok" | "bad">;
1125
+ readonly tierLabel: _angular_core.Signal<string>;
1126
+ readonly tierEmoji: _angular_core.Signal<"☀️" | "⛅" | "🌧️" | "🌤">;
1127
+ readonly factors: _angular_core.Signal<CampingScoreFactor[]>;
1128
+ factorBarPct(score: number): number;
1129
+ factorTier(score: number, inverted?: boolean): string;
1130
+ readonly displayScore: _angular_core.WritableSignal<string>;
1131
+ private raf;
1132
+ constructor();
1133
+ ngOnDestroy(): void;
1134
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CampingScoreWidgetComponent, never>;
1135
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CampingScoreWidgetComponent, "c2g-camping-score-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1136
+ }
1137
+
1138
+ interface RainDay extends RainForecastDay {
1139
+ dayLabel: string;
1140
+ probPct: number;
1141
+ barPct: number;
1142
+ level: 'none' | 'light' | 'moderate' | 'heavy';
1143
+ icon: string;
1144
+ }
1145
+ declare class RainVisualizationWidgetComponent {
1146
+ readonly data: _angular_core.InputSignal<RainVisualizationData>;
1147
+ readonly enriched: _angular_core.Signal<RainDay[]>;
1148
+ readonly overallRisk: _angular_core.Signal<"low" | "medium" | "high">;
1149
+ readonly riskLabel: _angular_core.Signal<string>;
1150
+ readonly summaryIcon: _angular_core.Signal<"☀️" | "⛈" | "🌦">;
1151
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RainVisualizationWidgetComponent, never>;
1152
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RainVisualizationWidgetComponent, "c2g-rain-visualization-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1153
+ }
1154
+
1155
+ declare class GroupCompositionWidgetComponent {
1156
+ readonly data: _angular_core.InputSignal<GroupCompositionData>;
1157
+ readonly sorted: _angular_core.Signal<_camp2gether_c2g_ui_presets.GroupMemberCompositionEntry[]>;
1158
+ readonly totalPeople: _angular_core.Signal<number>;
1159
+ readonly totalPets: _angular_core.Signal<number>;
1160
+ readonly maxCount: _angular_core.Signal<number>;
1161
+ readonly avatars: _angular_core.Signal<{
1162
+ emoji: string;
1163
+ color: string;
1164
+ key: string;
1165
+ }[]>;
1166
+ configFor(type: MemberType): {
1167
+ emoji: string;
1168
+ label: string;
1169
+ color: string;
1170
+ };
1171
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<GroupCompositionWidgetComponent, never>;
1172
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<GroupCompositionWidgetComponent, "c2g-group-composition-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1173
+ }
1174
+
1175
+ declare class CriticalItemsAlertWidgetComponent {
1176
+ readonly data: _angular_core.InputSignal<CriticalItemsAlertData>;
1177
+ readonly daysUntil: _angular_core.Signal<number>;
1178
+ readonly urgency: _angular_core.Signal<"warning" | "ok" | "critical">;
1179
+ readonly urgencyLabel: _angular_core.Signal<string>;
1180
+ readonly allClear: _angular_core.Signal<boolean>;
1181
+ readonly personalItems: _angular_core.Signal<CriticalItemAlertEntry[]>;
1182
+ readonly sharedItems: _angular_core.Signal<CriticalItemAlertEntry[]>;
1183
+ readonly personalHidden: _angular_core.Signal<number>;
1184
+ readonly sharedHidden: _angular_core.Signal<number>;
1185
+ readonly successVisualType: _angular_core.Signal<_camp2gether_c2g_ui_presets.SuccessVisualType>;
1186
+ readonly lottieOptions: _angular_core.Signal<AnimationOptions>;
1187
+ readonly imageValue: _angular_core.Signal<string | null>;
1188
+ readonly imageAlt: _angular_core.Signal<string>;
1189
+ readonly iconValue: _angular_core.Signal<string>;
1190
+ sharedProgress(item: CriticalItemAlertEntry): number;
1191
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CriticalItemsAlertWidgetComponent, never>;
1192
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CriticalItemsAlertWidgetComponent, "c2g-critical-items-alert-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1193
+ }
1194
+
1195
+ declare class WindIndicatorWidgetComponent {
1196
+ readonly data: _angular_core.InputSignal<WindIndicatorData>;
1197
+ readonly days: _angular_core.Signal<WindForecastDay[]>;
1198
+ readonly peak: _angular_core.Signal<WindForecastDay>;
1199
+ readonly peakBeaufort: _angular_core.Signal<{
1200
+ max: number;
1201
+ label: string;
1202
+ emoji: string;
1203
+ color: string;
1204
+ }>;
1205
+ readonly overallRisk: _angular_core.Signal<"calm" | "breezy" | "windy" | "stormy">;
1206
+ enriched: _angular_core.Signal<{
1207
+ bf: {
1208
+ max: number;
1209
+ label: string;
1210
+ emoji: string;
1211
+ color: string;
1212
+ };
1213
+ dirLabel: string;
1214
+ arrowDeg: number;
1215
+ barPct: number;
1216
+ date: string;
1217
+ windSpeed: number;
1218
+ windDirection: number;
1219
+ description?: string;
1220
+ }[]>;
1221
+ formatDate(iso: string): string;
1222
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WindIndicatorWidgetComponent, never>;
1223
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WindIndicatorWidgetComponent, "c2g-wind-indicator-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1224
+ }
1225
+
1226
+ declare class TotalKmWidgetComponent implements OnDestroy {
1227
+ readonly data: _angular_core.InputSignal<TotalKmData>;
1228
+ readonly displayKm: _angular_core.WritableSignal<number>;
1229
+ readonly displayYearKm: _angular_core.WritableSignal<number>;
1230
+ private rafId;
1231
+ private rafYearId;
1232
+ constructor();
1233
+ private animateCount;
1234
+ readonly sparklinePath: _angular_core.Signal<{
1235
+ line: string;
1236
+ area: string;
1237
+ lastX: number;
1238
+ lastY: number;
1239
+ } | null>;
1240
+ ngOnDestroy(): void;
1241
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TotalKmWidgetComponent, never>;
1242
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TotalKmWidgetComponent, "c2g-total-km-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1243
+ }
1244
+
1245
+ interface Segment {
1246
+ type: TourType;
1247
+ label: string;
1248
+ emoji: string;
1249
+ color: string;
1250
+ count: number;
1251
+ km: number;
1252
+ pct: number;
1253
+ offset: number;
1254
+ dash: number;
1255
+ }
1256
+ declare class TourTypeSplitWidgetComponent {
1257
+ readonly data: _angular_core.InputSignal<TourTypeSplitData>;
1258
+ readonly segments: _angular_core.Signal<Segment[]>;
1259
+ readonly dominantSegment: _angular_core.Signal<Segment | null>;
1260
+ readonly circumference: number;
1261
+ trackByType(_: number, seg: Segment): TourType;
1262
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TourTypeSplitWidgetComponent, never>;
1263
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TourTypeSplitWidgetComponent, "c2g-tour-type-split-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1264
+ }
1265
+
1266
+ interface WeekCell extends TourRhythmWeek {
1267
+ col: number;
1268
+ monthLabel: string | null;
1269
+ }
1270
+ declare class TourRhythmWidgetComponent {
1271
+ readonly data: _angular_core.InputSignal<TourRhythmData>;
1272
+ readonly cells: _angular_core.Signal<WeekCell[]>;
1273
+ readonly totalCols: _angular_core.Signal<number>;
1274
+ readonly levelColors: string[];
1275
+ levelColor(level: 0 | 1 | 2 | 3 | 4): string;
1276
+ trackByCol(_: number, cell: WeekCell): number;
1277
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TourRhythmWidgetComponent, never>;
1278
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TourRhythmWidgetComponent, "c2g-tour-rhythm-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1279
+ }
1280
+
1281
+ interface SeasonSegment {
1282
+ season: Season;
1283
+ label: string;
1284
+ emoji: string;
1285
+ color: string;
1286
+ tourCount: number;
1287
+ km: number;
1288
+ nights: number;
1289
+ pct: number;
1290
+ startAngle: number;
1291
+ endAngle: number;
1292
+ pathD: string;
1293
+ labelX: number;
1294
+ labelY: number;
1295
+ }
1296
+ declare class SeasonDnaWidgetComponent {
1297
+ readonly data: _angular_core.InputSignal<SeasonDnaData>;
1298
+ readonly segments: _angular_core.Signal<SeasonSegment[]>;
1299
+ readonly dominantSeason: _angular_core.Signal<{
1300
+ label: string;
1301
+ emoji: string;
1302
+ color: string;
1303
+ } | null>;
1304
+ trackBySeason(_: number, seg: SeasonSegment): Season;
1305
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SeasonDnaWidgetComponent, never>;
1306
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SeasonDnaWidgetComponent, "c2g-season-dna-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1307
+ }
1308
+
1309
+ declare class WeightHistoryWidgetComponent {
1310
+ readonly data: _angular_core.InputSignal<WeightHistoryData>;
1311
+ readonly points: _angular_core.Signal<WeightHistoryPoint[]>;
1312
+ readonly sparklinePath: _angular_core.Signal<{
1313
+ line: string;
1314
+ area: string;
1315
+ lastX: number;
1316
+ lastY: number;
1317
+ improving: boolean;
1318
+ } | null>;
1319
+ readonly trend: _angular_core.Signal<{
1320
+ diffG: number;
1321
+ pct: number;
1322
+ improving: boolean;
1323
+ } | null>;
1324
+ formatKg(g: number): string;
1325
+ formatDate(iso: string): string;
1326
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WeightHistoryWidgetComponent, never>;
1327
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WeightHistoryWidgetComponent, "c2g-weight-history-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1328
+ }
1329
+
1330
+ declare class GearValueWidgetComponent {
1331
+ readonly data: _angular_core.InputSignal<GearValueData>;
1332
+ readonly topCategories: _angular_core.Signal<{
1333
+ label: string;
1334
+ value: number;
1335
+ count: number;
1336
+ }[]>;
1337
+ readonly maxCatValue: _angular_core.Signal<number>;
1338
+ readonly formattedTotal: _angular_core.Signal<string>;
1339
+ formatValue(v: number): string;
1340
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<GearValueWidgetComponent, never>;
1341
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<GearValueWidgetComponent, "c2g-gear-value-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1342
+ }
1343
+
1344
+ interface EnrichedEntry extends WeightBreakdownEntry {
1345
+ pct: number;
1346
+ color: string;
1347
+ barOffset: number;
1348
+ }
1349
+ declare class WeightBreakdownWidgetComponent {
1350
+ readonly data: _angular_core.InputSignal<WeightBreakdownData>;
1351
+ readonly entries: _angular_core.Signal<EnrichedEntry[]>;
1352
+ readonly totalKg: _angular_core.Signal<string>;
1353
+ readonly circumference = 100;
1354
+ formatKg(g: number): string;
1355
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WeightBreakdownWidgetComponent, never>;
1356
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WeightBreakdownWidgetComponent, "c2g-weight-breakdown-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1357
+ }
1358
+
1359
+ declare class AdventureScoreWidgetComponent implements OnDestroy {
1360
+ readonly data: _angular_core.InputSignal<AdventureScoreData>;
1361
+ readonly displayScore: _angular_core.WritableSignal<number>;
1362
+ private raf;
1363
+ constructor();
1364
+ readonly arcPath: _angular_core.Signal<string>;
1365
+ readonly trackPath = "M 60 8 A 52 52 0 1 1 59.99 8";
1366
+ readonly levelColor: _angular_core.Signal<"#22c55e" | "#f59e0b" | "#ff6b35" | "#3b82f6" | "#94a3b8">;
1367
+ readonly sparklinePath: _angular_core.Signal<string | null>;
1368
+ ngOnDestroy(): void;
1369
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AdventureScoreWidgetComponent, never>;
1370
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AdventureScoreWidgetComponent, "c2g-adventure-score-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1371
+ }
1372
+
1373
+ declare class TopGearWidgetComponent {
1374
+ readonly data: _angular_core.InputSignal<TopGearData>;
1375
+ readonly top: _angular_core.Signal<_camp2gether_c2g_ui_presets.TopGearEntry[]>;
1376
+ readonly maxUsage: _angular_core.Signal<number>;
1377
+ usagePct(count: number): number;
1378
+ medal(index: number): string;
1379
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TopGearWidgetComponent, never>;
1380
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TopGearWidgetComponent, "c2g-top-gear-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1381
+ }
1382
+
1383
+ interface RankedEntry extends GroupActivityEntry {
1384
+ rank: number;
1385
+ pct: number;
1386
+ }
1387
+ declare class GroupActivityWidgetComponent {
1388
+ readonly data: _angular_core.InputSignal<GroupActivityData>;
1389
+ readonly ranked: _angular_core.Signal<RankedEntry[]>;
1390
+ medal(rank: number): string;
1391
+ completionPct(m: GroupActivityEntry): number;
1392
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<GroupActivityWidgetComponent, never>;
1393
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<GroupActivityWidgetComponent, "c2g-group-activity-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1394
+ }
1395
+
1396
+ declare class GearSharingWidgetComponent implements OnDestroy {
1397
+ readonly data: _angular_core.InputSignal<GearSharingData>;
1398
+ readonly displayPct: _angular_core.WritableSignal<number>;
1399
+ private raf;
1400
+ constructor();
1401
+ readonly sharingPct: _angular_core.Signal<number>;
1402
+ readonly tier: _angular_core.Signal<"low" | "medium" | "high">;
1403
+ readonly arcPath: _angular_core.Signal<string>;
1404
+ ngOnDestroy(): void;
1405
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<GearSharingWidgetComponent, never>;
1406
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<GearSharingWidgetComponent, "c2g-gear-sharing-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1407
+ }
1408
+
1409
+ declare class AdventureRadiusWidgetComponent {
1410
+ readonly data: _angular_core.InputSignal<AdventureRadiusData>;
1411
+ readonly buckets: _angular_core.Signal<{
1412
+ labelKm: string;
1413
+ count: number;
1414
+ }[]>;
1415
+ readonly maxBucketCount: _angular_core.Signal<number>;
1416
+ bucketPct(count: number): number;
1417
+ readonly radiusTier: _angular_core.Signal<"local" | "regional" | "national" | "international">;
1418
+ readonly tierEmoji: _angular_core.Signal<"🌍" | "🗺️" | "🏔️" | "🏡">;
1419
+ readonly tierLabel: _angular_core.Signal<"Weltenbummler" | "Deutschlandreisender" | "Regionalentdecker" | "Heimatverbunden">;
1420
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AdventureRadiusWidgetComponent, never>;
1421
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AdventureRadiusWidgetComponent, "c2g-adventure-radius-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1422
+ }
1423
+
1424
+ declare class PackProgressWidgetComponent {
1425
+ readonly data: _angular_core.InputSignal<PackProgressData>;
1426
+ readonly rows: _angular_core.Signal<PackProgressRow[]>;
1427
+ readonly overallPacked: _angular_core.Signal<number>;
1428
+ readonly overallTotal: _angular_core.Signal<number>;
1429
+ readonly overallPercent: _angular_core.Signal<number>;
1430
+ pct(row: PackProgressRow): number;
1431
+ tone(row: PackProgressRow): 'success' | 'warning' | 'danger';
1432
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PackProgressWidgetComponent, never>;
1433
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PackProgressWidgetComponent, "c2g-pack-progress-widget", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1434
+ }
1435
+
1436
+ export { ActionMenuComponent, AdventureRadiusWidgetComponent, AdventureScoreWidgetComponent, C2G_PACKING_CATEGORY_INFO, CampingScoreWidgetComponent, CriticalItemsAlertWidgetComponent, DEFAULT_PACKING_LIST_CONFIG, DEFAULT_PACKING_LIST_LABEL_KEYS, GearSharingWidgetComponent, GearValueWidgetComponent, GroupActivityWidgetComponent, GroupCompositionWidgetComponent, MainNavigationComponent, MainNavigationItemComponent, MemberItemComponent, MemberListComponent, MemberPanelComponent, MemberReadinessWidgetComponent, MemberTagsComponent, MenuComponent, NextAdventureWidgetComponent, PackProgressWidgetComponent, PackStatusWidgetComponent, PackWeightWidgetComponent, PackingListCategoryComponent, PackingListComponent, PackingListFiltersComponent, PackingListItemComponent, PackingListItemCreateComponent, PackingListPrivateListComponent, PackingListStatsComponent, RainVisualizationWidgetComponent, SeasonDnaWidgetComponent, StreakWidgetComponent, SubmenuComponent, SubmenuItemComponent, TopGearWidgetComponent, TotalKmWidgetComponent, TourRhythmWidgetComponent, TourTypeSplitWidgetComponent, WEATHER_ICON_MAP, WeatherWidgetComponent, WeightBreakdownWidgetComponent, WeightHistoryWidgetComponent, WindIndicatorWidgetComponent, resolvePackingCategory, resolveWeatherIcon };
1437
+ export type { ActionMenuItem, AdventureRadiusData, AdventureScoreData, C2gMainNavigationItem, C2gMember, C2gMenuItem, C2gMenuSelection, C2gPackingAssignmentStatus, C2gPackingCategoryInfo, C2gPackingItemAssignedEvent, C2gPackingListAssignment, C2gPackingListColumnDef, C2gPackingListConfig, C2gPackingListFeatures, C2gPackingListFilterState, C2gPackingListItem, C2gPackingListLabels, C2gPackingListMember, C2gPackingListMemberOverlayRequest, C2gPackingListMemberStatus, C2gPackingListPermissions, C2gPackingListRowAction, C2gPackingListSortState, C2gPackingSortDir, C2gPackingVisibility, C2gSubmenuItem, C2gSubmenuSelection, CampingScoreData, CampingScoreFactor, CriticalItemAlertEntry, CriticalItemsAlertData, DashboardWeatherDay, GearSharingData, GearValueData, GroupActivityData, GroupActivityEntry, GroupCompositionData, GroupMemberCompositionEntry, MemberReadinessData, MemberReadinessEntry, MemberRoleKey, MemberType, NextAdventureData, PackProgressData, PackProgressRow, PackStatusData, PackWeightData, RainForecastDay, RainVisualizationData, Season, SeasonDnaData, SeasonDnaEntry, StreakData, SuccessVisual, SuccessVisualType, TopGearData, TopGearEntry, TotalKmData, TotalKmSparkPoint, TourRhythmData, TourRhythmWeek, TourType, TourTypeSplitData, TourTypeSplitEntry, WeatherDay, WeightBreakdownData, WeightBreakdownEntry, WeightHistoryData, WeightHistoryPoint, WindForecastDay, WindIndicatorData };