@rufous/ui 0.3.19 → 0.3.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.cjs CHANGED
@@ -169,13 +169,22 @@ __export(main_exports, {
169
169
  WorkItemIcon: () => workItemIcon_default,
170
170
  Zoom: () => Zoom,
171
171
  getAllCountries: () => getAllCountries2,
172
+ getCitiesByName: () => getCitiesByName,
172
173
  getCitiesOfCountry: () => getCitiesOfCountry,
173
174
  getCitiesOfState: () => getCitiesOfState,
175
+ getCityByName: () => getCityByName,
176
+ getCountriesByName: () => getCountriesByName,
174
177
  getCountryByCode: () => getCountryByCode,
178
+ getCountryByName: () => getCountryByName,
175
179
  getStateByCode: () => getStateByCode,
180
+ getStateByName: () => getStateByName,
181
+ getStatesByName: () => getStatesByName,
176
182
  getStatesOfCountry: () => getStatesOfCountry,
177
183
  transformLegacyTodos: () => transformLegacyTodos,
178
- useRufousTheme: () => useRufousTheme
184
+ useCitiesSearch: () => useCitiesSearch,
185
+ useCountriesSearch: () => useCountriesSearch,
186
+ useRufousTheme: () => useRufousTheme,
187
+ useStatesSearch: () => useStatesSearch
179
188
  });
180
189
  module.exports = __toCommonJS(main_exports);
181
190
 
@@ -13634,12 +13643,54 @@ function getStateNameMap(countryCode) {
13634
13643
  }
13635
13644
  return _stateNameCache.get(countryCode);
13636
13645
  }
13646
+ var _allCountriesCache = null;
13647
+ function getAllCountriesCached() {
13648
+ if (!_allCountriesCache) _allCountriesCache = import_country_state_city3.Country.getAllCountries();
13649
+ return _allCountriesCache;
13650
+ }
13651
+ var _allStatesCache = null;
13652
+ function getAllStatesCached() {
13653
+ if (!_allStatesCache) {
13654
+ const countryMap = new Map(import_country_state_city3.Country.getAllCountries().map((c) => [c.isoCode, c.name]));
13655
+ _allStatesCache = import_country_state_city3.State.getAllStates().map((s2) => ({
13656
+ ...s2,
13657
+ countryName: countryMap.get(s2.countryCode) ?? ""
13658
+ }));
13659
+ }
13660
+ return _allStatesCache;
13661
+ }
13662
+ var _allCitiesCache = null;
13663
+ function getAllCitiesCached() {
13664
+ if (!_allCitiesCache) {
13665
+ const countryMap = new Map(import_country_state_city3.Country.getAllCountries().map((c) => [c.isoCode, c.name]));
13666
+ const stateMap = new Map(import_country_state_city3.State.getAllStates().map((s2) => [`${s2.countryCode}:${s2.isoCode}`, s2.name]));
13667
+ _allCitiesCache = import_country_state_city3.City.getAllCities().map((city) => ({
13668
+ ...city,
13669
+ cityCode: city.name.slice(0, 3),
13670
+ countryName: countryMap.get(city.countryCode) ?? "",
13671
+ stateName: stateMap.get(`${city.countryCode}:${city.stateCode}`) ?? ""
13672
+ }));
13673
+ }
13674
+ return _allCitiesCache;
13675
+ }
13637
13676
  function getAllCountries2() {
13638
- return import_country_state_city3.Country.getAllCountries();
13677
+ return getAllCountriesCached();
13639
13678
  }
13640
13679
  function getCountryByCode(isoCode) {
13641
13680
  return import_country_state_city3.Country.getCountryByCode(isoCode) ?? void 0;
13642
13681
  }
