@cappasoft/openrouter-model-selector 1.2.0 → 1.3.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/README.md +49 -1
- package/dist/index.js +155 -148
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -71,6 +71,54 @@ You can also override the exposed CSS variables (scoped to `.orm-root`):
|
|
|
71
71
|
}
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
+
## CSS Isolation
|
|
75
|
+
|
|
76
|
+
This component uses **CSS isolation** to prevent style leaks into your application. All Tailwind classes are scoped to `.orm-root`, ensuring that:
|
|
77
|
+
|
|
78
|
+
- ✅ The component's styles don't affect your app (shadcn, etc.)
|
|
79
|
+
- ✅ Your app's global styles don't affect the component
|
|
80
|
+
- ✅ Portals (Select dropdowns, Dialogs) are properly scoped
|
|
81
|
+
|
|
82
|
+
### How it works
|
|
83
|
+
|
|
84
|
+
1. **Root wrapper**: The component automatically wraps itself with `.orm-root`
|
|
85
|
+
2. **Tailwind scoping**: All generated Tailwind utilities are prefixed with `.orm-root` (e.g., `.orm-root .flex`, `.orm-root .text-sm`)
|
|
86
|
+
3. **Portal wrapping**: Select and Dialog portals are wrapped with `.orm-root` to maintain isolation
|
|
87
|
+
|
|
88
|
+
### Double wrapping
|
|
89
|
+
|
|
90
|
+
In some cases (e.g., `showAllInModal`), you may see `.orm-root` appear multiple times in the DOM:
|
|
91
|
+
|
|
92
|
+
```html
|
|
93
|
+
<div class="orm-root"> <!-- Main wrapper -->
|
|
94
|
+
<div class="orm-root"> <!-- Portal wrapper -->
|
|
95
|
+
<SelectContent>...</SelectContent>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
This is **intentional and safe**. The redundant wrappers ensure robust isolation even when portals are rendered outside the React tree.
|
|
101
|
+
|
|
102
|
+
### Z-index conflicts
|
|
103
|
+
|
|
104
|
+
If you experience z-index conflicts with your app (e.g., navbar, modals), you can add CSS isolation:
|
|
105
|
+
|
|
106
|
+
```css
|
|
107
|
+
.orm-root {
|
|
108
|
+
isolation: isolate;
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
This creates a new stacking context and prevents z-index conflicts.
|
|
113
|
+
|
|
114
|
+
### Overriding styles
|
|
115
|
+
|
|
116
|
+
Your `className` prop is applied to the **content** (not the root wrapper), so it has priority over internal styles:
|
|
117
|
+
|
|
118
|
+
```tsx
|
|
119
|
+
<ModelSelector className="text-lg" /> {/* Overrides internal text-sm */}
|
|
120
|
+
```
|
|
121
|
+
|
|
74
122
|
## Use cases (Playground)
|
|
75
123
|
|
|
76
124
|
### 1) API key from env (Vite)
|
|
@@ -138,4 +186,4 @@ export function App() {
|
|
|
138
186
|
|
|
139
187
|
## License
|
|
140
188
|
|
|
141
|
-
MIT
|
|
189
|
+
MIT
|
package/dist/index.js
CHANGED
|
@@ -203,7 +203,7 @@ var DialogOverlay = React4.forwardRef(({ className, ...props }, ref) => /* @__PU
|
|
|
203
203
|
}
|
|
204
204
|
));
|
|
205
205
|
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
206
|
-
var DialogContent = React4.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */
|
|
206
|
+
var DialogContent = React4.forwardRef(({ className, containerClassName, children, ...props }, ref) => /* @__PURE__ */ jsx(DialogPortal, { children: /* @__PURE__ */ jsxs("div", { className: cn("orm-root", containerClassName), children: [
|
|
207
207
|
/* @__PURE__ */ jsx(DialogOverlay, {}),
|
|
208
208
|
/* @__PURE__ */ jsxs(
|
|
209
209
|
DialogPrimitive.Content,
|
|
@@ -223,7 +223,7 @@ var DialogContent = React4.forwardRef(({ className, children, ...props }, ref) =
|
|
|
223
223
|
]
|
|
224
224
|
}
|
|
225
225
|
)
|
|
226
|
-
] }));
|
|
226
|
+
] }) }));
|
|
227
227
|
DialogContent.displayName = DialogPrimitive.Content.displayName;
|
|
228
228
|
var DialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("flex flex-col space-y-1.5 text-center sm:text-left", className), ...props });
|
|
229
229
|
DialogHeader.displayName = "DialogHeader";
|
|
@@ -259,7 +259,7 @@ var SelectScrollDownButton = React4.forwardRef(({ className, ...props }, ref) =>
|
|
|
259
259
|
}
|
|
260
260
|
));
|
|
261
261
|
SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
|
|
262
|
-
var SelectContent = React4.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
|
|
262
|
+
var SelectContent = React4.forwardRef(({ className, containerClassName, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsx("div", { className: cn("orm-root", containerClassName), children: /* @__PURE__ */ jsxs(
|
|
263
263
|
SelectPrimitive.Content,
|
|
264
264
|
{
|
|
265
265
|
ref,
|
|
@@ -285,7 +285,7 @@ var SelectContent = React4.forwardRef(({ className, children, position = "popper
|
|
|
285
285
|
/* @__PURE__ */ jsx(SelectScrollDownButton, {})
|
|
286
286
|
]
|
|
287
287
|
}
|
|
288
|
-
) }));
|
|
288
|
+
) }) }));
|
|
289
289
|
SelectContent.displayName = SelectPrimitive.Content.displayName;
|
|
290
290
|
var SelectItem = React4.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
|
|
291
291
|
SelectPrimitive.Item,
|
|
@@ -452,15 +452,15 @@ function ModelSelector({
|
|
|
452
452
|
{ id: "cheap", label: labels.capabilityCheap, icon: /* @__PURE__ */ jsx(DollarSign, { className: "h-3 w-3" }), color: "text-green-500 border-green-500/50 bg-green-500/10" }
|
|
453
453
|
];
|
|
454
454
|
if (apiKeyMissing) {
|
|
455
|
-
return /* @__PURE__ */ jsx("div", { className: "text-sm text-destructive", children: labels.apiKeyRequired });
|
|
455
|
+
return /* @__PURE__ */ jsx("div", { className: cn("orm-root", contrastClass), children: /* @__PURE__ */ jsx("div", { className: cn("text-sm text-destructive", className), children: labels.apiKeyRequired }) });
|
|
456
456
|
}
|
|
457
457
|
if (error) {
|
|
458
|
-
return /* @__PURE__ */ jsxs("div", { className: "text-sm text-destructive", children: [
|
|
458
|
+
return /* @__PURE__ */ jsx("div", { className: cn("orm-root", contrastClass), children: /* @__PURE__ */ jsxs("div", { className: cn("text-sm text-destructive", className), children: [
|
|
459
459
|
"Error loading models: ",
|
|
460
460
|
error
|
|
461
|
-
] });
|
|
461
|
+
] }) });
|
|
462
462
|
}
|
|
463
|
-
const renderFullSelector = () => /* @__PURE__ */ jsx("div", { className: cn("
|
|
463
|
+
const renderFullSelector = () => /* @__PURE__ */ jsx("div", { className: cn("orm-root", contrastClass), children: /* @__PURE__ */ jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
464
464
|
(showSearch || showFilters) && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
465
465
|
showSearch && /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
466
466
|
/* @__PURE__ */ jsx(Search, { className: "absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" }),
|
|
@@ -559,9 +559,9 @@ function ModelSelector({
|
|
|
559
559
|
);
|
|
560
560
|
}) })
|
|
561
561
|
] }, category.name)) })
|
|
562
|
-
] }) });
|
|
562
|
+
] }) }) });
|
|
563
563
|
if (showAllInModal) {
|
|
564
|
-
return /* @__PURE__ */
|
|
564
|
+
return /* @__PURE__ */ jsx("div", { className: cn("orm-root", contrastClass), children: /* @__PURE__ */ jsxs("div", { className: cn("space-y-2", className), children: [
|
|
565
565
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
566
566
|
/* @__PURE__ */ jsxs(Select2, { value, onValueChange, disabled: disabled || isLoading, children: [
|
|
567
567
|
/* @__PURE__ */ jsx(SelectTrigger2, { className: "flex-1 text-left", children: isLoading ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
@@ -571,14 +571,14 @@ function ModelSelector({
|
|
|
571
571
|
/* @__PURE__ */ jsx("span", { className: "truncate font-medium orm-model-name", children: selectedModel.name }),
|
|
572
572
|
getModelBadge(selectedModel) && /* @__PURE__ */ jsx(Zap, { className: cn("h-3 w-3 shrink-0", getModelBadge(selectedModel).color.split(" ")[0]) })
|
|
573
573
|
] }) }) }),
|
|
574
|
-
/* @__PURE__ */ jsxs(SelectContent2, { children: [
|
|
574
|
+
/* @__PURE__ */ jsxs(SelectContent2, { containerClassName: cn("orm-root", contrastClass), children: [
|
|
575
575
|
commonModels?.map((model) => /* @__PURE__ */ jsx(SelectItem2, { value: model.id, children: /* @__PURE__ */ jsx("span", { className: "font-medium orm-model-name", children: model.name }) }, model.id)),
|
|
576
576
|
!commonModels?.length && !isLoading && /* @__PURE__ */ jsx("div", { className: "p-2 text-xs text-foreground/70 orm-text-secondary", children: labels.noResults })
|
|
577
577
|
] })
|
|
578
578
|
] }),
|
|
579
579
|
/* @__PURE__ */ jsxs(Dialog2, { open: modalOpen, onOpenChange: setModalOpen, children: [
|
|
580
580
|
/* @__PURE__ */ jsx(DialogTrigger2, { asChild: true, children: /* @__PURE__ */ jsx(Button2, { variant: "outline", size: "icon", className: "shrink-0", title: labels.showAllModelsTitle, children: /* @__PURE__ */ jsx(Settings2, { className: "h-4 w-4" }) }) }),
|
|
581
|
-
/* @__PURE__ */ jsxs(DialogContent2, { className: cn("max-w-2xl max-h-[85vh] orm-
|
|
581
|
+
/* @__PURE__ */ jsxs(DialogContent2, { containerClassName: cn("orm-root", contrastClass), className: cn("max-w-2xl max-h-[85vh] orm-dialog"), children: [
|
|
582
582
|
/* @__PURE__ */ jsx(DialogHeader2, { children: /* @__PURE__ */ jsx(DialogTitle2, { children: labels.libraryTitle }) }),
|
|
583
583
|
renderFullSelector()
|
|
584
584
|
] })
|
|
@@ -613,9 +613,9 @@ function ModelSelector({
|
|
|
613
613
|
] })
|
|
614
614
|
] })
|
|
615
615
|
] })
|
|
616
|
-
] });
|
|
616
|
+
] }) });
|
|
617
617
|
}
|
|
618
|
-
return /* @__PURE__ */
|
|
618
|
+
return /* @__PURE__ */ jsx("div", { className: cn("orm-root", contrastClass), children: /* @__PURE__ */ jsxs("div", { className: cn("space-y-2", className), children: [
|
|
619
619
|
/* @__PURE__ */ jsxs(Select2, { value, onValueChange, disabled: disabled || isLoading, children: [
|
|
620
620
|
/* @__PURE__ */ jsx(SelectTrigger2, { className: cn(variant === "compact" && "h-8 text-sm"), children: isLoading ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
621
621
|
/* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" }),
|
|
@@ -624,144 +624,151 @@ function ModelSelector({
|
|
|
624
624
|
/* @__PURE__ */ jsx("span", { className: "orm-model-name", children: selectedModel.name }),
|
|
625
625
|
getModelBadge(selectedModel) && /* @__PURE__ */ jsx("span", { className: cn("flex items-center gap-0.5 text-xs", getModelBadge(selectedModel).color), children: getModelBadge(selectedModel).icon })
|
|
626
626
|
] }) }) }),
|
|
627
|
-
/* @__PURE__ */ jsxs(
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
className: "
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
] })
|
|
667
|
-
] }),
|
|
668
|
-
(showSearch || showFilters) && /* @__PURE__ */ jsxs("div", { className: "p-2 border-b space-y-2", children: [
|
|
669
|
-
showSearch && /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
670
|
-
/* @__PURE__ */ jsx(Search, { className: "absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" }),
|
|
671
|
-
/* @__PURE__ */ jsx(
|
|
672
|
-
Input2,
|
|
673
|
-
{
|
|
674
|
-
placeholder: labels.searchPlaceholder,
|
|
675
|
-
value: searchQuery,
|
|
676
|
-
onChange: (e) => setSearchQuery(e.target.value),
|
|
677
|
-
className: "pl-8 h-8",
|
|
678
|
-
onClick: (e) => e.stopPropagation(),
|
|
679
|
-
onKeyDown: (e) => e.stopPropagation()
|
|
680
|
-
}
|
|
681
|
-
)
|
|
682
|
-
] }),
|
|
683
|
-
showFilters && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
684
|
-
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: PROVIDER_FILTERS.map((filter) => /* @__PURE__ */ jsxs(
|
|
685
|
-
Button2,
|
|
686
|
-
{
|
|
687
|
-
variant: providerFilter === filter.id ? "default" : "outline",
|
|
688
|
-
size: "sm",
|
|
689
|
-
className: cn("h-6 px-2 text-xs", providerFilter === filter.id && "bg-primary text-primary-foreground"),
|
|
690
|
-
onClick: (e) => {
|
|
691
|
-
e.stopPropagation();
|
|
692
|
-
setProviderFilter(providerFilter === filter.id ? null : filter.id);
|
|
693
|
-
},
|
|
694
|
-
children: [
|
|
695
|
-
filter.icon && /* @__PURE__ */ jsx("span", { className: "mr-1", children: filter.icon }),
|
|
696
|
-
filter.label
|
|
697
|
-
]
|
|
698
|
-
},
|
|
699
|
-
filter.id
|
|
700
|
-
)) }),
|
|
701
|
-
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: CAPABILITY_FILTERS.map((filter) => /* @__PURE__ */ jsxs(
|
|
702
|
-
Button2,
|
|
703
|
-
{
|
|
704
|
-
variant: "outline",
|
|
705
|
-
size: "sm",
|
|
706
|
-
className: cn(
|
|
707
|
-
"h-6 px-2 text-xs border",
|
|
708
|
-
capabilityFilter === filter.id ? filter.color : "text-foreground/70 orm-text-secondary"
|
|
709
|
-
),
|
|
710
|
-
onClick: (e) => {
|
|
711
|
-
e.stopPropagation();
|
|
712
|
-
setCapabilityFilter(capabilityFilter === filter.id ? null : filter.id);
|
|
713
|
-
},
|
|
714
|
-
children: [
|
|
715
|
-
filter.icon,
|
|
716
|
-
/* @__PURE__ */ jsx("span", { className: "ml-1", children: filter.label })
|
|
717
|
-
]
|
|
718
|
-
},
|
|
719
|
-
filter.id
|
|
720
|
-
)) }),
|
|
721
|
-
hasActiveFilters && /* @__PURE__ */ jsxs(
|
|
722
|
-
Button2,
|
|
723
|
-
{
|
|
724
|
-
variant: "ghost",
|
|
725
|
-
size: "sm",
|
|
726
|
-
className: "h-6 px-2 text-xs text-foreground/70 orm-text-secondary hover:text-foreground",
|
|
727
|
-
onClick: (e) => {
|
|
728
|
-
e.stopPropagation();
|
|
729
|
-
clearFilters();
|
|
730
|
-
},
|
|
731
|
-
children: [
|
|
732
|
-
/* @__PURE__ */ jsx(X, { className: "h-3 w-3 mr-1" }),
|
|
733
|
-
labels.clearFilters
|
|
734
|
-
]
|
|
735
|
-
}
|
|
736
|
-
)
|
|
737
|
-
] })
|
|
738
|
-
] }),
|
|
739
|
-
/* @__PURE__ */ jsx("div", { className: "max-h-[300px] overflow-y-auto", children: filteredCategories.length === 0 ? /* @__PURE__ */ jsx("div", { className: "p-4 text-center text-sm text-foreground/70 orm-text-secondary orm-no-results", children: labels.noResults }) : filteredCategories.map((category) => /* @__PURE__ */ jsxs("div", { children: [
|
|
740
|
-
/* @__PURE__ */ jsx("div", { className: "px-2 py-1.5 text-xs font-semibold text-foreground/80 orm-section-title bg-muted/50 sticky top-0", children: category.name }),
|
|
741
|
-
category.models.map((model) => {
|
|
742
|
-
const badge = getModelBadge(model);
|
|
743
|
-
return /* @__PURE__ */ jsx(SelectItem2, { value: model.id, className: "py-2", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5", children: [
|
|
744
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
745
|
-
/* @__PURE__ */ jsx("span", { className: "font-medium orm-model-name", children: model.name }),
|
|
746
|
-
badge && /* @__PURE__ */ jsxs("span", { className: cn("flex items-center gap-0.5 text-xs", badge.color), children: [
|
|
747
|
-
badge.icon,
|
|
748
|
-
/* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: badge.label })
|
|
749
|
-
] })
|
|
627
|
+
/* @__PURE__ */ jsxs(
|
|
628
|
+
SelectContent2,
|
|
629
|
+
{
|
|
630
|
+
containerClassName: cn("orm-root", contrastClass),
|
|
631
|
+
className: cn("max-h-[500px] min-w-[var(--radix-select-trigger-width)] w-full orm-select-content"),
|
|
632
|
+
children: [
|
|
633
|
+
/* @__PURE__ */ jsxs("div", { className: "p-2 border-b space-y-2", children: [
|
|
634
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-2", children: [
|
|
635
|
+
/* @__PURE__ */ jsx("div", { className: "grid w-full gap-1 grid-cols-[repeat(auto-fit,minmax(150px,1fr))]", children: recommendedModels.map((model) => /* @__PURE__ */ jsxs(
|
|
636
|
+
Button2,
|
|
637
|
+
{
|
|
638
|
+
size: "sm",
|
|
639
|
+
variant: value === model.id ? "default" : "outline",
|
|
640
|
+
className: "h-8 px-2 text-xs justify-start",
|
|
641
|
+
onClick: (e) => {
|
|
642
|
+
e.stopPropagation();
|
|
643
|
+
onValueChange(model.id);
|
|
644
|
+
},
|
|
645
|
+
children: [
|
|
646
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "h-3 w-3 mr-1" }),
|
|
647
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: model.name })
|
|
648
|
+
]
|
|
649
|
+
},
|
|
650
|
+
model.id
|
|
651
|
+
)) }),
|
|
652
|
+
/* @__PURE__ */ jsx(
|
|
653
|
+
Button2,
|
|
654
|
+
{
|
|
655
|
+
size: "icon",
|
|
656
|
+
variant: "ghost",
|
|
657
|
+
className: "h-8 w-8",
|
|
658
|
+
onClick: (e) => {
|
|
659
|
+
e.stopPropagation();
|
|
660
|
+
handleRefresh();
|
|
661
|
+
},
|
|
662
|
+
title: labels.refreshTitle,
|
|
663
|
+
children: isRefreshing ? /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ jsx(Sparkles, { className: "h-4 w-4" })
|
|
664
|
+
}
|
|
665
|
+
)
|
|
750
666
|
] }),
|
|
751
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
/* @__PURE__ */ jsx("span", { children: fmtPrice(model.pricing.prompt) })
|
|
756
|
-
] })
|
|
667
|
+
lastUpdated && /* @__PURE__ */ jsxs("div", { className: "text-[11px] text-foreground/70 orm-text-secondary orm-last-updated", children: [
|
|
668
|
+
labels.lastUpdatedPrefix,
|
|
669
|
+
" ",
|
|
670
|
+
new Date(lastUpdated).toLocaleTimeString(locale === "fr" ? "fr-FR" : "en-US")
|
|
757
671
|
] })
|
|
758
|
-
] })
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
672
|
+
] }),
|
|
673
|
+
(showSearch || showFilters) && /* @__PURE__ */ jsxs("div", { className: "p-2 border-b space-y-2", children: [
|
|
674
|
+
showSearch && /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
675
|
+
/* @__PURE__ */ jsx(Search, { className: "absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" }),
|
|
676
|
+
/* @__PURE__ */ jsx(
|
|
677
|
+
Input2,
|
|
678
|
+
{
|
|
679
|
+
placeholder: labels.searchPlaceholder,
|
|
680
|
+
value: searchQuery,
|
|
681
|
+
onChange: (e) => setSearchQuery(e.target.value),
|
|
682
|
+
className: "pl-8 h-8",
|
|
683
|
+
onClick: (e) => e.stopPropagation(),
|
|
684
|
+
onKeyDown: (e) => e.stopPropagation()
|
|
685
|
+
}
|
|
686
|
+
)
|
|
687
|
+
] }),
|
|
688
|
+
showFilters && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
689
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: PROVIDER_FILTERS.map((filter) => /* @__PURE__ */ jsxs(
|
|
690
|
+
Button2,
|
|
691
|
+
{
|
|
692
|
+
variant: providerFilter === filter.id ? "default" : "outline",
|
|
693
|
+
size: "sm",
|
|
694
|
+
className: cn("h-6 px-2 text-xs", providerFilter === filter.id && "bg-primary text-primary-foreground"),
|
|
695
|
+
onClick: (e) => {
|
|
696
|
+
e.stopPropagation();
|
|
697
|
+
setProviderFilter(providerFilter === filter.id ? null : filter.id);
|
|
698
|
+
},
|
|
699
|
+
children: [
|
|
700
|
+
filter.icon && /* @__PURE__ */ jsx("span", { className: "mr-1", children: filter.icon }),
|
|
701
|
+
filter.label
|
|
702
|
+
]
|
|
703
|
+
},
|
|
704
|
+
filter.id
|
|
705
|
+
)) }),
|
|
706
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: CAPABILITY_FILTERS.map((filter) => /* @__PURE__ */ jsxs(
|
|
707
|
+
Button2,
|
|
708
|
+
{
|
|
709
|
+
variant: "outline",
|
|
710
|
+
size: "sm",
|
|
711
|
+
className: cn(
|
|
712
|
+
"h-6 px-2 text-xs border",
|
|
713
|
+
capabilityFilter === filter.id ? filter.color : "text-foreground/70 orm-text-secondary"
|
|
714
|
+
),
|
|
715
|
+
onClick: (e) => {
|
|
716
|
+
e.stopPropagation();
|
|
717
|
+
setCapabilityFilter(capabilityFilter === filter.id ? null : filter.id);
|
|
718
|
+
},
|
|
719
|
+
children: [
|
|
720
|
+
filter.icon,
|
|
721
|
+
/* @__PURE__ */ jsx("span", { className: "ml-1", children: filter.label })
|
|
722
|
+
]
|
|
723
|
+
},
|
|
724
|
+
filter.id
|
|
725
|
+
)) }),
|
|
726
|
+
hasActiveFilters && /* @__PURE__ */ jsxs(
|
|
727
|
+
Button2,
|
|
728
|
+
{
|
|
729
|
+
variant: "ghost",
|
|
730
|
+
size: "sm",
|
|
731
|
+
className: "h-6 px-2 text-xs text-foreground/70 orm-text-secondary hover:text-foreground",
|
|
732
|
+
onClick: (e) => {
|
|
733
|
+
e.stopPropagation();
|
|
734
|
+
clearFilters();
|
|
735
|
+
},
|
|
736
|
+
children: [
|
|
737
|
+
/* @__PURE__ */ jsx(X, { className: "h-3 w-3 mr-1" }),
|
|
738
|
+
labels.clearFilters
|
|
739
|
+
]
|
|
740
|
+
}
|
|
741
|
+
)
|
|
742
|
+
] })
|
|
743
|
+
] }),
|
|
744
|
+
/* @__PURE__ */ jsx("div", { className: "max-h-[300px] overflow-y-auto", children: filteredCategories.length === 0 ? /* @__PURE__ */ jsx("div", { className: "p-4 text-center text-sm text-foreground/70 orm-text-secondary orm-no-results", children: labels.noResults }) : filteredCategories.map((category) => /* @__PURE__ */ jsxs("div", { children: [
|
|
745
|
+
/* @__PURE__ */ jsx("div", { className: "px-2 py-1.5 text-xs font-semibold text-foreground/80 orm-section-title bg-muted/50 sticky top-0", children: category.name }),
|
|
746
|
+
category.models.map((model) => {
|
|
747
|
+
const badge = getModelBadge(model);
|
|
748
|
+
return /* @__PURE__ */ jsx(SelectItem2, { value: model.id, className: "py-2", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5", children: [
|
|
749
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
750
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium orm-model-name", children: model.name }),
|
|
751
|
+
badge && /* @__PURE__ */ jsxs("span", { className: cn("flex items-center gap-0.5 text-xs", badge.color), children: [
|
|
752
|
+
badge.icon,
|
|
753
|
+
/* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: badge.label })
|
|
754
|
+
] })
|
|
755
|
+
] }),
|
|
756
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-xs text-foreground/70 orm-text-secondary orm-model-desc", children: [
|
|
757
|
+
/* @__PURE__ */ jsx("span", { children: formatContextLength(model.context_length) }),
|
|
758
|
+
showPricing && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
759
|
+
/* @__PURE__ */ jsx("span", { children: "\u2022" }),
|
|
760
|
+
/* @__PURE__ */ jsx("span", { children: fmtPrice(model.pricing.prompt) })
|
|
761
|
+
] })
|
|
762
|
+
] })
|
|
763
|
+
] }) }, model.id);
|
|
764
|
+
})
|
|
765
|
+
] }, category.name)) })
|
|
766
|
+
]
|
|
767
|
+
}
|
|
768
|
+
)
|
|
762
769
|
] }),
|
|
763
770
|
variant === "default" && selectedModel && /* @__PURE__ */ jsx("div", { className: "text-xs text-foreground/70 orm-text-secondary", children: selectedModel.description && /* @__PURE__ */ jsx("p", { className: "line-clamp-2", children: selectedModel.description }) })
|
|
764
|
-
] });
|
|
771
|
+
] }) });
|
|
765
772
|
}
|
|
766
773
|
function ModelSelectorCompact({
|
|
767
774
|
value,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/i18n.ts","../src/useOpenRouterModels.ts","../src/ui/button.tsx","../src/ui/input.tsx","../src/ui/dialog.tsx","../src/ui/select.tsx","../src/ModelSelector.tsx"],"names":["React","React2","jsx","React3","jsxs","useMemo","Button","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Dialog","DialogContent","DialogHeader","DialogTitle","DialogTrigger","useState","useCallback","X"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n\n","export type Locale = \"en\" | \"fr\"\n\nexport interface Labels {\n placeholder: string\n loading: string\n searchPlaceholder: string\n noResults: string\n apiKeyRequired: string\n refreshTitle: string\n lastUpdatedPrefix: string\n clearFilters: string\n libraryTitle: string\n showAllModelsTitle: string\n showDetailsTitle: string\n modelDetailsTitle: string\n noDescription: string\n\n // Capability labels\n capabilityFast: string\n capabilityPowerful: string\n capabilityReasoning: string\n capabilityCheap: string\n\n // Badge labels\n badgeFast: string\n badgePowerful: string\n badgeReasoning: string\n}\n\nexport const defaultLabelsEN: Labels = {\n placeholder: \"Select a model\",\n loading: \"Loading...\",\n searchPlaceholder: \"Search a model...\",\n noResults: \"No models found\",\n apiKeyRequired: \"OpenRouter API key required\",\n refreshTitle: \"Refresh model list\",\n lastUpdatedPrefix: \"Last updated:\",\n clearFilters: \"Clear filters\",\n libraryTitle: \"Model library\",\n showAllModelsTitle: \"All models\",\n showDetailsTitle: \"Show details\",\n modelDetailsTitle: \"Model details\",\n noDescription: \"No description available.\",\n\n capabilityFast: \"Fast\",\n capabilityPowerful: \"Powerful\",\n capabilityReasoning: \"Reasoning\",\n capabilityCheap: \"Cheap\",\n\n badgeFast: \"Fast\",\n badgePowerful: \"Powerful\",\n badgeReasoning: \"Reasoning\",\n}\n\nexport const defaultLabelsFR: Labels = {\n placeholder: \"Sélectionner un modèle\",\n loading: \"Chargement...\",\n searchPlaceholder: \"Rechercher un modèle...\",\n noResults: \"Aucun modèle trouvé\",\n apiKeyRequired: \"Clé API OpenRouter requise\",\n refreshTitle: \"Rafraîchir la liste des modèles\",\n lastUpdatedPrefix: \"Dernière mise à jour:\",\n clearFilters: \"Effacer les filtres\",\n libraryTitle: \"Bibliothèque de modèles\",\n showAllModelsTitle: \"Tous les modèles\",\n showDetailsTitle: \"Afficher les détails\",\n modelDetailsTitle: \"Détails du modèle\",\n noDescription: \"Pas de description disponible.\",\n\n capabilityFast: \"Rapide\",\n capabilityPowerful: \"Puissant\",\n capabilityReasoning: \"Raisonnement\",\n capabilityCheap: \"Économique\",\n\n badgeFast: \"Rapide\",\n badgePowerful: \"Puissant\",\n badgeReasoning: \"Raisonnement\",\n}\n\nexport function resolveBrowserLocale(): Locale {\n try {\n if (typeof navigator === \"undefined\") return \"en\"\n const candidates = (navigator.languages?.length ? navigator.languages : [navigator.language]).filter(Boolean)\n const first = candidates[0] ?? \"\"\n if (first.toLowerCase().startsWith(\"fr\")) return \"fr\"\n return \"en\"\n } catch {\n return \"en\"\n }\n}\n\nexport function resolveLabels(locale: Locale | undefined, overrides?: Partial<Labels>): Labels {\n const effectiveLocale = locale ?? resolveBrowserLocale()\n const base = effectiveLocale === \"fr\" ? defaultLabelsFR : defaultLabelsEN\n return { ...base, ...(overrides ?? {}) }\n}\n\n\n","import { useCallback, useEffect, useMemo, useState } from \"react\"\n\nimport type { ModelCategory, OpenRouterModel, OpenRouterModelsClient } from \"@cappasoft/openrouter-models\"\nimport { createOpenRouterModelsClient } from \"@cappasoft/openrouter-models\"\n\nexport interface UseOpenRouterModelsOptions {\n apiKey: string\n endpoint?: string\n enabled?: boolean\n}\n\nexport interface UseOpenRouterModelsResult {\n models: OpenRouterModel[]\n categories: ModelCategory[]\n isLoading: boolean\n isRefreshing: boolean\n error: string | null\n lastUpdated: number | null\n refresh(): void\n formatPrice(pricePerToken: string): string\n}\n\nfunction formatPriceForUI(pricePerToken: string): string {\n const price = parseFloat(pricePerToken)\n if (price === 0) return \"Free\"\n const pricePerMillion = price * 1000000\n if (pricePerMillion < 0.01) return \"<$0.01/M\"\n return `$${pricePerMillion.toFixed(2)}/M`\n}\n\nexport function useOpenRouterModels(options: UseOpenRouterModelsOptions): UseOpenRouterModelsResult {\n const enabled = options.enabled ?? true\n\n const client: OpenRouterModelsClient | null = useMemo(() => {\n if (!enabled) return null\n return createOpenRouterModelsClient({\n apiKey: options.apiKey,\n endpoint: options.endpoint,\n })\n }, [enabled, options.apiKey, options.endpoint])\n\n const [models, setModels] = useState<OpenRouterModel[]>([])\n const [categories, setCategories] = useState<ModelCategory[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [isRefreshing, setIsRefreshing] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [lastUpdated, setLastUpdated] = useState<number | null>(null)\n\n const load = useCallback(\n async (force: boolean) => {\n if (!enabled || !client) {\n setModels([])\n setCategories([])\n setLastUpdated(null)\n setError(null)\n setIsLoading(false)\n setIsRefreshing(false)\n return\n }\n setError(null)\n if (force) setIsRefreshing(true)\n setIsLoading(true)\n try {\n const res = force ? await client.refresh() : await client.listModels()\n setModels(res.models)\n setCategories(res.categories)\n setLastUpdated(res.lastUpdated)\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch models\")\n } finally {\n setIsLoading(false)\n setIsRefreshing(false)\n }\n },\n [enabled, client]\n )\n\n useEffect(() => {\n load(false)\n }, [load])\n\n const refresh = useCallback(() => void load(true), [load])\n\n return {\n models,\n categories,\n isLoading,\n isRefreshing,\n error,\n lastUpdated,\n refresh,\n formatPrice: formatPriceForUI,\n }\n}\n\n\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline: \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />\n }\n)\nButton.displayName = \"Button\"\n\nexport { buttonVariants }\n\n\n","import * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nexport const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n})\nInput.displayName = \"Input\"\n\n\n","import * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\n\nexport const Dialog = DialogPrimitive.Root\nexport const DialogTrigger = DialogPrimitive.Trigger\nexport const DialogPortal = DialogPrimitive.Portal\nexport const DialogClose = DialogPrimitive.Close\n\nexport const DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nexport const DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nexport const DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex flex-col space-y-1.5 text-center sm:text-left\", className)} {...props} />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nexport const DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title ref={ref} className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)} {...props} />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\n\n","import * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\n\nexport const Select = SelectPrimitive.Root\nexport const SelectGroup = SelectPrimitive.Group\nexport const SelectValue = SelectPrimitive.Value\n\nexport const SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nexport const SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton ref={ref} className={cn(\"flex cursor-default items-center justify-center py-1\", className)} {...props}>\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nexport const SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName\n\nexport const SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nexport const SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\n\n","import { useCallback, useMemo, useState } from \"react\"\nimport type * as React from \"react\"\nimport { Brain, DollarSign, Info, Loader2, Search, Settings2, Sparkles, X, Zap } from \"lucide-react\"\n\nimport type { OpenRouterModel } from \"@cappasoft/openrouter-models\"\nimport { RECOMMENDED_MODELS } from \"@cappasoft/openrouter-models\"\n\nimport { cn } from \"./utils\"\nimport type { Labels, Locale } from \"./i18n\"\nimport { resolveLabels } from \"./i18n\"\nimport { useOpenRouterModels } from \"./useOpenRouterModels\"\n\nimport { Button as DefaultButton } from \"./ui/button\"\nimport { Input as DefaultInput } from \"./ui/input\"\nimport { Dialog as DefaultDialog, DialogContent as DefaultDialogContent, DialogHeader as DefaultDialogHeader, DialogTitle as DefaultDialogTitle, DialogTrigger as DefaultDialogTrigger } from \"./ui/dialog\"\nimport {\n Select as DefaultSelect,\n SelectContent as DefaultSelectContent,\n SelectItem as DefaultSelectItem,\n SelectTrigger as DefaultSelectTrigger,\n SelectValue as DefaultSelectValue,\n} from \"./ui/select\"\n\n// Quick filter types\ntype ProviderFilter = \"openai\" | \"anthropic\" | \"google\" | \"meta\" | \"deepseek\" | null\ntype CapabilityFilter = \"fast\" | \"powerful\" | \"reasoning\" | \"cheap\" | null\n\nexport interface UIComponents {\n Button: React.ComponentType<any>\n Input: React.ComponentType<any>\n Select: React.ComponentType<any>\n SelectTrigger: React.ComponentType<any>\n SelectValue: React.ComponentType<any>\n SelectContent: React.ComponentType<any>\n SelectItem: React.ComponentType<any>\n Dialog: React.ComponentType<any>\n DialogTrigger: React.ComponentType<any>\n DialogContent: React.ComponentType<any>\n DialogHeader: React.ComponentType<any>\n DialogTitle: React.ComponentType<any>\n}\n\nexport interface ModelSelectorProps {\n value: string\n onValueChange: (value: string) => void\n\n apiKey: string\n endpoint?: string\n\n locale?: Locale\n labels?: Partial<Labels>\n components?: Partial<UIComponents>\n\n className?: string\n disabled?: boolean\n showSearch?: boolean\n showPricing?: boolean\n showFilters?: boolean\n /**\n * Contrast mode for accessibility.\n * - default: uses softer secondary text\n * - high-contrast: increases contrast for secondary text (prices, metadata, headers)\n */\n contrast?: \"default\" | \"high-contrast\"\n variant?: \"default\" | \"compact\"\n\n // Advanced layout\n showAllInModal?: boolean\n infoToggle?: boolean\n}\n\nfunction formatContextLength(length: number): string {\n if (length >= 1000000) return `${(length / 1000000).toFixed(1)}M ctx`\n if (length >= 1000) return `${Math.round(length / 1000)}K ctx`\n return `${length} ctx`\n}\n\nfunction matchesCapability(model: OpenRouterModel, filter: CapabilityFilter): boolean {\n if (!filter) return true\n const id = model.id.toLowerCase()\n const price = parseFloat(model.pricing.prompt)\n\n switch (filter) {\n case \"fast\":\n return id.includes(\"flash\") || id.includes(\"mini\") || id.includes(\"haiku\") || id.includes(\"small\") || id.includes(\"8b\")\n case \"powerful\":\n return id.includes(\"opus\") || id.includes(\"large\") || id.includes(\"pro\") || (id.includes(\"4o\") && !id.includes(\"mini\")) || id.includes(\"70b\") || id.includes(\"sonnet-4\")\n case \"reasoning\":\n return id.includes(\"o1\") || id.includes(\"r1\") || id.includes(\"reasoning\")\n case \"cheap\":\n return price * 1000000 < 1\n default:\n return true\n }\n}\n\nfunction matchesProvider(model: OpenRouterModel, filter: ProviderFilter): boolean {\n if (!filter) return true\n return model.id.toLowerCase().startsWith(filter)\n}\n\nexport function ModelSelector({\n value,\n onValueChange,\n apiKey,\n endpoint,\n locale,\n labels: labelsOverrides,\n components,\n className,\n disabled = false,\n showSearch = true,\n showPricing = true,\n showFilters = true,\n contrast = \"default\",\n variant = \"default\",\n showAllInModal = false,\n infoToggle = false,\n}: ModelSelectorProps) {\n const labels = useMemo(() => resolveLabels(locale, labelsOverrides), [locale, labelsOverrides])\n\n const ui = {\n Button: components?.Button ?? DefaultButton,\n Input: components?.Input ?? DefaultInput,\n Select: components?.Select ?? DefaultSelect,\n SelectTrigger: components?.SelectTrigger ?? DefaultSelectTrigger,\n SelectValue: components?.SelectValue ?? DefaultSelectValue,\n SelectContent: components?.SelectContent ?? DefaultSelectContent,\n SelectItem: components?.SelectItem ?? DefaultSelectItem,\n Dialog: components?.Dialog ?? DefaultDialog,\n DialogTrigger: components?.DialogTrigger ?? DefaultDialogTrigger,\n DialogContent: components?.DialogContent ?? DefaultDialogContent,\n DialogHeader: components?.DialogHeader ?? DefaultDialogHeader,\n DialogTitle: components?.DialogTitle ?? DefaultDialogTitle,\n } satisfies UIComponents\n\n const { Button, Input, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } = ui\n\n const apiKeyMissing = !apiKey\n\n const { categories, isLoading, isRefreshing, error, refresh, lastUpdated, models, formatPrice } = useOpenRouterModels({\n apiKey,\n endpoint,\n enabled: !apiKeyMissing,\n })\n\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [providerFilter, setProviderFilter] = useState<ProviderFilter>(null)\n const [capabilityFilter, setCapabilityFilter] = useState<CapabilityFilter>(null)\n const [modalOpen, setModalOpen] = useState(false)\n const [showInfo, setShowInfo] = useState(false)\n\n const hasActiveFilters = providerFilter !== null || capabilityFilter !== null || searchQuery.trim() !== \"\"\n const contrastClass = contrast === \"high-contrast\" ? \"orm-contrast-high\" : \"orm-contrast-default\"\n\n const clearFilters = () => {\n setSearchQuery(\"\")\n setProviderFilter(null)\n setCapabilityFilter(null)\n }\n\n const recommendedModels = useMemo(() => {\n const map = new Map(models.map((m) => [m.id, m]))\n return RECOMMENDED_MODELS.map((id) => map.get(id)).filter(Boolean) as OpenRouterModel[]\n }, [models])\n\n const commonModels = useMemo(() => {\n if (!showAllInModal) return null\n const list = [...recommendedModels]\n if (value && !list.find((m) => m.id === value)) {\n const selected = models.find((m) => m.id === value)\n if (selected) list.push(selected)\n }\n return list\n }, [recommendedModels, value, models, showAllInModal])\n\n const filteredCategories = useMemo(() => {\n return categories\n .map((cat) => ({\n ...cat,\n models: cat.models\n .filter((m) => {\n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase()\n const matchesSearch =\n m.name.toLowerCase().includes(query) ||\n m.id.toLowerCase().includes(query) ||\n m.description?.toLowerCase().includes(query)\n if (!matchesSearch) return false\n }\n if (!matchesProvider(m, providerFilter)) return false\n if (!matchesCapability(m, capabilityFilter)) return false\n return true\n })\n .sort((a, b) => parseFloat(b.pricing.prompt) - parseFloat(a.pricing.prompt)),\n }))\n .filter((cat) => cat.models.length > 0)\n }, [categories, searchQuery, providerFilter, capabilityFilter])\n\n const selectedModel = useMemo(() => {\n for (const cat of categories) {\n const model = cat.models.find((m) => m.id === value)\n if (model) return model\n }\n return null\n }, [categories, value])\n\n const handleRefresh = useCallback(() => refresh(), [refresh])\n\n const fmtPrice = useCallback(\n (pricePerToken: string) => {\n const v = parseFloat(pricePerToken)\n if (v === 0) return locale === \"fr\" ? \"Gratuit\" : \"Free\"\n return formatPrice(pricePerToken)\n },\n [formatPrice, locale]\n )\n\n const getModelBadge = (model: OpenRouterModel): { icon: React.ReactNode; label: string; color: string; bgColor: string } | null => {\n const id = model.id.toLowerCase()\n if (id.includes(\"o1\") || id.includes(\"r1\") || id.includes(\"reasoning\")) {\n return { icon: <Brain className=\"h-3 w-3\" />, label: labels.badgeReasoning, color: \"text-purple-500\", bgColor: \"bg-purple-500/10\" }\n }\n if (id.includes(\"flash\") || id.includes(\"mini\") || id.includes(\"haiku\") || id.includes(\"small\")) {\n return { icon: <Zap className=\"h-3 w-3\" />, label: labels.badgeFast, color: \"text-yellow-500\", bgColor: \"bg-yellow-500/10\" }\n }\n if (id.includes(\"opus\") || id.includes(\"large\") || id.includes(\"pro\") || (id.includes(\"4o\") && !id.includes(\"mini\"))) {\n return { icon: <Sparkles className=\"h-3 w-3\" />, label: labels.badgePowerful, color: \"text-blue-500\", bgColor: \"bg-blue-500/10\" }\n }\n return null\n }\n\n const PROVIDER_FILTERS: { id: ProviderFilter; label: string; icon?: string }[] = [\n { id: \"openai\", label: \"OpenAI\", icon: \"🤖\" },\n { id: \"anthropic\", label: \"Claude\", icon: \"🎭\" },\n { id: \"google\", label: \"Gemini\", icon: \"💎\" },\n { id: \"meta\", label: \"Llama\", icon: \"🦙\" },\n { id: \"deepseek\", label: \"DeepSeek\", icon: \"🔍\" },\n ]\n\n const CAPABILITY_FILTERS: { id: CapabilityFilter; label: string; icon: React.ReactNode; color: string }[] = [\n { id: \"fast\", label: labels.capabilityFast, icon: <Zap className=\"h-3 w-3\" />, color: \"text-yellow-500 border-yellow-500/50 bg-yellow-500/10\" },\n { id: \"powerful\", label: labels.capabilityPowerful, icon: <Sparkles className=\"h-3 w-3\" />, color: \"text-blue-500 border-blue-500/50 bg-blue-500/10\" },\n { id: \"reasoning\", label: labels.capabilityReasoning, icon: <Brain className=\"h-3 w-3\" />, color: \"text-purple-500 border-purple-500/50 bg-purple-500/10\" },\n { id: \"cheap\", label: labels.capabilityCheap, icon: <DollarSign className=\"h-3 w-3\" />, color: \"text-green-500 border-green-500/50 bg-green-500/10\" },\n ]\n\n if (apiKeyMissing) {\n return <div className=\"text-sm text-destructive\">{labels.apiKeyRequired}</div>\n }\n\n if (error) {\n return <div className=\"text-sm text-destructive\">Error loading models: {error}</div>\n }\n\n const renderFullSelector = () => (\n <div className={cn(\"space-y-4 orm-root\", contrastClass)}>\n <div className=\"space-y-2\">\n {(showSearch || showFilters) && (\n <div className=\"space-y-2\">\n {showSearch && (\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder={labels.searchPlaceholder}\n value={searchQuery}\n onChange={(e: any) => setSearchQuery(e.target.value)}\n className=\"pl-8 h-8\"\n />\n </div>\n )}\n\n {showFilters && (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap gap-1\">\n {PROVIDER_FILTERS.map((filter) => (\n <Button\n key={filter.id}\n variant={providerFilter === filter.id ? \"default\" : \"outline\"}\n size=\"sm\"\n className={cn(\"h-6 px-2 text-xs\", providerFilter === filter.id && \"bg-primary text-primary-foreground\")}\n onClick={() => setProviderFilter(providerFilter === filter.id ? null : filter.id)}\n >\n {filter.icon && <span className=\"mr-1\">{filter.icon}</span>}\n {filter.label}\n </Button>\n ))}\n </div>\n\n <div className=\"flex flex-wrap gap-1\">\n {CAPABILITY_FILTERS.map((filter) => (\n <Button\n key={filter.id}\n variant=\"outline\"\n size=\"sm\"\n className={cn(\n \"h-6 px-2 text-xs border\",\n capabilityFilter === filter.id ? filter.color : \"text-foreground/70 orm-text-secondary\"\n )}\n onClick={() => setCapabilityFilter(capabilityFilter === filter.id ? null : filter.id)}\n >\n {filter.icon}\n <span className=\"ml-1\">{filter.label}</span>\n </Button>\n ))}\n </div>\n\n {hasActiveFilters && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-xs text-foreground/70 orm-text-secondary hover:text-foreground\"\n onClick={clearFilters}\n >\n <X className=\"h-3 w-3 mr-1\" />\n {labels.clearFilters}\n </Button>\n )}\n </div>\n )}\n </div>\n )}\n\n <div className=\"h-[400px] overflow-y-auto border rounded-md p-2\">\n {filteredCategories.length === 0 ? (\n <div className=\"p-4 text-center text-sm text-foreground/70 orm-text-secondary orm-no-results\">{labels.noResults}</div>\n ) : (\n filteredCategories.map((category) => (\n <div key={category.name} className=\"mb-4 last:mb-0\">\n <div className=\"px-2 py-1.5 text-xs font-semibold text-foreground/80 orm-section-title bg-muted/50 mb-1 rounded\">\n {category.name}\n </div>\n <div className=\"grid grid-cols-1 gap-1\">\n {category.models.map((model) => {\n const badge = getModelBadge(model)\n const isSelected = value === model.id\n return (\n <div\n key={model.id}\n className={cn(\n \"flex flex-col p-2 rounded-md cursor-pointer transition-colors border\",\n isSelected ? \"bg-primary/10 border-primary\" : \"hover:bg-muted border-transparent\"\n )}\n onClick={() => {\n onValueChange(model.id)\n if (showAllInModal) setModalOpen(false)\n }}\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"font-medium text-sm orm-model-name\">{model.name}</span>\n {badge && (\n <span className={cn(\"text-[10px] px-1.5 py-0.5 rounded-full flex items-center gap-1\", badge.color, badge.bgColor)}>\n {badge.icon}\n {badge.label}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2 text-[10px] text-foreground/70 orm-text-secondary orm-model-desc mt-1\">\n <span>{formatContextLength(model.context_length)} context</span>\n {showPricing && <span>•</span>}\n {showPricing && <span>{fmtPrice(model.pricing.prompt)}</span>}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n )\n\n if (showAllInModal) {\n return (\n <div className={cn(\"space-y-2 orm-root\", contrastClass, className)}>\n <div className=\"flex items-center gap-2\">\n <Select value={value} onValueChange={onValueChange} disabled={disabled || isLoading}>\n <SelectTrigger className=\"flex-1 text-left\">\n {isLoading ? (\n <div className=\"flex items-center gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span>{labels.loading}</span>\n </div>\n ) : (\n <SelectValue placeholder={labels.placeholder}>\n {selectedModel && (\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className=\"truncate font-medium orm-model-name\">{selectedModel.name}</span>\n {getModelBadge(selectedModel) && (\n <Zap className={cn(\"h-3 w-3 shrink-0\", getModelBadge(selectedModel)!.color.split(\" \")[0])} />\n )}\n </div>\n )}\n </SelectValue>\n )}\n </SelectTrigger>\n <SelectContent>\n {commonModels?.map((model) => (\n <SelectItem key={model.id} value={model.id}>\n <span className=\"font-medium orm-model-name\">{model.name}</span>\n </SelectItem>\n ))}\n {!commonModels?.length && !isLoading && <div className=\"p-2 text-xs text-foreground/70 orm-text-secondary\">{labels.noResults}</div>}\n </SelectContent>\n </Select>\n\n <Dialog open={modalOpen} onOpenChange={setModalOpen}>\n <DialogTrigger asChild>\n <Button variant=\"outline\" size=\"icon\" className=\"shrink-0\" title={labels.showAllModelsTitle}>\n <Settings2 className=\"h-4 w-4\" />\n </Button>\n </DialogTrigger>\n <DialogContent className={cn(\"max-w-2xl max-h-[85vh] orm-root\", contrastClass, \"orm-dialog\")}>\n <DialogHeader>\n <DialogTitle>{labels.libraryTitle}</DialogTitle>\n </DialogHeader>\n {renderFullSelector()}\n </DialogContent>\n </Dialog>\n\n {infoToggle && (\n <Button\n variant={showInfo ? \"default\" : \"outline\"}\n size=\"icon\"\n className=\"shrink-0\"\n onClick={() => setShowInfo(!showInfo)}\n title={labels.showDetailsTitle}\n >\n <Info className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n\n {infoToggle && showInfo && selectedModel && (\n <div className=\"text-xs text-foreground/70 orm-text-secondary p-2 bg-muted/30 rounded-md border mt-2 animate-in slide-in-from-top-1 fade-in duration-200\">\n <div className=\"font-medium text-foreground mb-1\">{labels.modelDetailsTitle}</div>\n {selectedModel.description ? <p className=\"mb-2\">{selectedModel.description}</p> : <p className=\"mb-2 italic\">{labels.noDescription}</p>}\n <div className=\"flex flex-wrap gap-2 text-[10px]\">\n <span className=\"bg-background border rounded px-1.5 py-0.5\">Context: {formatContextLength(selectedModel.context_length)}</span>\n <span className=\"bg-background border rounded px-1.5 py-0.5\">Input: {fmtPrice(selectedModel.pricing.prompt)}</span>\n <span className=\"bg-background border rounded px-1.5 py-0.5\">Output: {fmtPrice(selectedModel.pricing.completion)}</span>\n </div>\n </div>\n )}\n </div>\n )\n }\n\n return (\n <div className={cn(\"space-y-2 orm-root\", contrastClass, className)}>\n <Select value={value} onValueChange={onValueChange} disabled={disabled || isLoading}>\n <SelectTrigger className={cn(variant === \"compact\" && \"h-8 text-sm\")}>\n {isLoading ? (\n <div className=\"flex items-center gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span>{labels.loading}</span>\n </div>\n ) : (\n <SelectValue placeholder={labels.placeholder}>\n {selectedModel && (\n <div className=\"flex items-center gap-2\">\n <span className=\"orm-model-name\">{selectedModel.name}</span>\n {getModelBadge(selectedModel) && (\n <span className={cn(\"flex items-center gap-0.5 text-xs\", getModelBadge(selectedModel)!.color)}>{getModelBadge(selectedModel)!.icon}</span>\n )}\n </div>\n )}\n </SelectValue>\n )}\n </SelectTrigger>\n <SelectContent className={cn(\"max-h-[500px] min-w-[var(--radix-select-trigger-width)] w-full orm-root\", contrastClass, \"orm-select-content\")}>\n <div className=\"p-2 border-b space-y-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"grid w-full gap-1 grid-cols-[repeat(auto-fit,minmax(150px,1fr))]\">\n {recommendedModels.map((model) => (\n <Button\n key={model.id}\n size=\"sm\"\n variant={value === model.id ? \"default\" : \"outline\"}\n className=\"h-8 px-2 text-xs justify-start\"\n onClick={(e: any) => {\n e.stopPropagation()\n onValueChange(model.id)\n }}\n >\n <Sparkles className=\"h-3 w-3 mr-1\" />\n <span className=\"truncate\">{model.name}</span>\n </Button>\n ))}\n </div>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"h-8 w-8\"\n onClick={(e: any) => {\n e.stopPropagation()\n handleRefresh()\n }}\n title={labels.refreshTitle}\n >\n {isRefreshing ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Sparkles className=\"h-4 w-4\" />}\n </Button>\n </div>\n {lastUpdated && (\n <div className=\"text-[11px] text-foreground/70 orm-text-secondary orm-last-updated\">\n {labels.lastUpdatedPrefix}{\" \"}\n {new Date(lastUpdated).toLocaleTimeString(locale === \"fr\" ? \"fr-FR\" : \"en-US\")}\n </div>\n )}\n </div>\n\n {(showSearch || showFilters) && (\n <div className=\"p-2 border-b space-y-2\">\n {showSearch && (\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder={labels.searchPlaceholder}\n value={searchQuery}\n onChange={(e: any) => setSearchQuery(e.target.value)}\n className=\"pl-8 h-8\"\n onClick={(e: any) => e.stopPropagation()}\n onKeyDown={(e: any) => e.stopPropagation()}\n />\n </div>\n )}\n\n {showFilters && (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap gap-1\">\n {PROVIDER_FILTERS.map((filter) => (\n <Button\n key={filter.id}\n variant={providerFilter === filter.id ? \"default\" : \"outline\"}\n size=\"sm\"\n className={cn(\"h-6 px-2 text-xs\", providerFilter === filter.id && \"bg-primary text-primary-foreground\")}\n onClick={(e: any) => {\n e.stopPropagation()\n setProviderFilter(providerFilter === filter.id ? null : filter.id)\n }}\n >\n {filter.icon && <span className=\"mr-1\">{filter.icon}</span>}\n {filter.label}\n </Button>\n ))}\n </div>\n\n <div className=\"flex flex-wrap gap-1\">\n {CAPABILITY_FILTERS.map((filter) => (\n <Button\n key={filter.id}\n variant=\"outline\"\n size=\"sm\"\n className={cn(\n \"h-6 px-2 text-xs border\",\n capabilityFilter === filter.id ? filter.color : \"text-foreground/70 orm-text-secondary\"\n )}\n onClick={(e: any) => {\n e.stopPropagation()\n setCapabilityFilter(capabilityFilter === filter.id ? null : filter.id)\n }}\n >\n {filter.icon}\n <span className=\"ml-1\">{filter.label}</span>\n </Button>\n ))}\n </div>\n\n {hasActiveFilters && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-xs text-foreground/70 orm-text-secondary hover:text-foreground\"\n onClick={(e: any) => {\n e.stopPropagation()\n clearFilters()\n }}\n >\n <X className=\"h-3 w-3 mr-1\" />\n {labels.clearFilters}\n </Button>\n )}\n </div>\n )}\n </div>\n )}\n\n <div className=\"max-h-[300px] overflow-y-auto\">\n {filteredCategories.length === 0 ? (\n <div className=\"p-4 text-center text-sm text-foreground/70 orm-text-secondary orm-no-results\">{labels.noResults}</div>\n ) : (\n filteredCategories.map((category) => (\n <div key={category.name}>\n <div className=\"px-2 py-1.5 text-xs font-semibold text-foreground/80 orm-section-title bg-muted/50 sticky top-0\">\n {category.name}\n </div>\n {category.models.map((model) => {\n const badge = getModelBadge(model)\n return (\n <SelectItem key={model.id} value={model.id} className=\"py-2\">\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium orm-model-name\">{model.name}</span>\n {badge && (\n <span className={cn(\"flex items-center gap-0.5 text-xs\", badge.color)}>\n {badge.icon}\n <span className=\"hidden sm:inline\">{badge.label}</span>\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2 text-xs text-foreground/70 orm-text-secondary orm-model-desc\">\n <span>{formatContextLength(model.context_length)}</span>\n {showPricing && (\n <>\n <span>•</span>\n <span>{fmtPrice(model.pricing.prompt)}</span>\n </>\n )}\n </div>\n </div>\n </SelectItem>\n )\n })}\n </div>\n ))\n )}\n </div>\n </SelectContent>\n </Select>\n\n {variant === \"default\" && selectedModel && (\n <div className=\"text-xs text-foreground/70 orm-text-secondary\">{selectedModel.description && <p className=\"line-clamp-2\">{selectedModel.description}</p>}</div>\n )}\n </div>\n )\n}\n\nexport function ModelSelectorCompact({\n value,\n onValueChange,\n apiKey,\n endpoint,\n locale,\n labels,\n components,\n className,\n disabled = false,\n contrast,\n}: Pick<ModelSelectorProps, \"value\" | \"onValueChange\" | \"apiKey\" | \"endpoint\" | \"locale\" | \"labels\" | \"components\" | \"className\" | \"disabled\" | \"contrast\">) {\n return (\n <ModelSelector\n value={value}\n onValueChange={onValueChange}\n apiKey={apiKey}\n endpoint={endpoint}\n locale={locale}\n labels={labels}\n components={components}\n className={className}\n disabled={disabled}\n contrast={contrast}\n showSearch={false}\n showPricing={false}\n variant=\"compact\"\n />\n )\n}\n\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/i18n.ts","../src/useOpenRouterModels.ts","../src/ui/button.tsx","../src/ui/input.tsx","../src/ui/dialog.tsx","../src/ui/select.tsx","../src/ModelSelector.tsx"],"names":["React","React2","jsx","React3","jsxs","useMemo","Button","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Dialog","DialogContent","DialogHeader","DialogTitle","DialogTrigger","useState","useCallback","X"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n\n","export type Locale = \"en\" | \"fr\"\n\nexport interface Labels {\n placeholder: string\n loading: string\n searchPlaceholder: string\n noResults: string\n apiKeyRequired: string\n refreshTitle: string\n lastUpdatedPrefix: string\n clearFilters: string\n libraryTitle: string\n showAllModelsTitle: string\n showDetailsTitle: string\n modelDetailsTitle: string\n noDescription: string\n\n // Capability labels\n capabilityFast: string\n capabilityPowerful: string\n capabilityReasoning: string\n capabilityCheap: string\n\n // Badge labels\n badgeFast: string\n badgePowerful: string\n badgeReasoning: string\n}\n\nexport const defaultLabelsEN: Labels = {\n placeholder: \"Select a model\",\n loading: \"Loading...\",\n searchPlaceholder: \"Search a model...\",\n noResults: \"No models found\",\n apiKeyRequired: \"OpenRouter API key required\",\n refreshTitle: \"Refresh model list\",\n lastUpdatedPrefix: \"Last updated:\",\n clearFilters: \"Clear filters\",\n libraryTitle: \"Model library\",\n showAllModelsTitle: \"All models\",\n showDetailsTitle: \"Show details\",\n modelDetailsTitle: \"Model details\",\n noDescription: \"No description available.\",\n\n capabilityFast: \"Fast\",\n capabilityPowerful: \"Powerful\",\n capabilityReasoning: \"Reasoning\",\n capabilityCheap: \"Cheap\",\n\n badgeFast: \"Fast\",\n badgePowerful: \"Powerful\",\n badgeReasoning: \"Reasoning\",\n}\n\nexport const defaultLabelsFR: Labels = {\n placeholder: \"Sélectionner un modèle\",\n loading: \"Chargement...\",\n searchPlaceholder: \"Rechercher un modèle...\",\n noResults: \"Aucun modèle trouvé\",\n apiKeyRequired: \"Clé API OpenRouter requise\",\n refreshTitle: \"Rafraîchir la liste des modèles\",\n lastUpdatedPrefix: \"Dernière mise à jour:\",\n clearFilters: \"Effacer les filtres\",\n libraryTitle: \"Bibliothèque de modèles\",\n showAllModelsTitle: \"Tous les modèles\",\n showDetailsTitle: \"Afficher les détails\",\n modelDetailsTitle: \"Détails du modèle\",\n noDescription: \"Pas de description disponible.\",\n\n capabilityFast: \"Rapide\",\n capabilityPowerful: \"Puissant\",\n capabilityReasoning: \"Raisonnement\",\n capabilityCheap: \"Économique\",\n\n badgeFast: \"Rapide\",\n badgePowerful: \"Puissant\",\n badgeReasoning: \"Raisonnement\",\n}\n\nexport function resolveBrowserLocale(): Locale {\n try {\n if (typeof navigator === \"undefined\") return \"en\"\n const candidates = (navigator.languages?.length ? navigator.languages : [navigator.language]).filter(Boolean)\n const first = candidates[0] ?? \"\"\n if (first.toLowerCase().startsWith(\"fr\")) return \"fr\"\n return \"en\"\n } catch {\n return \"en\"\n }\n}\n\nexport function resolveLabels(locale: Locale | undefined, overrides?: Partial<Labels>): Labels {\n const effectiveLocale = locale ?? resolveBrowserLocale()\n const base = effectiveLocale === \"fr\" ? defaultLabelsFR : defaultLabelsEN\n return { ...base, ...(overrides ?? {}) }\n}\n\n\n","import { useCallback, useEffect, useMemo, useState } from \"react\"\n\nimport type { ModelCategory, OpenRouterModel, OpenRouterModelsClient } from \"@cappasoft/openrouter-models\"\nimport { createOpenRouterModelsClient } from \"@cappasoft/openrouter-models\"\n\nexport interface UseOpenRouterModelsOptions {\n apiKey: string\n endpoint?: string\n enabled?: boolean\n}\n\nexport interface UseOpenRouterModelsResult {\n models: OpenRouterModel[]\n categories: ModelCategory[]\n isLoading: boolean\n isRefreshing: boolean\n error: string | null\n lastUpdated: number | null\n refresh(): void\n formatPrice(pricePerToken: string): string\n}\n\nfunction formatPriceForUI(pricePerToken: string): string {\n const price = parseFloat(pricePerToken)\n if (price === 0) return \"Free\"\n const pricePerMillion = price * 1000000\n if (pricePerMillion < 0.01) return \"<$0.01/M\"\n return `$${pricePerMillion.toFixed(2)}/M`\n}\n\nexport function useOpenRouterModels(options: UseOpenRouterModelsOptions): UseOpenRouterModelsResult {\n const enabled = options.enabled ?? true\n\n const client: OpenRouterModelsClient | null = useMemo(() => {\n if (!enabled) return null\n return createOpenRouterModelsClient({\n apiKey: options.apiKey,\n endpoint: options.endpoint,\n })\n }, [enabled, options.apiKey, options.endpoint])\n\n const [models, setModels] = useState<OpenRouterModel[]>([])\n const [categories, setCategories] = useState<ModelCategory[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [isRefreshing, setIsRefreshing] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [lastUpdated, setLastUpdated] = useState<number | null>(null)\n\n const load = useCallback(\n async (force: boolean) => {\n if (!enabled || !client) {\n setModels([])\n setCategories([])\n setLastUpdated(null)\n setError(null)\n setIsLoading(false)\n setIsRefreshing(false)\n return\n }\n setError(null)\n if (force) setIsRefreshing(true)\n setIsLoading(true)\n try {\n const res = force ? await client.refresh() : await client.listModels()\n setModels(res.models)\n setCategories(res.categories)\n setLastUpdated(res.lastUpdated)\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch models\")\n } finally {\n setIsLoading(false)\n setIsRefreshing(false)\n }\n },\n [enabled, client]\n )\n\n useEffect(() => {\n load(false)\n }, [load])\n\n const refresh = useCallback(() => void load(true), [load])\n\n return {\n models,\n categories,\n isLoading,\n isRefreshing,\n error,\n lastUpdated,\n refresh,\n formatPrice: formatPriceForUI,\n }\n}\n\n\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline: \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />\n }\n)\nButton.displayName = \"Button\"\n\nexport { buttonVariants }\n\n\n","import * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nexport const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n})\nInput.displayName = \"Input\"\n\n\n","import * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\n\nexport const Dialog = DialogPrimitive.Root\nexport const DialogTrigger = DialogPrimitive.Trigger\nexport const DialogPortal = DialogPrimitive.Portal\nexport const DialogClose = DialogPrimitive.Close\n\nexport const DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\ntype DialogContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n containerClassName?: string\n}\n\nexport const DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(({ className, containerClassName, children, ...props }, ref) => (\n <DialogPortal>\n <div className={cn(\"orm-root\", containerClassName)}>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </div>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nexport const DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex flex-col space-y-1.5 text-center sm:text-left\", className)} {...props} />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nexport const DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title ref={ref} className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)} {...props} />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\n\n","import * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\n\nexport const Select = SelectPrimitive.Root\nexport const SelectGroup = SelectPrimitive.Group\nexport const SelectValue = SelectPrimitive.Value\n\nexport const SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nexport const SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton ref={ref} className={cn(\"flex cursor-default items-center justify-center py-1\", className)} {...props}>\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nexport const SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName\n\ntype SelectContentProps = React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content> & {\n containerClassName?: string\n}\n\nexport const SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n SelectContentProps\n>(({ className, containerClassName, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <div className={cn(\"orm-root\", containerClassName)}>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </div>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nexport const SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\n\n","import { useCallback, useMemo, useState } from \"react\"\nimport type * as React from \"react\"\nimport { Brain, DollarSign, Info, Loader2, Search, Settings2, Sparkles, X, Zap } from \"lucide-react\"\n\nimport type { OpenRouterModel } from \"@cappasoft/openrouter-models\"\nimport { RECOMMENDED_MODELS } from \"@cappasoft/openrouter-models\"\n\nimport { cn } from \"./utils\"\nimport type { Labels, Locale } from \"./i18n\"\nimport { resolveLabels } from \"./i18n\"\nimport { useOpenRouterModels } from \"./useOpenRouterModels\"\n\nimport { Button as DefaultButton } from \"./ui/button\"\nimport { Input as DefaultInput } from \"./ui/input\"\nimport { Dialog as DefaultDialog, DialogContent as DefaultDialogContent, DialogHeader as DefaultDialogHeader, DialogTitle as DefaultDialogTitle, DialogTrigger as DefaultDialogTrigger } from \"./ui/dialog\"\nimport {\n Select as DefaultSelect,\n SelectContent as DefaultSelectContent,\n SelectItem as DefaultSelectItem,\n SelectTrigger as DefaultSelectTrigger,\n SelectValue as DefaultSelectValue,\n} from \"./ui/select\"\n\n// Quick filter types\ntype ProviderFilter = \"openai\" | \"anthropic\" | \"google\" | \"meta\" | \"deepseek\" | null\ntype CapabilityFilter = \"fast\" | \"powerful\" | \"reasoning\" | \"cheap\" | null\n\nexport interface UIComponents {\n Button: React.ComponentType<any>\n Input: React.ComponentType<any>\n Select: React.ComponentType<any>\n SelectTrigger: React.ComponentType<any>\n SelectValue: React.ComponentType<any>\n SelectContent: React.ComponentType<any>\n SelectItem: React.ComponentType<any>\n Dialog: React.ComponentType<any>\n DialogTrigger: React.ComponentType<any>\n DialogContent: React.ComponentType<any>\n DialogHeader: React.ComponentType<any>\n DialogTitle: React.ComponentType<any>\n}\n\nexport interface ModelSelectorProps {\n value: string\n onValueChange: (value: string) => void\n\n apiKey: string\n endpoint?: string\n\n locale?: Locale\n labels?: Partial<Labels>\n components?: Partial<UIComponents>\n\n className?: string\n disabled?: boolean\n showSearch?: boolean\n showPricing?: boolean\n showFilters?: boolean\n /**\n * Contrast mode for accessibility.\n * - default: uses softer secondary text\n * - high-contrast: increases contrast for secondary text (prices, metadata, headers)\n */\n contrast?: \"default\" | \"high-contrast\"\n variant?: \"default\" | \"compact\"\n\n // Advanced layout\n showAllInModal?: boolean\n infoToggle?: boolean\n}\n\nfunction formatContextLength(length: number): string {\n if (length >= 1000000) return `${(length / 1000000).toFixed(1)}M ctx`\n if (length >= 1000) return `${Math.round(length / 1000)}K ctx`\n return `${length} ctx`\n}\n\nfunction matchesCapability(model: OpenRouterModel, filter: CapabilityFilter): boolean {\n if (!filter) return true\n const id = model.id.toLowerCase()\n const price = parseFloat(model.pricing.prompt)\n\n switch (filter) {\n case \"fast\":\n return id.includes(\"flash\") || id.includes(\"mini\") || id.includes(\"haiku\") || id.includes(\"small\") || id.includes(\"8b\")\n case \"powerful\":\n return id.includes(\"opus\") || id.includes(\"large\") || id.includes(\"pro\") || (id.includes(\"4o\") && !id.includes(\"mini\")) || id.includes(\"70b\") || id.includes(\"sonnet-4\")\n case \"reasoning\":\n return id.includes(\"o1\") || id.includes(\"r1\") || id.includes(\"reasoning\")\n case \"cheap\":\n return price * 1000000 < 1\n default:\n return true\n }\n}\n\nfunction matchesProvider(model: OpenRouterModel, filter: ProviderFilter): boolean {\n if (!filter) return true\n return model.id.toLowerCase().startsWith(filter)\n}\n\nexport function ModelSelector({\n value,\n onValueChange,\n apiKey,\n endpoint,\n locale,\n labels: labelsOverrides,\n components,\n className,\n disabled = false,\n showSearch = true,\n showPricing = true,\n showFilters = true,\n contrast = \"default\",\n variant = \"default\",\n showAllInModal = false,\n infoToggle = false,\n}: ModelSelectorProps) {\n const labels = useMemo(() => resolveLabels(locale, labelsOverrides), [locale, labelsOverrides])\n\n const ui = {\n Button: components?.Button ?? DefaultButton,\n Input: components?.Input ?? DefaultInput,\n Select: components?.Select ?? DefaultSelect,\n SelectTrigger: components?.SelectTrigger ?? DefaultSelectTrigger,\n SelectValue: components?.SelectValue ?? DefaultSelectValue,\n SelectContent: components?.SelectContent ?? DefaultSelectContent,\n SelectItem: components?.SelectItem ?? DefaultSelectItem,\n Dialog: components?.Dialog ?? DefaultDialog,\n DialogTrigger: components?.DialogTrigger ?? DefaultDialogTrigger,\n DialogContent: components?.DialogContent ?? DefaultDialogContent,\n DialogHeader: components?.DialogHeader ?? DefaultDialogHeader,\n DialogTitle: components?.DialogTitle ?? DefaultDialogTitle,\n } satisfies UIComponents\n\n const { Button, Input, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } = ui\n\n const apiKeyMissing = !apiKey\n\n const { categories, isLoading, isRefreshing, error, refresh, lastUpdated, models, formatPrice } = useOpenRouterModels({\n apiKey,\n endpoint,\n enabled: !apiKeyMissing,\n })\n\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [providerFilter, setProviderFilter] = useState<ProviderFilter>(null)\n const [capabilityFilter, setCapabilityFilter] = useState<CapabilityFilter>(null)\n const [modalOpen, setModalOpen] = useState(false)\n const [showInfo, setShowInfo] = useState(false)\n\n const hasActiveFilters = providerFilter !== null || capabilityFilter !== null || searchQuery.trim() !== \"\"\n const contrastClass = contrast === \"high-contrast\" ? \"orm-contrast-high\" : \"orm-contrast-default\"\n\n const clearFilters = () => {\n setSearchQuery(\"\")\n setProviderFilter(null)\n setCapabilityFilter(null)\n }\n\n const recommendedModels = useMemo(() => {\n const map = new Map(models.map((m) => [m.id, m]))\n return RECOMMENDED_MODELS.map((id) => map.get(id)).filter(Boolean) as OpenRouterModel[]\n }, [models])\n\n const commonModels = useMemo(() => {\n if (!showAllInModal) return null\n const list = [...recommendedModels]\n if (value && !list.find((m) => m.id === value)) {\n const selected = models.find((m) => m.id === value)\n if (selected) list.push(selected)\n }\n return list\n }, [recommendedModels, value, models, showAllInModal])\n\n const filteredCategories = useMemo(() => {\n return categories\n .map((cat) => ({\n ...cat,\n models: cat.models\n .filter((m) => {\n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase()\n const matchesSearch =\n m.name.toLowerCase().includes(query) ||\n m.id.toLowerCase().includes(query) ||\n m.description?.toLowerCase().includes(query)\n if (!matchesSearch) return false\n }\n if (!matchesProvider(m, providerFilter)) return false\n if (!matchesCapability(m, capabilityFilter)) return false\n return true\n })\n .sort((a, b) => parseFloat(b.pricing.prompt) - parseFloat(a.pricing.prompt)),\n }))\n .filter((cat) => cat.models.length > 0)\n }, [categories, searchQuery, providerFilter, capabilityFilter])\n\n const selectedModel = useMemo(() => {\n for (const cat of categories) {\n const model = cat.models.find((m) => m.id === value)\n if (model) return model\n }\n return null\n }, [categories, value])\n\n const handleRefresh = useCallback(() => refresh(), [refresh])\n\n const fmtPrice = useCallback(\n (pricePerToken: string) => {\n const v = parseFloat(pricePerToken)\n if (v === 0) return locale === \"fr\" ? \"Gratuit\" : \"Free\"\n return formatPrice(pricePerToken)\n },\n [formatPrice, locale]\n )\n\n const getModelBadge = (model: OpenRouterModel): { icon: React.ReactNode; label: string; color: string; bgColor: string } | null => {\n const id = model.id.toLowerCase()\n if (id.includes(\"o1\") || id.includes(\"r1\") || id.includes(\"reasoning\")) {\n return { icon: <Brain className=\"h-3 w-3\" />, label: labels.badgeReasoning, color: \"text-purple-500\", bgColor: \"bg-purple-500/10\" }\n }\n if (id.includes(\"flash\") || id.includes(\"mini\") || id.includes(\"haiku\") || id.includes(\"small\")) {\n return { icon: <Zap className=\"h-3 w-3\" />, label: labels.badgeFast, color: \"text-yellow-500\", bgColor: \"bg-yellow-500/10\" }\n }\n if (id.includes(\"opus\") || id.includes(\"large\") || id.includes(\"pro\") || (id.includes(\"4o\") && !id.includes(\"mini\"))) {\n return { icon: <Sparkles className=\"h-3 w-3\" />, label: labels.badgePowerful, color: \"text-blue-500\", bgColor: \"bg-blue-500/10\" }\n }\n return null\n }\n\n const PROVIDER_FILTERS: { id: ProviderFilter; label: string; icon?: string }[] = [\n { id: \"openai\", label: \"OpenAI\", icon: \"🤖\" },\n { id: \"anthropic\", label: \"Claude\", icon: \"🎭\" },\n { id: \"google\", label: \"Gemini\", icon: \"💎\" },\n { id: \"meta\", label: \"Llama\", icon: \"🦙\" },\n { id: \"deepseek\", label: \"DeepSeek\", icon: \"🔍\" },\n ]\n\n const CAPABILITY_FILTERS: { id: CapabilityFilter; label: string; icon: React.ReactNode; color: string }[] = [\n { id: \"fast\", label: labels.capabilityFast, icon: <Zap className=\"h-3 w-3\" />, color: \"text-yellow-500 border-yellow-500/50 bg-yellow-500/10\" },\n { id: \"powerful\", label: labels.capabilityPowerful, icon: <Sparkles className=\"h-3 w-3\" />, color: \"text-blue-500 border-blue-500/50 bg-blue-500/10\" },\n { id: \"reasoning\", label: labels.capabilityReasoning, icon: <Brain className=\"h-3 w-3\" />, color: \"text-purple-500 border-purple-500/50 bg-purple-500/10\" },\n { id: \"cheap\", label: labels.capabilityCheap, icon: <DollarSign className=\"h-3 w-3\" />, color: \"text-green-500 border-green-500/50 bg-green-500/10\" },\n ]\n\n if (apiKeyMissing) {\n return (\n <div className={cn(\"orm-root\", contrastClass)}>\n <div className={cn(\"text-sm text-destructive\", className)}>{labels.apiKeyRequired}</div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className={cn(\"orm-root\", contrastClass)}>\n <div className={cn(\"text-sm text-destructive\", className)}>Error loading models: {error}</div>\n </div>\n )\n }\n\n const renderFullSelector = () => (\n <div className={cn(\"orm-root\", contrastClass)}>\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n {(showSearch || showFilters) && (\n <div className=\"space-y-2\">\n {showSearch && (\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder={labels.searchPlaceholder}\n value={searchQuery}\n onChange={(e: any) => setSearchQuery(e.target.value)}\n className=\"pl-8 h-8\"\n />\n </div>\n )}\n\n {showFilters && (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap gap-1\">\n {PROVIDER_FILTERS.map((filter) => (\n <Button\n key={filter.id}\n variant={providerFilter === filter.id ? \"default\" : \"outline\"}\n size=\"sm\"\n className={cn(\"h-6 px-2 text-xs\", providerFilter === filter.id && \"bg-primary text-primary-foreground\")}\n onClick={() => setProviderFilter(providerFilter === filter.id ? null : filter.id)}\n >\n {filter.icon && <span className=\"mr-1\">{filter.icon}</span>}\n {filter.label}\n </Button>\n ))}\n </div>\n\n <div className=\"flex flex-wrap gap-1\">\n {CAPABILITY_FILTERS.map((filter) => (\n <Button\n key={filter.id}\n variant=\"outline\"\n size=\"sm\"\n className={cn(\n \"h-6 px-2 text-xs border\",\n capabilityFilter === filter.id ? filter.color : \"text-foreground/70 orm-text-secondary\"\n )}\n onClick={() => setCapabilityFilter(capabilityFilter === filter.id ? null : filter.id)}\n >\n {filter.icon}\n <span className=\"ml-1\">{filter.label}</span>\n </Button>\n ))}\n </div>\n\n {hasActiveFilters && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-xs text-foreground/70 orm-text-secondary hover:text-foreground\"\n onClick={clearFilters}\n >\n <X className=\"h-3 w-3 mr-1\" />\n {labels.clearFilters}\n </Button>\n )}\n </div>\n )}\n </div>\n )}\n\n <div className=\"h-[400px] overflow-y-auto border rounded-md p-2\">\n {filteredCategories.length === 0 ? (\n <div className=\"p-4 text-center text-sm text-foreground/70 orm-text-secondary orm-no-results\">{labels.noResults}</div>\n ) : (\n filteredCategories.map((category) => (\n <div key={category.name} className=\"mb-4 last:mb-0\">\n <div className=\"px-2 py-1.5 text-xs font-semibold text-foreground/80 orm-section-title bg-muted/50 mb-1 rounded\">\n {category.name}\n </div>\n <div className=\"grid grid-cols-1 gap-1\">\n {category.models.map((model) => {\n const badge = getModelBadge(model)\n const isSelected = value === model.id\n return (\n <div\n key={model.id}\n className={cn(\n \"flex flex-col p-2 rounded-md cursor-pointer transition-colors border\",\n isSelected ? \"bg-primary/10 border-primary\" : \"hover:bg-muted border-transparent\"\n )}\n onClick={() => {\n onValueChange(model.id)\n if (showAllInModal) setModalOpen(false)\n }}\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"font-medium text-sm orm-model-name\">{model.name}</span>\n {badge && (\n <span className={cn(\"text-[10px] px-1.5 py-0.5 rounded-full flex items-center gap-1\", badge.color, badge.bgColor)}>\n {badge.icon}\n {badge.label}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2 text-[10px] text-foreground/70 orm-text-secondary orm-model-desc mt-1\">\n <span>{formatContextLength(model.context_length)} context</span>\n {showPricing && <span>•</span>}\n {showPricing && <span>{fmtPrice(model.pricing.prompt)}</span>}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n </div>\n )\n\n if (showAllInModal) {\n return (\n <div className={cn(\"orm-root\", contrastClass)}>\n <div className={cn(\"space-y-2\", className)}>\n <div className=\"flex items-center gap-2\">\n <Select value={value} onValueChange={onValueChange} disabled={disabled || isLoading}>\n <SelectTrigger className=\"flex-1 text-left\">\n {isLoading ? (\n <div className=\"flex items-center gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span>{labels.loading}</span>\n </div>\n ) : (\n <SelectValue placeholder={labels.placeholder}>\n {selectedModel && (\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className=\"truncate font-medium orm-model-name\">{selectedModel.name}</span>\n {getModelBadge(selectedModel) && (\n <Zap className={cn(\"h-3 w-3 shrink-0\", getModelBadge(selectedModel)!.color.split(\" \")[0])} />\n )}\n </div>\n )}\n </SelectValue>\n )}\n </SelectTrigger>\n <SelectContent containerClassName={cn(\"orm-root\", contrastClass)}>\n {commonModels?.map((model) => (\n <SelectItem key={model.id} value={model.id}>\n <span className=\"font-medium orm-model-name\">{model.name}</span>\n </SelectItem>\n ))}\n {!commonModels?.length && !isLoading && <div className=\"p-2 text-xs text-foreground/70 orm-text-secondary\">{labels.noResults}</div>}\n </SelectContent>\n </Select>\n\n <Dialog open={modalOpen} onOpenChange={setModalOpen}>\n <DialogTrigger asChild>\n <Button variant=\"outline\" size=\"icon\" className=\"shrink-0\" title={labels.showAllModelsTitle}>\n <Settings2 className=\"h-4 w-4\" />\n </Button>\n </DialogTrigger>\n <DialogContent containerClassName={cn(\"orm-root\", contrastClass)} className={cn(\"max-w-2xl max-h-[85vh] orm-dialog\")}>\n <DialogHeader>\n <DialogTitle>{labels.libraryTitle}</DialogTitle>\n </DialogHeader>\n {renderFullSelector()}\n </DialogContent>\n </Dialog>\n\n {infoToggle && (\n <Button\n variant={showInfo ? \"default\" : \"outline\"}\n size=\"icon\"\n className=\"shrink-0\"\n onClick={() => setShowInfo(!showInfo)}\n title={labels.showDetailsTitle}\n >\n <Info className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n\n {infoToggle && showInfo && selectedModel && (\n <div className=\"text-xs text-foreground/70 orm-text-secondary p-2 bg-muted/30 rounded-md border mt-2 animate-in slide-in-from-top-1 fade-in duration-200\">\n <div className=\"font-medium text-foreground mb-1\">{labels.modelDetailsTitle}</div>\n {selectedModel.description ? <p className=\"mb-2\">{selectedModel.description}</p> : <p className=\"mb-2 italic\">{labels.noDescription}</p>}\n <div className=\"flex flex-wrap gap-2 text-[10px]\">\n <span className=\"bg-background border rounded px-1.5 py-0.5\">Context: {formatContextLength(selectedModel.context_length)}</span>\n <span className=\"bg-background border rounded px-1.5 py-0.5\">Input: {fmtPrice(selectedModel.pricing.prompt)}</span>\n <span className=\"bg-background border rounded px-1.5 py-0.5\">Output: {fmtPrice(selectedModel.pricing.completion)}</span>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n }\n\n return (\n <div className={cn(\"orm-root\", contrastClass)}>\n <div className={cn(\"space-y-2\", className)}>\n <Select value={value} onValueChange={onValueChange} disabled={disabled || isLoading}>\n <SelectTrigger className={cn(variant === \"compact\" && \"h-8 text-sm\")}>\n {isLoading ? (\n <div className=\"flex items-center gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span>{labels.loading}</span>\n </div>\n ) : (\n <SelectValue placeholder={labels.placeholder}>\n {selectedModel && (\n <div className=\"flex items-center gap-2\">\n <span className=\"orm-model-name\">{selectedModel.name}</span>\n {getModelBadge(selectedModel) && (\n <span className={cn(\"flex items-center gap-0.5 text-xs\", getModelBadge(selectedModel)!.color)}>\n {getModelBadge(selectedModel)!.icon}\n </span>\n )}\n </div>\n )}\n </SelectValue>\n )}\n </SelectTrigger>\n <SelectContent\n containerClassName={cn(\"orm-root\", contrastClass)}\n className={cn(\"max-h-[500px] min-w-[var(--radix-select-trigger-width)] w-full orm-select-content\")}\n >\n <div className=\"p-2 border-b space-y-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"grid w-full gap-1 grid-cols-[repeat(auto-fit,minmax(150px,1fr))]\">\n {recommendedModels.map((model) => (\n <Button\n key={model.id}\n size=\"sm\"\n variant={value === model.id ? \"default\" : \"outline\"}\n className=\"h-8 px-2 text-xs justify-start\"\n onClick={(e: any) => {\n e.stopPropagation()\n onValueChange(model.id)\n }}\n >\n <Sparkles className=\"h-3 w-3 mr-1\" />\n <span className=\"truncate\">{model.name}</span>\n </Button>\n ))}\n </div>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"h-8 w-8\"\n onClick={(e: any) => {\n e.stopPropagation()\n handleRefresh()\n }}\n title={labels.refreshTitle}\n >\n {isRefreshing ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Sparkles className=\"h-4 w-4\" />}\n </Button>\n </div>\n {lastUpdated && (\n <div className=\"text-[11px] text-foreground/70 orm-text-secondary orm-last-updated\">\n {labels.lastUpdatedPrefix}{\" \"}\n {new Date(lastUpdated).toLocaleTimeString(locale === \"fr\" ? \"fr-FR\" : \"en-US\")}\n </div>\n )}\n </div>\n\n {(showSearch || showFilters) && (\n <div className=\"p-2 border-b space-y-2\">\n {showSearch && (\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder={labels.searchPlaceholder}\n value={searchQuery}\n onChange={(e: any) => setSearchQuery(e.target.value)}\n className=\"pl-8 h-8\"\n onClick={(e: any) => e.stopPropagation()}\n onKeyDown={(e: any) => e.stopPropagation()}\n />\n </div>\n )}\n\n {showFilters && (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap gap-1\">\n {PROVIDER_FILTERS.map((filter) => (\n <Button\n key={filter.id}\n variant={providerFilter === filter.id ? \"default\" : \"outline\"}\n size=\"sm\"\n className={cn(\"h-6 px-2 text-xs\", providerFilter === filter.id && \"bg-primary text-primary-foreground\")}\n onClick={(e: any) => {\n e.stopPropagation()\n setProviderFilter(providerFilter === filter.id ? null : filter.id)\n }}\n >\n {filter.icon && <span className=\"mr-1\">{filter.icon}</span>}\n {filter.label}\n </Button>\n ))}\n </div>\n\n <div className=\"flex flex-wrap gap-1\">\n {CAPABILITY_FILTERS.map((filter) => (\n <Button\n key={filter.id}\n variant=\"outline\"\n size=\"sm\"\n className={cn(\n \"h-6 px-2 text-xs border\",\n capabilityFilter === filter.id ? filter.color : \"text-foreground/70 orm-text-secondary\"\n )}\n onClick={(e: any) => {\n e.stopPropagation()\n setCapabilityFilter(capabilityFilter === filter.id ? null : filter.id)\n }}\n >\n {filter.icon}\n <span className=\"ml-1\">{filter.label}</span>\n </Button>\n ))}\n </div>\n\n {hasActiveFilters && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-xs text-foreground/70 orm-text-secondary hover:text-foreground\"\n onClick={(e: any) => {\n e.stopPropagation()\n clearFilters()\n }}\n >\n <X className=\"h-3 w-3 mr-1\" />\n {labels.clearFilters}\n </Button>\n )}\n </div>\n )}\n </div>\n )}\n\n <div className=\"max-h-[300px] overflow-y-auto\">\n {filteredCategories.length === 0 ? (\n <div className=\"p-4 text-center text-sm text-foreground/70 orm-text-secondary orm-no-results\">{labels.noResults}</div>\n ) : (\n filteredCategories.map((category) => (\n <div key={category.name}>\n <div className=\"px-2 py-1.5 text-xs font-semibold text-foreground/80 orm-section-title bg-muted/50 sticky top-0\">\n {category.name}\n </div>\n {category.models.map((model) => {\n const badge = getModelBadge(model)\n return (\n <SelectItem key={model.id} value={model.id} className=\"py-2\">\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium orm-model-name\">{model.name}</span>\n {badge && (\n <span className={cn(\"flex items-center gap-0.5 text-xs\", badge.color)}>\n {badge.icon}\n <span className=\"hidden sm:inline\">{badge.label}</span>\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2 text-xs text-foreground/70 orm-text-secondary orm-model-desc\">\n <span>{formatContextLength(model.context_length)}</span>\n {showPricing && (\n <>\n <span>•</span>\n <span>{fmtPrice(model.pricing.prompt)}</span>\n </>\n )}\n </div>\n </div>\n </SelectItem>\n )\n })}\n </div>\n ))\n )}\n </div>\n </SelectContent>\n </Select>\n\n {variant === \"default\" && selectedModel && (\n <div className=\"text-xs text-foreground/70 orm-text-secondary\">{selectedModel.description && <p className=\"line-clamp-2\">{selectedModel.description}</p>}</div>\n )}\n </div>\n </div>\n )\n}\n\nexport function ModelSelectorCompact({\n value,\n onValueChange,\n apiKey,\n endpoint,\n locale,\n labels,\n components,\n className,\n disabled = false,\n contrast,\n}: Pick<ModelSelectorProps, \"value\" | \"onValueChange\" | \"apiKey\" | \"endpoint\" | \"locale\" | \"labels\" | \"components\" | \"className\" | \"disabled\" | \"contrast\">) {\n return (\n <ModelSelector\n value={value}\n onValueChange={onValueChange}\n apiKey={apiKey}\n endpoint={endpoint}\n locale={locale}\n labels={labels}\n components={components}\n className={className}\n disabled={disabled}\n contrast={contrast}\n showSearch={false}\n showPricing={false}\n variant=\"compact\"\n />\n )\n}\n\n\n"]}
|
package/dist/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.orm-root{--orm-text-primary:hsl(var(--foreground));--orm-text-secondary:hsl(var(--foreground)/0.72);--orm-text-muted:hsl(var(--foreground)/0.6)}.orm-contrast-high{--orm-text-secondary:hsl(var(--foreground)/0.85);--orm-text-muted:hsl(var(--foreground)/0.75)}.orm-text-secondary{color:var(--orm-text-secondary)}.orm-model-name{color:var(--orm-text-primary)}.orm-last-updated,.orm-model-desc,.orm-no-results{color:var(--orm-text-secondary)}.orm-section-title{color:hsl(var(--foreground)/.8);letter-spacing:-.01em}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.left-2{left:.5rem}.left-\[50\%\]{left:50%}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-50{z-index:50}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.mr-1{margin-right:.25rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[400px\]{height:400px}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.max-h-96{max-height:24rem}.max-h-\[300px\]{max-height:300px}.max-h-\[500px\]{max-height:500px}.max-h-\[85vh\]{max-height:85vh}.w-10{width:2.5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-2xl{max-width:42rem}.max-w-lg{max-width:32rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/2,.translate-x-\[-50\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x:-50%}.translate-y-\[-50\%\]{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-\[repeat\(auto-fit\2c minmax\(150px\2c 1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-blue-500\/50{border-color:rgba(59,130,246,.5)}.border-green-500\/50{border-color:rgba(34,197,94,.5)}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.border-purple-500\/50{border-color:rgba(168,85,247,.5)}.border-transparent{border-color:transparent}.border-yellow-500\/50{border-color:rgba(234,179,8,.5)}.bg-background{background-color:hsl(var(--background))}.bg-black\/80{background-color:rgba(0,0,0,.8)}.bg-blue-500\/10{background-color:rgba(59,130,246,.1)}.bg-destructive{background-color:hsl(var(--destructive))}.bg-green-500\/10{background-color:rgba(34,197,94,.1)}.bg-muted\/30{background-color:hsl(var(--muted)/.3)}.bg-muted\/50{background-color:hsl(var(--muted)/.5)}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/10{background-color:hsl(var(--primary)/.1)}.bg-purple-500\/10{background-color:rgba(168,85,247,.1)}.bg-secondary{background-color:hsl(var(--secondary))}.bg-yellow-500\/10{background-color:rgba(234,179,8,.1)}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.italic{font-style:italic}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/70{color:hsl(var(--foreground)/.7)}.text-foreground\/80{color:hsl(var(--foreground)/.8)}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity,1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.\!filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.file\:border-0::file-selector-button{border-width:0}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.file\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.last\:mb-0:last-child{margin-bottom:0}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive)/.9)}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary)/.9)}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary)/.8)}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:0.25rem}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom],.data-\[side\=left\]\:-translate-x-1[data-side=left]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:-0.25rem}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:0.25rem}.data-\[side\=right\]\:translate-x-1[data-side=right],.data-\[side\=top\]\:-translate-y-1[data-side=top]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:-0.25rem}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}@media (min-width:640px){.sm\:inline{display:inline}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}}@media (min-width:768px){.md\:text-sm{font-size:.875rem;line-height:1.25rem}}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}
|
|
1
|
+
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.orm-root{--orm-background:var(--popover,var(--background,#fff));--orm-foreground:var(--popover-foreground,var(--foreground,#0f1729));--orm-border:var(--border,#e1e7ef);--orm-input:var(--input,#e1e7ef);--orm-ring:var(--ring,#5048e5);--orm-primary:var(--primary,#5048e5);--orm-primary-foreground:var(--primary-foreground,#fff);--orm-secondary:var(--secondary,#f1f5f9);--orm-secondary-foreground:var(--secondary-foreground,#0f1729);--orm-muted:var(--muted,#f1f5f9);--orm-muted-foreground:var(--muted-foreground,#65758b);--orm-accent:var(--accent,#f1f5f9);--orm-accent-foreground:var(--accent-foreground,#0f1729);--orm-destructive:var(--destructive,#dc2828);--orm-destructive-foreground:var(--destructive-foreground,#fff);--orm-radius:var(--radius,0.5rem);--orm-text-primary:var(--orm-foreground);--orm-text-secondary:var(--orm-muted-foreground)}.orm-contrast-high{--orm-text-secondary:var(--orm-foreground)}.orm-text-secondary{color:var(--orm-text-secondary)}.orm-model-name{color:var(--orm-text-primary)}.orm-last-updated,.orm-model-desc,.orm-no-results{color:var(--orm-text-secondary)}.orm-section-title{color:var(--orm-muted-foreground);letter-spacing:-.01em}.orm-root .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.orm-root .fixed{position:fixed}.orm-root .absolute{position:absolute}.orm-root .relative{position:relative}.orm-root .sticky{position:sticky}.orm-root .inset-0{inset:0}.orm-root .left-2{left:.5rem}.orm-root .left-\[50\%\]{left:50%}.orm-root .right-4{right:1rem}.orm-root .top-0{top:0}.orm-root .top-1\/2{top:50%}.orm-root .top-4{top:1rem}.orm-root .top-\[50\%\]{top:50%}.orm-root .z-50{z-index:50}.orm-root .mb-1{margin-bottom:.25rem}.orm-root .mb-2{margin-bottom:.5rem}.orm-root .mb-4{margin-bottom:1rem}.orm-root .ml-1{margin-left:.25rem}.orm-root .mr-1{margin-right:.25rem}.orm-root .mt-1{margin-top:.25rem}.orm-root .mt-2{margin-top:.5rem}.orm-root .line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.orm-root .flex{display:flex}.orm-root .inline-flex{display:inline-flex}.orm-root .grid{display:grid}.orm-root .hidden{display:none}.orm-root .h-10{height:2.5rem}.orm-root .h-11{height:2.75rem}.orm-root .h-3{height:.75rem}.orm-root .h-3\.5{height:.875rem}.orm-root .h-4{height:1rem}.orm-root .h-6{height:1.5rem}.orm-root .h-8{height:2rem}.orm-root .h-9{height:2.25rem}.orm-root .h-\[400px\]{height:400px}.orm-root .h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.orm-root .max-h-96{max-height:24rem}.orm-root .max-h-\[300px\]{max-height:300px}.orm-root .max-h-\[500px\]{max-height:500px}.orm-root .max-h-\[85vh\]{max-height:85vh}.orm-root .w-10{width:2.5rem}.orm-root .w-3{width:.75rem}.orm-root .w-3\.5{width:.875rem}.orm-root .w-4{width:1rem}.orm-root .w-8{width:2rem}.orm-root .w-full{width:100%}.orm-root .min-w-0{min-width:0}.orm-root .min-w-\[8rem\]{min-width:8rem}.orm-root .min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.orm-root .max-w-2xl{max-width:42rem}.orm-root .max-w-lg{max-width:32rem}.orm-root .flex-1{flex:1 1 0%}.orm-root .shrink-0{flex-shrink:0}.orm-root .-translate-y-1\/2{--tw-translate-y:-50%}.orm-root .-translate-y-1\/2,.orm-root .translate-x-\[-50\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.orm-root .translate-x-\[-50\%\]{--tw-translate-x:-50%}.orm-root .translate-y-\[-50\%\]{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.orm-root .animate-spin{animation:spin 1s linear infinite}.orm-root .cursor-default{cursor:default}.orm-root .cursor-pointer{cursor:pointer}.orm-root .select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.orm-root .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.orm-root .grid-cols-\[repeat\(auto-fit\2c minmax\(150px\2c 1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}.orm-root .flex-col{flex-direction:column}.orm-root .flex-wrap{flex-wrap:wrap}.orm-root .items-start{align-items:flex-start}.orm-root .items-center{align-items:center}.orm-root .justify-start{justify-content:flex-start}.orm-root .justify-center{justify-content:center}.orm-root .justify-between{justify-content:space-between}.orm-root .gap-0\.5{gap:.125rem}.orm-root .gap-1{gap:.25rem}.orm-root .gap-2{gap:.5rem}.orm-root .gap-4{gap:1rem}.orm-root :is(.space-y-1\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.orm-root :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.orm-root :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.orm-root .overflow-hidden{overflow:hidden}.orm-root .overflow-y-auto{overflow-y:auto}.orm-root .truncate{overflow:hidden;text-overflow:ellipsis}.orm-root .truncate,.orm-root .whitespace-nowrap{white-space:nowrap}.orm-root .rounded{border-radius:.25rem}.orm-root .rounded-full{border-radius:9999px}.orm-root .rounded-md{border-radius:calc(var(--radius) - 2px)}.orm-root .rounded-sm{border-radius:calc(var(--radius) - 4px)}.orm-root .border{border-width:1px}.orm-root .border-b{border-bottom-width:1px}.orm-root .border-blue-500\/50{border-color:rgba(59,130,246,.5)}.orm-root .border-green-500\/50{border-color:rgba(34,197,94,.5)}.orm-root .border-input{border-color:var(--orm-input)}.orm-root .border-primary{border-color:var(--orm-primary)}.orm-root .border-purple-500\/50{border-color:rgba(168,85,247,.5)}.orm-root .border-transparent{border-color:transparent}.orm-root .border-yellow-500\/50{border-color:rgba(234,179,8,.5)}.orm-root .bg-background{background-color:var(--orm-background)}.orm-root .bg-black\/80{background-color:rgba(0,0,0,.8)}.orm-root .bg-blue-500\/10{background-color:rgba(59,130,246,.1)}.orm-root .bg-destructive{background-color:var(--orm-destructive)}.orm-root .bg-green-500\/10{background-color:rgba(34,197,94,.1)}.orm-root .bg-popover{background-color:var(--orm-background)}.orm-root .bg-primary{background-color:var(--orm-primary)}.orm-root .bg-purple-500\/10{background-color:rgba(168,85,247,.1)}.orm-root .bg-secondary{background-color:var(--orm-secondary)}.orm-root .bg-yellow-500\/10{background-color:rgba(234,179,8,.1)}.orm-root .p-1{padding:.25rem}.orm-root .p-2{padding:.5rem}.orm-root .p-4{padding:1rem}.orm-root .p-6{padding:1.5rem}.orm-root .px-1\.5{padding-left:.375rem;padding-right:.375rem}.orm-root .px-2{padding-left:.5rem;padding-right:.5rem}.orm-root .px-3{padding-left:.75rem;padding-right:.75rem}.orm-root .px-4{padding-left:1rem;padding-right:1rem}.orm-root .px-8{padding-left:2rem;padding-right:2rem}.orm-root .py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.orm-root .py-1{padding-top:.25rem;padding-bottom:.25rem}.orm-root .py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.orm-root .py-2{padding-top:.5rem;padding-bottom:.5rem}.orm-root .pl-8{padding-left:2rem}.orm-root .pr-2{padding-right:.5rem}.orm-root .text-left{text-align:left}.orm-root .text-center{text-align:center}.orm-root .text-\[10px\]{font-size:10px}.orm-root .text-\[11px\]{font-size:11px}.orm-root .text-base{font-size:1rem;line-height:1.5rem}.orm-root .text-lg{font-size:1.125rem;line-height:1.75rem}.orm-root .text-sm{font-size:.875rem;line-height:1.25rem}.orm-root .text-xs{font-size:.75rem;line-height:1rem}.orm-root .font-medium{font-weight:500}.orm-root .font-semibold{font-weight:600}.orm-root .italic{font-style:italic}.orm-root .leading-none{line-height:1}.orm-root .tracking-tight{letter-spacing:-.025em}.orm-root .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.orm-root .text-destructive{color:var(--orm-destructive)}.orm-root .text-destructive-foreground{color:var(--orm-destructive-foreground)}.orm-root .text-foreground{color:var(--orm-foreground)}.orm-root .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.orm-root .text-muted-foreground{color:var(--orm-muted-foreground)}.orm-root .text-popover-foreground{color:var(--orm-foreground)}.orm-root .text-primary{color:var(--orm-primary)}.orm-root .text-primary-foreground{color:var(--orm-primary-foreground)}.orm-root .text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity,1))}.orm-root .text-secondary-foreground{color:var(--orm-secondary-foreground)}.orm-root .text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.orm-root .underline-offset-4{text-underline-offset:4px}.orm-root .opacity-50{opacity:.5}.orm-root .opacity-70{opacity:.7}.orm-root .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.orm-root .shadow-lg,.orm-root .shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.orm-root .shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.orm-root .outline-none{outline:2px solid transparent;outline-offset:2px}.orm-root .outline{outline-style:solid}.orm-root .ring-offset-background{--tw-ring-offset-color:var(--orm-background)}.orm-root .\!filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.orm-root .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.orm-root .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.orm-root .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.orm-root .duration-200{transition-duration:.2s}.orm-root .file\:border-0::file-selector-button{border-width:0}.orm-root .file\:bg-transparent::file-selector-button{background-color:transparent}.orm-root .file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.orm-root .file\:font-medium::file-selector-button{font-weight:500}.orm-root .file\:text-foreground::file-selector-button{color:var(--orm-foreground)}.orm-root .placeholder\:text-muted-foreground::-moz-placeholder{color:var(--orm-muted-foreground)}.orm-root .placeholder\:text-muted-foreground::placeholder{color:var(--orm-muted-foreground)}.orm-root .last\:mb-0:last-child{margin-bottom:0}.orm-root .hover\:bg-accent:hover{background-color:var(--orm-accent)}.orm-root .hover\:bg-muted:hover{background-color:var(--orm-muted)}.orm-root .hover\:text-accent-foreground:hover{color:var(--orm-accent-foreground)}.orm-root .hover\:text-foreground:hover{color:var(--orm-foreground)}.orm-root .hover\:underline:hover{text-decoration-line:underline}.orm-root .hover\:opacity-100:hover{opacity:1}.orm-root .focus\:bg-accent:focus{background-color:var(--orm-accent)}.orm-root .focus\:text-accent-foreground:focus{color:var(--orm-accent-foreground)}.orm-root .focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.orm-root .focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.orm-root .focus\:ring-ring:focus{--tw-ring-color:var(--orm-ring)}.orm-root .focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.orm-root .focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.orm-root .focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.orm-root .focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--orm-ring)}.orm-root .focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.orm-root .disabled\:pointer-events-none:disabled{pointer-events:none}.orm-root .disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.orm-root .disabled\:opacity-50:disabled{opacity:.5}.orm-root .data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.orm-root .data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:0.25rem}.orm-root .data-\[side\=bottom\]\:translate-y-1[data-side=bottom],.orm-root .data-\[side\=left\]\:-translate-x-1[data-side=left]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.orm-root .data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:-0.25rem}.orm-root .data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:0.25rem}.orm-root .data-\[side\=right\]\:translate-x-1[data-side=right],.orm-root .data-\[side\=top\]\:-translate-y-1[data-side=top]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.orm-root .data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:-0.25rem}.orm-root .data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--orm-accent)}.orm-root .data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--orm-muted-foreground)}.orm-root .data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}@media (min-width:640px){.orm-root .sm\:inline{display:inline}.orm-root .sm\:rounded-lg{border-radius:var(--radius)}.orm-root .sm\:text-left{text-align:left}}@media (min-width:768px){.orm-root .md\:text-sm{font-size:.875rem;line-height:1.25rem}}.orm-root :is(.\[\&\>span\]\:line-clamp-1>span){overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.orm-root :is(.\[\&_svg\]\:pointer-events-none svg){pointer-events:none}.orm-root :is(.\[\&_svg\]\:size-4 svg){width:1rem;height:1rem}.orm-root :is(.\[\&_svg\]\:shrink-0 svg){flex-shrink:0}
|