@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 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__ */ jsxs(DialogPortal, { children: [
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("space-y-4 orm-root", contrastClass), children: /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
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__ */ jsxs("div", { className: cn("space-y-2 orm-root", contrastClass, className), children: [
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-root", contrastClass, "orm-dialog"), children: [
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__ */ jsxs("div", { className: cn("space-y-2 orm-root", contrastClass, className), children: [
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(SelectContent2, { className: cn("max-h-[500px] min-w-[var(--radix-select-trigger-width)] w-full orm-root", contrastClass, "orm-select-content"), children: [
628
- /* @__PURE__ */ jsxs("div", { className: "p-2 border-b space-y-2", children: [
629
- /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-2", children: [
630
- /* @__PURE__ */ jsx("div", { className: "grid w-full gap-1 grid-cols-[repeat(auto-fit,minmax(150px,1fr))]", children: recommendedModels.map((model) => /* @__PURE__ */ jsxs(
631
- Button2,
632
- {
633
- size: "sm",
634
- variant: value === model.id ? "default" : "outline",
635
- className: "h-8 px-2 text-xs justify-start",
636
- onClick: (e) => {
637
- e.stopPropagation();
638
- onValueChange(model.id);
639
- },
640
- children: [
641
- /* @__PURE__ */ jsx(Sparkles, { className: "h-3 w-3 mr-1" }),
642
- /* @__PURE__ */ jsx("span", { className: "truncate", children: model.name })
643
- ]
644
- },
645
- model.id
646
- )) }),
647
- /* @__PURE__ */ jsx(
648
- Button2,
649
- {
650
- size: "icon",
651
- variant: "ghost",
652
- className: "h-8 w-8",
653
- onClick: (e) => {
654
- e.stopPropagation();
655
- handleRefresh();
656
- },
657
- title: labels.refreshTitle,
658
- children: isRefreshing ? /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ jsx(Sparkles, { className: "h-4 w-4" })
659
- }
660
- )
661
- ] }),
662
- lastUpdated && /* @__PURE__ */ jsxs("div", { className: "text-[11px] text-foreground/70 orm-text-secondary orm-last-updated", children: [
663
- labels.lastUpdatedPrefix,
664
- " ",
665
- new Date(lastUpdated).toLocaleTimeString(locale === "fr" ? "fr-FR" : "en-US")
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: "flex items-center gap-2 text-xs text-foreground/70 orm-text-secondary orm-model-desc", children: [
752
- /* @__PURE__ */ jsx("span", { children: formatContextLength(model.context_length) }),
753
- showPricing && /* @__PURE__ */ jsxs(Fragment, { children: [
754
- /* @__PURE__ */ jsx("span", { children: "\u2022" }),
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
- ] }) }, model.id);
759
- })
760
- ] }, category.name)) })
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}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cappasoft/openrouter-model-selector",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "React UI component for selecting OpenRouter models",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",