13682
+ function getCountryByName(name, exact = false) {
13683
+ const q = name.toLowerCase();
13684
+ return getAllCountriesCached().find(
13685
+ (c) => exact ? c.name.toLowerCase() === q : c.name.toLowerCase().includes(q)
13686
+ );
13687
+ }
13688
+ function getCountriesByName(name, exact = false) {
13689
+ const q = name.toLowerCase();
13690
+ return getAllCountriesCached().filter(
13691
+ (c) => exact ? c.name.toLowerCase() === q : c.name.toLowerCase().includes(q)
13692
+ );
13693
+ }
13643
13694
  function getStatesOfCountry(countryCode) {
13644
13695
  const countryName = import_country_state_city3.Country.getCountryByCode(countryCode)?.name ?? "";
13645
13696
  return import_country_state_city3.State.getStatesOfCountry(countryCode).map((state) => ({
@@ -13653,6 +13704,18 @@ function getStateByCode(stateCode, countryCode) {
13653
13704
  const countryName = import_country_state_city3.Country.getCountryByCode(countryCode)?.name ?? "";
13654
13705
  return { ...state, countryName };
13655
13706
  }
13707
+ function getStateByName(name, exact = false) {
13708
+ const q = name.toLowerCase();
13709
+ return getAllStatesCached().find(
13710
+ (s2) => exact ? s2.name.toLowerCase() === q : s2.name.toLowerCase().includes(q)
13711
+ );
13712
+ }
13713
+ function getStatesByName(name, exact = false) {
13714
+ const q = name.toLowerCase();
13715
+ return getAllStatesCached().filter(
13716
+ (s2) => exact ? s2.name.toLowerCase() === q : s2.name.toLowerCase().includes(q)
13717
+ );
13718
+ }
13656
13719
  function getCitiesOfState(countryCode, stateCode) {
13657
13720
  const countryName = import_country_state_city3.Country.getCountryByCode(countryCode)?.name ?? "";
13658
13721
  const stateName = import_country_state_city3.State.getStateByCodeAndCountry(stateCode, countryCode)?.name ?? "";
@@ -13673,6 +13736,67 @@ function getCitiesOfCountry(countryCode) {
13673
13736
  stateName: stateNameMap.get(city.stateCode) ?? ""
13674
13737
  }));
13675
13738
  }
13739
+ function getCityByName(name, exact = false) {
13740
+ const q = name.toLowerCase();
13741
+ return getAllCitiesCached().find(
13742
+ (c) => exact ? c.name.toLowerCase() === q : c.name.toLowerCase().includes(q)
13743
+ );
13744
+ }
13745
+ function getCitiesByName(name, exact = false) {
13746
+ const q = name.toLowerCase();
13747
+ return getAllCitiesCached().filter(
13748
+ (c) => exact ? c.name.toLowerCase() === q : c.name.toLowerCase().includes(q)
13749
+ );
13750
+ }
13751
+
13752
+ // lib/utils/useLocationSearch.ts
13753
+ var import_react64 = require("react");
13754
+ function useDebounced(searcher, debounceMs) {
13755
+ const [query, setQuery] = (0, import_react64.useState)("");
13756
+ const [results, setResults] = (0, import_react64.useState)([]);
13757
+ const timer = (0, import_react64.useRef)(null);
13758
+ (0, import_react64.useEffect)(() => () => {
13759
+ if (timer.current) clearTimeout(timer.current);
13760
+ }, []);
13761
+ const search = (0, import_react64.useCallback)((name) => {
13762
+ setQuery(name);
13763
+ if (timer.current) clearTimeout(timer.current);
13764
+ if (!name.trim()) {
13765
+ setResults([]);
13766
+ return;
13767
+ }
13768
+ timer.current = setTimeout(() => {
13769
+ setResults(searcher(name));
13770
+ }, debounceMs);
13771
+ }, [searcher, debounceMs]);
13772
+ const clear = (0, import_react64.useCallback)(() => {
13773
+ if (timer.current) clearTimeout(timer.current);
13774
+ setQuery("");
13775
+ setResults([]);
13776
+ }, []);
13777
+ return { results, query, search, clear };
13778
+ }
13779
+ function useCountriesSearch(debounceMs = 300) {
13780
+ const searcher = (0, import_react64.useCallback)(
13781
+ (q) => getCountriesByName(q),
13782
+ []
13783
+ );
13784
+ return useDebounced(searcher, debounceMs);
13785
+ }
13786
+ function useStatesSearch(debounceMs = 300) {
13787
+ const searcher = (0, import_react64.useCallback)(
13788
+ (q) => getStatesByName(q),
13789
+ []
13790
+ );
13791
+ return useDebounced(searcher, debounceMs);
13792
+ }
13793
+ function useCitiesSearch(debounceMs = 300) {
13794
+ const searcher = (0, import_react64.useCallback)(
13795
+ (q) => getCitiesByName(q),
13796
+ []
13797
+ );
13798
+ return useDebounced(searcher, debounceMs);
13799
+ }
13676
13800
  // Annotate the CommonJS export names for ESM import in node:
13677
13801
  0 && (module.exports = {
13678
13802
  APP_THEMES,
@@ -13815,11 +13939,20 @@ function getCitiesOfCountry(countryCode) {
13815
13939
  WorkItemIcon,
13816
13940
  Zoom,
13817
13941
  getAllCountries,
13942
+ getCitiesByName,
13818
13943
  getCitiesOfCountry,
13819
13944
  getCitiesOfState,
13945
+ getCityByName,
13946
+ getCountriesByName,
13820
13947
  getCountryByCode,
13948
+ getCountryByName,
13821
13949
  getStateByCode,
13950
+ getStateByName,
13951
+ getStatesByName,
13822
13952
  getStatesOfCountry,
13823
13953
  transformLegacyTodos,
13824
- useRufousTheme
13954
+ useCitiesSearch,
13955
+ useCountriesSearch,
13956
+ useRufousTheme,
13957
+ useStatesSearch
13825
13958
  });
package/dist/main.d.cts CHANGED
@@ -2078,6 +2078,20 @@ interface EnhancedCity extends ICity {
2078
2078
  declare function getAllCountries(): EnhancedCountry[];
2079
2079
  /** Returns a single country by its ISO 2-letter code, or undefined if not found. */
2080
2080
  declare function getCountryByCode(isoCode: string): EnhancedCountry | undefined;
2081
+ /**
2082
+ * Returns the first country whose name matches the query (case-insensitive).
2083
+ * Pass `exact: false` (default) to also match partial names.
2084
+ * @param name Country name or partial name, e.g. "United States" or "united"
2085
+ * @param exact When true, requires an exact case-insensitive match. Default false.
2086
+ */
2087
+ declare function getCountryByName(name: string, exact?: boolean): EnhancedCountry | undefined;
2088
+ /**
2089
+ * Returns all countries whose names match the query (case-insensitive, partial by default).
2090
+ * Useful for search-as-you-type flows where you want multiple candidates.
2091
+ * @param name Search string, e.g. "ind" matches "India", "Indonesia", etc.
2092
+ * @param exact When true, only exact case-insensitive matches are returned. Default false.
2093
+ */
2094
+ declare function getCountriesByName(name: string, exact?: boolean): EnhancedCountry[];
2081
2095
  /**
2082
2096
  * Returns all states for a country, each enriched with `countryName`.
2083
2097
  * @param countryCode ISO 2-letter country code, e.g. "US"
@@ -2089,6 +2103,18 @@ declare function getStatesOfCountry(countryCode: string): EnhancedState[];
2089
2103
  * @param countryCode ISO 2-letter country code, e.g. "US"
2090
2104
  */
2091
2105
  declare function getStateByCode(stateCode: string, countryCode: string): EnhancedState | undefined;
2106
+ /**
2107
+ * Returns the first state whose name matches the query across **all countries** (case-insensitive).
2108
+ * @param name State name or partial name, e.g. "Iowa" or "iow"
2109
+ * @param exact When true, requires an exact case-insensitive match. Default false.
2110
+ */
2111
+ declare function getStateByName(name: string, exact?: boolean): EnhancedState | undefined;
2112
+ /**
2113
+ * Returns all states whose names match the query across **all countries** (case-insensitive, partial by default).
2114
+ * @param name Search string, e.g. "new" matches "New York", "New South Wales", etc.
2115
+ * @param exact When true, only exact case-insensitive matches are returned. Default false.
2116
+ */
2117
+ declare function getStatesByName(name: string, exact?: boolean): EnhancedState[];
2092
2118
  /**
2093
2119
  * Returns all cities for a given state, each enriched with `cityCode`, `countryName`,
2094
2120
  * and `stateName`.
@@ -2102,5 +2128,63 @@ declare function getCitiesOfState(countryCode: string, stateCode: string): Enhan
2102
2128
  * @param countryCode ISO 2-letter country code, e.g. "US"
2103
2129
  */
2104
2130
  declare function getCitiesOfCountry(countryCode: string): EnhancedCity[];
2131
+ /**
2132
+ * Returns the first city whose name matches the query across **all countries and states** (case-insensitive).
2133
+ * @param name City name or partial name, e.g. "Delhi" or "del"
2134
+ * @param exact When true, requires an exact case-insensitive match. Default false.
2135
+ */
2136
+ declare function getCityByName(name: string, exact?: boolean): EnhancedCity | undefined;
2137
+ /**
2138
+ * Returns all cities whose names match the query across **all countries and states** (case-insensitive, partial by default).
2139
+ * Searches ~148k cities — prefer the debounced `useCitiesSearch` hook in React components.
2140
+ * @param name Search string, e.g. "spring" matches "Springfield", "Spring Hill", etc.
2141
+ * @param exact When true, only exact case-insensitive matches are returned. Default false.
2142
+ */
2143
+ declare function getCitiesByName(name: string, exact?: boolean): EnhancedCity[];
2144
+
2145
+ interface SearchResult<T> {
2146
+ /** Filtered results. Empty while query is blank. */
2147
+ results: T[];
2148
+ /** Current value of the search input (updated immediately on each keystroke). */
2149
+ query: string;
2150
+ /** Call this on every keystroke — triggers the debounced filter. */
2151
+ search: (name: string) => void;
2152
+ /** Resets query and results immediately. */
2153
+ clear: () => void;
2154
+ }
2155
+ /**
2156
+ * Debounced country name search across all ~250 countries.
2157
+ *
2158
+ * @param debounceMs Delay before filtering runs. Defaults to 300 ms.
2159
+ *
2160
+ * @example
2161
+ * const { results, search, clear, query } = useCountriesSearch();
2162
+ * <input onChange={e => search(e.target.value)} value={query} />
2163
+ * {results.map(c => <div key={c.isoCode}>{c.flag} {c.name}</div>)}
2164
+ */
2165
+ declare function useCountriesSearch(debounceMs?: number): SearchResult<EnhancedCountry>;
2166
+ /**
2167
+ * Debounced state / province name search across **all countries** (~5k states).
2168
+ * No country scoping — results include `countryName` so you can display origin.
2169
+ *
2170
+ * @param debounceMs Delay before filtering runs. Defaults to 300 ms.
2171
+ *
2172
+ * @example
2173
+ * const { results, search, clear } = useStatesSearch();
2174
+ * // results[0] → { name, isoCode, countryCode, countryName, latitude, longitude }
2175
+ */
2176
+ declare function useStatesSearch(debounceMs?: number): SearchResult<EnhancedState>;
2177
+ /**
2178
+ * Debounced city name search across **all countries and states** (~148k cities).
2179
+ * No country / state scoping — results include `countryName` and `stateName`.
2180
+ * Debouncing is strongly recommended given the dataset size.
2181
+ *
2182
+ * @param debounceMs Delay before filtering runs. Defaults to 300 ms.
2183
+ *
2184
+ * @example
2185
+ * const { results, search, clear } = useCitiesSearch(400);
2186
+ * // results[0] → { name, cityCode, stateCode, stateName, countryCode, countryName, … }
2187
+ */
2188
+ declare function useCitiesSearch(debounceMs?: number): SearchResult<EnhancedCity>;
2105
2189
 
2106
- export { APP_THEMES, Accordion, AccordionDetails, type AccordionDetailsProps, type AccordionProps, AccordionSummary, type AccordionSummaryProps, type Action, ActivateUserIcon, AddButton, AddressLookup, ArchivedIcon, AssignGroupIcon, Autocomplete, type AutocompleteProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, BaseDialog, Box, type BoxProps, Breadcrumbs, type BreadcrumbsProps, Button, type ButtonProps, CameraIcon, CancelButton, Card, CardActions, type CardActionsProps, CardContent, type CardContentProps, CardHeader, type CardHeaderProps, CardMedia, type CardMediaProps, type CardProps, Checkbox, type CheckboxProps, Chip, type ChipProps, CircularProgress, CircularProgressIcon, type CircularProgressIconProps, CloseIcon, Collapse, type CollapseProps, type Column, CopyIcon, DataGrid, type DataGridProps, DateField, type DateFieldProps, type DateFormatString, DateRangeField, type DateRangeFieldProps, type DateRangeValue, DifficultyAllIcon, DifficultyEasyIcon, DifficultyHardIcon, DifficultyMediumIcon, Divider, type DividerProps, DollarIcon, DownloadIcon, DownloadPdfIcon, Drawer, type DrawerProps, EditChatIcon, EditIcon, EngagementIcon, type EnhancedCity, type EnhancedCountry, type EnhancedState, Fade, type FadeProps, FunctionIcon, Grid, type GridProps, Grow, type GrowProps, HelpOutlinedIcon, HierarchyIcon, IconButton, type IconButtonProps, ImageField, type ImageFieldProps, InactiveGroupIcon, IndustryIcon, InvoiceIcon, Link, type LinkProps, List, ListItem, ListItemButton, type ListItemButtonProps, ListItemIcon, type ListItemIconProps, type ListItemProps, ListItemText, type ListItemTextProps, type ListProps, ListSubheader, type ListSubheaderProps, LocationPinIcon, LogsIcon, Menu, MenuDivider, MenuItem, type MenuItemProps, MenuList, type MenuListProps, type MenuProps, MinExperienceIcon, NineDotMenuIcon, NotificationIcon, type NumberVariant, Paper, type PaperProps, PhoneField, type PhoneFieldProps, Popover, type PopoverProps, Popper, type PopperProps, ProjectIcon, QualificationsIcon, QuestionStatusAllIcon, QuestionStatusPrivateIcon, QuestionStatusPublicIcon, QuestionTypeAllIcon, QuestionTypeCodingIcon, QuestionTypeDescriptiveIcon, QuestionTypeMultipleIcon, QuestionTypeSingleIcon, Radio, RadioGroup, type RadioGroupProps, type RadioProps, Rating, type RatingProps, RefreshIcon, ResendInviteIcon, RolesIcon, RufousAiIcon, RufousBirdIcon, RufousLauncherIcon, RufousLogoLoader, type RufousLogoLoaderProps, RufousTextContent, type RufousTextContentProps, RufousTextEditor, type MentionItemData as RufousTextEditorMentionItem, type RufousTextEditorProps, RufousThemeProvider, Select, type SelectProps, SidebarIcon, Skeleton, type SkeletonProps, Slide, type SlideProps, Slider, type SliderProps, SmartSelect, type SmartSelectProps, Snackbar, type SnackbarProps, SoftSkillsIcon, type SortDirection, Stack, type StackProps, StandardButton, Step, StepButton, type StepButtonProps, StepContent, type StepContentProps, StepLabel, type StepLabelProps, type StepProps, Stepper, type StepperProps, SubmitButton, SubscribeIcon, SuspendUserIcon, Switch, type SwitchProps, type SxProp, Tab, TabPanel, type TabPanelProps, type TabProps, Tabs, type TabsProps, TechnicalSkillsIcon, TextField, type TextFieldProps, TickIcon, TimerIcon, ToggleButton, ToggleButtonGroup, type ToggleButtonGroupProps, type ToggleButtonProps, Tooltip, type TooltipProps, TrashIcon, type TreeNode, TreeSelect, type TreeSelectMultiValue, type TreeSelectProps, type TreeSelectValue, Typography, type TypographyProps, UnArchivedIcon, UnsubscribeIcon, UploadIcon, UserAssignIcon, type UserOption, UserSelectionField, type UserSelectionFieldProps, ViewIcon, WorkItemIcon, Zoom, type ZoomProps, getAllCountries, getCitiesOfCountry, getCitiesOfState, getCountryByCode, getStateByCode, getStatesOfCountry, transformLegacyTodos, useRufousTheme };
2190
+ export { APP_THEMES, Accordion, AccordionDetails, type AccordionDetailsProps, type AccordionProps, AccordionSummary, type AccordionSummaryProps, type Action, ActivateUserIcon, AddButton, AddressLookup, ArchivedIcon, AssignGroupIcon, Autocomplete, type AutocompleteProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, BaseDialog, Box, type BoxProps, Breadcrumbs, type BreadcrumbsProps, Button, type ButtonProps, CameraIcon, CancelButton, Card, CardActions, type CardActionsProps, CardContent, type CardContentProps, CardHeader, type CardHeaderProps, CardMedia, type CardMediaProps, type CardProps, Checkbox, type CheckboxProps, Chip, type ChipProps, CircularProgress, CircularProgressIcon, type CircularProgressIconProps, CloseIcon, Collapse, type CollapseProps, type Column, CopyIcon, DataGrid, type DataGridProps, DateField, type DateFieldProps, type DateFormatString, DateRangeField, type DateRangeFieldProps, type DateRangeValue, DifficultyAllIcon, DifficultyEasyIcon, DifficultyHardIcon, DifficultyMediumIcon, Divider, type DividerProps, DollarIcon, DownloadIcon, DownloadPdfIcon, Drawer, type DrawerProps, EditChatIcon, EditIcon, EngagementIcon, type EnhancedCity, type EnhancedCountry, type EnhancedState, Fade, type FadeProps, FunctionIcon, Grid, type GridProps, Grow, type GrowProps, HelpOutlinedIcon, HierarchyIcon, IconButton, type IconButtonProps, ImageField, type ImageFieldProps, InactiveGroupIcon, IndustryIcon, InvoiceIcon, Link, type LinkProps, List, ListItem, ListItemButton, type ListItemButtonProps, ListItemIcon, type ListItemIconProps, type ListItemProps, ListItemText, type ListItemTextProps, type ListProps, ListSubheader, type ListSubheaderProps, LocationPinIcon, LogsIcon, Menu, MenuDivider, MenuItem, type MenuItemProps, MenuList, type MenuListProps, type MenuProps, MinExperienceIcon, NineDotMenuIcon, NotificationIcon, type NumberVariant, Paper, type PaperProps, PhoneField, type PhoneFieldProps, Popover, type PopoverProps, Popper, type PopperProps, ProjectIcon, QualificationsIcon, QuestionStatusAllIcon, QuestionStatusPrivateIcon, QuestionStatusPublicIcon, QuestionTypeAllIcon, QuestionTypeCodingIcon, QuestionTypeDescriptiveIcon, QuestionTypeMultipleIcon, QuestionTypeSingleIcon, Radio, RadioGroup, type RadioGroupProps, type RadioProps, Rating, type RatingProps, RefreshIcon, ResendInviteIcon, RolesIcon, RufousAiIcon, RufousBirdIcon, RufousLauncherIcon, RufousLogoLoader, type RufousLogoLoaderProps, RufousTextContent, type RufousTextContentProps, RufousTextEditor, type MentionItemData as RufousTextEditorMentionItem, type RufousTextEditorProps, RufousThemeProvider, Select, type SelectProps, SidebarIcon, Skeleton, type SkeletonProps, Slide, type SlideProps, Slider, type SliderProps, SmartSelect, type SmartSelectProps, Snackbar, type SnackbarProps, SoftSkillsIcon, type SortDirection, Stack, type StackProps, StandardButton, Step, StepButton, type StepButtonProps, StepContent, type StepContentProps, StepLabel, type StepLabelProps, type StepProps, Stepper, type StepperProps, SubmitButton, SubscribeIcon, SuspendUserIcon, Switch, type SwitchProps, type SxProp, Tab, TabPanel, type TabPanelProps, type TabProps, Tabs, type TabsProps, TechnicalSkillsIcon, TextField, type TextFieldProps, TickIcon, TimerIcon, ToggleButton, ToggleButtonGroup, type ToggleButtonGroupProps, type ToggleButtonProps, Tooltip, type TooltipProps, TrashIcon, type TreeNode, TreeSelect, type TreeSelectMultiValue, type TreeSelectProps, type TreeSelectValue, Typography, type TypographyProps, UnArchivedIcon, UnsubscribeIcon, UploadIcon, UserAssignIcon, type UserOption, UserSelectionField, type UserSelectionFieldProps, ViewIcon, WorkItemIcon, Zoom, type ZoomProps, getAllCountries, getCitiesByName, getCitiesOfCountry, getCitiesOfState, getCityByName, getCountriesByName, getCountryByCode, getCountryByName, getStateByCode, getStateByName, getStatesByName, getStatesOfCountry, transformLegacyTodos, useCitiesSearch, useCountriesSearch, useRufousTheme, useStatesSearch };
package/dist/main.d.ts CHANGED
@@ -2078,6 +2078,20 @@ interface EnhancedCity extends ICity {
2078
2078
  declare function getAllCountries(): EnhancedCountry[];
2079
2079
  /** Returns a single country by its ISO 2-letter code, or undefined if not found. */
2080
2080
  declare function getCountryByCode(isoCode: string): EnhancedCountry | undefined;
2081
+ /**
2082
+ * Returns the first country whose name matches the query (case-insensitive).
2083
+ * Pass `exact: false` (default) to also match partial names.
2084
+ * @param name Country name or partial name, e.g. "United States" or "united"
2085
+ * @param exact When true, requires an exact case-insensitive match. Default false.
2086
+ */
2087
+ declare function getCountryByName(name: string, exact?: boolean): EnhancedCountry | undefined;
2088
+ /**
2089
+ * Returns all countries whose names match the query (case-insensitive, partial by default).
2090
+ * Useful for search-as-you-type flows where you want multiple candidates.
2091
+ * @param name Search string, e.g. "ind" matches "India", "Indonesia", etc.
2092
+ * @param exact When true, only exact case-insensitive matches are returned. Default false.
2093
+ */
2094
+ declare function getCountriesByName(name: string, exact?: boolean): EnhancedCountry[];
2081
2095
  /**
2082
2096
  * Returns all states for a country, each enriched with `countryName`.
2083
2097
  * @param countryCode ISO 2-letter country code, e.g. "US"
@@ -2089,6 +2103,18 @@ declare function getStatesOfCountry(countryCode: string): EnhancedState[];
2089
2103
  * @param countryCode ISO 2-letter country code, e.g. "US"
2090
2104
  */
2091
2105
  declare function getStateByCode(stateCode: string, countryCode: string): EnhancedState | undefined;
2106
+ /**
2107
+ * Returns the first state whose name matches the query across **all countries** (case-insensitive).
2108
+ * @param name State name or partial name, e.g. "Iowa" or "iow"
2109
+ * @param exact When true, requires an exact case-insensitive match. Default false.
2110
+ */
2111
+ declare function getStateByName(name: string, exact?: boolean): EnhancedState | undefined;
2112
+ /**
2113
+ * Returns all states whose names match the query across **all countries** (case-insensitive, partial by default).
2114
+ * @param name Search string, e.g. "new" matches "New York", "New South Wales", etc.
2115
+ * @param exact When true, only exact case-insensitive matches are returned. Default false.
2116
+ */
2117
+ declare function getStatesByName(name: string, exact?: boolean): EnhancedState[];
2092
2118
  /**
2093
2119
  * Returns all cities for a given state, each enriched with `cityCode`, `countryName`,
2094
2120
  * and `stateName`.
@@ -2102,5 +2128,63 @@ declare function getCitiesOfState(countryCode: string, stateCode: string): Enhan
2102
2128
  * @param countryCode ISO 2-letter country code, e.g. "US"
2103
2129
  */
2104
2130
  declare function getCitiesOfCountry(countryCode: string): EnhancedCity[];
2131
+ /**
2132
+ * Returns the first city whose name matches the query across **all countries and states** (case-insensitive).
2133
+ * @param name City name or partial name, e.g. "Delhi" or "del"
2134
+ * @param exact When true, requires an exact case-insensitive match. Default false.
2135
+ */
2136
+ declare function getCityByName(name: string, exact?: boolean): EnhancedCity | undefined;
2137
+ /**
2138
+ * Returns all cities whose names match the query across **all countries and states** (case-insensitive, partial by default).
2139
+ * Searches ~148k cities — prefer the debounced `useCitiesSearch` hook in React components.
2140
+ * @param name Search string, e.g. "spring" matches "Springfield", "Spring Hill", etc.
2141
+ * @param exact When true, only exact case-insensitive matches are returned. Default false.
2142
+ */
2143
+ declare function getCitiesByName(name: string, exact?: boolean): EnhancedCity[];
2144
+
2145
+ interface SearchResult<T> {
2146
+ /** Filtered results. Empty while query is blank. */
2147
+ results: T[];
2148
+ /** Current value of the search input (updated immediately on each keystroke). */
2149
+ query: string;
2150
+ /** Call this on every keystroke — triggers the debounced filter. */
2151
+ search: (name: string) => void;
2152
+ /** Resets query and results immediately. */
2153
+ clear: () => void;
2154
+ }
2155
+ /**
2156
+ * Debounced country name search across all ~250 countries.
2157
+ *
2158
+ * @param debounceMs Delay before filtering runs. Defaults to 300 ms.
2159
+ *
2160
+ * @example
2161
+ * const { results, search, clear, query } = useCountriesSearch();
2162
+ * <input onChange={e => search(e.target.value)} value={query} />
2163
+ * {results.map(c => <div key={c.isoCode}>{c.flag} {c.name}</div>)}
2164
+ */
2165
+ declare function useCountriesSearch(debounceMs?: number): SearchResult<EnhancedCountry>;
2166
+ /**
2167
+ * Debounced state / province name search across **all countries** (~5k states).
2168
+ * No country scoping — results include `countryName` so you can display origin.
2169
+ *
2170
+ * @param debounceMs Delay before filtering runs. Defaults to 300 ms.
2171
+ *
2172
+ * @example
2173
+ * const { results, search, clear } = useStatesSearch();
2174
+ * // results[0] → { name, isoCode, countryCode, countryName, latitude, longitude }
2175
+ */
2176
+ declare function useStatesSearch(debounceMs?: number): SearchResult<EnhancedState>;
2177
+ /**
2178
+ * Debounced city name search across **all countries and states** (~148k cities).
2179
+ * No country / state scoping — results include `countryName` and `stateName`.
2180
+ * Debouncing is strongly recommended given the dataset size.
2181
+ *
2182
+ * @param debounceMs Delay before filtering runs. Defaults to 300 ms.
2183
+ *
2184
+ * @example
2185
+ * const { results, search, clear } = useCitiesSearch(400);
2186
+ * // results[0] → { name, cityCode, stateCode, stateName, countryCode, countryName, … }
2187
+ */
2188
+ declare function useCitiesSearch(debounceMs?: number): SearchResult<EnhancedCity>;
2105
2189
 
2106
- export { APP_THEMES, Accordion, AccordionDetails, type AccordionDetailsProps, type AccordionProps, AccordionSummary, type AccordionSummaryProps, type Action, ActivateUserIcon, AddButton, AddressLookup, ArchivedIcon, AssignGroupIcon, Autocomplete, type AutocompleteProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, BaseDialog, Box, type BoxProps, Breadcrumbs, type BreadcrumbsProps, Button, type ButtonProps, CameraIcon, CancelButton, Card, CardActions, type CardActionsProps, CardContent, type CardContentProps, CardHeader, type CardHeaderProps, CardMedia, type CardMediaProps, type CardProps, Checkbox, type CheckboxProps, Chip, type ChipProps, CircularProgress, CircularProgressIcon, type CircularProgressIconProps, CloseIcon, Collapse, type CollapseProps, type Column, CopyIcon, DataGrid, type DataGridProps, DateField, type DateFieldProps, type DateFormatString, DateRangeField, type DateRangeFieldProps, type DateRangeValue, DifficultyAllIcon, DifficultyEasyIcon, DifficultyHardIcon, DifficultyMediumIcon, Divider, type DividerProps, DollarIcon, DownloadIcon, DownloadPdfIcon, Drawer, type DrawerProps, EditChatIcon, EditIcon, EngagementIcon, type EnhancedCity, type EnhancedCountry, type EnhancedState, Fade, type FadeProps, FunctionIcon, Grid, type GridProps, Grow, type GrowProps, HelpOutlinedIcon, HierarchyIcon, IconButton, type IconButtonProps, ImageField, type ImageFieldProps, InactiveGroupIcon, IndustryIcon, InvoiceIcon, Link, type LinkProps, List, ListItem, ListItemButton, type ListItemButtonProps, ListItemIcon, type ListItemIconProps, type ListItemProps, ListItemText, type ListItemTextProps, type ListProps, ListSubheader, type ListSubheaderProps, LocationPinIcon, LogsIcon, Menu, MenuDivider, MenuItem, type MenuItemProps, MenuList, type MenuListProps, type MenuProps, MinExperienceIcon, NineDotMenuIcon, NotificationIcon, type NumberVariant, Paper, type PaperProps, PhoneField, type PhoneFieldProps, Popover, type PopoverProps, Popper, type PopperProps, ProjectIcon, QualificationsIcon, QuestionStatusAllIcon, QuestionStatusPrivateIcon, QuestionStatusPublicIcon, QuestionTypeAllIcon, QuestionTypeCodingIcon, QuestionTypeDescriptiveIcon, QuestionTypeMultipleIcon, QuestionTypeSingleIcon, Radio, RadioGroup, type RadioGroupProps, type RadioProps, Rating, type RatingProps, RefreshIcon, ResendInviteIcon, RolesIcon, RufousAiIcon, RufousBirdIcon, RufousLauncherIcon, RufousLogoLoader, type RufousLogoLoaderProps, RufousTextContent, type RufousTextContentProps, RufousTextEditor, type MentionItemData as RufousTextEditorMentionItem, type RufousTextEditorProps, RufousThemeProvider, Select, type SelectProps, SidebarIcon, Skeleton, type SkeletonProps, Slide, type SlideProps, Slider, type SliderProps, SmartSelect, type SmartSelectProps, Snackbar, type SnackbarProps, SoftSkillsIcon, type SortDirection, Stack, type StackProps, StandardButton, Step, StepButton, type StepButtonProps, StepContent, type StepContentProps, StepLabel, type StepLabelProps, type StepProps, Stepper, type StepperProps, SubmitButton, SubscribeIcon, SuspendUserIcon, Switch, type SwitchProps, type SxProp, Tab, TabPanel, type TabPanelProps, type TabProps, Tabs, type TabsProps, TechnicalSkillsIcon, TextField, type TextFieldProps, TickIcon, TimerIcon, ToggleButton, ToggleButtonGroup, type ToggleButtonGroupProps, type ToggleButtonProps, Tooltip, type TooltipProps, TrashIcon, type TreeNode, TreeSelect, type TreeSelectMultiValue, type TreeSelectProps, type TreeSelectValue, Typography, type TypographyProps, UnArchivedIcon, UnsubscribeIcon, UploadIcon, UserAssignIcon, type UserOption, UserSelectionField, type UserSelectionFieldProps, ViewIcon, WorkItemIcon, Zoom, type ZoomProps, getAllCountries, getCitiesOfCountry, getCitiesOfState, getCountryByCode, getStateByCode, getStatesOfCountry, transformLegacyTodos, useRufousTheme };
2190
+ export { APP_THEMES, Accordion, AccordionDetails, type AccordionDetailsProps, type AccordionProps, AccordionSummary, type AccordionSummaryProps, type Action, ActivateUserIcon, AddButton, AddressLookup, ArchivedIcon, AssignGroupIcon, Autocomplete, type AutocompleteProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, BaseDialog, Box, type BoxProps, Breadcrumbs, type BreadcrumbsProps, Button, type ButtonProps, CameraIcon, CancelButton, Card, CardActions, type CardActionsProps, CardContent, type CardContentProps, CardHeader, type CardHeaderProps, CardMedia, type CardMediaProps, type CardProps, Checkbox, type CheckboxProps, Chip, type ChipProps, CircularProgress, CircularProgressIcon, type CircularProgressIconProps, CloseIcon, Collapse, type CollapseProps, type Column, CopyIcon, DataGrid, type DataGridProps, DateField, type DateFieldProps, type DateFormatString, DateRangeField, type DateRangeFieldProps, type DateRangeValue, DifficultyAllIcon, DifficultyEasyIcon, DifficultyHardIcon, DifficultyMediumIcon, Divider, type DividerProps, DollarIcon, DownloadIcon, DownloadPdfIcon, Drawer, type DrawerProps, EditChatIcon, EditIcon, EngagementIcon, type EnhancedCity, type EnhancedCountry, type EnhancedState, Fade, type FadeProps, FunctionIcon, Grid, type GridProps, Grow, type GrowProps, HelpOutlinedIcon, HierarchyIcon, IconButton, type IconButtonProps, ImageField, type ImageFieldProps, InactiveGroupIcon, IndustryIcon, InvoiceIcon, Link, type LinkProps, List, ListItem, ListItemButton, type ListItemButtonProps, ListItemIcon, type ListItemIconProps, type ListItemProps, ListItemText, type ListItemTextProps, type ListProps, ListSubheader, type ListSubheaderProps, LocationPinIcon, LogsIcon, Menu, MenuDivider, MenuItem, type MenuItemProps, MenuList, type MenuListProps, type MenuProps, MinExperienceIcon, NineDotMenuIcon, NotificationIcon, type NumberVariant, Paper, type PaperProps, PhoneField, type PhoneFieldProps, Popover, type PopoverProps, Popper, type PopperProps, ProjectIcon, QualificationsIcon, QuestionStatusAllIcon, QuestionStatusPrivateIcon, QuestionStatusPublicIcon, QuestionTypeAllIcon, QuestionTypeCodingIcon, QuestionTypeDescriptiveIcon, QuestionTypeMultipleIcon, QuestionTypeSingleIcon, Radio, RadioGroup, type RadioGroupProps, type RadioProps, Rating, type RatingProps, RefreshIcon, ResendInviteIcon, RolesIcon, RufousAiIcon, RufousBirdIcon, RufousLauncherIcon, RufousLogoLoader, type RufousLogoLoaderProps, RufousTextContent, type RufousTextContentProps, RufousTextEditor, type MentionItemData as RufousTextEditorMentionItem, type RufousTextEditorProps, RufousThemeProvider, Select, type SelectProps, SidebarIcon, Skeleton, type SkeletonProps, Slide, type SlideProps, Slider, type SliderProps, SmartSelect, type SmartSelectProps, Snackbar, type SnackbarProps, SoftSkillsIcon, type SortDirection, Stack, type StackProps, StandardButton, Step, StepButton, type StepButtonProps, StepContent, type StepContentProps, StepLabel, type StepLabelProps, type StepProps, Stepper, type StepperProps, SubmitButton, SubscribeIcon, SuspendUserIcon, Switch, type SwitchProps, type SxProp, Tab, TabPanel, type TabPanelProps, type TabProps, Tabs, type TabsProps, TechnicalSkillsIcon, TextField, type TextFieldProps, TickIcon, TimerIcon, ToggleButton, ToggleButtonGroup, type ToggleButtonGroupProps, type ToggleButtonProps, Tooltip, type TooltipProps, TrashIcon, type TreeNode, TreeSelect, type TreeSelectMultiValue, type TreeSelectProps, type TreeSelectValue, Typography, type TypographyProps, UnArchivedIcon, UnsubscribeIcon, UploadIcon, UserAssignIcon, type UserOption, UserSelectionField, type UserSelectionFieldProps, ViewIcon, WorkItemIcon, Zoom, type ZoomProps, getAllCountries, getCitiesByName, getCitiesOfCountry, getCitiesOfState, getCityByName, getCountriesByName, getCountryByCode, getCountryByName, getStateByCode, getStateByName, getStatesByName, getStatesOfCountry, transformLegacyTodos, useCitiesSearch, useCountriesSearch, useRufousTheme, useStatesSearch };
package/dist/main.js CHANGED
@@ -13567,12 +13567,54 @@ function getStateNameMap(countryCode) {
13567
13567
  }
13568
13568
  return _stateNameCache.get(countryCode);
13569
13569
  }
13570
+ var _allCountriesCache = null;
13571
+ function getAllCountriesCached() {
13572
+ if (!_allCountriesCache) _allCountriesCache = Country3.getAllCountries();
13573
+ return _allCountriesCache;
13574
+ }
13575
+ var _allStatesCache = null;
13576
+ function getAllStatesCached() {
13577
+ if (!_allStatesCache) {
13578
+ const countryMap = new Map(Country3.getAllCountries().map((c) => [c.isoCode, c.name]));
13579
+ _allStatesCache = State2.getAllStates().map((s2) => ({
13580
+ ...s2,
13581
+ countryName: countryMap.get(s2.countryCode) ?? ""
13582
+ }));
13583
+ }
13584
+ return _allStatesCache;
13585
+ }
13586
+ var _allCitiesCache = null;
13587
+ function getAllCitiesCached() {
13588
+ if (!_allCitiesCache) {
13589
+ const countryMap = new Map(Country3.getAllCountries().map((c) => [c.isoCode, c.name]));
13590
+ const stateMap = new Map(State2.getAllStates().map((s2) => [`${s2.countryCode}:${s2.isoCode}`, s2.name]));
13591
+ _allCitiesCache = City2.getAllCities().map((city) => ({
13592
+ ...city,
13593
+ cityCode: city.name.slice(0, 3),
13594
+ countryName: countryMap.get(city.countryCode) ?? "",
13595
+ stateName: stateMap.get(`${city.countryCode}:${city.stateCode}`) ?? ""
13596
+ }));
13597
+ }
13598
+ return _allCitiesCache;
13599
+ }
13570
13600
  function getAllCountries2() {
13571
- return Country3.getAllCountries();
13601
+ return getAllCountriesCached();
13572
13602
  }
13573
13603
  function getCountryByCode(isoCode) {
13574
13604
  return Country3.getCountryByCode(isoCode) ?? void 0;
13575
13605
  }
13606
+ function getCountryByName(name, exact = false) {
13607
+ const q = name.toLowerCase();
13608
+ return getAllCountriesCached().find(
13609
+ (c) => exact ? c.name.toLowerCase() === q : c.name.toLowerCase().includes(q)
13610
+ );
13611
+ }
13612
+ function getCountriesByName(name, exact = false) {
13613
+ const q = name.toLowerCase();
13614
+ return getAllCountriesCached().filter(
13615
+ (c) => exact ? c.name.toLowerCase() === q : c.name.toLowerCase().includes(q)
13616
+ );
13617
+ }
13576
13618
  function getStatesOfCountry(countryCode) {
13577
13619
  const countryName = Country3.getCountryByCode(countryCode)?.name ?? "";
13578
13620
  return State2.getStatesOfCountry(countryCode).map((state) => ({
@@ -13586,6 +13628,18 @@ function getStateByCode(stateCode, countryCode) {
13586
13628
  const countryName = Country3.getCountryByCode(countryCode)?.name ?? "";
13587
13629
  return { ...state, countryName };
13588
13630
  }
13631
+ function getStateByName(name, exact = false) {
13632
+ const q = name.toLowerCase();
13633
+ return getAllStatesCached().find(
13634
+ (s2) => exact ? s2.name.toLowerCase() === q : s2.name.toLowerCase().includes(q)
13635
+ );
13636
+ }
13637
+ function getStatesByName(name, exact = false) {
13638
+ const q = name.toLowerCase();
13639
+ return getAllStatesCached().filter(
13640
+ (s2) => exact ? s2.name.toLowerCase() === q : s2.name.toLowerCase().includes(q)
13641
+ );
13642
+ }
13589
13643
  function getCitiesOfState(countryCode, stateCode) {
13590
13644
  const countryName = Country3.getCountryByCode(countryCode)?.name ?? "";
13591
13645
  const stateName = State2.getStateByCodeAndCountry(stateCode, countryCode)?.name ?? "";
@@ -13606,6 +13660,67 @@ function getCitiesOfCountry(countryCode) {
13606
13660
  stateName: stateNameMap.get(city.stateCode) ?? ""
13607
13661
  }));
13608
13662
  }
13663
+ function getCityByName(name, exact = false) {
13664
+ const q = name.toLowerCase();
13665
+ return getAllCitiesCached().find(
13666
+ (c) => exact ? c.name.toLowerCase() === q : c.name.toLowerCase().includes(q)
13667
+ );
13668
+ }
13669
+ function getCitiesByName(name, exact = false) {
13670
+ const q = name.toLowerCase();
13671
+ return getAllCitiesCached().filter(
13672
+ (c) => exact ? c.name.toLowerCase() === q : c.name.toLowerCase().includes(q)
13673
+ );
13674
+ }
13675
+
13676
+ // lib/utils/useLocationSearch.ts
13677
+ import { useState as useState36, useEffect as useEffect31, useRef as useRef34, useCallback as useCallback17 } from "react";
13678
+ function useDebounced(searcher, debounceMs) {
13679
+ const [query, setQuery] = useState36("");
13680
+ const [results, setResults] = useState36([]);
13681
+ const timer = useRef34(null);
13682
+ useEffect31(() => () => {
13683
+ if (timer.current) clearTimeout(timer.current);
13684
+ }, []);
13685
+ const search = useCallback17((name) => {
13686
+ setQuery(name);
13687
+ if (timer.current) clearTimeout(timer.current);
13688
+ if (!name.trim()) {
13689
+ setResults([]);
13690
+ return;
13691
+ }
13692
+ timer.current = setTimeout(() => {
13693
+ setResults(searcher(name));
13694
+ }, debounceMs);
13695
+ }, [searcher, debounceMs]);
13696
+ const clear = useCallback17(() => {
13697
+ if (timer.current) clearTimeout(timer.current);
13698
+ setQuery("");
13699
+ setResults([]);
13700
+ }, []);
13701
+ return { results, query, search, clear };
13702
+ }
13703
+ function useCountriesSearch(debounceMs = 300) {
13704
+ const searcher = useCallback17(
13705
+ (q) => getCountriesByName(q),
13706
+ []
13707
+ );
13708
+ return useDebounced(searcher, debounceMs);
13709
+ }
13710
+ function useStatesSearch(debounceMs = 300) {
13711
+ const searcher = useCallback17(
13712
+ (q) => getStatesByName(q),
13713
+ []
13714
+ );
13715
+ return useDebounced(searcher, debounceMs);
13716
+ }
13717
+ function useCitiesSearch(debounceMs = 300) {
13718
+ const searcher = useCallback17(
13719
+ (q) => getCitiesByName(q),
13720
+ []
13721
+ );
13722
+ return useDebounced(searcher, debounceMs);
13723
+ }
13609
13724
  export {
13610
13725
  APP_THEMES,
13611
13726
  Accordion,
@@ -13747,11 +13862,20 @@ export {
13747
13862
  workItemIcon_default as WorkItemIcon,
13748
13863
  Zoom,
13749
13864
  getAllCountries2 as getAllCountries,
13865
+ getCitiesByName,
13750
13866
  getCitiesOfCountry,
13751
13867
  getCitiesOfState,
13868
+ getCityByName,
13869
+ getCountriesByName,
13752
13870
  getCountryByCode,
13871
+ getCountryByName,
13753
13872
  getStateByCode,
13873
+ getStateByName,
13874
+ getStatesByName,
13754
13875
  getStatesOfCountry,
13755
13876
  transformLegacyTodos,
13756
- useRufousTheme
13877
+ useCitiesSearch,
13878
+ useCountriesSearch,
13879
+ useRufousTheme,
13880
+ useStatesSearch
13757
13881
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rufous/ui",
3
3
  "private": false,
4
- "version": "0.3.19",
4
+ "version": "0.3.20",
5
5
  "type": "module",
6
6
  "description": "Experimental: A lightweight React UI component library (Beta)",
7
7
  "style": "./dist/main.css",