@lindaui/blocks 0.4.2 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -0
- package/dist/ai-cost-card-f403ypsg.js +99 -0
- package/dist/ai-performance-card-cggm09nc.js +191 -0
- package/dist/analytics/ai-cost-card.d.ts +3 -0
- package/dist/analytics/ai-cost-card.d.ts.map +1 -0
- package/dist/analytics/ai-performance-card.d.ts +3 -0
- package/dist/analytics/ai-performance-card.d.ts.map +1 -0
- package/dist/analytics/analytics-card.d.ts +3 -0
- package/dist/analytics/analytics-card.d.ts.map +1 -0
- package/dist/analytics/analytics-skeleton.d.ts +5 -0
- package/dist/analytics/analytics-skeleton.d.ts.map +1 -0
- package/dist/analytics/entity-health-card.d.ts +3 -0
- package/dist/analytics/entity-health-card.d.ts.map +1 -0
- package/dist/analytics/status-distribution-chart.d.ts +3 -0
- package/dist/analytics/status-distribution-chart.d.ts.map +1 -0
- package/dist/analytics/time-range-picker.d.ts +3 -0
- package/dist/analytics/time-range-picker.d.ts.map +1 -0
- package/dist/analytics/top-entities-table.d.ts +3 -0
- package/dist/analytics/top-entities-table.d.ts.map +1 -0
- package/dist/analytics/types.d.ts +104 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/analytics-card-bcmijpt6.js +38 -0
- package/dist/analytics-skeleton-imve37du.js +164 -0
- package/dist/analytics.d.ts +11 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +8 -0
- package/dist/app-shell/drawer-focus.d.ts +8 -0
- package/dist/app-shell/drawer-focus.d.ts.map +1 -0
- package/dist/app-shell/footer.d.ts +39 -0
- package/dist/app-shell/footer.d.ts.map +1 -0
- package/dist/app-shell/logout-dialog.d.ts +6 -0
- package/dist/app-shell/logout-dialog.d.ts.map +1 -0
- package/dist/app-shell/navigation.d.ts +15 -0
- package/dist/app-shell/navigation.d.ts.map +1 -0
- package/dist/app-shell/types.d.ts +55 -0
- package/dist/app-shell/types.d.ts.map +1 -0
- package/dist/app-shell.d.ts +7 -0
- package/dist/app-shell.d.ts.map +1 -0
- package/dist/app-shell.js +254 -0
- package/dist/channel-settings.d.ts +24 -0
- package/dist/channel-settings.d.ts.map +1 -0
- package/dist/channel-settings.js +60 -0
- package/dist/chat-avatar-jdmeyf2o.js +30 -0
- package/dist/chat-layout-fwx3x26g.js +25 -0
- package/dist/chat.d.ts +22 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +66 -0
- package/dist/command-palette.d.ts +22 -0
- package/dist/command-palette.d.ts.map +1 -0
- package/dist/command-palette.js +141 -0
- package/dist/compat-chat/chat-avatar.d.ts +16 -0
- package/dist/compat-chat/chat-avatar.d.ts.map +1 -0
- package/dist/compat-chat/chat-header.d.ts +9 -0
- package/dist/compat-chat/chat-header.d.ts.map +1 -0
- package/dist/compat-chat/chat-layout.d.ts +10 -0
- package/dist/compat-chat/chat-layout.d.ts.map +1 -0
- package/dist/compat-chat/conversation-list-item.d.ts +10 -0
- package/dist/compat-chat/conversation-list-item.d.ts.map +1 -0
- package/dist/compat-chat/conversation-list.d.ts +24 -0
- package/dist/compat-chat/conversation-list.d.ts.map +1 -0
- package/dist/compat-chat/conversation-thread.d.ts +18 -0
- package/dist/compat-chat/conversation-thread.d.ts.map +1 -0
- package/dist/compat-chat/date-divider.d.ts +5 -0
- package/dist/compat-chat/date-divider.d.ts.map +1 -0
- package/dist/compat-chat/empty-chat-view.d.ts +6 -0
- package/dist/compat-chat/empty-chat-view.d.ts.map +1 -0
- package/dist/compat-chat/image-lightbox.d.ts +7 -0
- package/dist/compat-chat/image-lightbox.d.ts.map +1 -0
- package/dist/compat-chat/message-bubble.d.ts +6 -0
- package/dist/compat-chat/message-bubble.d.ts.map +1 -0
- package/dist/compat-chat/message-composer.d.ts +11 -0
- package/dist/compat-chat/message-composer.d.ts.map +1 -0
- package/dist/compat-chat/time-divider.d.ts +5 -0
- package/dist/compat-chat/time-divider.d.ts.map +1 -0
- package/dist/compat-chat/time-grouping.d.ts +5 -0
- package/dist/compat-chat/time-grouping.d.ts.map +1 -0
- package/dist/compat-chat/types.d.ts +35 -0
- package/dist/compat-chat/types.d.ts.map +1 -0
- package/dist/compat-chat/whatsapp-audio-player.d.ts +7 -0
- package/dist/compat-chat/whatsapp-audio-player.d.ts.map +1 -0
- package/dist/compat.d.ts +9 -0
- package/dist/compat.d.ts.map +1 -0
- package/dist/compat.js +4 -0
- package/dist/connected-panel-lhwy25yk.js +132 -0
- package/dist/connection-panel/connected-panel.d.ts +26 -0
- package/dist/connection-panel/connected-panel.d.ts.map +1 -0
- package/dist/connection-panel/disconnected-panel.d.ts +12 -0
- package/dist/connection-panel/disconnected-panel.d.ts.map +1 -0
- package/dist/connection-panel/instructions.d.ts +5 -0
- package/dist/connection-panel/instructions.d.ts.map +1 -0
- package/dist/connection-panel/qr-panel.d.ts +14 -0
- package/dist/connection-panel/qr-panel.d.ts.map +1 -0
- package/dist/connection-panel/use-qr-refresh.d.ts +18 -0
- package/dist/connection-panel/use-qr-refresh.d.ts.map +1 -0
- package/dist/connection-panel.d.ts +39 -0
- package/dist/connection-panel.d.ts.map +1 -0
- package/dist/connection-panel.js +328 -0
- package/dist/conversation-list-ekq2dzca.js +133 -0
- package/dist/conversation-list-item-fy6t5af2.js +55 -0
- package/dist/conversation-thread-c60431oa.js +205 -0
- package/dist/entity-card.d.ts +17 -0
- package/dist/entity-card.d.ts.map +1 -0
- package/dist/entity-card.js +69 -0
- package/dist/entity-health-card-ggnmrtrq.js +192 -0
- package/dist/entity-switcher.d.ts +33 -0
- package/dist/entity-switcher.d.ts.map +1 -0
- package/dist/entity-switcher.js +137 -0
- package/dist/filter-bar.d.ts +41 -0
- package/dist/filter-bar.d.ts.map +1 -0
- package/dist/filter-bar.js +155 -0
- package/dist/footer-f7r5e42b.js +192 -0
- package/dist/image-lightbox-ci3arb6z.js +62 -0
- package/dist/kanban/drop-utils.d.ts +18 -0
- package/dist/kanban/drop-utils.d.ts.map +1 -0
- package/dist/kanban/navigation-buttons.d.ts +9 -0
- package/dist/kanban/navigation-buttons.d.ts.map +1 -0
- package/dist/kanban/scroll-indicators.d.ts +6 -0
- package/dist/kanban/scroll-indicators.d.ts.map +1 -0
- package/dist/kanban/use-keyboard-navigation.d.ts +4 -0
- package/dist/kanban/use-keyboard-navigation.d.ts.map +1 -0
- package/dist/kanban-board.d.ts +31 -0
- package/dist/kanban-board.d.ts.map +1 -0
- package/dist/kanban-board.js +128 -0
- package/dist/kanban-column.d.ts +13 -0
- package/dist/kanban-column.d.ts.map +1 -0
- package/dist/kanban-column.js +58 -0
- package/dist/legacy-kpi-card.d.ts +16 -0
- package/dist/legacy-kpi-card.d.ts.map +1 -0
- package/dist/legacy-kpi-card.js +4 -0
- package/dist/logout-dialog-bbv59tbi.js +93 -0
- package/dist/message-bubble-odjvhroq.js +110 -0
- package/dist/message-composer-m2n6soo7.js +59 -0
- package/dist/navigation-buttons-e77mshh0.js +65 -0
- package/dist/navigation-hotcrqoq.js +115 -0
- package/dist/save-bar.d.ts +15 -0
- package/dist/save-bar.d.ts.map +1 -0
- package/dist/save-bar.js +38 -0
- package/dist/scroll-indicators-gvxapogd.js +39 -0
- package/dist/settings-layout.d.ts +20 -0
- package/dist/settings-layout.d.ts.map +1 -0
- package/dist/settings-layout.js +56 -0
- package/dist/source-selector.d.ts +18 -0
- package/dist/source-selector.d.ts.map +1 -0
- package/dist/source-selector.js +59 -0
- package/dist/status-distribution-chart-oucedzv7.js +87 -0
- package/dist/status-filters.d.ts +12 -0
- package/dist/status-filters.d.ts.map +1 -0
- package/dist/status-filters.js +31 -0
- package/dist/stepper.d.ts +15 -0
- package/dist/stepper.d.ts.map +1 -0
- package/dist/stepper.js +42 -0
- package/dist/time-range-picker-mu38hul4.js +123 -0
- package/dist/top-entities-table-o7xzpq96.js +78 -0
- package/dist/use-keyboard-navigation-he1xmriz.js +52 -0
- package/dist/whatsapp-audio-player-nooty6jb.js +277 -0
- package/llms.txt +98 -4
- package/package.json +191 -46
- package/src/analytics/ai-cost-card.tsx +31 -0
- package/src/analytics/ai-performance-card.tsx +48 -0
- package/src/analytics/analytics-card.tsx +14 -0
- package/src/analytics/analytics-skeleton.tsx +15 -0
- package/src/analytics/entity-health-card.tsx +50 -0
- package/src/analytics/status-distribution-chart.tsx +20 -0
- package/src/analytics/time-range-picker.tsx +43 -0
- package/src/analytics/top-entities-table.tsx +24 -0
- package/src/analytics/types.ts +43 -0
- package/src/analytics.ts +10 -0
- package/src/app-shell/drawer-focus.ts +42 -0
- package/src/app-shell/footer.tsx +160 -0
- package/src/app-shell/logout-dialog.tsx +68 -0
- package/src/app-shell/navigation.tsx +147 -0
- package/src/app-shell/types.ts +57 -0
- package/src/app-shell.tsx +166 -0
- package/src/area-chart.tsx +85 -0
- package/src/audio-player.tsx +74 -0
- package/src/auth-layout.tsx +132 -0
- package/src/auth-provider.tsx +29 -0
- package/src/bar-chart.tsx +78 -0
- package/src/channel-settings.tsx +76 -0
- package/src/chart-card.tsx +45 -0
- package/src/chat-avatar.tsx +57 -0
- package/src/chat-date-divider.tsx +18 -0
- package/src/chat-header.tsx +24 -0
- package/src/chat-layout.tsx +41 -0
- package/src/chat-time-divider.tsx +20 -0
- package/src/chat-types.ts +32 -0
- package/src/chat.ts +21 -0
- package/src/command-palette.tsx +110 -0
- package/src/compat-chat/chat-avatar.tsx +23 -0
- package/src/compat-chat/chat-header.tsx +12 -0
- package/src/compat-chat/chat-layout.tsx +14 -0
- package/src/compat-chat/conversation-list-item.tsx +27 -0
- package/src/compat-chat/conversation-list.tsx +49 -0
- package/src/compat-chat/conversation-thread.tsx +92 -0
- package/src/compat-chat/date-divider.tsx +7 -0
- package/src/compat-chat/empty-chat-view.tsx +9 -0
- package/src/compat-chat/image-lightbox.tsx +22 -0
- package/src/compat-chat/message-bubble.tsx +28 -0
- package/src/compat-chat/message-composer.tsx +26 -0
- package/src/compat-chat/time-divider.tsx +5 -0
- package/src/compat-chat/time-grouping.ts +19 -0
- package/src/compat-chat/types.ts +31 -0
- package/src/compat-chat/whatsapp-audio-player.tsx +100 -0
- package/src/compat.ts +8 -0
- package/src/confirm-dialog.tsx +85 -0
- package/src/connection-panel/connected-panel.tsx +106 -0
- package/src/connection-panel/disconnected-panel.tsx +48 -0
- package/src/connection-panel/instructions.tsx +9 -0
- package/src/connection-panel/qr-panel.tsx +62 -0
- package/src/connection-panel/use-qr-refresh.ts +52 -0
- package/src/connection-panel.tsx +141 -0
- package/src/conversation-list-item.tsx +53 -0
- package/src/conversation-list.tsx +67 -0
- package/src/conversation-thread.tsx +64 -0
- package/src/detail-panel.tsx +123 -0
- package/src/document-panel.tsx +109 -0
- package/src/document-reader.tsx +29 -0
- package/src/empty-chat-view.tsx +25 -0
- package/src/entity-card.tsx +74 -0
- package/src/entity-health-card.tsx +53 -0
- package/src/entity-switcher.tsx +126 -0
- package/src/fetching-indicator.tsx +16 -0
- package/src/field-array-form.tsx +166 -0
- package/src/filter-bar.tsx +203 -0
- package/src/image-viewer.tsx +129 -0
- package/src/kanban/drop-utils.ts +31 -0
- package/src/kanban/navigation-buttons.tsx +80 -0
- package/src/kanban/scroll-indicators.tsx +47 -0
- package/src/kanban/use-keyboard-navigation.ts +43 -0
- package/src/kanban-board.tsx +160 -0
- package/src/kanban-column.tsx +62 -0
- package/src/legacy-kpi-card.tsx +38 -0
- package/src/line-chart.tsx +58 -0
- package/src/list-item.tsx +63 -0
- package/src/list-pane.tsx +143 -0
- package/src/login-form.tsx +128 -0
- package/src/message-bubble.tsx +70 -0
- package/src/message-composer.tsx +52 -0
- package/src/pie-chart.tsx +70 -0
- package/src/radar-chart.tsx +55 -0
- package/src/radial-chart.tsx +103 -0
- package/src/recording-overlay.tsx +159 -0
- package/src/save-bar.tsx +35 -0
- package/src/settings-layout.tsx +79 -0
- package/src/source-selector.tsx +71 -0
- package/src/split-workspace.tsx +74 -0
- package/src/stat-card.tsx +166 -0
- package/src/stats-grid.tsx +23 -0
- package/src/status-filters.tsx +28 -0
- package/src/stepper.tsx +47 -0
- package/src/table-pane.tsx +194 -0
- package/src/time-range-picker.tsx +89 -0
- package/src/workspace-back-button.tsx +32 -0
- package/dist/chat-types.test.d.ts +0 -2
- package/dist/chat-types.test.d.ts.map +0 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
export interface EntitySwitcherItem {
|
|
3
|
+
identifier: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description?: string | null;
|
|
6
|
+
}
|
|
7
|
+
export interface EntitySwitcherAction {
|
|
8
|
+
identifier: string;
|
|
9
|
+
label: string;
|
|
10
|
+
icon?: ReactNode;
|
|
11
|
+
className?: string;
|
|
12
|
+
onAction: () => void;
|
|
13
|
+
}
|
|
14
|
+
export interface EntitySwitcherLabels {
|
|
15
|
+
trigger: string;
|
|
16
|
+
menu: string;
|
|
17
|
+
section: string;
|
|
18
|
+
fallbackDescription?: string;
|
|
19
|
+
visiting?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface EntitySwitcherProps<T extends EntitySwitcherItem = EntitySwitcherItem> {
|
|
22
|
+
currentEntity?: T | null;
|
|
23
|
+
entities: T[];
|
|
24
|
+
onSelect: (entity: T) => void;
|
|
25
|
+
labels: EntitySwitcherLabels;
|
|
26
|
+
isCollapsed?: boolean;
|
|
27
|
+
isVisiting?: boolean;
|
|
28
|
+
actions?: EntitySwitcherAction[];
|
|
29
|
+
renderAvatar?: (entity: T) => ReactNode;
|
|
30
|
+
}
|
|
31
|
+
/** Controlled, domain-neutral entity selector with the original compact sidebar anatomy. */
|
|
32
|
+
export declare function EntitySwitcher<T extends EntitySwitcherItem>({ currentEntity, entities, onSelect, labels, isCollapsed, isVisiting, actions, renderAvatar, }: EntitySwitcherProps<T>): import("react").JSX.Element | null;
|
|
33
|
+
//# sourceMappingURL=entity-switcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-switcher.d.ts","sourceRoot":"","sources":["../src/entity-switcher.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB;IACpF,aAAa,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,CAAC,EAAE,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAC9B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,SAAS,CAAC;CACzC;AAED,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,CAAC,SAAS,kBAAkB,EAAE,EAC3D,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAmB,EAC9D,UAAkB,EAAE,OAAY,EAAE,YAAY,GAC/C,EAAE,mBAAmB,CAAC,CAAC,CAAC,sCAiFxB"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
3
|
+
import { Dropdown, Avatar, Chip, Header, Label, Description, Separator } from '@lindaui/ui/compound';
|
|
4
|
+
import { cn } from '@lindaui/ui/cn';
|
|
5
|
+
import { ChevronDown } from 'lucide-react';
|
|
6
|
+
|
|
7
|
+
/** Controlled, domain-neutral entity selector with the original compact sidebar anatomy. */ function EntitySwitcher({ currentEntity, entities, onSelect, labels, isCollapsed = false, isVisiting = false, actions = [], renderAvatar }) {
|
|
8
|
+
if (!currentEntity) return null;
|
|
9
|
+
return /*#__PURE__*/ jsx("div", {
|
|
10
|
+
className: cn("px-2 py-2", isCollapsed ? "flex justify-center" : ""),
|
|
11
|
+
children: /*#__PURE__*/ jsxs(Dropdown, {
|
|
12
|
+
children: [
|
|
13
|
+
/*#__PURE__*/ jsx(Dropdown.Trigger, {
|
|
14
|
+
"aria-label": labels.trigger,
|
|
15
|
+
className: "w-full min-w-0",
|
|
16
|
+
children: /*#__PURE__*/ jsxs("div", {
|
|
17
|
+
className: cn("flex w-full min-w-0 cursor-pointer items-center gap-2 rounded-lg p-2 transition-colors hover:bg-surface-secondary", isVisiting ? "ring-2 ring-warning ring-offset-1" : "", isCollapsed ? "justify-center" : ""),
|
|
18
|
+
children: [
|
|
19
|
+
/*#__PURE__*/ jsx(Avatar, {
|
|
20
|
+
className: "flex-shrink-0 transition-transform",
|
|
21
|
+
color: isVisiting ? "warning" : "default",
|
|
22
|
+
size: "sm",
|
|
23
|
+
children: renderAvatar ? renderAvatar(currentEntity) : /*#__PURE__*/ jsx(Avatar.Fallback, {
|
|
24
|
+
children: currentEntity.name.charAt(0).toUpperCase()
|
|
25
|
+
})
|
|
26
|
+
}),
|
|
27
|
+
!isCollapsed && /*#__PURE__*/ jsxs(Fragment, {
|
|
28
|
+
children: [
|
|
29
|
+
/*#__PURE__*/ jsxs("div", {
|
|
30
|
+
className: "min-w-0 flex-1 overflow-hidden",
|
|
31
|
+
children: [
|
|
32
|
+
/*#__PURE__*/ jsxs("div", {
|
|
33
|
+
className: "flex min-w-0 items-center gap-1.5",
|
|
34
|
+
children: [
|
|
35
|
+
/*#__PURE__*/ jsx("p", {
|
|
36
|
+
className: "truncate font-semibold text-sm",
|
|
37
|
+
children: currentEntity.name
|
|
38
|
+
}),
|
|
39
|
+
isVisiting && labels.visiting ? /*#__PURE__*/ jsx(Chip, {
|
|
40
|
+
className: "shrink-0",
|
|
41
|
+
color: "warning",
|
|
42
|
+
size: "sm",
|
|
43
|
+
variant: "soft",
|
|
44
|
+
children: labels.visiting
|
|
45
|
+
}) : null
|
|
46
|
+
]
|
|
47
|
+
}),
|
|
48
|
+
/*#__PURE__*/ jsx("p", {
|
|
49
|
+
className: "truncate text-muted text-xs",
|
|
50
|
+
children: currentEntity.description || labels.fallbackDescription
|
|
51
|
+
})
|
|
52
|
+
]
|
|
53
|
+
}),
|
|
54
|
+
/*#__PURE__*/ jsx(ChevronDown, {
|
|
55
|
+
className: "shrink-0 text-muted",
|
|
56
|
+
size: 16
|
|
57
|
+
})
|
|
58
|
+
]
|
|
59
|
+
})
|
|
60
|
+
]
|
|
61
|
+
})
|
|
62
|
+
}),
|
|
63
|
+
/*#__PURE__*/ jsx(Dropdown.Popover, {
|
|
64
|
+
className: "rounded-[14px]",
|
|
65
|
+
placement: "bottom start",
|
|
66
|
+
children: /*#__PURE__*/ jsxs(Dropdown.Menu, {
|
|
67
|
+
"aria-label": labels.menu,
|
|
68
|
+
className: "w-60 [&_[data-slot=menu-item]]:rounded-lg",
|
|
69
|
+
onAction: (key)=>{
|
|
70
|
+
const action = actions.find((item)=>item.identifier === String(key));
|
|
71
|
+
if (action) {
|
|
72
|
+
action.onAction();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const entity = entities.find((item)=>item.identifier === String(key));
|
|
76
|
+
if (entity) onSelect(entity);
|
|
77
|
+
},
|
|
78
|
+
selectedKeys: new Set([
|
|
79
|
+
currentEntity.identifier
|
|
80
|
+
]),
|
|
81
|
+
selectionMode: "single",
|
|
82
|
+
children: [
|
|
83
|
+
/*#__PURE__*/ jsxs(Dropdown.Section, {
|
|
84
|
+
children: [
|
|
85
|
+
/*#__PURE__*/ jsx(Header, {
|
|
86
|
+
children: labels.section
|
|
87
|
+
}),
|
|
88
|
+
entities.map((entity)=>/*#__PURE__*/ jsxs(Dropdown.Item, {
|
|
89
|
+
id: entity.identifier,
|
|
90
|
+
textValue: entity.name,
|
|
91
|
+
children: [
|
|
92
|
+
/*#__PURE__*/ jsx(Dropdown.ItemIndicator, {}),
|
|
93
|
+
/*#__PURE__*/ jsx(Avatar, {
|
|
94
|
+
className: "flex-shrink-0",
|
|
95
|
+
size: "sm",
|
|
96
|
+
children: renderAvatar ? renderAvatar(entity) : /*#__PURE__*/ jsx(Avatar.Fallback, {
|
|
97
|
+
children: entity.name.charAt(0).toUpperCase()
|
|
98
|
+
})
|
|
99
|
+
}),
|
|
100
|
+
/*#__PURE__*/ jsxs("div", {
|
|
101
|
+
className: "flex min-w-0 flex-col",
|
|
102
|
+
children: [
|
|
103
|
+
/*#__PURE__*/ jsx(Label, {
|
|
104
|
+
children: entity.name
|
|
105
|
+
}),
|
|
106
|
+
/*#__PURE__*/ jsx(Description, {
|
|
107
|
+
children: entity.description
|
|
108
|
+
})
|
|
109
|
+
]
|
|
110
|
+
})
|
|
111
|
+
]
|
|
112
|
+
}, entity.identifier))
|
|
113
|
+
]
|
|
114
|
+
}),
|
|
115
|
+
actions.length > 0 ? /*#__PURE__*/ jsx(Separator, {}) : null,
|
|
116
|
+
actions.length > 0 ? /*#__PURE__*/ jsx(Dropdown.Section, {
|
|
117
|
+
children: actions.map((action)=>/*#__PURE__*/ jsxs(Dropdown.Item, {
|
|
118
|
+
className: action.className,
|
|
119
|
+
id: action.identifier,
|
|
120
|
+
textValue: action.label,
|
|
121
|
+
children: [
|
|
122
|
+
action.icon,
|
|
123
|
+
/*#__PURE__*/ jsx(Label, {
|
|
124
|
+
children: action.label
|
|
125
|
+
})
|
|
126
|
+
]
|
|
127
|
+
}, action.identifier))
|
|
128
|
+
}) : null
|
|
129
|
+
]
|
|
130
|
+
})
|
|
131
|
+
})
|
|
132
|
+
]
|
|
133
|
+
})
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export { EntitySwitcher };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type LucideIcon } from "lucide-react";
|
|
2
|
+
import { type ReactNode } from "react";
|
|
3
|
+
export interface FilterOption {
|
|
4
|
+
key: string;
|
|
5
|
+
label: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SortOption {
|
|
8
|
+
key: string;
|
|
9
|
+
label: string;
|
|
10
|
+
}
|
|
11
|
+
export interface FilterBarSearchProps {
|
|
12
|
+
className: string;
|
|
13
|
+
onChange: (value: string) => void;
|
|
14
|
+
placeholder: string;
|
|
15
|
+
value: string;
|
|
16
|
+
}
|
|
17
|
+
export interface FilterBarIconButtonProps {
|
|
18
|
+
icon: LucideIcon;
|
|
19
|
+
isActive: boolean;
|
|
20
|
+
tooltip: string;
|
|
21
|
+
}
|
|
22
|
+
export interface FilterBarProps {
|
|
23
|
+
className?: string;
|
|
24
|
+
searchValue: string;
|
|
25
|
+
onSearchChange: (value: string) => void;
|
|
26
|
+
searchPlaceholder?: string;
|
|
27
|
+
filterOptions?: FilterOption[];
|
|
28
|
+
selectedFilters?: string[];
|
|
29
|
+
onFilterChange?: (filters: string[]) => void;
|
|
30
|
+
filterLabel?: string;
|
|
31
|
+
clearFiltersLabel?: string;
|
|
32
|
+
clearSearchLabel?: string;
|
|
33
|
+
sortOptions?: SortOption[];
|
|
34
|
+
selectedSort?: string;
|
|
35
|
+
onSortChange?: (sort: string) => void;
|
|
36
|
+
sortLabel?: string;
|
|
37
|
+
renderSearchInput?: (props: FilterBarSearchProps) => ReactNode;
|
|
38
|
+
renderIconButton?: (props: FilterBarIconButtonProps) => ReactNode;
|
|
39
|
+
}
|
|
40
|
+
export declare function FilterBar({ searchValue, onSearchChange, searchPlaceholder, filterOptions, selectedFilters, onFilterChange, filterLabel, clearFiltersLabel, clearSearchLabel, sortOptions, selectedSort, onSortChange, sortLabel, className, renderSearchInput, renderIconButton, }: FilterBarProps): import("react").JSX.Element;
|
|
41
|
+
//# sourceMappingURL=filter-bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-bar.d.ts","sourceRoot":"","sources":["../src/filter-bar.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,SAAS,CAAC;IAC/D,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,SAAS,CAAC;CACnE;AAED,wBAAgB,SAAS,CAAC,EACxB,WAAW,EACX,cAAc,EACd,iBAA+B,EAC/B,aAAa,EACb,eAAoB,EACpB,cAAc,EACd,WAAsB,EACtB,iBAAmC,EACnC,gBAAiC,EACjC,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,SAAkB,EAClB,SAAS,EACT,iBAAiB,EACjB,gBAA6D,GAC9D,EAAE,cAAc,+BAqFhB"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { Popover, CheckboxGroup, Checkbox, Button, TextField, InputGroup, CloseButton } from '@lindaui/ui/compound';
|
|
4
|
+
import { cn } from '@lindaui/ui/cn';
|
|
5
|
+
import { Filter, SlidersHorizontal, Search } from 'lucide-react';
|
|
6
|
+
import { useState } from 'react';
|
|
7
|
+
|
|
8
|
+
function FilterBar({ searchValue, onSearchChange, searchPlaceholder = "Search...", filterOptions, selectedFilters = [], onFilterChange, filterLabel = "Filter", clearFiltersLabel = "Clear filters", clearSearchLabel = "Clear search", sortOptions, selectedSort, onSortChange, sortLabel = "Sort", className, renderSearchInput, renderIconButton = (props)=>/*#__PURE__*/ jsx(FilterIconButton, {
|
|
9
|
+
...props
|
|
10
|
+
}) }) {
|
|
11
|
+
const [isFilterOpen, setIsFilterOpen] = useState(false);
|
|
12
|
+
const [isSortOpen, setIsSortOpen] = useState(false);
|
|
13
|
+
const hasActiveFilters = selectedFilters.length > 0;
|
|
14
|
+
const searchProps = {
|
|
15
|
+
className: "min-w-0 flex-1",
|
|
16
|
+
onChange: onSearchChange,
|
|
17
|
+
placeholder: searchPlaceholder,
|
|
18
|
+
value: searchValue
|
|
19
|
+
};
|
|
20
|
+
return /*#__PURE__*/ jsxs("div", {
|
|
21
|
+
className: cn("flex items-center gap-2", className),
|
|
22
|
+
children: [
|
|
23
|
+
renderSearchInput ? renderSearchInput(searchProps) : /*#__PURE__*/ jsx(FilterSearchInput, {
|
|
24
|
+
...searchProps,
|
|
25
|
+
clearLabel: clearSearchLabel
|
|
26
|
+
}),
|
|
27
|
+
filterOptions && filterOptions.length > 0 ? /*#__PURE__*/ jsxs(Popover, {
|
|
28
|
+
isOpen: isFilterOpen,
|
|
29
|
+
onOpenChange: setIsFilterOpen,
|
|
30
|
+
children: [
|
|
31
|
+
renderIconButton({
|
|
32
|
+
icon: Filter,
|
|
33
|
+
isActive: hasActiveFilters,
|
|
34
|
+
tooltip: filterLabel
|
|
35
|
+
}),
|
|
36
|
+
/*#__PURE__*/ jsx(Popover.Content, {
|
|
37
|
+
className: "min-w-[200px] p-4",
|
|
38
|
+
placement: "bottom end",
|
|
39
|
+
children: /*#__PURE__*/ jsxs(Popover.Dialog, {
|
|
40
|
+
className: "space-y-3",
|
|
41
|
+
children: [
|
|
42
|
+
/*#__PURE__*/ jsx("p", {
|
|
43
|
+
className: "font-semibold text-sm",
|
|
44
|
+
children: filterLabel
|
|
45
|
+
}),
|
|
46
|
+
/*#__PURE__*/ jsx(CheckboxGroup, {
|
|
47
|
+
"aria-label": filterLabel,
|
|
48
|
+
onChange: (values)=>onFilterChange?.(values),
|
|
49
|
+
value: selectedFilters,
|
|
50
|
+
children: filterOptions.map((option)=>/*#__PURE__*/ jsx(Checkbox, {
|
|
51
|
+
value: option.key,
|
|
52
|
+
children: /*#__PURE__*/ jsxs(Checkbox.Content, {
|
|
53
|
+
children: [
|
|
54
|
+
/*#__PURE__*/ jsx(Checkbox.Control, {
|
|
55
|
+
children: /*#__PURE__*/ jsx(Checkbox.Indicator, {})
|
|
56
|
+
}),
|
|
57
|
+
option.label
|
|
58
|
+
]
|
|
59
|
+
})
|
|
60
|
+
}, option.key))
|
|
61
|
+
}),
|
|
62
|
+
hasActiveFilters ? /*#__PURE__*/ jsx(Button, {
|
|
63
|
+
className: "w-full text-danger",
|
|
64
|
+
onPress: ()=>onFilterChange?.([]),
|
|
65
|
+
size: "sm",
|
|
66
|
+
variant: "ghost",
|
|
67
|
+
children: clearFiltersLabel
|
|
68
|
+
}) : null
|
|
69
|
+
]
|
|
70
|
+
})
|
|
71
|
+
})
|
|
72
|
+
]
|
|
73
|
+
}) : null,
|
|
74
|
+
sortOptions && sortOptions.length > 0 ? /*#__PURE__*/ jsxs(Popover, {
|
|
75
|
+
isOpen: isSortOpen,
|
|
76
|
+
onOpenChange: setIsSortOpen,
|
|
77
|
+
children: [
|
|
78
|
+
renderIconButton({
|
|
79
|
+
icon: SlidersHorizontal,
|
|
80
|
+
isActive: !!selectedSort,
|
|
81
|
+
tooltip: sortLabel
|
|
82
|
+
}),
|
|
83
|
+
/*#__PURE__*/ jsx(Popover.Content, {
|
|
84
|
+
className: "min-w-[200px] p-4",
|
|
85
|
+
placement: "bottom end",
|
|
86
|
+
children: /*#__PURE__*/ jsxs(Popover.Dialog, {
|
|
87
|
+
className: "space-y-3",
|
|
88
|
+
children: [
|
|
89
|
+
/*#__PURE__*/ jsx("p", {
|
|
90
|
+
className: "font-semibold text-sm",
|
|
91
|
+
children: sortLabel
|
|
92
|
+
}),
|
|
93
|
+
/*#__PURE__*/ jsx("div", {
|
|
94
|
+
className: "space-y-1",
|
|
95
|
+
children: sortOptions.map((option)=>/*#__PURE__*/ jsx(Button, {
|
|
96
|
+
className: cn("w-full justify-start", selectedSort === option.key && "bg-accent-soft text-accent"),
|
|
97
|
+
onPress: ()=>{
|
|
98
|
+
onSortChange?.(option.key);
|
|
99
|
+
setIsSortOpen(false);
|
|
100
|
+
},
|
|
101
|
+
size: "sm",
|
|
102
|
+
variant: selectedSort === option.key ? "tertiary" : "ghost",
|
|
103
|
+
children: option.label
|
|
104
|
+
}, option.key))
|
|
105
|
+
})
|
|
106
|
+
]
|
|
107
|
+
})
|
|
108
|
+
})
|
|
109
|
+
]
|
|
110
|
+
}) : null
|
|
111
|
+
]
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function FilterSearchInput({ value, onChange, placeholder, className, clearLabel }) {
|
|
115
|
+
return /*#__PURE__*/ jsx(TextField, {
|
|
116
|
+
"aria-label": placeholder,
|
|
117
|
+
className: cn("w-full min-w-0", className),
|
|
118
|
+
onChange: onChange,
|
|
119
|
+
value: value,
|
|
120
|
+
children: /*#__PURE__*/ jsxs(InputGroup, {
|
|
121
|
+
children: [
|
|
122
|
+
/*#__PURE__*/ jsx(InputGroup.Prefix, {
|
|
123
|
+
children: /*#__PURE__*/ jsx(Search, {
|
|
124
|
+
className: "text-muted",
|
|
125
|
+
size: 18
|
|
126
|
+
})
|
|
127
|
+
}),
|
|
128
|
+
/*#__PURE__*/ jsx(InputGroup.Input, {
|
|
129
|
+
className: "text-sm",
|
|
130
|
+
placeholder: placeholder
|
|
131
|
+
}),
|
|
132
|
+
value ? /*#__PURE__*/ jsx(InputGroup.Suffix, {
|
|
133
|
+
children: /*#__PURE__*/ jsx(CloseButton, {
|
|
134
|
+
"aria-label": clearLabel,
|
|
135
|
+
onPress: ()=>onChange("")
|
|
136
|
+
})
|
|
137
|
+
}) : null
|
|
138
|
+
]
|
|
139
|
+
})
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
function FilterIconButton({ icon: Icon, isActive, tooltip }) {
|
|
143
|
+
return /*#__PURE__*/ jsx(Button, {
|
|
144
|
+
"aria-label": tooltip,
|
|
145
|
+
className: cn("border border-border", isActive ? "border-accent" : ""),
|
|
146
|
+
isIconOnly: true,
|
|
147
|
+
size: "md",
|
|
148
|
+
variant: isActive ? "tertiary" : "ghost",
|
|
149
|
+
children: /*#__PURE__*/ jsx(Icon, {
|
|
150
|
+
size: 20
|
|
151
|
+
})
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export { FilterBar };
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
3
|
+
import { Tooltip, Button, Avatar } from '@lindaui/ui/compound';
|
|
4
|
+
import { cn } from '@lindaui/ui/cn';
|
|
5
|
+
import { Wifi, WifiOff, Download, Sun, Moon, LogOut } from 'lucide-react';
|
|
6
|
+
import { u as useLogoutDialog } from './logout-dialog-bbv59tbi.js';
|
|
7
|
+
|
|
8
|
+
const defaultLabels = {
|
|
9
|
+
connected: "Connected",
|
|
10
|
+
disconnected: "Disconnected",
|
|
11
|
+
installApp: "Install app",
|
|
12
|
+
lightTheme: "Light mode",
|
|
13
|
+
darkTheme: "Dark mode",
|
|
14
|
+
lightThemeTooltip: "Light mode",
|
|
15
|
+
darkThemeTooltip: "Dark mode",
|
|
16
|
+
logoutTrigger: "Sign out",
|
|
17
|
+
logoutTitle: "Sign out?",
|
|
18
|
+
logoutDescription: "You will need to sign in again to access your account.",
|
|
19
|
+
logoutCancel: "Cancel",
|
|
20
|
+
logoutConfirm: "Sign out",
|
|
21
|
+
logoutPending: "Signing out…",
|
|
22
|
+
logoutError: "Unable to sign out. Please try again."
|
|
23
|
+
};
|
|
24
|
+
/** Connection, installation, theme and account actions; all business effects are injected. */ function AppShellFooter({ className, isCollapsed = false, isConnected = false, showConnectionStatus = true, isInstallable = false, onInstall, mounted = false, theme, onToggleTheme, user, onSignOut, labels: labelOverrides }) {
|
|
25
|
+
const labels = {
|
|
26
|
+
...defaultLabels,
|
|
27
|
+
...labelOverrides
|
|
28
|
+
};
|
|
29
|
+
const logout = useLogoutDialog(onSignOut, labels);
|
|
30
|
+
const statusLabel = isConnected ? labels.connected : labels.disconnected;
|
|
31
|
+
const themeLabel = theme === "dark" ? labels.lightTheme : labels.darkTheme;
|
|
32
|
+
const themeTooltip = theme === "dark" ? labels.lightThemeTooltip : labels.darkThemeTooltip;
|
|
33
|
+
return /*#__PURE__*/ jsxs("div", {
|
|
34
|
+
className: cn("space-y-2 border-border border-t px-2 py-4", className),
|
|
35
|
+
children: [
|
|
36
|
+
showConnectionStatus ? isCollapsed ? /*#__PURE__*/ jsxs(Tooltip, {
|
|
37
|
+
children: [
|
|
38
|
+
/*#__PURE__*/ jsx(Tooltip.Trigger, {
|
|
39
|
+
"aria-label": statusLabel,
|
|
40
|
+
children: /*#__PURE__*/ jsx("div", {
|
|
41
|
+
className: cn("mx-1 flex justify-center rounded-lg py-2", isConnected ? "bg-success/10" : "bg-danger/10"),
|
|
42
|
+
children: isConnected ? /*#__PURE__*/ jsx(Wifi, {
|
|
43
|
+
className: "text-success",
|
|
44
|
+
size: 16
|
|
45
|
+
}) : /*#__PURE__*/ jsx(WifiOff, {
|
|
46
|
+
className: "text-danger",
|
|
47
|
+
size: 16
|
|
48
|
+
})
|
|
49
|
+
})
|
|
50
|
+
}),
|
|
51
|
+
/*#__PURE__*/ jsx(Tooltip.Content, {
|
|
52
|
+
placement: "right",
|
|
53
|
+
children: statusLabel
|
|
54
|
+
})
|
|
55
|
+
]
|
|
56
|
+
}) : /*#__PURE__*/ jsx("div", {
|
|
57
|
+
className: cn("flex items-center justify-center gap-2 rounded-lg px-3 py-2.5", isConnected ? "bg-success/10" : "bg-danger/10"),
|
|
58
|
+
children: isConnected ? /*#__PURE__*/ jsxs(Fragment, {
|
|
59
|
+
children: [
|
|
60
|
+
/*#__PURE__*/ jsx(Wifi, {
|
|
61
|
+
className: "text-success",
|
|
62
|
+
size: 16
|
|
63
|
+
}),
|
|
64
|
+
/*#__PURE__*/ jsx("span", {
|
|
65
|
+
className: "font-medium text-success text-xs",
|
|
66
|
+
children: statusLabel
|
|
67
|
+
})
|
|
68
|
+
]
|
|
69
|
+
}) : /*#__PURE__*/ jsxs(Fragment, {
|
|
70
|
+
children: [
|
|
71
|
+
/*#__PURE__*/ jsx(WifiOff, {
|
|
72
|
+
className: "text-danger",
|
|
73
|
+
size: 16
|
|
74
|
+
}),
|
|
75
|
+
/*#__PURE__*/ jsx("span", {
|
|
76
|
+
className: "font-medium text-danger text-xs",
|
|
77
|
+
children: statusLabel
|
|
78
|
+
})
|
|
79
|
+
]
|
|
80
|
+
})
|
|
81
|
+
}) : null,
|
|
82
|
+
isInstallable && !isCollapsed ? /*#__PURE__*/ jsxs(Button, {
|
|
83
|
+
className: "w-full text-xs",
|
|
84
|
+
onPress: onInstall,
|
|
85
|
+
size: "sm",
|
|
86
|
+
variant: "tertiary",
|
|
87
|
+
children: [
|
|
88
|
+
/*#__PURE__*/ jsx(Download, {
|
|
89
|
+
size: 14
|
|
90
|
+
}),
|
|
91
|
+
labels.installApp
|
|
92
|
+
]
|
|
93
|
+
}) : null,
|
|
94
|
+
mounted ? isCollapsed ? /*#__PURE__*/ jsxs(Tooltip, {
|
|
95
|
+
children: [
|
|
96
|
+
/*#__PURE__*/ jsx(Tooltip.Trigger, {
|
|
97
|
+
children: /*#__PURE__*/ jsx(Button, {
|
|
98
|
+
"aria-label": themeTooltip,
|
|
99
|
+
className: "w-full text-muted hover:text-foreground",
|
|
100
|
+
isIconOnly: true,
|
|
101
|
+
onPress: onToggleTheme,
|
|
102
|
+
size: "sm",
|
|
103
|
+
variant: "ghost",
|
|
104
|
+
children: theme === "dark" ? /*#__PURE__*/ jsx(Sun, {
|
|
105
|
+
size: 16
|
|
106
|
+
}) : /*#__PURE__*/ jsx(Moon, {
|
|
107
|
+
size: 16
|
|
108
|
+
})
|
|
109
|
+
})
|
|
110
|
+
}),
|
|
111
|
+
/*#__PURE__*/ jsx(Tooltip.Content, {
|
|
112
|
+
placement: "right",
|
|
113
|
+
children: themeTooltip
|
|
114
|
+
})
|
|
115
|
+
]
|
|
116
|
+
}) : /*#__PURE__*/ jsxs(Button, {
|
|
117
|
+
className: "w-full text-xs",
|
|
118
|
+
onPress: onToggleTheme,
|
|
119
|
+
size: "sm",
|
|
120
|
+
variant: "tertiary",
|
|
121
|
+
children: [
|
|
122
|
+
theme === "dark" ? /*#__PURE__*/ jsx(Sun, {
|
|
123
|
+
size: 14
|
|
124
|
+
}) : /*#__PURE__*/ jsx(Moon, {
|
|
125
|
+
size: 14
|
|
126
|
+
}),
|
|
127
|
+
themeLabel
|
|
128
|
+
]
|
|
129
|
+
}) : null,
|
|
130
|
+
isCollapsed ? /*#__PURE__*/ jsxs(Tooltip, {
|
|
131
|
+
children: [
|
|
132
|
+
/*#__PURE__*/ jsx(Tooltip.Trigger, {
|
|
133
|
+
children: /*#__PURE__*/ jsx(Button, {
|
|
134
|
+
"aria-label": labels.logoutTrigger,
|
|
135
|
+
className: "w-full text-muted hover:text-danger",
|
|
136
|
+
isIconOnly: true,
|
|
137
|
+
onPress: logout.open,
|
|
138
|
+
size: "sm",
|
|
139
|
+
variant: "ghost",
|
|
140
|
+
children: /*#__PURE__*/ jsx(LogOut, {
|
|
141
|
+
size: 16
|
|
142
|
+
})
|
|
143
|
+
})
|
|
144
|
+
}),
|
|
145
|
+
/*#__PURE__*/ jsx(Tooltip.Content, {
|
|
146
|
+
placement: "right",
|
|
147
|
+
children: labels.logoutTrigger
|
|
148
|
+
})
|
|
149
|
+
]
|
|
150
|
+
}) : /*#__PURE__*/ jsxs("div", {
|
|
151
|
+
className: "flex items-center gap-2 px-2",
|
|
152
|
+
children: [
|
|
153
|
+
/*#__PURE__*/ jsxs(Avatar, {
|
|
154
|
+
className: "flex-shrink-0",
|
|
155
|
+
color: "default",
|
|
156
|
+
size: "sm",
|
|
157
|
+
children: [
|
|
158
|
+
/*#__PURE__*/ jsx(Avatar.Image, {
|
|
159
|
+
alt: user?.avatarAlt ?? "",
|
|
160
|
+
src: user?.avatarSrc
|
|
161
|
+
}),
|
|
162
|
+
/*#__PURE__*/ jsx(Avatar.Fallback, {
|
|
163
|
+
children: user?.initials
|
|
164
|
+
})
|
|
165
|
+
]
|
|
166
|
+
}),
|
|
167
|
+
/*#__PURE__*/ jsx("div", {
|
|
168
|
+
className: "min-w-0 flex-1",
|
|
169
|
+
children: /*#__PURE__*/ jsx("p", {
|
|
170
|
+
className: "truncate font-medium text-xs",
|
|
171
|
+
children: user?.displayName
|
|
172
|
+
})
|
|
173
|
+
}),
|
|
174
|
+
/*#__PURE__*/ jsx(Button, {
|
|
175
|
+
"aria-label": labels.logoutTrigger,
|
|
176
|
+
className: "text-muted hover:text-danger",
|
|
177
|
+
isIconOnly: true,
|
|
178
|
+
onPress: logout.open,
|
|
179
|
+
size: "sm",
|
|
180
|
+
variant: "ghost",
|
|
181
|
+
children: /*#__PURE__*/ jsx(LogOut, {
|
|
182
|
+
size: 14
|
|
183
|
+
})
|
|
184
|
+
})
|
|
185
|
+
]
|
|
186
|
+
}),
|
|
187
|
+
logout.dialog
|
|
188
|
+
]
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export { AppShellFooter as A };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { Modal } from '@lindaui/ui/compound';
|
|
4
|
+
import { useCallback } from 'react';
|
|
5
|
+
import { useDisclosure } from '@lindaui/ui/use-disclosure';
|
|
6
|
+
|
|
7
|
+
function ImageLightbox({ src, alt = "Media", className }) {
|
|
8
|
+
const { isOpen, open: onOpen, close: onClose } = useDisclosure();
|
|
9
|
+
const handleOpenChange = useCallback((open)=>{
|
|
10
|
+
if (!open) onClose();
|
|
11
|
+
}, [
|
|
12
|
+
onClose
|
|
13
|
+
]);
|
|
14
|
+
return /*#__PURE__*/ jsxs(Fragment, {
|
|
15
|
+
children: [
|
|
16
|
+
/*#__PURE__*/ jsx("button", {
|
|
17
|
+
"aria-label": `Ver imagen: ${alt}`,
|
|
18
|
+
className: `cursor-pointer rounded-lg p-0 transition-opacity hover:opacity-90 focus:outline-none focus:ring-2 focus:ring-accent ${className ?? ""}`,
|
|
19
|
+
onClick: onOpen,
|
|
20
|
+
type: "button",
|
|
21
|
+
children: /*#__PURE__*/ jsx("img", {
|
|
22
|
+
alt: alt,
|
|
23
|
+
className: "h-44 w-full max-w-[220px] rounded-lg object-cover",
|
|
24
|
+
height: 600,
|
|
25
|
+
loading: "lazy",
|
|
26
|
+
src: src,
|
|
27
|
+
width: 800
|
|
28
|
+
})
|
|
29
|
+
}),
|
|
30
|
+
/*#__PURE__*/ jsx(Modal.Backdrop, {
|
|
31
|
+
className: "bg-black/80",
|
|
32
|
+
isOpen: isOpen,
|
|
33
|
+
onOpenChange: handleOpenChange,
|
|
34
|
+
variant: "blur",
|
|
35
|
+
children: /*#__PURE__*/ jsx(Modal.Container, {
|
|
36
|
+
className: "overflow-hidden",
|
|
37
|
+
size: "full",
|
|
38
|
+
children: /*#__PURE__*/ jsxs(Modal.Dialog, {
|
|
39
|
+
className: "m-0 rounded-none shadow-none",
|
|
40
|
+
children: [
|
|
41
|
+
/*#__PURE__*/ jsx(Modal.CloseTrigger, {
|
|
42
|
+
className: "top-4 right-4 z-10 rounded-full bg-black/50 text-white hover:bg-black/70"
|
|
43
|
+
}),
|
|
44
|
+
/*#__PURE__*/ jsx(Modal.Body, {
|
|
45
|
+
className: "flex h-full items-center justify-center overflow-hidden p-4",
|
|
46
|
+
children: /*#__PURE__*/ jsx("img", {
|
|
47
|
+
alt: alt,
|
|
48
|
+
className: "max-h-full max-w-full rounded-lg object-contain",
|
|
49
|
+
height: 1080,
|
|
50
|
+
src: src,
|
|
51
|
+
width: 1920
|
|
52
|
+
})
|
|
53
|
+
})
|
|
54
|
+
]
|
|
55
|
+
})
|
|
56
|
+
})
|
|
57
|
+
})
|
|
58
|
+
]
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export { ImageLightbox as I };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { UniqueIdentifier } from "@dnd-kit/core";
|
|
2
|
+
export interface KanbanDropInput<Entity, ColumnId extends UniqueIdentifier> {
|
|
3
|
+
activeId: UniqueIdentifier;
|
|
4
|
+
overId: UniqueIdentifier | null;
|
|
5
|
+
entities: readonly Entity[];
|
|
6
|
+
columns: readonly {
|
|
7
|
+
id: ColumnId;
|
|
8
|
+
}[];
|
|
9
|
+
getEntityId: (entity: Entity) => UniqueIdentifier;
|
|
10
|
+
getColumnId: (entity: Entity) => ColumnId;
|
|
11
|
+
}
|
|
12
|
+
/** Resolve column and card targets without mutating the controlled collection. */
|
|
13
|
+
export declare function resolveKanbanDrop<Entity, ColumnId extends UniqueIdentifier>({ activeId, overId, entities, columns, getEntityId, getColumnId, }: KanbanDropInput<Entity, ColumnId>): {
|
|
14
|
+
entity: Entity & ({} | null);
|
|
15
|
+
entityId: UniqueIdentifier;
|
|
16
|
+
columnId: ColumnId;
|
|
17
|
+
} | null;
|
|
18
|
+
//# sourceMappingURL=drop-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drop-utils.d.ts","sourceRoot":"","sources":["../../src/kanban/drop-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,WAAW,eAAe,CAAC,MAAM,EAAE,QAAQ,SAAS,gBAAgB;IACxE,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,SAAS;QAAE,EAAE,EAAE,QAAQ,CAAA;KAAE,EAAE,CAAC;IACrC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,gBAAgB,CAAC;IAClD,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,QAAQ,CAAC;CAC3C;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,SAAS,gBAAgB,EAAE,EAC3E,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,OAAO,EACP,WAAW,EACX,WAAW,GACZ,EAAE,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC;;;;SAWnC"}
|