react-native-magic-tab-bar 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,6 +14,16 @@ function hrefToPath(href) {
14
14
  return typeof pathname === 'string' ? pathname : '';
15
15
  }
16
16
 
17
+ /**
18
+ * Removes Expo Router group segments (`(group)`) from a path so hrefs match
19
+ * `usePathname()`. Groups are organizational and never appear in the URL, so
20
+ * `href: "/(home)/expenses"` must compare against a pathname of `/expenses`.
21
+ * Collapses any doubled or trailing slashes and falls back to `/` for root.
22
+ */
23
+ function stripGroupSegments(path) {
24
+ return path.replace(/\/\([^/)]+\)/g, '').replace(/\/{2,}/g, '/').replace(/(.)\/$/, '$1') || '/';
25
+ }
26
+
17
27
  /**
18
28
  * Finds the tab whose `href` best matches the current path, by longest prefix
19
29
  * so nested routes (e.g. `/explore/details`) still resolve to their tab.
@@ -21,10 +31,12 @@ function hrefToPath(href) {
21
31
  function findActiveTab(tabs, pathname) {
22
32
  let best;
23
33
  let bestLen = -1;
34
+ const currentPath = stripGroupSegments(pathname);
24
35
  for (const tab of tabs) {
25
- const path = hrefToPath(tab.href);
26
- if (!path) continue;
27
- const matches = path === '/' ? pathname === '/' : pathname === path || pathname.startsWith(`${path}/`);
36
+ const rawPath = hrefToPath(tab.href);
37
+ if (!rawPath) continue;
38
+ const path = stripGroupSegments(rawPath);
39
+ const matches = path === '/' ? currentPath === '/' : currentPath === path || currentPath.startsWith(`${path}/`);
28
40
  if (matches && path.length > bestLen) {
29
41
  best = tab;
30
42
  bestLen = path.length;
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","Tabs","TabList","TabSlot","TabTrigger","usePathname","MagicTabBar","MagicTabItem","defaultTheme","jsx","_jsx","jsxs","_jsxs","hrefToPath","href","pathname","findActiveTab","tabs","best","bestLen","tab","path","matches","startsWith","length","resolveLabelMode","showLabels","labelPosition","mode","__DEV__","console","warn","MagicTabs","theme","themeOverride","isLight","lightBottomMargin","variant","isTransparent","transparency","glass","renderBackground","haptics","onTabPress","onTabLongPress","barLabelMode","activeTab","effectiveLight","children","asChild","map","labelMode","showLabel","undefined","name","icon","label","badge","disabled"],"sourceRoot":"../../src","sources":["MagicTabs.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useMemo","Tabs","TabList","TabSlot","TabTrigger","usePathname","MagicTabBar","MagicTabItem","defaultTheme","jsx","_jsx","jsxs","_jsxs","hrefToPath","href","pathname","stripGroupSegments","path","replace","findActiveTab","tabs","best","bestLen","currentPath","tab","rawPath","matches","startsWith","length","resolveLabelMode","showLabels","labelPosition","mode","__DEV__","console","warn","MagicTabs","theme","themeOverride","isLight","lightBottomMargin","variant","isTransparent","transparency","glass","renderBackground","haptics","onTabPress","onTabLongPress","barLabelMode","activeTab","effectiveLight","children","asChild","map","labelMode","showLabel","undefined","name","icon","label","badge","disabled"],"sourceRoot":"../../src","sources":["MagicTabs.tsx"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"MagicTabs.d.ts","sourceRoot":"","sources":["../../src/MagicTabs.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAOhD,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACrB,MAAM,SAAS,CAAC;AA+DjB,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAClC;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC;IACtC,kEAAkE;IAClE,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,SAAS,CAAC;IACnC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,2CAA2C;IAC3C,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACvC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,KAAK,EAAE,aAAa,EACpB,UAAiB,EACjB,aAAuB,EACvB,OAAe,EACf,iBAAiB,EACjB,OAAO,EACP,aAAa,EACb,YAAY,EACZ,KAAK,EACL,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,cAAc,GACf,EAAE,cAAc,+BAkEhB"}
1
+ {"version":3,"file":"MagicTabs.d.ts","sourceRoot":"","sources":["../../src/MagicTabs.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAOhD,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACrB,MAAM,SAAS,CAAC;AAgFjB,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAClC;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC;IACtC,kEAAkE;IAClE,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,SAAS,CAAC;IACnC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,2CAA2C;IAC3C,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACvC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,KAAK,EAAE,aAAa,EACpB,UAAiB,EACjB,aAAuB,EACvB,OAAe,EACf,iBAAiB,EACjB,OAAO,EACP,aAAa,EACb,YAAY,EACZ,KAAK,EACL,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,cAAc,GACf,EAAE,cAAc,+BAkEhB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-magic-tab-bar",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Customizable floating tab bar for Expo Router (SDK 56+). Bring your own icons and labels.",
5
5
  "workspaces": [
6
6
  "example"
package/src/MagicTabs.tsx CHANGED
@@ -23,6 +23,21 @@ function hrefToPath(href: Href): string {
23
23
  return typeof pathname === 'string' ? pathname : '';
24
24
  }
25
25
 
26
+ /**
27
+ * Removes Expo Router group segments (`(group)`) from a path so hrefs match
28
+ * `usePathname()`. Groups are organizational and never appear in the URL, so
29
+ * `href: "/(home)/expenses"` must compare against a pathname of `/expenses`.
30
+ * Collapses any doubled or trailing slashes and falls back to `/` for root.
31
+ */
32
+ function stripGroupSegments(path: string): string {
33
+ return (
34
+ path
35
+ .replace(/\/\([^/)]+\)/g, '')
36
+ .replace(/\/{2,}/g, '/')
37
+ .replace(/(.)\/$/, '$1') || '/'
38
+ );
39
+ }
40
+
26
41
  /**
27
42
  * Finds the tab whose `href` best matches the current path, by longest prefix
28
43
  * so nested routes (e.g. `/explore/details`) still resolve to their tab.
@@ -33,13 +48,15 @@ function findActiveTab(
33
48
  ): MagicTabConfig | undefined {
34
49
  let best: MagicTabConfig | undefined;
35
50
  let bestLen = -1;
51
+ const currentPath = stripGroupSegments(pathname);
36
52
  for (const tab of tabs) {
37
- const path = hrefToPath(tab.href);
38
- if (!path) continue;
53
+ const rawPath = hrefToPath(tab.href);
54
+ if (!rawPath) continue;
55
+ const path = stripGroupSegments(rawPath);
39
56
  const matches =
40
57
  path === '/'
41
- ? pathname === '/'
42
- : pathname === path || pathname.startsWith(`${path}/`);
58
+ ? currentPath === '/'
59
+ : currentPath === path || currentPath.startsWith(`${path}/`);
43
60
  if (matches && path.length > bestLen) {
44
61
  best = tab;
45
62
  bestLen = path.length;