@anymux/ui-kit 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{calendar-DSlrbHoj.js → calendar-DQKfYSQS.js} +48 -45
- package/dist/calendar-DQKfYSQS.js.map +1 -0
- package/dist/calendar.d.ts +1 -1
- package/dist/calendar.js +1 -1
- package/dist/{contacts-DQXTZzHc.js → contacts-By9Wg3kn.js} +35 -33
- package/dist/contacts-By9Wg3kn.js.map +1 -0
- package/dist/contacts.d.ts +1 -1
- package/dist/contacts.js +1 -1
- package/dist/{file-browser-m5atC3kF.js → file-browser-CkhNwADU.js} +61 -133
- package/dist/file-browser-CkhNwADU.js.map +1 -0
- package/dist/file-browser.d.ts +6 -6
- package/dist/file-browser.js +4 -4
- package/dist/{git-B55e6LL-.js → git-m4lboTfx.js} +29 -29
- package/dist/git-m4lboTfx.js.map +1 -0
- package/dist/git.js +1 -1
- package/dist/{iconMap-V4B8P-Uh.js → iconMap-DDpe35ek.js} +5 -5
- package/dist/iconMap-DDpe35ek.js.map +1 -0
- package/dist/icons.js +1 -1
- package/dist/{index-Bryv_GCG.d.ts → index-BP4IYXiF.d.ts} +46 -53
- package/dist/index-BP4IYXiF.d.ts.map +1 -0
- package/dist/{index-kHr9udZD.d.ts → index-BkIh8oov.d.ts} +17 -17
- package/dist/{index-kHr9udZD.d.ts.map → index-BkIh8oov.d.ts.map} +1 -1
- package/dist/{index-DSu19mq0.d.ts → index-D3Ob3aXg.d.ts} +9 -9
- package/dist/{index-DSu19mq0.d.ts.map → index-D3Ob3aXg.d.ts.map} +1 -1
- package/dist/{index-Ml_SgiKa.d.ts → index-DGoLQBX6.d.ts} +18 -42
- package/dist/index-DGoLQBX6.d.ts.map +1 -0
- package/dist/index-DnJaZr08.d.ts +67 -0
- package/dist/index-DnJaZr08.d.ts.map +1 -0
- package/dist/{index-DmsyeHFr.d.ts → index-Pty-N7-g.d.ts} +5 -5
- package/dist/{index-DmsyeHFr.d.ts.map → index-Pty-N7-g.d.ts.map} +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.js +10 -10
- package/dist/layout-BYsc16hD.js +183 -0
- package/dist/layout-BYsc16hD.js.map +1 -0
- package/dist/layout.d.ts +2 -2
- package/dist/layout.js +2 -2
- package/dist/{list-CxfT6hix.js → list-DAq-b6RR.js} +49 -63
- package/dist/list-DAq-b6RR.js.map +1 -0
- package/dist/list.d.ts +2 -2
- package/dist/list.js +4 -3
- package/dist/{media-DZ292aKK.js → media-DuczOGsk.js} +32 -31
- package/dist/media-DuczOGsk.js.map +1 -0
- package/dist/media.js +1 -1
- package/dist/{tree-Dd9Z0Aso.js → tree-B9VQcKBp.js} +2 -2
- package/dist/{tree-Dd9Z0Aso.js.map → tree-B9VQcKBp.js.map} +1 -1
- package/dist/tree.d.ts +1 -1
- package/dist/tree.js +2 -2
- package/package.json +2 -2
- package/src/calendar/AgendaView.tsx +2 -2
- package/src/calendar/CalendarBrowser.tsx +11 -11
- package/src/calendar/CalendarSidebar.tsx +10 -10
- package/src/calendar/DayView.tsx +5 -5
- package/src/calendar/EventCard.tsx +3 -3
- package/src/calendar/MonthView.tsx +6 -6
- package/src/calendar/WeekView.tsx +10 -10
- package/src/contacts/ContactBrowser.tsx +8 -8
- package/src/contacts/ContactCard.tsx +4 -4
- package/src/contacts/ContactDetail.tsx +10 -10
- package/src/contacts/ContactGroupSidebar.tsx +6 -6
- package/src/contacts/ContactList.tsx +3 -3
- package/src/file-browser/components/FileBrowser.tsx +3 -2
- package/src/file-browser/components/FileBrowserContent.tsx +1 -1
- package/src/file-browser/examples/BasicUsage.tsx +2 -2
- package/src/file-browser/index.ts +1 -1
- package/src/file-browser/providers/FileSystemProvider.ts +1 -1
- package/src/git/BranchList.tsx +12 -12
- package/src/git/CommitList.tsx +11 -11
- package/src/git/DiffViewer.tsx +11 -11
- package/src/icons/iconMap.ts +4 -4
- package/src/layout/index.ts +6 -2
- package/src/layout/models/ResponsiveLayoutModel.ts +116 -0
- package/src/list/components/ListItem.tsx +1 -1
- package/src/list/index.ts +1 -1
- package/src/media/AlbumSidebar.tsx +4 -4
- package/src/media/MediaBrowser.tsx +11 -11
- package/src/media/MediaGrid.tsx +3 -3
- package/src/media/MediaList.tsx +6 -6
- package/src/media/MediaPreview.tsx +2 -2
- package/src/media/MediaTimeline.tsx +3 -3
- package/src/{file-browser/components/shared → shared}/ErrorBoundary.tsx +3 -3
- package/dist/calendar-DSlrbHoj.js.map +0 -1
- package/dist/contacts-DQXTZzHc.js.map +0 -1
- package/dist/file-browser-m5atC3kF.js.map +0 -1
- package/dist/git-B55e6LL-.js.map +0 -1
- package/dist/iconMap-V4B8P-Uh.js.map +0 -1
- package/dist/index-Bryv_GCG.d.ts.map +0 -1
- package/dist/index-DzfY1Tok.d.ts +0 -32
- package/dist/index-DzfY1Tok.d.ts.map +0 -1
- package/dist/index-Ml_SgiKa.d.ts.map +0 -1
- package/dist/layout-Ca_4r8ka.js +0 -89
- package/dist/layout-Ca_4r8ka.js.map +0 -1
- package/dist/list-CxfT6hix.js.map +0 -1
- package/dist/media-DZ292aKK.js.map +0 -1
- package/src/list/components/shared/ErrorBoundary.tsx +0 -123
|
@@ -139,7 +139,7 @@ const ContactAvatar = ({ firstName, lastName, avatar, size = "md", className = "
|
|
|
139
139
|
//#region src/contacts/ContactCard.tsx
|
|
140
140
|
const ContactCard = ({ contact, selected = false, onClick, className = "" }) => /* @__PURE__ */ jsxs("button", {
|
|
141
141
|
onClick,
|
|
142
|
-
className: `flex items-center gap-3 px-4 py-3 w-full text-left transition-colors ${selected ? "bg-
|
|
142
|
+
className: `flex items-center gap-3 px-4 py-3 w-full text-left transition-colors ${selected ? "bg-primary/10 border-l-2 border-primary" : "hover:bg-muted/50 border-l-2 border-transparent"} ${className}`,
|
|
143
143
|
children: [
|
|
144
144
|
/* @__PURE__ */ jsx(ContactAvatar, {
|
|
145
145
|
firstName: contact.firstName,
|
|
@@ -149,7 +149,7 @@ const ContactCard = ({ contact, selected = false, onClick, className = "" }) =>
|
|
|
149
149
|
/* @__PURE__ */ jsxs("div", {
|
|
150
150
|
className: "flex-1 min-w-0",
|
|
151
151
|
children: [/* @__PURE__ */ jsxs("p", {
|
|
152
|
-
className: "text-sm font-medium text-
|
|
152
|
+
className: "text-sm font-medium text-foreground truncate",
|
|
153
153
|
title: `${contact.firstName} ${contact.lastName}`,
|
|
154
154
|
children: [
|
|
155
155
|
contact.firstName,
|
|
@@ -157,13 +157,13 @@ const ContactCard = ({ contact, selected = false, onClick, className = "" }) =>
|
|
|
157
157
|
contact.lastName
|
|
158
158
|
]
|
|
159
159
|
}), contact.company && /* @__PURE__ */ jsxs("p", {
|
|
160
|
-
className: "text-xs text-
|
|
160
|
+
className: "text-xs text-muted-foreground flex items-center gap-1 truncate",
|
|
161
161
|
title: contact.company,
|
|
162
162
|
children: [/* @__PURE__ */ jsx(Building, { size: 12 }), contact.company]
|
|
163
163
|
})]
|
|
164
164
|
}),
|
|
165
165
|
/* @__PURE__ */ jsxs("div", {
|
|
166
|
-
className: "flex items-center gap-1.5 text-
|
|
166
|
+
className: "flex items-center gap-1.5 text-muted-foreground",
|
|
167
167
|
children: [contact.email && /* @__PURE__ */ jsx(Mail, { size: 14 }), contact.phone && /* @__PURE__ */ jsx(Phone, { size: 14 })]
|
|
168
168
|
})
|
|
169
169
|
]
|
|
@@ -174,9 +174,9 @@ const ContactCard = ({ contact, selected = false, onClick, className = "" }) =>
|
|
|
174
174
|
const ContactList = observer(({ model, className = "" }) => /* @__PURE__ */ jsxs("div", {
|
|
175
175
|
className: `overflow-y-auto ${className}`,
|
|
176
176
|
children: [Array.from(model.groupedByLetter.entries()).map(([letter, contacts]) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
|
|
177
|
-
className: "sticky top-0 bg-
|
|
177
|
+
className: "sticky top-0 bg-muted/50 backdrop-blur-sm px-4 py-1 border-b border-border",
|
|
178
178
|
children: /* @__PURE__ */ jsx("span", {
|
|
179
|
-
className: "text-xs font-semibold text-
|
|
179
|
+
className: "text-xs font-semibold text-muted-foreground",
|
|
180
180
|
children: letter
|
|
181
181
|
})
|
|
182
182
|
}), contacts.map((contact) => /* @__PURE__ */ jsx(ContactCard, {
|
|
@@ -184,7 +184,7 @@ const ContactList = observer(({ model, className = "" }) => /* @__PURE__ */ jsxs
|
|
|
184
184
|
selected: model.selectedContact?.id === contact.id,
|
|
185
185
|
onClick: () => model.selectContact(contact)
|
|
186
186
|
}, contact.id))] }, letter)), model.filteredContacts.length === 0 && /* @__PURE__ */ jsx("div", {
|
|
187
|
-
className: "flex items-center justify-center h-32 text-
|
|
187
|
+
className: "flex items-center justify-center h-32 text-muted-foreground text-sm",
|
|
188
188
|
children: "No contacts found"
|
|
189
189
|
})]
|
|
190
190
|
}));
|
|
@@ -195,19 +195,19 @@ const DetailRow = ({ icon: Icon, label, value }) => /* @__PURE__ */ jsxs("div",
|
|
|
195
195
|
className: "flex items-start gap-3 py-2",
|
|
196
196
|
children: [/* @__PURE__ */ jsx(Icon, {
|
|
197
197
|
size: 16,
|
|
198
|
-
className: "text-
|
|
198
|
+
className: "text-muted-foreground mt-0.5 flex-shrink-0"
|
|
199
199
|
}), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
|
|
200
|
-
className: "text-xs text-
|
|
200
|
+
className: "text-xs text-muted-foreground",
|
|
201
201
|
children: label
|
|
202
202
|
}), /* @__PURE__ */ jsx("p", {
|
|
203
|
-
className: "text-sm text-
|
|
203
|
+
className: "text-sm text-foreground",
|
|
204
204
|
children: value
|
|
205
205
|
})] })]
|
|
206
206
|
});
|
|
207
207
|
const ContactDetail = observer(({ model, className = "" }) => {
|
|
208
208
|
const contact = model.selectedContact;
|
|
209
209
|
if (!contact) return /* @__PURE__ */ jsx("div", {
|
|
210
|
-
className: `flex items-center justify-center h-full text-
|
|
210
|
+
className: `flex items-center justify-center h-full text-muted-foreground text-sm ${className}`,
|
|
211
211
|
children: "Select a contact to view details"
|
|
212
212
|
});
|
|
213
213
|
return /* @__PURE__ */ jsxs("div", {
|
|
@@ -222,7 +222,7 @@ const ContactDetail = observer(({ model, className = "" }) => {
|
|
|
222
222
|
size: "lg"
|
|
223
223
|
}),
|
|
224
224
|
/* @__PURE__ */ jsxs("h2", {
|
|
225
|
-
className: "mt-3 text-lg font-semibold text-
|
|
225
|
+
className: "mt-3 text-lg font-semibold text-foreground",
|
|
226
226
|
children: [
|
|
227
227
|
contact.firstName,
|
|
228
228
|
" ",
|
|
@@ -230,12 +230,12 @@ const ContactDetail = observer(({ model, className = "" }) => {
|
|
|
230
230
|
]
|
|
231
231
|
}),
|
|
232
232
|
contact.company && /* @__PURE__ */ jsx("p", {
|
|
233
|
-
className: "text-sm text-
|
|
233
|
+
className: "text-sm text-muted-foreground",
|
|
234
234
|
children: contact.company
|
|
235
235
|
})
|
|
236
236
|
]
|
|
237
237
|
}), /* @__PURE__ */ jsxs("div", {
|
|
238
|
-
className: "divide-y divide-
|
|
238
|
+
className: "divide-y divide-border",
|
|
239
239
|
children: [
|
|
240
240
|
contact.email && /* @__PURE__ */ jsx(DetailRow, {
|
|
241
241
|
icon: Mail,
|
|
@@ -266,14 +266,14 @@ const ContactDetail = observer(({ model, className = "" }) => {
|
|
|
266
266
|
className: "flex items-start gap-3 py-2",
|
|
267
267
|
children: [/* @__PURE__ */ jsx(Tag, {
|
|
268
268
|
size: 16,
|
|
269
|
-
className: "text-
|
|
269
|
+
className: "text-muted-foreground mt-0.5 flex-shrink-0"
|
|
270
270
|
}), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
|
|
271
|
-
className: "text-xs text-
|
|
271
|
+
className: "text-xs text-muted-foreground",
|
|
272
272
|
children: "Groups"
|
|
273
273
|
}), /* @__PURE__ */ jsx("div", {
|
|
274
274
|
className: "flex flex-wrap gap-1 mt-1",
|
|
275
275
|
children: contact.groups.map((g) => /* @__PURE__ */ jsx("span", {
|
|
276
|
-
className: "text-xs bg-
|
|
276
|
+
className: "text-xs bg-muted text-muted-foreground px-2 py-0.5 rounded-full",
|
|
277
277
|
children: g
|
|
278
278
|
}, g))
|
|
279
279
|
})] })]
|
|
@@ -286,29 +286,29 @@ const ContactDetail = observer(({ model, className = "" }) => {
|
|
|
286
286
|
//#endregion
|
|
287
287
|
//#region src/contacts/ContactGroupSidebar.tsx
|
|
288
288
|
const ContactGroupSidebar = observer(({ model, className = "" }) => /* @__PURE__ */ jsx("div", {
|
|
289
|
-
className: `w-56 border-r border-
|
|
289
|
+
className: `w-56 border-r border-border bg-muted/30 overflow-y-auto ${className}`,
|
|
290
290
|
children: /* @__PURE__ */ jsxs("div", {
|
|
291
291
|
className: "p-3",
|
|
292
292
|
children: [
|
|
293
293
|
/* @__PURE__ */ jsx("h3", {
|
|
294
|
-
className: "text-xs font-semibold text-
|
|
294
|
+
className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2",
|
|
295
295
|
children: "Groups"
|
|
296
296
|
}),
|
|
297
297
|
/* @__PURE__ */ jsxs("button", {
|
|
298
298
|
onClick: () => model.setGroup(null),
|
|
299
|
-
className: `flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors ${model.currentGroup === null ? "bg-
|
|
299
|
+
className: `flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors ${model.currentGroup === null ? "bg-primary/10 text-primary" : "text-foreground hover:bg-muted"}`,
|
|
300
300
|
children: [
|
|
301
301
|
/* @__PURE__ */ jsx(Users, { size: 16 }),
|
|
302
302
|
/* @__PURE__ */ jsx("span", { children: "All Contacts" }),
|
|
303
303
|
/* @__PURE__ */ jsx("span", {
|
|
304
|
-
className: "ml-auto text-xs text-
|
|
304
|
+
className: "ml-auto text-xs text-muted-foreground",
|
|
305
305
|
children: model.contacts.length
|
|
306
306
|
})
|
|
307
307
|
]
|
|
308
308
|
}),
|
|
309
309
|
model.groups.map((group) => /* @__PURE__ */ jsxs("button", {
|
|
310
310
|
onClick: () => model.setGroup(group.id),
|
|
311
|
-
className: `flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors ${model.currentGroup === group.id ? "bg-
|
|
311
|
+
className: `flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors ${model.currentGroup === group.id ? "bg-primary/10 text-primary" : "text-foreground hover:bg-muted"}`,
|
|
312
312
|
children: [
|
|
313
313
|
/* @__PURE__ */ jsx(User, { size: 16 }),
|
|
314
314
|
/* @__PURE__ */ jsx("span", {
|
|
@@ -317,7 +317,7 @@ const ContactGroupSidebar = observer(({ model, className = "" }) => /* @__PURE__
|
|
|
317
317
|
children: group.name
|
|
318
318
|
}),
|
|
319
319
|
/* @__PURE__ */ jsx("span", {
|
|
320
|
-
className: "ml-auto text-xs text-
|
|
320
|
+
className: "ml-auto text-xs text-muted-foreground",
|
|
321
321
|
children: group.count
|
|
322
322
|
})
|
|
323
323
|
]
|
|
@@ -333,32 +333,34 @@ const ContactBrowser = observer(({ model, className = "", showSidebar = true })
|
|
|
333
333
|
model.loadContacts();
|
|
334
334
|
}, [model]);
|
|
335
335
|
return /* @__PURE__ */ jsxs("div", {
|
|
336
|
-
className: `flex h-full bg-
|
|
336
|
+
className: `flex h-full bg-background rounded-xl border border-border overflow-hidden ${className}`,
|
|
337
337
|
children: [
|
|
338
|
-
showSidebar && /* @__PURE__ */ jsx(ContactGroupSidebar, {
|
|
338
|
+
showSidebar && /* @__PURE__ */ jsx(ContactGroupSidebar, {
|
|
339
|
+
model,
|
|
340
|
+
className: "hidden lg:block"
|
|
341
|
+
}),
|
|
339
342
|
/* @__PURE__ */ jsxs("div", {
|
|
340
|
-
className: "flex-1 flex flex-col min-w-0 border-r border-
|
|
341
|
-
style: { maxWidth: "380px" },
|
|
343
|
+
className: "flex-1 flex flex-col min-w-0 border-r border-border sm:max-w-[380px]",
|
|
342
344
|
children: [/* @__PURE__ */ jsx("div", {
|
|
343
|
-
className: "px-
|
|
345
|
+
className: "px-3 py-2 border-b border-border",
|
|
344
346
|
children: /* @__PURE__ */ jsxs("div", {
|
|
345
347
|
className: "relative",
|
|
346
348
|
children: [/* @__PURE__ */ jsx(Search, {
|
|
347
349
|
size: 16,
|
|
348
|
-
className: "absolute left-3 top-1/2 -translate-y-1/2 text-
|
|
350
|
+
className: "absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground"
|
|
349
351
|
}), /* @__PURE__ */ jsx("input", {
|
|
350
352
|
type: "text",
|
|
351
353
|
placeholder: "Search contacts...",
|
|
352
354
|
value: model.searchQuery,
|
|
353
355
|
onChange: (e) => model.setSearch(e.target.value),
|
|
354
|
-
className: "w-full pl-9 pr-3 py-1.5 text-sm border border-
|
|
356
|
+
className: "w-full pl-9 pr-3 py-1.5 text-sm border border-border rounded-lg bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-ring"
|
|
355
357
|
})]
|
|
356
358
|
})
|
|
357
359
|
}), model.loading ? /* @__PURE__ */ jsx("div", {
|
|
358
360
|
className: "flex items-center justify-center h-64",
|
|
359
361
|
children: /* @__PURE__ */ jsx(Loader2, {
|
|
360
362
|
size: 24,
|
|
361
|
-
className: "animate-spin text-
|
|
363
|
+
className: "animate-spin text-muted-foreground"
|
|
362
364
|
})
|
|
363
365
|
}) : model.error ? /* @__PURE__ */ jsx(BrowserError, {
|
|
364
366
|
error: model.error,
|
|
@@ -371,7 +373,7 @@ const ContactBrowser = observer(({ model, className = "", showSidebar = true })
|
|
|
371
373
|
}),
|
|
372
374
|
/* @__PURE__ */ jsx(ContactDetail, {
|
|
373
375
|
model,
|
|
374
|
-
className: "flex-1"
|
|
376
|
+
className: "flex-1 hidden sm:block"
|
|
375
377
|
})
|
|
376
378
|
]
|
|
377
379
|
});
|
|
@@ -536,4 +538,4 @@ var MockContactProvider = class {
|
|
|
536
538
|
|
|
537
539
|
//#endregion
|
|
538
540
|
export { ContactAvatar, ContactBrowser, ContactCard, ContactDetail, ContactGroupSidebar, ContactList, ContactListModel, MockContactProvider };
|
|
539
|
-
//# sourceMappingURL=contacts-
|
|
541
|
+
//# sourceMappingURL=contacts-By9Wg3kn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts-By9Wg3kn.js","names":["provider: IContactProvider","err: any","contact: ContactItem | null","groupId: string | null","query: string","sortBy: ContactSortBy","contact: Omit<ContactItem, 'id' | 'createdAt' | 'updatedAt'>","id: string","contacts: ContactItem[]","GROUPS_DATA: ContactGroup[]","contacts: ContactItem[]","id: string","item: Omit<ContactItem, 'id' | 'createdAt' | 'updatedAt'>","created: ContactItem","updates: Partial<ContactItem>","query: string","groupId: string","name: string"],"sources":["../src/contacts/ContactListModel.ts","../src/contacts/ContactAvatar.tsx","../src/contacts/ContactCard.tsx","../src/contacts/ContactList.tsx","../src/contacts/ContactDetail.tsx","../src/contacts/ContactGroupSidebar.tsx","../src/contacts/ContactBrowser.tsx","../src/contacts/MockContactProvider.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from 'mobx';\nimport type { IContactProvider, ContactItem, ContactGroup } from './types';\n\nexport type ContactSortBy = 'firstName' | 'lastName' | 'company';\n\nexport class ContactListModel {\n contacts: ContactItem[] = [];\n selectedContact: ContactItem | null = null;\n groups: ContactGroup[] = [];\n currentGroup: string | null = null;\n searchQuery = '';\n sortBy: ContactSortBy = 'lastName';\n loading = false;\n error: string | null = null;\n\n constructor(private provider: IContactProvider) {\n makeAutoObservable(this);\n }\n\n get filteredContacts(): ContactItem[] {\n let result = this.contacts;\n if (this.searchQuery) {\n const q = this.searchQuery.toLowerCase();\n result = result.filter(c =>\n c.firstName.toLowerCase().includes(q) ||\n c.lastName.toLowerCase().includes(q) ||\n c.email?.toLowerCase().includes(q) ||\n c.company?.toLowerCase().includes(q)\n );\n }\n return this.sortContacts(result);\n }\n\n get groupedByLetter(): Map<string, ContactItem[]> {\n const groups = new Map<string, ContactItem[]>();\n for (const contact of this.filteredContacts) {\n const letter = (this.sortBy === 'firstName' ? contact.firstName : contact.lastName)\n .charAt(0).toUpperCase();\n const group = groups.get(letter) ?? [];\n group.push(contact);\n groups.set(letter, group);\n }\n return groups;\n }\n\n get groupedByGroup(): Map<string, ContactItem[]> {\n const groups = new Map<string, ContactItem[]>();\n for (const contact of this.filteredContacts) {\n for (const groupName of contact.groups ?? ['Ungrouped']) {\n const group = groups.get(groupName) ?? [];\n group.push(contact);\n groups.set(groupName, group);\n }\n }\n return groups;\n }\n\n async loadContacts() {\n this.loading = true;\n this.error = null;\n try {\n const [contacts, groups] = await Promise.all([\n this.currentGroup\n ? this.provider.getByGroup(this.currentGroup)\n : this.provider.listItems(),\n this.provider.getGroups()\n ]);\n runInAction(() => {\n this.contacts = contacts;\n this.groups = groups;\n });\n } catch (err: any) {\n runInAction(() => { this.error = err?.message || 'Failed to load contacts'; });\n } finally {\n runInAction(() => { this.loading = false; });\n }\n }\n\n selectContact(contact: ContactItem | null) {\n this.selectedContact = contact;\n }\n\n setGroup(groupId: string | null) {\n this.currentGroup = groupId;\n this.loadContacts();\n }\n\n setSearch(query: string) {\n this.searchQuery = query;\n }\n\n setSort(sortBy: ContactSortBy) {\n this.sortBy = sortBy;\n }\n\n async addContact(contact: Omit<ContactItem, 'id' | 'createdAt' | 'updatedAt'>) {\n const created = await this.provider.createItem(contact);\n runInAction(() => { this.contacts.push(created); });\n return created;\n }\n\n async deleteContact(id: string) {\n await this.provider.deleteItem(id);\n runInAction(() => {\n this.contacts = this.contacts.filter(c => c.id !== id);\n if (this.selectedContact?.id === id) this.selectedContact = null;\n });\n }\n\n private sortContacts(contacts: ContactItem[]): ContactItem[] {\n return [...contacts].sort((a, b) => {\n switch (this.sortBy) {\n case 'firstName': return a.firstName.localeCompare(b.firstName);\n case 'lastName': return a.lastName.localeCompare(b.lastName);\n case 'company': return (a.company ?? '').localeCompare(b.company ?? '');\n default: return 0;\n }\n });\n }\n}\n","import React from 'react';\n\nexport interface ContactAvatarProps {\n firstName: string;\n lastName: string;\n avatar?: string;\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n}\n\nconst sizeClasses = {\n sm: 'w-8 h-8 text-xs',\n md: 'w-10 h-10 text-sm',\n lg: 'w-16 h-16 text-xl',\n};\n\nconst bgColors = [\n 'bg-blue-500', 'bg-green-500', 'bg-purple-500', 'bg-pink-500',\n 'bg-indigo-500', 'bg-teal-500', 'bg-orange-500', 'bg-red-500',\n];\n\nexport const ContactAvatar = ({ firstName, lastName, avatar, size = 'md', className = '' }: ContactAvatarProps) => {\n const initials = `${firstName.charAt(0)}${lastName.charAt(0)}`.toUpperCase();\n const colorIdx = (firstName.charCodeAt(0) + lastName.charCodeAt(0)) % bgColors.length;\n\n if (avatar) {\n return <img src={avatar} alt={`${firstName} ${lastName}`} className={`${sizeClasses[size]} rounded-full object-cover ${className}`} />;\n }\n\n return (\n <div className={`${sizeClasses[size]} ${bgColors[colorIdx]} rounded-full flex items-center justify-center text-white font-medium ${className}`}>\n {initials}\n </div>\n );\n};\n","import React from 'react';\nimport { Mail, Phone, Building } from 'lucide-react';\nimport type { ContactItem } from './types';\nimport { ContactAvatar } from './ContactAvatar';\n\nexport interface ContactCardProps {\n contact: ContactItem;\n selected?: boolean;\n onClick?: () => void;\n className?: string;\n}\n\nexport const ContactCard = ({ contact, selected = false, onClick, className = '' }: ContactCardProps) => (\n <button\n onClick={onClick}\n className={`flex items-center gap-3 px-4 py-3 w-full text-left transition-colors ${\n selected ? 'bg-primary/10 border-l-2 border-primary' : 'hover:bg-muted/50 border-l-2 border-transparent'\n } ${className}`}\n >\n <ContactAvatar firstName={contact.firstName} lastName={contact.lastName} avatar={contact.avatar} />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground truncate\" title={`${contact.firstName} ${contact.lastName}`}>\n {contact.firstName} {contact.lastName}\n </p>\n {contact.company && (\n <p className=\"text-xs text-muted-foreground flex items-center gap-1 truncate\" title={contact.company}>\n <Building size={12} />\n {contact.company}\n </p>\n )}\n </div>\n <div className=\"flex items-center gap-1.5 text-muted-foreground\">\n {contact.email && <Mail size={14} />}\n {contact.phone && <Phone size={14} />}\n </div>\n </button>\n);\n","import React from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { ContactListModel } from './ContactListModel';\nimport { ContactCard } from './ContactCard';\n\nexport interface ContactListProps {\n model: ContactListModel;\n className?: string;\n}\n\nexport const ContactList = observer<ContactListProps>(({ model, className = '' }) => (\n <div className={`overflow-y-auto ${className}`}>\n {Array.from(model.groupedByLetter.entries()).map(([letter, contacts]) => (\n <div key={letter}>\n <div className=\"sticky top-0 bg-muted/50 backdrop-blur-sm px-4 py-1 border-b border-border\">\n <span className=\"text-xs font-semibold text-muted-foreground\">{letter}</span>\n </div>\n {contacts.map(contact => (\n <ContactCard\n key={contact.id}\n contact={contact}\n selected={model.selectedContact?.id === contact.id}\n onClick={() => model.selectContact(contact)}\n />\n ))}\n </div>\n ))}\n {model.filteredContacts.length === 0 && (\n <div className=\"flex items-center justify-center h-32 text-muted-foreground text-sm\">No contacts found</div>\n )}\n </div>\n));\n","import React from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { Mail, Phone, MapPin, Building, Calendar, Tag } from 'lucide-react';\nimport type { ContactListModel } from './ContactListModel';\nimport { ContactAvatar } from './ContactAvatar';\n\nexport interface ContactDetailProps {\n model: ContactListModel;\n className?: string;\n}\n\nconst DetailRow = ({ icon: Icon, label, value }: { icon: React.ElementType; label: string; value: string }) => (\n <div className=\"flex items-start gap-3 py-2\">\n <Icon size={16} className=\"text-muted-foreground mt-0.5 flex-shrink-0\" />\n <div>\n <p className=\"text-xs text-muted-foreground\">{label}</p>\n <p className=\"text-sm text-foreground\">{value}</p>\n </div>\n </div>\n);\n\nexport const ContactDetail = observer<ContactDetailProps>(({ model, className = '' }) => {\n const contact = model.selectedContact;\n\n if (!contact) {\n return (\n <div className={`flex items-center justify-center h-full text-muted-foreground text-sm ${className}`}>\n Select a contact to view details\n </div>\n );\n }\n\n return (\n <div className={`p-6 overflow-y-auto ${className}`}>\n <div className=\"flex flex-col items-center mb-6\">\n <ContactAvatar firstName={contact.firstName} lastName={contact.lastName} avatar={contact.avatar} size=\"lg\" />\n <h2 className=\"mt-3 text-lg font-semibold text-foreground\">{contact.firstName} {contact.lastName}</h2>\n {contact.company && <p className=\"text-sm text-muted-foreground\">{contact.company}</p>}\n </div>\n\n <div className=\"divide-y divide-border\">\n {contact.email && <DetailRow icon={Mail} label=\"Email\" value={contact.email} />}\n {contact.phone && <DetailRow icon={Phone} label=\"Phone\" value={contact.phone} />}\n {contact.company && <DetailRow icon={Building} label=\"Company\" value={contact.company} />}\n {contact.address && <DetailRow icon={MapPin} label=\"Address\" value={contact.address} />}\n {contact.birthday && <DetailRow icon={Calendar} label=\"Birthday\" value={contact.birthday.toLocaleDateString()} />}\n {contact.groups && contact.groups.length > 0 && (\n <div className=\"flex items-start gap-3 py-2\">\n <Tag size={16} className=\"text-muted-foreground mt-0.5 flex-shrink-0\" />\n <div>\n <p className=\"text-xs text-muted-foreground\">Groups</p>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {contact.groups.map(g => (\n <span key={g} className=\"text-xs bg-muted text-muted-foreground px-2 py-0.5 rounded-full\">{g}</span>\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n});\n","import React from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { Users, User } from 'lucide-react';\nimport type { ContactListModel } from './ContactListModel';\n\nexport interface ContactGroupSidebarProps {\n model: ContactListModel;\n className?: string;\n}\n\nexport const ContactGroupSidebar = observer<ContactGroupSidebarProps>(({ model, className = '' }) => (\n <div className={`w-56 border-r border-border bg-muted/30 overflow-y-auto ${className}`}>\n <div className=\"p-3\">\n <h3 className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2\">Groups</h3>\n <button\n onClick={() => model.setGroup(null)}\n className={`flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors ${\n model.currentGroup === null ? 'bg-primary/10 text-primary' : 'text-foreground hover:bg-muted'\n }`}\n >\n <Users size={16} />\n <span>All Contacts</span>\n <span className=\"ml-auto text-xs text-muted-foreground\">{model.contacts.length}</span>\n </button>\n {model.groups.map(group => (\n <button\n key={group.id}\n onClick={() => model.setGroup(group.id)}\n className={`flex items-center gap-2 w-full px-3 py-2 rounded-lg text-sm transition-colors ${\n model.currentGroup === group.id ? 'bg-primary/10 text-primary' : 'text-foreground hover:bg-muted'\n }`}\n >\n <User size={16} />\n <span className=\"truncate\" title={group.name}>{group.name}</span>\n <span className=\"ml-auto text-xs text-muted-foreground\">{group.count}</span>\n </button>\n ))}\n </div>\n </div>\n));\n","import React, { useEffect } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { Search, Loader2 } from 'lucide-react';\nimport { BrowserError } from '@anymux/ui/components/browser-error';\nimport type { ContactListModel } from './ContactListModel';\nimport { ContactList } from './ContactList';\nimport { ContactDetail } from './ContactDetail';\nimport { ContactGroupSidebar } from './ContactGroupSidebar';\n\nexport interface ContactBrowserProps {\n model: ContactListModel;\n className?: string;\n showSidebar?: boolean;\n}\n\nexport const ContactBrowser = observer<ContactBrowserProps>(({ model, className = '', showSidebar = true }) => {\n useEffect(() => { model.loadContacts(); }, [model]);\n\n return (\n <div className={`flex h-full bg-background rounded-xl border border-border overflow-hidden ${className}`}>\n {showSidebar && <ContactGroupSidebar model={model} className=\"hidden lg:block\" />}\n\n <div className=\"flex-1 flex flex-col min-w-0 border-r border-border sm:max-w-[380px]\">\n {/* Search */}\n <div className=\"px-3 py-2 border-b border-border\">\n <div className=\"relative\">\n <Search size={16} className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground\" />\n <input\n type=\"text\"\n placeholder=\"Search contacts...\"\n value={model.searchQuery}\n onChange={e => model.setSearch(e.target.value)}\n className=\"w-full pl-9 pr-3 py-1.5 text-sm border border-border rounded-lg bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n </div>\n\n {model.loading ? (\n <div className=\"flex items-center justify-center h-64\">\n <Loader2 size={24} className=\"animate-spin text-muted-foreground\" />\n </div>\n ) : model.error ? (\n <BrowserError\n error={model.error}\n context=\"Contacts\"\n onRetry={() => model.loadContacts()}\n />\n ) : (\n <ContactList model={model} className=\"flex-1\" />\n )}\n </div>\n\n <ContactDetail model={model} className=\"flex-1 hidden sm:block\" />\n </div>\n );\n});\n","import type { IContactProvider, ContactItem, ContactGroup } from './types';\n\nconst FIRST_NAMES = ['Alice', 'Bob', 'Charlie', 'Diana', 'Emma', 'Frank', 'Grace', 'Henry', 'Iris', 'Jack', 'Karen', 'Leo', 'Mia', 'Nathan', 'Olivia', 'Paul', 'Quinn', 'Rachel', 'Sam', 'Tina', 'Uma', 'Victor', 'Wendy', 'Xavier', 'Yara', 'Zach'];\nconst LAST_NAMES = ['Anderson', 'Baker', 'Chen', 'Davis', 'Evans', 'Fisher', 'Garcia', 'Hall', 'Ibrahim', 'Jones', 'Kim', 'Lee', 'Martinez', 'Nguyen', 'O\\'Brien', 'Park', 'Quinn', 'Robinson', 'Smith', 'Taylor', 'Ueda', 'Vega', 'Wilson', 'Xu', 'Yang', 'Zhang'];\nconst COMPANIES = ['Acme Corp', 'TechStart Inc', 'Global Systems', 'DataFlow', 'CloudNine', 'PixelPerfect'];\nconst GROUPS_DATA: ContactGroup[] = [\n { id: 'family', name: 'Family', count: 8 },\n { id: 'work', name: 'Work', count: 12 },\n { id: 'friends', name: 'Friends', count: 10 },\n { id: 'vip', name: 'VIP', count: 5 },\n];\n\nfunction generateContacts(): ContactItem[] {\n const contacts: ContactItem[] = [];\n const now = new Date();\n for (let i = 0; i < FIRST_NAMES.length; i++) {\n contacts.push({\n id: `contact-${i}`,\n type: 'contact',\n title: `${FIRST_NAMES[i]} ${LAST_NAMES[i]}`,\n firstName: FIRST_NAMES[i],\n lastName: LAST_NAMES[i],\n email: `${FIRST_NAMES[i].toLowerCase()}.${LAST_NAMES[i].toLowerCase()}@example.com`,\n phone: `+1 (555) ${String(100 + i).padStart(3, '0')}-${String(1000 + i * 37).slice(0, 4)}`,\n company: COMPANIES[i % COMPANIES.length],\n address: `${100 + i} Main St, City ${i % 10}, ST ${10000 + i}`,\n birthday: new Date(1985 + (i % 20), i % 12, 1 + (i % 28)),\n groups: [GROUPS_DATA[i % GROUPS_DATA.length].id],\n createdAt: now,\n updatedAt: now,\n });\n }\n return contacts;\n}\n\nexport class MockContactProvider implements IContactProvider {\n private contacts = generateContacts();\n\n async listItems() { return this.contacts; }\n\n async getItem(id: string) { return this.contacts.find(c => c.id === id) ?? null; }\n\n async createItem(item: Omit<ContactItem, 'id' | 'createdAt' | 'updatedAt'>) {\n const now = new Date();\n const created: ContactItem = { ...item, id: `contact-${Date.now()}`, createdAt: now, updatedAt: now } as ContactItem;\n this.contacts.push(created);\n return created;\n }\n\n async updateItem(id: string, updates: Partial<ContactItem>) {\n const idx = this.contacts.findIndex(c => c.id === id);\n if (idx === -1) throw new Error('Not found');\n this.contacts[idx] = { ...this.contacts[idx], ...updates, updatedAt: new Date() };\n return this.contacts[idx];\n }\n\n async deleteItem(id: string) {\n this.contacts = this.contacts.filter(c => c.id !== id);\n }\n\n async search(query: string) {\n const q = query.toLowerCase();\n return this.contacts.filter(c =>\n c.firstName.toLowerCase().includes(q) || c.lastName.toLowerCase().includes(q)\n );\n }\n\n async getGroups() { return GROUPS_DATA; }\n\n async getByGroup(groupId: string) {\n return this.contacts.filter(c => c.groups?.includes(groupId));\n }\n\n async searchByName(name: string) {\n return this.search(name);\n }\n}\n"],"mappings":"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"}
|
package/dist/contacts.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import "./types-common-CB3kRek8.js";
|
|
2
|
-
import { ContactAvatar$1 as ContactAvatar, ContactAvatarProps, ContactBrowser$1 as ContactBrowser, ContactBrowserProps, ContactCard$1 as ContactCard, ContactCardProps, ContactDetail$1 as ContactDetail, ContactDetailProps, ContactGroup, ContactGroupSidebar$1 as ContactGroupSidebar, ContactGroupSidebarProps, ContactItem, ContactList$1 as ContactList, ContactListModel$1 as ContactListModel, ContactListProps, ContactSortBy, IContactProvider, MockContactProvider$1 as MockContactProvider } from "./index-
|
|
2
|
+
import { ContactAvatar$1 as ContactAvatar, ContactAvatarProps, ContactBrowser$1 as ContactBrowser, ContactBrowserProps, ContactCard$1 as ContactCard, ContactCardProps, ContactDetail$1 as ContactDetail, ContactDetailProps, ContactGroup, ContactGroupSidebar$1 as ContactGroupSidebar, ContactGroupSidebarProps, ContactItem, ContactList$1 as ContactList, ContactListModel$1 as ContactListModel, ContactListProps, ContactSortBy, IContactProvider, MockContactProvider$1 as MockContactProvider } from "./index-Pty-N7-g.js";
|
|
3
3
|
export { ContactAvatar, ContactAvatarProps, ContactBrowser, ContactBrowserProps, ContactCard, ContactCardProps, ContactDetail, ContactDetailProps, ContactGroup, ContactGroupSidebar, ContactGroupSidebarProps, ContactItem, ContactList, ContactListModel, ContactListProps, ContactSortBy, IContactProvider, MockContactProvider };
|
package/dist/contacts.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { ContactAvatar, ContactBrowser, ContactCard, ContactDetail, ContactGroupSidebar, ContactList, ContactListModel, MockContactProvider } from "./contacts-
|
|
1
|
+
import { ContactAvatar, ContactBrowser, ContactCard, ContactDetail, ContactGroupSidebar, ContactList, ContactListModel, MockContactProvider } from "./contacts-By9Wg3kn.js";
|
|
2
2
|
|
|
3
3
|
export { ContactAvatar, ContactBrowser, ContactCard, ContactDetail, ContactGroupSidebar, ContactList, ContactListModel, MockContactProvider };
|