dirk-cfx-react 1.1.81 → 1.1.83

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.
@@ -1054,4 +1054,42 @@ type AnimPostFxSelectProps = Omit<SelectProps, "data" | "value" | "onChange"> &
1054
1054
  };
1055
1055
  declare function AnimPostFxSelect({ value, onChange, label, size, searchable, clearable, ...rest }: AnimPostFxSelectProps): react_jsx_runtime.JSX.Element;
1056
1056
 
1057
- export { AdminPageTitle, type AdminPageTitleProps, AnimPostFxSelect, type AnimPostFxSelectProps, AsyncSaveButton, BlipColorSelect, type BlipColorSelectProps, BlipDisplaySelect, type BlipDisplaySelectProps, BlipIconSelect, type BlipIconSelectProps, BorderedIcon, type BorderedIconProps, type ButtonProps, ConfigPanel, type ConfigPanelProps, ConfirmModal, type ConfirmModalProps, ControlMultiSelect, type ControlMultiSelectProps, ControlSelect, type ControlSelectProps, Counter, type FiveMControls, FiveMKeyBindInput, FloatingParticles, type FloatingParticlesProps, GroupName, type GroupNameProps, GroupRank, type GroupRankProps, GroupSelect, type GroupSelectProps, type GroupType, type GroupValue, InfoBox, type InfoBoxProps, InputContainer, type InputContainerProps, LevelBanner, LevelPanel, MissingItemsBanner, Modal, ModalContext, type ModalProps, ModalProvider, MotionFlex, MotionIcon, MotionImage, MotionText, NavBar, type NavItem, NavigationContext, NavigationProvider, type NavigationStore, type ParticleState, PositionPicker, type PositionPickerProps, type ProgressProps, type Prompt, type PromptButton, PromptModal, type SegmentProps, SegmentedControl, type SegmentedControlProps, SegmentedProgress, SelectItem, type SelectItemProps, type StoreModalProps, SwitchPanel, type SwitchPanelProps, TestBed, type TestBedItem, type TestBedPlacement, type TestBedProps, ThemeOverrideSection, type ThemeOverrideSectionProps, type ThemeOverrideValue, Title, type TitleProps, type TitleSize, Vector4DeleteButton, Vector4Display, type Vector4Value, WorldPositionGotoButton, WorldPositionSetButton, useMissingItemsAudit, useModal, useModalActions, useNavigation, useNavigationStore };
1057
+ type ScenarioSelectProps = Omit<SelectProps, "data" | "value" | "onChange"> & {
1058
+ /** Current scenario name. Empty string = no scenario selected. */
1059
+ value: string;
1060
+ onChange: (name: string) => void;
1061
+ };
1062
+ declare function ScenarioSelect({ value, onChange, label, size, searchable, clearable, ...rest }: ScenarioSelectProps): react_jsx_runtime.JSX.Element;
1063
+
1064
+ type DiscordRole = {
1065
+ id: string;
1066
+ name: string;
1067
+ color: number;
1068
+ position?: number;
1069
+ };
1070
+ type SharedProps = {
1071
+ /** NUI callback name registered by the consumer that returns ListResponse. */
1072
+ endpoint: string;
1073
+ /** Optional label / size / placeholder forwarded to the underlying Mantine Select. */
1074
+ label?: React.ReactNode;
1075
+ size?: SelectProps["size"];
1076
+ placeholder?: string;
1077
+ disabled?: boolean;
1078
+ /** Style props applied to the wrapping Select/MultiSelect. */
1079
+ style?: React.CSSProperties;
1080
+ styles?: SelectProps["styles"];
1081
+ };
1082
+ type SingleProps = SharedProps & {
1083
+ multi?: false;
1084
+ value: string | null;
1085
+ onChange: (id: string | null) => void;
1086
+ };
1087
+ type MultiProps = SharedProps & {
1088
+ multi: true;
1089
+ value: string[];
1090
+ onChange: (ids: string[]) => void;
1091
+ };
1092
+ type DiscordRoleSelectProps = SingleProps | MultiProps;
1093
+ declare function DiscordRoleSelect(props: DiscordRoleSelectProps): react_jsx_runtime.JSX.Element;
1094
+
1095
+ export { AdminPageTitle, type AdminPageTitleProps, AnimPostFxSelect, type AnimPostFxSelectProps, AsyncSaveButton, BlipColorSelect, type BlipColorSelectProps, BlipDisplaySelect, type BlipDisplaySelectProps, BlipIconSelect, type BlipIconSelectProps, BorderedIcon, type BorderedIconProps, type ButtonProps, ConfigPanel, type ConfigPanelProps, ConfirmModal, type ConfirmModalProps, ControlMultiSelect, type ControlMultiSelectProps, ControlSelect, type ControlSelectProps, Counter, type DiscordRole, DiscordRoleSelect, type DiscordRoleSelectProps, type FiveMControls, FiveMKeyBindInput, FloatingParticles, type FloatingParticlesProps, GroupName, type GroupNameProps, GroupRank, type GroupRankProps, GroupSelect, type GroupSelectProps, type GroupType, type GroupValue, InfoBox, type InfoBoxProps, InputContainer, type InputContainerProps, LevelBanner, LevelPanel, MissingItemsBanner, Modal, ModalContext, type ModalProps, ModalProvider, MotionFlex, MotionIcon, MotionImage, MotionText, NavBar, type NavItem, NavigationContext, NavigationProvider, type NavigationStore, type ParticleState, PositionPicker, type PositionPickerProps, type ProgressProps, type Prompt, type PromptButton, PromptModal, ScenarioSelect, type ScenarioSelectProps, type SegmentProps, SegmentedControl, type SegmentedControlProps, SegmentedProgress, SelectItem, type SelectItemProps, type StoreModalProps, SwitchPanel, type SwitchPanelProps, TestBed, type TestBedItem, type TestBedPlacement, type TestBedProps, ThemeOverrideSection, type ThemeOverrideSectionProps, type ThemeOverrideValue, Title, type TitleProps, type TitleSize, Vector4DeleteButton, Vector4Display, type Vector4Value, WorldPositionGotoButton, WorldPositionSetButton, useMissingItemsAudit, useModal, useModalActions, useNavigation, useNavigationStore };
@@ -1054,4 +1054,42 @@ type AnimPostFxSelectProps = Omit<SelectProps, "data" | "value" | "onChange"> &
1054
1054
  };
1055
1055
  declare function AnimPostFxSelect({ value, onChange, label, size, searchable, clearable, ...rest }: AnimPostFxSelectProps): react_jsx_runtime.JSX.Element;
1056
1056
 
1057
- export { AdminPageTitle, type AdminPageTitleProps, AnimPostFxSelect, type AnimPostFxSelectProps, AsyncSaveButton, BlipColorSelect, type BlipColorSelectProps, BlipDisplaySelect, type BlipDisplaySelectProps, BlipIconSelect, type BlipIconSelectProps, BorderedIcon, type BorderedIconProps, type ButtonProps, ConfigPanel, type ConfigPanelProps, ConfirmModal, type ConfirmModalProps, ControlMultiSelect, type ControlMultiSelectProps, ControlSelect, type ControlSelectProps, Counter, type FiveMControls, FiveMKeyBindInput, FloatingParticles, type FloatingParticlesProps, GroupName, type GroupNameProps, GroupRank, type GroupRankProps, GroupSelect, type GroupSelectProps, type GroupType, type GroupValue, InfoBox, type InfoBoxProps, InputContainer, type InputContainerProps, LevelBanner, LevelPanel, MissingItemsBanner, Modal, ModalContext, type ModalProps, ModalProvider, MotionFlex, MotionIcon, MotionImage, MotionText, NavBar, type NavItem, NavigationContext, NavigationProvider, type NavigationStore, type ParticleState, PositionPicker, type PositionPickerProps, type ProgressProps, type Prompt, type PromptButton, PromptModal, type SegmentProps, SegmentedControl, type SegmentedControlProps, SegmentedProgress, SelectItem, type SelectItemProps, type StoreModalProps, SwitchPanel, type SwitchPanelProps, TestBed, type TestBedItem, type TestBedPlacement, type TestBedProps, ThemeOverrideSection, type ThemeOverrideSectionProps, type ThemeOverrideValue, Title, type TitleProps, type TitleSize, Vector4DeleteButton, Vector4Display, type Vector4Value, WorldPositionGotoButton, WorldPositionSetButton, useMissingItemsAudit, useModal, useModalActions, useNavigation, useNavigationStore };
1057
+ type ScenarioSelectProps = Omit<SelectProps, "data" | "value" | "onChange"> & {
1058
+ /** Current scenario name. Empty string = no scenario selected. */
1059
+ value: string;
1060
+ onChange: (name: string) => void;
1061
+ };
1062
+ declare function ScenarioSelect({ value, onChange, label, size, searchable, clearable, ...rest }: ScenarioSelectProps): react_jsx_runtime.JSX.Element;
1063
+
1064
+ type DiscordRole = {
1065
+ id: string;
1066
+ name: string;
1067
+ color: number;
1068
+ position?: number;
1069
+ };
1070
+ type SharedProps = {
1071
+ /** NUI callback name registered by the consumer that returns ListResponse. */
1072
+ endpoint: string;
1073
+ /** Optional label / size / placeholder forwarded to the underlying Mantine Select. */
1074
+ label?: React.ReactNode;
1075
+ size?: SelectProps["size"];
1076
+ placeholder?: string;
1077
+ disabled?: boolean;
1078
+ /** Style props applied to the wrapping Select/MultiSelect. */
1079
+ style?: React.CSSProperties;
1080
+ styles?: SelectProps["styles"];
1081
+ };
1082
+ type SingleProps = SharedProps & {
1083
+ multi?: false;
1084
+ value: string | null;
1085
+ onChange: (id: string | null) => void;
1086
+ };
1087
+ type MultiProps = SharedProps & {
1088
+ multi: true;
1089
+ value: string[];
1090
+ onChange: (ids: string[]) => void;
1091
+ };
1092
+ type DiscordRoleSelectProps = SingleProps | MultiProps;
1093
+ declare function DiscordRoleSelect(props: DiscordRoleSelectProps): react_jsx_runtime.JSX.Element;
1094
+
1095
+ export { AdminPageTitle, type AdminPageTitleProps, AnimPostFxSelect, type AnimPostFxSelectProps, AsyncSaveButton, BlipColorSelect, type BlipColorSelectProps, BlipDisplaySelect, type BlipDisplaySelectProps, BlipIconSelect, type BlipIconSelectProps, BorderedIcon, type BorderedIconProps, type ButtonProps, ConfigPanel, type ConfigPanelProps, ConfirmModal, type ConfirmModalProps, ControlMultiSelect, type ControlMultiSelectProps, ControlSelect, type ControlSelectProps, Counter, type DiscordRole, DiscordRoleSelect, type DiscordRoleSelectProps, type FiveMControls, FiveMKeyBindInput, FloatingParticles, type FloatingParticlesProps, GroupName, type GroupNameProps, GroupRank, type GroupRankProps, GroupSelect, type GroupSelectProps, type GroupType, type GroupValue, InfoBox, type InfoBoxProps, InputContainer, type InputContainerProps, LevelBanner, LevelPanel, MissingItemsBanner, Modal, ModalContext, type ModalProps, ModalProvider, MotionFlex, MotionIcon, MotionImage, MotionText, NavBar, type NavItem, NavigationContext, NavigationProvider, type NavigationStore, type ParticleState, PositionPicker, type PositionPickerProps, type ProgressProps, type Prompt, type PromptButton, PromptModal, ScenarioSelect, type ScenarioSelectProps, type SegmentProps, SegmentedControl, type SegmentedControlProps, SegmentedProgress, SelectItem, type SelectItemProps, type StoreModalProps, SwitchPanel, type SwitchPanelProps, TestBed, type TestBedItem, type TestBedPlacement, type TestBedProps, ThemeOverrideSection, type ThemeOverrideSectionProps, type ThemeOverrideValue, Title, type TitleProps, type TitleSize, Vector4DeleteButton, Vector4Display, type Vector4Value, WorldPositionGotoButton, WorldPositionSetButton, useMissingItemsAudit, useModal, useModalActions, useNavigation, useNavigationStore };
@@ -4,7 +4,7 @@ import { createContext, useContext, useRef, useState, useEffect, useCallback, us
4
4
  import { create, useStore, createStore } from 'zustand';
5
5
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
6
6
  import { motion, AnimatePresence, useMotionValue } from 'framer-motion';
7
- import { Info, X, AlertTriangle, Trash2, RefreshCw, ChevronDown, Check, Copy, MapPin, Crosshair, EyeOff, Eye, RotateCcw, FlaskConical, ChevronUp, Palette, ArrowLeft, Undo2, Redo2, Save, History, XCircle, Code2, Search, Filter, User } from 'lucide-react';
7
+ import { Info, X, AlertTriangle, Trash2, RefreshCw, ChevronDown, Check, Copy, MapPin, Crosshair, EyeOff, Eye, RotateCcw, FlaskConical, ChevronUp, Palette, ArrowLeft, Undo2, Redo2, Save, History, XCircle, Code2, ExternalLink, Search, Filter, User } from 'lucide-react';
8
8
  import clickSoundUrl from '../click_sound-PNCRRTM4.mp3';
9
9
  import hoverSoundUrl from '../hover_sound-NBUA222C.mp3';
10
10
  import { notifications } from '@mantine/notifications';
@@ -5849,6 +5849,503 @@ function AnimPostFxSelect({
5849
5849
  );
5850
5850
  }
5851
5851
 
5852
- export { AdminPageTitle, AnimPostFxSelect, AsyncSaveButton, BlipColorSelect, BlipDisplaySelect, BlipIconSelect, BorderedIcon, ConfigPanel, ConfirmModal, ControlMultiSelect, ControlSelect, Counter, FiveMKeyBindInput, FloatingParticles, GroupName, GroupRank, GroupSelect, InfoBox, InputContainer, LevelBanner, LevelPanel, MissingItemsBanner, Modal, ModalContext, ModalProvider, MotionFlex, MotionIcon, MotionImage, MotionText, NavBar, NavigationContext, NavigationProvider, PositionPicker, PromptModal, SegmentedControl, SegmentedProgress, SelectItem, SwitchPanel, TestBed, ThemeOverrideSection, Title, Vector4DeleteButton, Vector4Display, WorldPositionGotoButton, WorldPositionSetButton, useMissingItemsAudit, useModal, useModalActions, useNavigation, useNavigationStore };
5852
+ // src/utils/gtaScenarios.ts
5853
+ var GTA_SCENARIO_GROUP_ORDER = [
5854
+ "Sitting",
5855
+ "Standing & Idle",
5856
+ "Eating & Drinking",
5857
+ "Smoking & Substances",
5858
+ "Working",
5859
+ "Sports & Fitness",
5860
+ "Cops & Security",
5861
+ "Crime & Streets",
5862
+ "Tourists & Crowds",
5863
+ "Props (Misc)",
5864
+ "Movement",
5865
+ "Animals",
5866
+ "Vehicles",
5867
+ "Code (Advanced)"
5868
+ ];
5869
+ var GTA_SCENARIOS = [
5870
+ // ── Sitting ────────────────────────────────────────────────────────────────
5871
+ { name: "PROP_HUMAN_SEAT_ARMCHAIR", group: "Sitting" },
5872
+ { name: "PROP_HUMAN_SEAT_BAR", group: "Sitting" },
5873
+ { name: "PROP_HUMAN_SEAT_BENCH", group: "Sitting" },
5874
+ { name: "PROP_HUMAN_SEAT_BENCH_FACILITY", group: "Sitting" },
5875
+ { name: "PROP_HUMAN_SEAT_BENCH_DRINK", group: "Sitting" },
5876
+ { name: "PROP_HUMAN_SEAT_BENCH_DRINK_FACILITY", group: "Sitting" },
5877
+ { name: "PROP_HUMAN_SEAT_BENCH_DRINK_BEER", group: "Sitting" },
5878
+ { name: "PROP_HUMAN_SEAT_BENCH_FOOD", group: "Sitting" },
5879
+ { name: "PROP_HUMAN_SEAT_BENCH_FOOD_FACILITY", group: "Sitting" },
5880
+ { name: "PROP_HUMAN_SEAT_BUS_STOP_WAIT", group: "Sitting" },
5881
+ { name: "PROP_HUMAN_SEAT_CHAIR", group: "Sitting" },
5882
+ { name: "PROP_HUMAN_SEAT_CHAIR_DRINK", group: "Sitting" },
5883
+ { name: "PROP_HUMAN_SEAT_CHAIR_DRINK_BEER", group: "Sitting" },
5884
+ { name: "PROP_HUMAN_SEAT_CHAIR_FOOD", group: "Sitting" },
5885
+ { name: "PROP_HUMAN_SEAT_CHAIR_UPRIGHT", group: "Sitting" },
5886
+ { name: "PROP_HUMAN_SEAT_CHAIR_UPRIGHT_SHOWROOM", group: "Sitting" },
5887
+ { name: "PROP_HUMAN_SEAT_CHAIR_MP_PLAYER", group: "Sitting" },
5888
+ { name: "PROP_HUMAN_SEAT_COMPUTER", group: "Sitting" },
5889
+ { name: "PROP_HUMAN_SEAT_COMPUTER_LOW", group: "Sitting" },
5890
+ { name: "PROP_HUMAN_SEAT_DECKCHAIR", group: "Sitting" },
5891
+ { name: "PROP_HUMAN_SEAT_DECKCHAIR_DRINK", group: "Sitting" },
5892
+ { name: "PROP_HUMAN_SEAT_SEWING", group: "Sitting" },
5893
+ { name: "PROP_HUMAN_SEAT_STRIP_WATCH", group: "Sitting" },
5894
+ { name: "PROP_HUMAN_SEAT_SUNLOUNGER", group: "Sitting" },
5895
+ { name: "WORLD_HUMAN_SEAT_LEDGE", group: "Sitting" },
5896
+ { name: "WORLD_HUMAN_SEAT_LEDGE_EATING", group: "Sitting" },
5897
+ { name: "WORLD_HUMAN_SEAT_STEPS", group: "Sitting" },
5898
+ { name: "WORLD_HUMAN_SEAT_WALL", group: "Sitting" },
5899
+ { name: "WORLD_HUMAN_SEAT_WALL_EATING", group: "Sitting" },
5900
+ { name: "WORLD_HUMAN_SEAT_WALL_TABLET", group: "Sitting" },
5901
+ // ── Standing & Idle ────────────────────────────────────────────────────────
5902
+ { name: "Standing", group: "Standing & Idle" },
5903
+ { name: "WORLD_HUMAN_HANG_OUT_STREET", group: "Standing & Idle" },
5904
+ { name: "WORLD_HUMAN_HANG_OUT_STREET_CLUBHOUSE", group: "Standing & Idle" },
5905
+ { name: "WORLD_HUMAN_LEANING", group: "Standing & Idle" },
5906
+ { name: "WORLD_HUMAN_LEANING_CASINO_TERRACE", group: "Standing & Idle" },
5907
+ { name: "WORLD_HUMAN_STAND_IMPATIENT", group: "Standing & Idle" },
5908
+ { name: "WORLD_HUMAN_STAND_IMPATIENT_CLUBHOUSE", group: "Standing & Idle" },
5909
+ { name: "WORLD_HUMAN_STAND_IMPATIENT_FACILITY", group: "Standing & Idle" },
5910
+ { name: "WORLD_HUMAN_STAND_IMPATIENT_UPRIGHT", group: "Standing & Idle" },
5911
+ { name: "WORLD_HUMAN_STAND_IMPATIENT_UPRIGHT_FACILITY", group: "Standing & Idle" },
5912
+ { name: "WORLD_HUMAN_STAND_MOBILE", group: "Standing & Idle" },
5913
+ { name: "WORLD_HUMAN_STAND_MOBILE_CLUBHOUSE", group: "Standing & Idle" },
5914
+ { name: "WORLD_HUMAN_STAND_MOBILE_FACILITY", group: "Standing & Idle" },
5915
+ { name: "WORLD_HUMAN_STAND_MOBILE_UPRIGHT", group: "Standing & Idle" },
5916
+ { name: "WORLD_HUMAN_STAND_MOBILE_UPRIGHT_CLUBHOUSE", group: "Standing & Idle" },
5917
+ { name: "WORLD_HUMAN_STAND_FIRE", group: "Standing & Idle" },
5918
+ { name: "WORLD_HUMAN_STAND_FISHING", group: "Standing & Idle" },
5919
+ { name: "PROP_HUMAN_STAND_IMPATIENT", group: "Standing & Idle" },
5920
+ // ── Eating & Drinking ──────────────────────────────────────────────────────
5921
+ { name: "WORLD_HUMAN_DRINKING", group: "Eating & Drinking" },
5922
+ { name: "WORLD_HUMAN_DRINKING_FACILITY", group: "Eating & Drinking" },
5923
+ { name: "WORLD_HUMAN_DRINKING_CASINO_TERRACE", group: "Eating & Drinking" },
5924
+ { name: "WORLD_HUMAN_PICNIC", group: "Eating & Drinking" },
5925
+ // ── Smoking & Substances ───────────────────────────────────────────────────
5926
+ { name: "WORLD_HUMAN_AA_COFFEE", group: "Smoking & Substances" },
5927
+ { name: "WORLD_HUMAN_AA_SMOKE", group: "Smoking & Substances" },
5928
+ { name: "WORLD_HUMAN_SMOKING", group: "Smoking & Substances" },
5929
+ { name: "WORLD_HUMAN_SMOKING_CLUBHOUSE", group: "Smoking & Substances" },
5930
+ { name: "WORLD_HUMAN_SMOKING_POT", group: "Smoking & Substances" },
5931
+ { name: "WORLD_HUMAN_SMOKING_POT_CLUBHOUSE", group: "Smoking & Substances" },
5932
+ { name: "WORLD_HUMAN_STUPOR", group: "Smoking & Substances" },
5933
+ { name: "WORLD_HUMAN_STUPOR_CLUBHOUSE", group: "Smoking & Substances" },
5934
+ // ── Working ────────────────────────────────────────────────────────────────
5935
+ { name: "WORLD_HUMAN_CAR_PARK_ATTENDANT", group: "Working" },
5936
+ { name: "WORLD_HUMAN_CLIPBOARD", group: "Working" },
5937
+ { name: "WORLD_HUMAN_CLIPBOARD_FACILITY", group: "Working" },
5938
+ { name: "WORLD_HUMAN_CONST_DRILL", group: "Working" },
5939
+ { name: "WORLD_HUMAN_GARDENER_LEAF_BLOWER", group: "Working" },
5940
+ { name: "WORLD_HUMAN_GARDENER_PLANT", group: "Working" },
5941
+ { name: "WORLD_HUMAN_HAMMERING", group: "Working" },
5942
+ { name: "WORLD_HUMAN_JANITOR", group: "Working" },
5943
+ { name: "WORLD_HUMAN_MAID_CLEAN", group: "Working" },
5944
+ { name: "WORLD_HUMAN_MUSICIAN", group: "Working" },
5945
+ { name: "WORLD_HUMAN_VALET", group: "Working" },
5946
+ { name: "WORLD_HUMAN_VEHICLE_MECHANIC", group: "Working" },
5947
+ { name: "WORLD_HUMAN_WELDING", group: "Working" },
5948
+ // ── Sports & Fitness ───────────────────────────────────────────────────────
5949
+ { name: "WORLD_HUMAN_GOLF_PLAYER", group: "Sports & Fitness" },
5950
+ { name: "WORLD_HUMAN_HIKER", group: "Sports & Fitness" },
5951
+ { name: "WORLD_HUMAN_HIKER_STANDING", group: "Sports & Fitness" },
5952
+ { name: "WORLD_HUMAN_JOG", group: "Sports & Fitness" },
5953
+ { name: "WORLD_HUMAN_JOG_STANDING", group: "Sports & Fitness" },
5954
+ { name: "WORLD_HUMAN_MUSCLE_FLEX", group: "Sports & Fitness" },
5955
+ { name: "WORLD_HUMAN_MUSCLE_FREE_WEIGHTS", group: "Sports & Fitness" },
5956
+ { name: "WORLD_HUMAN_POWER_WALKER", group: "Sports & Fitness" },
5957
+ { name: "WORLD_HUMAN_PUSH_UPS", group: "Sports & Fitness" },
5958
+ { name: "WORLD_HUMAN_SIT_UPS", group: "Sports & Fitness" },
5959
+ { name: "WORLD_HUMAN_SUNBATHE", group: "Sports & Fitness" },
5960
+ { name: "WORLD_HUMAN_SUNBATHE_BACK", group: "Sports & Fitness" },
5961
+ { name: "WORLD_HUMAN_SWIMMING", group: "Sports & Fitness" },
5962
+ { name: "WORLD_HUMAN_TENNIS_PLAYER", group: "Sports & Fitness" },
5963
+ { name: "WORLD_HUMAN_YOGA", group: "Sports & Fitness" },
5964
+ { name: "PROP_HUMAN_MUSCLE_CHIN_UPS", group: "Sports & Fitness" },
5965
+ { name: "PROP_HUMAN_MUSCLE_CHIN_UPS_ARMY", group: "Sports & Fitness" },
5966
+ { name: "PROP_HUMAN_MUSCLE_CHIN_UPS_PRISON", group: "Sports & Fitness" },
5967
+ { name: "PROP_HUMAN_SEAT_MUSCLE_BENCH_PRESS", group: "Sports & Fitness" },
5968
+ { name: "PROP_HUMAN_SEAT_MUSCLE_BENCH_PRESS_PRISON", group: "Sports & Fitness" },
5969
+ // ── Cops & Security ────────────────────────────────────────────────────────
5970
+ { name: "WORLD_HUMAN_COP_IDLES", group: "Cops & Security" },
5971
+ { name: "WORLD_HUMAN_GUARD_PATROL", group: "Cops & Security" },
5972
+ { name: "WORLD_HUMAN_GUARD_STAND", group: "Cops & Security" },
5973
+ { name: "WORLD_HUMAN_GUARD_STAND_CASINO", group: "Cops & Security" },
5974
+ { name: "WORLD_HUMAN_GUARD_STAND_CLUBHOUSE", group: "Cops & Security" },
5975
+ { name: "WORLD_HUMAN_GUARD_STAND_FACILITY", group: "Cops & Security" },
5976
+ { name: "WORLD_HUMAN_GUARD_STAND_ARMY", group: "Cops & Security" },
5977
+ { name: "WORLD_HUMAN_SECURITY_SHINE_TORCH", group: "Cops & Security" },
5978
+ // ── Crime & Streets ────────────────────────────────────────────────────────
5979
+ { name: "WORLD_HUMAN_DRUG_DEALER", group: "Crime & Streets" },
5980
+ { name: "WORLD_HUMAN_DRUG_DEALER_HARD", group: "Crime & Streets" },
5981
+ { name: "WORLD_HUMAN_DRUG_FIELD_WORKERS_RAKE", group: "Crime & Streets" },
5982
+ { name: "WORLD_HUMAN_DRUG_FIELD_WORKERS_WEEDING", group: "Crime & Streets" },
5983
+ { name: "WORLD_HUMAN_DRUG_PROCESSORS_COKE", group: "Crime & Streets" },
5984
+ { name: "WORLD_HUMAN_DRUG_PROCESSORS_WEED", group: "Crime & Streets" },
5985
+ { name: "WORLD_HUMAN_PROSTITUTE_HIGH_CLASS", group: "Crime & Streets" },
5986
+ { name: "WORLD_HUMAN_PROSTITUTE_LOW_CLASS", group: "Crime & Streets" },
5987
+ { name: "WORLD_HUMAN_BUM_FREEWAY", group: "Crime & Streets" },
5988
+ { name: "WORLD_HUMAN_BUM_SLUMPED", group: "Crime & Streets" },
5989
+ { name: "WORLD_HUMAN_BUM_STANDING", group: "Crime & Streets" },
5990
+ { name: "WORLD_HUMAN_BUM_WASH", group: "Crime & Streets" },
5991
+ { name: "PROP_HUMAN_BUM_BIN", group: "Crime & Streets" },
5992
+ { name: "PROP_HUMAN_BUM_SHOPPING_CART", group: "Crime & Streets" },
5993
+ // ── Tourists & Crowds ──────────────────────────────────────────────────────
5994
+ { name: "WORLD_HUMAN_BINOCULARS", group: "Tourists & Crowds" },
5995
+ { name: "WORLD_HUMAN_CHEERING", group: "Tourists & Crowds" },
5996
+ { name: "WORLD_HUMAN_HUMAN_STATUE", group: "Tourists & Crowds" },
5997
+ { name: "WORLD_HUMAN_INSPECT_CROUCH", group: "Tourists & Crowds" },
5998
+ { name: "WORLD_HUMAN_INSPECT_STAND", group: "Tourists & Crowds" },
5999
+ { name: "WORLD_HUMAN_MOBILE_FILM_SHOCKING", group: "Tourists & Crowds" },
6000
+ { name: "WORLD_HUMAN_PAPARAZZI", group: "Tourists & Crowds" },
6001
+ { name: "WORLD_HUMAN_PARTYING", group: "Tourists & Crowds" },
6002
+ { name: "WORLD_HUMAN_STRIP_WATCH_STAND", group: "Tourists & Crowds" },
6003
+ { name: "WORLD_HUMAN_SUPERHERO", group: "Tourists & Crowds" },
6004
+ { name: "WORLD_HUMAN_TOURIST_MAP", group: "Tourists & Crowds" },
6005
+ { name: "WORLD_HUMAN_TOURIST_MOBILE", group: "Tourists & Crowds" },
6006
+ { name: "WORLD_HUMAN_WINDOW_SHOP_BROWSE", group: "Tourists & Crowds" },
6007
+ { name: "WORLD_HUMAN_WINDOW_SHOP_BROWSE_SHOWROOM", group: "Tourists & Crowds" },
6008
+ // ── Props (Misc) ───────────────────────────────────────────────────────────
6009
+ { name: "PROP_HUMAN_ATM", group: "Props (Misc)" },
6010
+ { name: "PROP_HUMAN_BBQ", group: "Props (Misc)" },
6011
+ { name: "PROP_HUMAN_PARKING_METER", group: "Props (Misc)" },
6012
+ { name: "PROP_HUMAN_MOVIE_BULB", group: "Props (Misc)" },
6013
+ { name: "PROP_HUMAN_MOVIE_STUDIO_LIGHT", group: "Props (Misc)" },
6014
+ { name: "PROP_BIRD_IN_TREE", group: "Props (Misc)" },
6015
+ { name: "PROP_BIRD_TELEGRAPH_POLE", group: "Props (Misc)" },
6016
+ // ── Movement ───────────────────────────────────────────────────────────────
6017
+ { name: "Walk", group: "Movement" },
6018
+ { name: "Walk_Facility", group: "Movement" },
6019
+ // ── Animals ────────────────────────────────────────────────────────────────
6020
+ { name: "WORLD_BOAR_GRAZING", group: "Animals" },
6021
+ { name: "WORLD_CAT_SLEEPING_GROUND", group: "Animals" },
6022
+ { name: "WORLD_CAT_SLEEPING_LEDGE", group: "Animals" },
6023
+ { name: "WORLD_COW_GRAZING", group: "Animals" },
6024
+ { name: "WORLD_COYOTE_HOWL", group: "Animals" },
6025
+ { name: "WORLD_COYOTE_REST", group: "Animals" },
6026
+ { name: "WORLD_COYOTE_WANDER", group: "Animals" },
6027
+ { name: "WORLD_COYOTE_WALK", group: "Animals" },
6028
+ { name: "WORLD_CHICKENHAWK_FEEDING", group: "Animals" },
6029
+ { name: "WORLD_CHICKENHAWK_STANDING", group: "Animals" },
6030
+ { name: "WORLD_CORMORANT_STANDING", group: "Animals" },
6031
+ { name: "WORLD_CROW_FEEDING", group: "Animals" },
6032
+ { name: "WORLD_CROW_STANDING", group: "Animals" },
6033
+ { name: "WORLD_DEER_GRAZING", group: "Animals" },
6034
+ { name: "WORLD_DOG_BARKING_ROTTWEILER", group: "Animals" },
6035
+ { name: "WORLD_DOG_BARKING_RETRIEVER", group: "Animals" },
6036
+ { name: "WORLD_DOG_BARKING_SHEPHERD", group: "Animals" },
6037
+ { name: "WORLD_DOG_BARKING_SMALL", group: "Animals" },
6038
+ { name: "WORLD_DOG_SITTING_ROTTWEILER", group: "Animals" },
6039
+ { name: "WORLD_DOG_SITTING_RETRIEVER", group: "Animals" },
6040
+ { name: "WORLD_DOG_SITTING_SHEPHERD", group: "Animals" },
6041
+ { name: "WORLD_DOG_SITTING_SMALL", group: "Animals" },
6042
+ { name: "WORLD_DOLPHIN_SWIM", group: "Animals" },
6043
+ { name: "WORLD_FISH_FLEE", group: "Animals" },
6044
+ { name: "WORLD_FISH_IDLE", group: "Animals" },
6045
+ { name: "WORLD_GULL_FEEDING", group: "Animals" },
6046
+ { name: "WORLD_GULL_STANDING", group: "Animals" },
6047
+ { name: "WORLD_HEN_FLEE", group: "Animals" },
6048
+ { name: "WORLD_HEN_PECKING", group: "Animals" },
6049
+ { name: "WORLD_HEN_STANDING", group: "Animals" },
6050
+ { name: "WORLD_MOUNTAIN_LION_REST", group: "Animals" },
6051
+ { name: "WORLD_MOUNTAIN_LION_WANDER", group: "Animals" },
6052
+ { name: "WORLD_ORCA_SWIM", group: "Animals" },
6053
+ { name: "WORLD_PIG_GRAZING", group: "Animals" },
6054
+ { name: "WORLD_PIGEON_FEEDING", group: "Animals" },
6055
+ { name: "WORLD_PIGEON_STANDING", group: "Animals" },
6056
+ { name: "WORLD_RABBIT_EATING", group: "Animals" },
6057
+ { name: "WORLD_RABBIT_FLEE", group: "Animals" },
6058
+ { name: "WORLD_RATS_EATING", group: "Animals" },
6059
+ { name: "WORLD_RATS_FLEEING", group: "Animals" },
6060
+ { name: "WORLD_SHARK_SWIM", group: "Animals" },
6061
+ { name: "WORLD_SHARK_HAMMERHEAD_SWIM", group: "Animals" },
6062
+ { name: "WORLD_STINGRAY_SWIM", group: "Animals" },
6063
+ { name: "WORLD_WHALE_SWIM", group: "Animals" },
6064
+ // ── Vehicles ───────────────────────────────────────────────────────────────
6065
+ { name: "DRIVE", group: "Vehicles" },
6066
+ { name: "PARK_VEHICLE", group: "Vehicles" },
6067
+ { name: "WORLD_VEHICLE_ATTRACTOR", group: "Vehicles" },
6068
+ { name: "WORLD_VEHICLE_AMBULANCE", group: "Vehicles" },
6069
+ { name: "WORLD_VEHICLE_BICYCLE_BMX", group: "Vehicles" },
6070
+ { name: "WORLD_VEHICLE_BICYCLE_BMX_BALLAS", group: "Vehicles" },
6071
+ { name: "WORLD_VEHICLE_BICYCLE_BMX_FAMILY", group: "Vehicles" },
6072
+ { name: "WORLD_VEHICLE_BICYCLE_BMX_HARMONY", group: "Vehicles" },
6073
+ { name: "WORLD_VEHICLE_BICYCLE_BMX_VAGOS", group: "Vehicles" },
6074
+ { name: "WORLD_VEHICLE_BICYCLE_MOUNTAIN", group: "Vehicles" },
6075
+ { name: "WORLD_VEHICLE_BICYCLE_ROAD", group: "Vehicles" },
6076
+ { name: "WORLD_VEHICLE_BIKE_OFF_ROAD_RACE", group: "Vehicles" },
6077
+ { name: "WORLD_VEHICLE_BIKER", group: "Vehicles" },
6078
+ { name: "WORLD_VEHICLE_BOAT_IDLE", group: "Vehicles" },
6079
+ { name: "WORLD_VEHICLE_BOAT_IDLE_ALAMO", group: "Vehicles" },
6080
+ { name: "WORLD_VEHICLE_BOAT_IDLE_MARQUIS", group: "Vehicles" },
6081
+ { name: "WORLD_VEHICLE_BROKEN_DOWN", group: "Vehicles" },
6082
+ { name: "WORLD_VEHICLE_BUSINESSMEN", group: "Vehicles" },
6083
+ { name: "WORLD_VEHICLE_CLUCKIN_BELL_TRAILER", group: "Vehicles" },
6084
+ { name: "WORLD_VEHICLE_CONSTRUCTION_SOLO", group: "Vehicles" },
6085
+ { name: "WORLD_VEHICLE_CONSTRUCTION_PASSENGERS", group: "Vehicles" },
6086
+ { name: "WORLD_VEHICLE_DISTANT_EMPTY_GROUND", group: "Vehicles" },
6087
+ { name: "WORLD_VEHICLE_DRIVE_PASSENGERS", group: "Vehicles" },
6088
+ { name: "WORLD_VEHICLE_DRIVE_PASSENGERS_LIMITED", group: "Vehicles" },
6089
+ { name: "WORLD_VEHICLE_DRIVE_SOLO", group: "Vehicles" },
6090
+ { name: "WORLD_VEHICLE_EMPTY", group: "Vehicles" },
6091
+ { name: "WORLD_VEHICLE_FARM_WORKER", group: "Vehicles" },
6092
+ { name: "WORLD_VEHICLE_FIRE_TRUCK", group: "Vehicles" },
6093
+ { name: "WORLD_VEHICLE_HELI_LIFEGUARD", group: "Vehicles" },
6094
+ { name: "WORLD_VEHICLE_MARIACHI", group: "Vehicles" },
6095
+ { name: "WORLD_VEHICLE_MECHANIC", group: "Vehicles" },
6096
+ { name: "WORLD_VEHICLE_MILITARY_PLANES_BIG", group: "Vehicles" },
6097
+ { name: "WORLD_VEHICLE_MILITARY_PLANES_SMALL", group: "Vehicles" },
6098
+ { name: "WORLD_VEHICLE_PARK_PARALLEL", group: "Vehicles" },
6099
+ { name: "WORLD_VEHICLE_PARK_PERPENDICULAR_NOSE_IN", group: "Vehicles" },
6100
+ { name: "WORLD_VEHICLE_PASSENGER_EXIT", group: "Vehicles" },
6101
+ { name: "WORLD_VEHICLE_POLICE_BIKE", group: "Vehicles" },
6102
+ { name: "WORLD_VEHICLE_POLICE_CAR", group: "Vehicles" },
6103
+ { name: "WORLD_VEHICLE_POLICE_NEXT_TO_CAR", group: "Vehicles" },
6104
+ { name: "WORLD_VEHICLE_QUARRY", group: "Vehicles" },
6105
+ { name: "WORLD_VEHICLE_SALTON", group: "Vehicles" },
6106
+ { name: "WORLD_VEHICLE_SALTON_DIRT_BIKE", group: "Vehicles" },
6107
+ { name: "WORLD_VEHICLE_SECURITY_CAR", group: "Vehicles" },
6108
+ { name: "WORLD_VEHICLE_STREETRACE", group: "Vehicles" },
6109
+ { name: "WORLD_VEHICLE_TANDL", group: "Vehicles" },
6110
+ { name: "WORLD_VEHICLE_TOURBUS", group: "Vehicles" },
6111
+ { name: "WORLD_VEHICLE_TOURIST", group: "Vehicles" },
6112
+ { name: "WORLD_VEHICLE_TRACTOR", group: "Vehicles" },
6113
+ { name: "WORLD_VEHICLE_TRACTOR_BEACH", group: "Vehicles" },
6114
+ { name: "WORLD_VEHICLE_TRUCK_LOGS", group: "Vehicles" },
6115
+ { name: "WORLD_VEHICLE_TRUCKS_TRAILERS", group: "Vehicles" },
6116
+ // ── Code (Advanced) ────────────────────────────────────────────────────────
6117
+ // These are engine-internal scenarios — rarely the right pick for cinematic
6118
+ // ped placements, but exposed because the game-data dump includes them.
6119
+ { name: "CODE_HUMAN_COWER", group: "Code (Advanced)" },
6120
+ { name: "CODE_HUMAN_CROSS_ROAD_WAIT", group: "Code (Advanced)" },
6121
+ { name: "CODE_HUMAN_PARK_CAR", group: "Code (Advanced)" },
6122
+ { name: "CODE_HUMAN_MEDIC_KNEEL", group: "Code (Advanced)" },
6123
+ { name: "CODE_HUMAN_MEDIC_TEND_TO_DEAD", group: "Code (Advanced)" },
6124
+ { name: "CODE_HUMAN_MEDIC_TIME_OF_DEATH", group: "Code (Advanced)" },
6125
+ { name: "CODE_HUMAN_POLICE_CROWD_CONTROL", group: "Code (Advanced)" },
6126
+ { name: "CODE_HUMAN_POLICE_INVESTIGATE", group: "Code (Advanced)" },
6127
+ { name: "CODE_HUMAN_STAND_COWER", group: "Code (Advanced)" },
6128
+ { name: "CHAINING_ENTRY", group: "Code (Advanced)" },
6129
+ { name: "CHAINING_EXIT", group: "Code (Advanced)" },
6130
+ { name: "EAR_TO_TEXT", group: "Code (Advanced)" },
6131
+ { name: "EAR_TO_TEXT_FAT", group: "Code (Advanced)" },
6132
+ { name: "WORLD_LOOKAT_POINT", group: "Code (Advanced)" }
6133
+ ];
6134
+ var PREFIX_RE = /^(WORLD|PROP|CODE)_(HUMAN_|BIRD_|VEHICLE_|CAT_|DOG_|COYOTE_|FISH_|HEN_|GULL_|CROW_|RABBIT_|RATS_|SHARK_|PIGEON_|ORCA_|WHALE_|STINGRAY_|DOLPHIN_|MOUNTAIN_LION_|PIG_|COW_|DEER_|BOAR_|CHICKENHAWK_|CORMORANT_)?/;
6135
+ function formatGtaScenario(name) {
6136
+ if (!name) return "";
6137
+ const stripped = name.replace(PREFIX_RE, "");
6138
+ const cleaned = stripped.length > 0 ? stripped : name;
6139
+ return cleaned.toLowerCase().split("_").filter(Boolean).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
6140
+ }
6141
+ function buildGroupedData3(extraNames = []) {
6142
+ const groups = /* @__PURE__ */ new Map();
6143
+ const seen = /* @__PURE__ */ new Set();
6144
+ for (const sc of GTA_SCENARIOS) {
6145
+ if (seen.has(sc.name)) continue;
6146
+ seen.add(sc.name);
6147
+ if (!groups.has(sc.group)) groups.set(sc.group, []);
6148
+ groups.get(sc.group).push(sc);
6149
+ }
6150
+ const data = GTA_SCENARIO_GROUP_ORDER.flatMap((g) => {
6151
+ const items = groups.get(g);
6152
+ if (!items || items.length === 0) return [];
6153
+ return [
6154
+ {
6155
+ group: g,
6156
+ items: items.map((sc) => ({
6157
+ value: sc.name,
6158
+ label: sc.label ?? formatGtaScenario(sc.name)
6159
+ }))
6160
+ }
6161
+ ];
6162
+ });
6163
+ const knownNames = new Set(GTA_SCENARIOS.map((sc) => sc.name));
6164
+ const customs = extraNames.filter((n) => n && !knownNames.has(n));
6165
+ if (customs.length > 0) {
6166
+ data.push({
6167
+ group: "Custom",
6168
+ items: customs.map((n) => ({ value: n, label: n }))
6169
+ });
6170
+ }
6171
+ return data;
6172
+ }
6173
+ function ScenarioSelect({
6174
+ value,
6175
+ onChange,
6176
+ label = "Scenario",
6177
+ size = "xs",
6178
+ searchable = true,
6179
+ clearable = true,
6180
+ ...rest
6181
+ }) {
6182
+ const data = buildGroupedData3([value]);
6183
+ return /* @__PURE__ */ jsx(
6184
+ Select,
6185
+ {
6186
+ label,
6187
+ size,
6188
+ searchable,
6189
+ clearable,
6190
+ maxDropdownHeight: 320,
6191
+ nothingFoundMessage: "No matching scenarios",
6192
+ placeholder: "Pick a scenario...",
6193
+ ...rest,
6194
+ data,
6195
+ value: value || null,
6196
+ onChange: (v) => onChange(v ?? "")
6197
+ }
6198
+ );
6199
+ }
6200
+ function decimalToHex(color) {
6201
+ if (!color || color === 0) return null;
6202
+ return "#" + color.toString(16).padStart(6, "0");
6203
+ }
6204
+ function RoleOption({ role }) {
6205
+ const swatch = decimalToHex(role.color) || "rgba(255,255,255,0.25)";
6206
+ return /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "0.6vh", children: [
6207
+ /* @__PURE__ */ jsx(
6208
+ "div",
6209
+ {
6210
+ style: {
6211
+ width: "1vh",
6212
+ height: "1vh",
6213
+ borderRadius: "50%",
6214
+ background: swatch,
6215
+ flexShrink: 0,
6216
+ boxShadow: role.color ? `0 0 0.4vh ${swatch}` : void 0
6217
+ }
6218
+ }
6219
+ ),
6220
+ /* @__PURE__ */ jsx(Text, { size: "xs", c: "rgba(255,255,255,0.9)", children: role.name })
6221
+ ] });
6222
+ }
6223
+ function NotConfiguredBanner({ label }) {
6224
+ const theme = useMantineTheme();
6225
+ return /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "xxs", children: [
6226
+ label && /* @__PURE__ */ jsx(Text, { ff: "Akrobat Bold", size: "xxs", tt: "uppercase", lts: "0.05em", c: "rgba(255,255,255,0.55)", children: label }),
6227
+ /* @__PURE__ */ jsxs(
6228
+ Flex,
6229
+ {
6230
+ align: "center",
6231
+ gap: "xs",
6232
+ px: "xs",
6233
+ py: "xxs",
6234
+ style: {
6235
+ background: "rgba(0,0,0,0.3)",
6236
+ border: "0.1vh dashed rgba(255,255,255,0.12)",
6237
+ borderRadius: theme.radius.xs
6238
+ },
6239
+ children: [
6240
+ /* @__PURE__ */ jsx(ExternalLink, { size: "1.4vh", color: "rgba(255,255,255,0.4)" }),
6241
+ /* @__PURE__ */ jsx(Text, { ff: "Akrobat Bold", size: "xxs", c: "rgba(255,255,255,0.55)", style: { flex: 1 }, children: locale("DiscordNotConfigured") || "Discord bot not configured \u2014 run /dirk_lib and set a bot token + guild ID." })
6242
+ ]
6243
+ }
6244
+ )
6245
+ ] });
6246
+ }
6247
+ function DiscordRoleSelect(props) {
6248
+ const { endpoint, label, size = "xs", placeholder, disabled, style, styles } = props;
6249
+ const [roles, setRoles] = useState(null);
6250
+ const [loading, setLoading] = useState(false);
6251
+ const [errorCode, setErrorCode] = useState(null);
6252
+ const refresh = async () => {
6253
+ setLoading(true);
6254
+ try {
6255
+ const res = await fetchNui(endpoint, {}, {
6256
+ // Browser dev fallback so the component renders something useful
6257
+ // outside FiveM.
6258
+ ok: true,
6259
+ roles: [
6260
+ { id: "1", name: "Admin", color: 15548997, position: 5 },
6261
+ { id: "2", name: "VIP Gold", color: 16426522, position: 4 },
6262
+ { id: "3", name: "Member", color: 5763719, position: 3 },
6263
+ { id: "4", name: "Guest", color: 0, position: 2 }
6264
+ ]
6265
+ });
6266
+ if (res?.ok) {
6267
+ setRoles(res.roles ?? []);
6268
+ setErrorCode(null);
6269
+ } else {
6270
+ setRoles(null);
6271
+ setErrorCode(res?._error || "FetchFailed");
6272
+ }
6273
+ } finally {
6274
+ setLoading(false);
6275
+ }
6276
+ };
6277
+ useEffect(() => {
6278
+ refresh();
6279
+ }, [endpoint]);
6280
+ const rolesById = useMemo(() => {
6281
+ const map = {};
6282
+ for (const r of roles ?? []) map[r.id] = r;
6283
+ return map;
6284
+ }, [roles]);
6285
+ if (errorCode === "NotConfigured") {
6286
+ return /* @__PURE__ */ jsx(NotConfiguredBanner, { label });
6287
+ }
6288
+ const data = (roles ?? []).map((r) => ({
6289
+ value: r.id,
6290
+ label: r.name
6291
+ }));
6292
+ const renderOption = ({ option }) => {
6293
+ const role = rolesById[option.value];
6294
+ return role ? /* @__PURE__ */ jsx(RoleOption, { role }) : /* @__PURE__ */ jsx(Text, { size: "xs", children: option.label });
6295
+ };
6296
+ const refreshButton = /* @__PURE__ */ jsx(
6297
+ ActionIcon,
6298
+ {
6299
+ size: "xs",
6300
+ variant: "subtle",
6301
+ onClick: refresh,
6302
+ title: locale("Refresh") || "Refresh",
6303
+ loading,
6304
+ children: /* @__PURE__ */ jsx(RefreshCw, { size: "1.2vh" })
6305
+ }
6306
+ );
6307
+ if (props.multi) {
6308
+ return /* @__PURE__ */ jsx(
6309
+ MultiSelect,
6310
+ {
6311
+ label,
6312
+ size,
6313
+ placeholder: placeholder || locale("PickRoles") || "Pick roles...",
6314
+ data,
6315
+ value: props.value || [],
6316
+ onChange: (ids) => props.onChange(ids),
6317
+ renderOption,
6318
+ searchable: true,
6319
+ clearable: true,
6320
+ disabled: disabled || loading && !roles,
6321
+ rightSection: refreshButton,
6322
+ style,
6323
+ styles,
6324
+ nothingFoundMessage: errorCode ? `${locale("Error") || "Error"} (${errorCode})` : locale("NoRoles") || "No roles found"
6325
+ }
6326
+ );
6327
+ }
6328
+ return /* @__PURE__ */ jsx(
6329
+ Select,
6330
+ {
6331
+ label,
6332
+ size,
6333
+ placeholder: placeholder || locale("PickRole") || "Pick a role...",
6334
+ data,
6335
+ value: props.value || null,
6336
+ onChange: (id) => props.onChange(id),
6337
+ renderOption,
6338
+ searchable: true,
6339
+ clearable: true,
6340
+ disabled: disabled || loading && !roles,
6341
+ rightSection: refreshButton,
6342
+ style,
6343
+ styles,
6344
+ nothingFoundMessage: errorCode ? `${locale("Error") || "Error"} (${errorCode})` : locale("NoRoles") || "No roles found"
6345
+ }
6346
+ );
6347
+ }
6348
+
6349
+ export { AdminPageTitle, AnimPostFxSelect, AsyncSaveButton, BlipColorSelect, BlipDisplaySelect, BlipIconSelect, BorderedIcon, ConfigPanel, ConfirmModal, ControlMultiSelect, ControlSelect, Counter, DiscordRoleSelect, FiveMKeyBindInput, FloatingParticles, GroupName, GroupRank, GroupSelect, InfoBox, InputContainer, LevelBanner, LevelPanel, MissingItemsBanner, Modal, ModalContext, ModalProvider, MotionFlex, MotionIcon, MotionImage, MotionText, NavBar, NavigationContext, NavigationProvider, PositionPicker, PromptModal, ScenarioSelect, SegmentedControl, SegmentedProgress, SelectItem, SwitchPanel, TestBed, ThemeOverrideSection, Title, Vector4DeleteButton, Vector4Display, WorldPositionGotoButton, WorldPositionSetButton, useMissingItemsAudit, useModal, useModalActions, useNavigation, useNavigationStore };
5853
6350
  //# sourceMappingURL=index.js.map
5854
6351
  //# sourceMappingURL=index.js.map