@tomny-dev/uzi 0.2.5 → 0.2.6

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.
Files changed (182) hide show
  1. package/dist/index.cjs +65 -1925
  2. package/dist/index.js +24 -1857
  3. package/dist/index10.cjs +26 -0
  4. package/dist/index10.cjs.map +1 -0
  5. package/dist/index10.js +19 -0
  6. package/dist/index10.js.map +1 -0
  7. package/dist/index11.cjs +22 -0
  8. package/dist/index11.cjs.map +1 -0
  9. package/dist/index11.js +22 -0
  10. package/dist/index11.js.map +1 -0
  11. package/dist/index12.cjs +22 -0
  12. package/dist/index12.cjs.map +1 -0
  13. package/dist/index12.js +41 -0
  14. package/dist/index12.js.map +1 -0
  15. package/dist/index13.cjs +56 -0
  16. package/dist/index13.cjs.map +1 -0
  17. package/dist/index13.js +84 -0
  18. package/dist/index13.js.map +1 -0
  19. package/dist/index14.cjs +87 -0
  20. package/dist/index14.cjs.map +1 -0
  21. package/dist/index14.js +17 -0
  22. package/dist/index14.js.map +1 -0
  23. package/dist/index15.cjs +22 -0
  24. package/dist/index15.cjs.map +1 -0
  25. package/dist/index15.js +16 -0
  26. package/dist/index15.js.map +1 -0
  27. package/dist/index16.cjs +16 -0
  28. package/dist/index16.cjs.map +1 -0
  29. package/dist/index16.js +45 -0
  30. package/dist/index16.js.map +1 -0
  31. package/dist/index17.cjs +64 -0
  32. package/dist/index17.cjs.map +1 -0
  33. package/dist/index17.js +435 -0
  34. package/dist/index17.js.map +1 -0
  35. package/dist/index18.cjs +438 -0
  36. package/dist/index18.cjs.map +1 -0
  37. package/dist/index18.js +7 -0
  38. package/dist/index18.js.map +1 -0
  39. package/dist/index19.cjs +8 -0
  40. package/dist/index19.cjs.map +1 -0
  41. package/dist/index19.js +18 -0
  42. package/dist/index19.js.map +1 -0
  43. package/dist/index2.cjs +23 -0
  44. package/dist/index20.cjs +20 -0
  45. package/dist/index20.cjs.map +1 -0
  46. package/dist/index20.js +7 -0
  47. package/dist/index20.js.map +1 -0
  48. package/dist/index21.cjs +8 -0
  49. package/dist/index21.cjs.map +1 -0
  50. package/dist/index21.js +15 -0
  51. package/dist/index21.js.map +1 -0
  52. package/dist/index22.cjs +17 -0
  53. package/dist/index22.cjs.map +1 -0
  54. package/dist/index22.js +7 -0
  55. package/dist/index22.js.map +1 -0
  56. package/dist/index23.cjs +8 -0
  57. package/dist/index23.cjs.map +1 -0
  58. package/dist/index23.js +18 -0
  59. package/dist/index23.js.map +1 -0
  60. package/dist/index24.cjs +20 -0
  61. package/dist/index24.cjs.map +1 -0
  62. package/dist/index24.js +41 -0
  63. package/dist/index24.js.map +1 -0
  64. package/dist/index25.cjs +58 -0
  65. package/dist/index25.cjs.map +1 -0
  66. package/dist/index25.js +123 -0
  67. package/dist/index25.js.map +1 -0
  68. package/dist/index26.cjs +126 -0
  69. package/dist/index26.cjs.map +1 -0
  70. package/dist/index26.js +29 -0
  71. package/dist/index26.js.map +1 -0
  72. package/dist/index27.cjs +40 -0
  73. package/dist/index27.cjs.map +1 -0
  74. package/dist/index27.js +110 -0
  75. package/dist/index27.js.map +1 -0
  76. package/dist/index28.cjs +113 -0
  77. package/dist/index28.cjs.map +1 -0
  78. package/dist/index28.js +26 -0
  79. package/dist/index28.js.map +1 -0
  80. package/dist/index29.cjs +28 -0
  81. package/dist/index29.cjs.map +1 -0
  82. package/dist/index29.js +29 -0
  83. package/dist/index29.js.map +1 -0
  84. package/dist/index3.js +8 -0
  85. package/dist/index3.js.map +1 -0
  86. package/dist/index30.cjs +40 -0
  87. package/dist/index30.cjs.map +1 -0
  88. package/dist/index30.js +118 -0
  89. package/dist/index30.js.map +1 -0
  90. package/dist/index31.cjs +134 -0
  91. package/dist/index31.cjs.map +1 -0
  92. package/dist/index31.js +20 -0
  93. package/dist/index31.js.map +1 -0
  94. package/dist/index32.cjs +23 -0
  95. package/dist/index32.cjs.map +1 -0
  96. package/dist/index32.js +114 -0
  97. package/dist/index32.js.map +1 -0
  98. package/dist/index33.cjs +115 -0
  99. package/dist/index33.cjs.map +1 -0
  100. package/dist/index33.js +7 -0
  101. package/dist/index33.js.map +1 -0
  102. package/dist/index34.cjs +8 -0
  103. package/dist/index34.cjs.map +1 -0
  104. package/dist/index34.js +66 -0
  105. package/dist/index34.js.map +1 -0
  106. package/dist/index35.cjs +66 -0
  107. package/dist/index35.cjs.map +1 -0
  108. package/dist/index35.js +25 -0
  109. package/dist/index35.js.map +1 -0
  110. package/dist/index36.cjs +34 -0
  111. package/dist/index36.cjs.map +1 -0
  112. package/dist/index36.js +55 -0
  113. package/dist/index36.js.map +1 -0
  114. package/dist/index37.cjs +55 -0
  115. package/dist/index37.cjs.map +1 -0
  116. package/dist/index37.js +35 -0
  117. package/dist/index37.js.map +1 -0
  118. package/dist/index38.cjs +49 -0
  119. package/dist/index38.cjs.map +1 -0
  120. package/dist/index38.js +150 -0
  121. package/dist/index38.js.map +1 -0
  122. package/dist/index39.cjs +150 -0
  123. package/dist/index39.cjs.map +1 -0
  124. package/dist/index39.js +43 -0
  125. package/dist/index39.js.map +1 -0
  126. package/dist/index4.cjs +8 -0
  127. package/dist/index4.cjs.map +1 -0
  128. package/dist/index4.js +29 -0
  129. package/dist/index4.js.map +1 -0
  130. package/dist/index40.cjs +61 -0
  131. package/dist/index40.cjs.map +1 -0
  132. package/dist/index40.js +173 -0
  133. package/dist/index40.js.map +1 -0
  134. package/dist/index41.cjs +173 -0
  135. package/dist/index41.cjs.map +1 -0
  136. package/dist/index41.js +14 -0
  137. package/dist/index41.js.map +1 -0
  138. package/dist/index42.cjs +15 -0
  139. package/dist/index42.cjs.map +1 -0
  140. package/dist/index42.js +21 -0
  141. package/dist/index42.js.map +1 -0
  142. package/dist/index43.cjs +21 -0
  143. package/dist/index43.cjs.map +1 -0
  144. package/dist/index43.js +15 -0
  145. package/dist/index43.js.map +1 -0
  146. package/dist/index44.cjs +17 -0
  147. package/dist/index44.cjs.map +1 -0
  148. package/dist/index44.js +24 -0
  149. package/dist/index44.js.map +1 -0
  150. package/dist/index45.cjs +24 -0
  151. package/dist/index45.cjs.map +1 -0
  152. package/dist/index45.js +13 -0
  153. package/dist/index45.js.map +1 -0
  154. package/dist/index46.cjs +16 -0
  155. package/dist/index46.cjs.map +1 -0
  156. package/dist/index46.js +96 -0
  157. package/dist/index46.js.map +1 -0
  158. package/dist/index47.cjs +98 -0
  159. package/dist/index47.cjs.map +1 -0
  160. package/dist/index5.cjs +40 -0
  161. package/dist/index5.cjs.map +1 -0
  162. package/dist/index5.js +45 -0
  163. package/dist/index5.js.map +1 -0
  164. package/dist/index6.cjs +47 -0
  165. package/dist/index6.cjs.map +1 -0
  166. package/dist/index6.js +17 -0
  167. package/dist/index6.js.map +1 -0
  168. package/dist/index7.cjs +20 -0
  169. package/dist/index7.cjs.map +1 -0
  170. package/dist/index7.js +30 -0
  171. package/dist/index7.js.map +1 -0
  172. package/dist/index8.cjs +35 -0
  173. package/dist/index8.cjs.map +1 -0
  174. package/dist/index8.js +18 -0
  175. package/dist/index8.js.map +1 -0
  176. package/dist/index9.cjs +20 -0
  177. package/dist/index9.cjs.map +1 -0
  178. package/dist/index9.js +26 -0
  179. package/dist/index9.js.map +1 -0
  180. package/package.json +1 -1
  181. package/dist/index.cjs.map +0 -1
  182. package/dist/index.js.map +0 -1
@@ -0,0 +1,173 @@
1
+ "use client";
2
+ const require_cx = require("./index4.cjs");
3
+ const require_sidebar_nav_module = require("./index40.cjs");
4
+ let react = require("react");
5
+ let react_jsx_runtime = require("react/jsx-runtime");
6
+ //#region src/components/sidebar-nav/SidebarNav.tsx
7
+ var isActivePrefix = (item, path) => {
8
+ if (item.active !== void 0) return item.active;
9
+ if (!item.href) return false;
10
+ if (!path) return false;
11
+ if (item.href === "/") return path === "/";
12
+ return path.startsWith(item.href);
13
+ };
14
+ var isActiveExact = (item, path) => {
15
+ if (item.active !== void 0) return item.active;
16
+ if (!item.href) return false;
17
+ if (!path) return false;
18
+ if (item.href === "/") return path === "/";
19
+ const normalizedHref = item.href.endsWith("/") ? item.href.slice(0, -1) : item.href;
20
+ return normalizedHref === path || path.startsWith(`${normalizedHref}/`);
21
+ };
22
+ var isNaturalPrefixMatch = (href, path) => {
23
+ if (href === "/") return path === "/";
24
+ return path.startsWith(href);
25
+ };
26
+ var isNaturalExactMatch = (href, path) => {
27
+ if (href === "/") return path === "/";
28
+ return (href.endsWith("/") ? href.slice(0, -1) : href) === path;
29
+ };
30
+ var hrefLength = (href) => href.endsWith("/") ? href.length - 1 : href.length;
31
+ var findMostSpecific = (items, currentPath) => {
32
+ const result = /* @__PURE__ */ new Set();
33
+ if (!currentPath) return result;
34
+ const matchingItems = items.filter((item) => {
35
+ if (item.disabled || !item.href) return false;
36
+ return item.exact ? isNaturalExactMatch(item.href, currentPath) : isNaturalPrefixMatch(item.href, currentPath);
37
+ });
38
+ if (matchingItems.length === 0) return result;
39
+ let maxLen = 0;
40
+ for (const item of matchingItems) {
41
+ if (!item.href) continue;
42
+ const len = hrefLength(item.href);
43
+ if (len > maxLen) maxLen = len;
44
+ }
45
+ for (const item of matchingItems) {
46
+ if (!item.href) continue;
47
+ if (hrefLength(item.href) === maxLen) result.add(item.href);
48
+ }
49
+ return result;
50
+ };
51
+ function SidebarNav({ items = [], sections, currentPath, getIsActive, matchStrategy = "prefix", onItemClick, header, footer, ariaLabel = "Sidebar navigation", collapsed = false, iconSize, className, itemClassName, sectionClassName }) {
52
+ const resolvedSections = (0, react.useMemo)(() => {
53
+ return sections?.length ? sections : [{
54
+ id: "default",
55
+ items
56
+ }];
57
+ }, [sections, items]);
58
+ const allItems = (0, react.useMemo)(() => resolvedSections.flatMap((section) => section.items), [resolvedSections]);
59
+ const defaultIsActiveFn = (0, react.useMemo)(() => {
60
+ if (matchStrategy === "most-specific") {
61
+ const mostSpecificHrefs = findMostSpecific(allItems, currentPath);
62
+ return (item) => {
63
+ if (item.active !== void 0) return item.active;
64
+ if (!item.href) return false;
65
+ return mostSpecificHrefs.has(item.href);
66
+ };
67
+ } else return (item, path) => {
68
+ if (item.active !== void 0) return item.active;
69
+ if (item.exact) return isActiveExact(item, path);
70
+ return isActivePrefix(item, path);
71
+ };
72
+ }, [
73
+ matchStrategy,
74
+ allItems,
75
+ currentPath
76
+ ]);
77
+ const resolvedGetIsActive = getIsActive ?? defaultIsActiveFn;
78
+ const style = iconSize !== void 0 ? { ["--sidebar-nav-icon-size"]: typeof iconSize === "number" ? `${iconSize}px` : iconSize } : void 0;
79
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("nav", {
80
+ className: require_cx.cx(require_sidebar_nav_module.default.sidebarNav, collapsed && require_sidebar_nav_module.default.sidebarNavCollapsed, className),
81
+ "aria-label": ariaLabel,
82
+ style,
83
+ children: [
84
+ header ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
85
+ className: require_sidebar_nav_module.default.header,
86
+ children: header
87
+ }) : null,
88
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
89
+ className: require_sidebar_nav_module.default.sections,
90
+ children: resolvedSections.map((section, sectionIndex) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
91
+ className: require_cx.cx(require_sidebar_nav_module.default.section, sectionClassName),
92
+ children: [section.label && !collapsed ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
93
+ className: require_sidebar_nav_module.default.sectionLabel,
94
+ children: section.label
95
+ }) : null, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
96
+ className: require_sidebar_nav_module.default.sectionItems,
97
+ children: section.items.map((item, itemIndex) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarNavEntry, {
98
+ item,
99
+ active: resolvedGetIsActive(item, currentPath),
100
+ collapsed,
101
+ itemClassName,
102
+ onItemClick
103
+ }, `${section.id ?? sectionIndex}-${item.href ?? item.title ?? itemIndex}`))
104
+ })]
105
+ }, section.id ?? `section-${sectionIndex}`))
106
+ }),
107
+ footer ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
108
+ className: require_sidebar_nav_module.default.footer,
109
+ children: footer
110
+ }) : null
111
+ ]
112
+ });
113
+ }
114
+ function SidebarNavEntry({ item, active, collapsed, itemClassName, onItemClick }) {
115
+ const rel = item.rel ?? (item.target === "_blank" ? "noreferrer" : void 0);
116
+ const title = item.title ?? (typeof item.label === "string" ? item.label : void 0);
117
+ const classes = require_cx.cx(require_sidebar_nav_module.default.item, active && require_sidebar_nav_module.default.itemActive, collapsed && require_sidebar_nav_module.default.itemCollapsed, item.disabled && require_sidebar_nav_module.default.itemDisabled, itemClassName);
118
+ const content = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [item.icon && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
119
+ className: require_sidebar_nav_module.default.icon,
120
+ children: item.icon
121
+ }), !collapsed ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
122
+ className: require_sidebar_nav_module.default.itemBody,
123
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
124
+ className: require_sidebar_nav_module.default.labelRow,
125
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
126
+ className: require_sidebar_nav_module.default.label,
127
+ children: item.label
128
+ }), item.badge && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
129
+ className: require_sidebar_nav_module.default.badge,
130
+ children: item.badge
131
+ })]
132
+ }), item.description ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
133
+ className: require_sidebar_nav_module.default.description,
134
+ children: item.description
135
+ }) : null]
136
+ }) : null] });
137
+ const handleClick = () => {
138
+ if (item.disabled) return;
139
+ item.onClick?.();
140
+ onItemClick?.(item);
141
+ };
142
+ if (!item.href) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
143
+ type: "button",
144
+ className: classes,
145
+ "aria-current": active ? "page" : void 0,
146
+ "aria-disabled": item.disabled ? "true" : void 0,
147
+ disabled: item.disabled,
148
+ title: collapsed ? title : void 0,
149
+ onClick: handleClick,
150
+ children: content
151
+ });
152
+ if (item.disabled) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
153
+ className: classes,
154
+ "aria-current": active ? "page" : void 0,
155
+ "aria-disabled": "true",
156
+ title: collapsed ? title : void 0,
157
+ children: content
158
+ });
159
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
160
+ className: classes,
161
+ href: item.href,
162
+ target: item.target,
163
+ rel,
164
+ "aria-current": active ? "page" : void 0,
165
+ title: collapsed ? title : void 0,
166
+ onClick: handleClick,
167
+ children: content
168
+ });
169
+ }
170
+ //#endregion
171
+ exports.SidebarNav = SidebarNav;
172
+
173
+ //# sourceMappingURL=index41.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index41.cjs","names":[],"sources":["../src/components/sidebar-nav/SidebarNav.tsx"],"sourcesContent":["\"use client\";\n\nimport { type AnchorHTMLAttributes, type CSSProperties, type ReactNode, useMemo } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./sidebar-nav.module.css\";\n\nexport type SidebarNavItem = {\n label: string;\n href?: string;\n icon?: ReactNode;\n description?: ReactNode;\n badge?: ReactNode;\n active?: boolean;\n disabled?: boolean;\n /**\n * When `true`, this item uses exact matching (matches its own path and paths starting with `{href}/`)\n * instead of prefix matching. This flag takes precedence over the global `matchStrategy` prop on a\n * per-item basis — even when `matchStrategy=\"prefix\"`, an item with `exact: true` will use exact matching.\n * When `matchStrategy=\"most-specific\"`, exact-flagged items participate in the length-based tiebreaker\n * like all other candidates, provided they pass their own match check first.\n */\n exact?: boolean;\n title?: string;\n target?: AnchorHTMLAttributes<HTMLAnchorElement>[\"target\"];\n rel?: AnchorHTMLAttributes<HTMLAnchorElement>[\"rel\"];\n onClick?: () => void;\n};\n\nexport type SidebarNavSection = {\n id?: string;\n label?: ReactNode;\n items: SidebarNavItem[];\n};\n\nexport type SidebarNavProps = {\n items?: SidebarNavItem[];\n sections?: SidebarNavSection[];\n currentPath?: string;\n getIsActive?: (item: SidebarNavItem, currentPath?: string) => boolean;\n matchStrategy?: \"prefix\" | \"most-specific\";\n onItemClick?: (item: SidebarNavItem) => void;\n header?: ReactNode;\n footer?: ReactNode;\n ariaLabel?: string;\n collapsed?: boolean;\n iconSize?: number | string;\n className?: string;\n itemClassName?: string;\n sectionClassName?: string;\n};\n\nconst isActivePrefix = (item: SidebarNavItem, path?: string) => {\n if (item.active !== undefined) return item.active;\n if (!item.href) return false;\n if (!path) return false;\n if (item.href === \"/\") return path === \"/\";\n return path.startsWith(item.href);\n};\n\nconst isActiveExact = (item: SidebarNavItem, path?: string) => {\n if (item.active !== undefined) return item.active;\n if (!item.href) return false;\n if (!path) return false;\n // Root href \"/\" must match exactly — otherwise every path would match.\n if (item.href === \"/\") return path === \"/\";\n // Normalize trailing slashes for consistent matching with findMostSpecific length computation.\n const normalizedHref = item.href.endsWith(\"/\") ? item.href.slice(0, -1) : item.href;\n return normalizedHref === path || path.startsWith(`${normalizedHref}/`);\n};\n\n// Natural matching helpers that ignore manual `active` overrides — used inside findMostSpecific\n// so that manually-set active flags don't hijack the length-based tiebreaker.\nconst isNaturalPrefixMatch = (href: string, path: string) => {\n if (href === \"/\") return path === \"/\";\n return path.startsWith(href);\n};\n\nconst isNaturalExactMatch = (href: string, path: string) => {\n if (href === \"/\") return path === \"/\";\n const normalizedHref = href.endsWith(\"/\") ? href.slice(0, -1) : href;\n return normalizedHref === path;\n};\n\nconst hrefLength = (href: string) => (href.endsWith(\"/\") ? href.length - 1 : href.length);\n\nconst findMostSpecific = (items: SidebarNavItem[], currentPath?: string): Set<string> => {\n const result = new Set<string>();\n if (!currentPath) return result;\n\n // Collect all items that naturally match the path — use natural matching helpers so that\n // manually-set `active` flags don't participate in the length-based tiebreaker.\n // Exclude disabled items from matching since they are not interactive targets.\n const matchingItems = items.filter(item => {\n if (item.disabled || !item.href) return false;\n return item.exact\n ? isNaturalExactMatch(item.href, currentPath)\n : isNaturalPrefixMatch(item.href, currentPath);\n });\n\n if (matchingItems.length === 0) return result;\n\n // Find the longest href among prefix matches.\n let maxLen = 0;\n for (const item of matchingItems) {\n if (!item.href) continue;\n const len = hrefLength(item.href);\n if (len > maxLen) maxLen = len;\n }\n\n // Only the items with the longest href are active.\n for (const item of matchingItems) {\n if (!item.href) continue;\n if (hrefLength(item.href) === maxLen) result.add(item.href);\n }\n\n return result;\n};\n\nexport function SidebarNav({\n items = [],\n sections,\n currentPath,\n getIsActive,\n matchStrategy = \"prefix\",\n onItemClick,\n header,\n footer,\n ariaLabel = \"Sidebar navigation\",\n collapsed = false,\n iconSize,\n className,\n itemClassName,\n sectionClassName,\n}: SidebarNavProps) {\n const resolvedSections = useMemo(() => {\n return sections?.length ? sections : [{ id: \"default\", items }];\n }, [sections, items]);\n\n // Stable reference to all items — avoids recreating on every render when `sections` is falsy.\n const allItems = useMemo(() => resolvedSections.flatMap(section => section.items), [resolvedSections]);\n\n // Build the default isActive function based on matchStrategy.\n const defaultIsActiveFn = useMemo<(item: SidebarNavItem, path?: string) => boolean>(() => {\n if (matchStrategy === \"most-specific\") {\n const mostSpecificHrefs = findMostSpecific(allItems, currentPath);\n return (item: SidebarNavItem) => {\n if (item.active !== undefined) return item.active;\n if (!item.href) return false;\n // Exact-flagged items participate in the length-based tiebreaker like all other candidates.\n return mostSpecificHrefs.has(item.href);\n };\n } else {\n return (item: SidebarNavItem, path?: string) => {\n if (item.active !== undefined) return item.active;\n if (item.exact) return isActiveExact(item, path);\n return isActivePrefix(item, path);\n };\n }\n }, [matchStrategy, allItems, currentPath]);\n\n const resolvedGetIsActive = getIsActive ?? defaultIsActiveFn;\n\n const style =\n iconSize !== undefined\n ? ({\n [\"--sidebar-nav-icon-size\" as string]:\n typeof iconSize === \"number\" ? `${iconSize}px` : iconSize,\n } satisfies CSSProperties)\n : undefined;\n\n return (\n <nav\n className={cx(\n styles.sidebarNav,\n collapsed && styles.sidebarNavCollapsed,\n className,\n )}\n aria-label={ariaLabel}\n style={style}\n >\n {header ? <div className={styles.header}>{header}</div> : null}\n <div className={styles.sections}>\n {resolvedSections.map((section, sectionIndex) => (\n <div\n key={section.id ?? `section-${sectionIndex}`}\n className={cx(styles.section, sectionClassName)}\n >\n {section.label && !collapsed ? (\n <div className={styles.sectionLabel}>{section.label}</div>\n ) : null}\n <div className={styles.sectionItems}>\n {section.items.map((item, itemIndex) => (\n <SidebarNavEntry\n key={`${section.id ?? sectionIndex}-${item.href ?? item.title ?? itemIndex}`}\n item={item}\n active={resolvedGetIsActive(item, currentPath)}\n collapsed={collapsed}\n itemClassName={itemClassName}\n onItemClick={onItemClick}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n {footer ? <div className={styles.footer}>{footer}</div> : null}\n </nav>\n );\n}\n\ntype SidebarNavEntryProps = {\n item: SidebarNavItem;\n active: boolean;\n collapsed: boolean;\n itemClassName?: string;\n onItemClick?: (item: SidebarNavItem) => void;\n};\n\nfunction SidebarNavEntry({\n item,\n active,\n collapsed,\n itemClassName,\n onItemClick,\n}: SidebarNavEntryProps) {\n const rel = item.rel ?? (item.target === \"_blank\" ? \"noreferrer\" : undefined);\n const title = item.title ?? (typeof item.label === \"string\" ? item.label : undefined);\n const classes = cx(\n styles.item,\n active && styles.itemActive,\n collapsed && styles.itemCollapsed,\n item.disabled && styles.itemDisabled,\n itemClassName,\n );\n const content = (\n <>\n {item.icon && <span className={styles.icon}>{item.icon}</span>}\n {!collapsed ? (\n <span className={styles.itemBody}>\n <span className={styles.labelRow}>\n <span className={styles.label}>{item.label}</span>\n {item.badge && <span className={styles.badge}>{item.badge}</span>}\n </span>\n {item.description ? <span className={styles.description}>{item.description}</span> : null}\n </span>\n ) : null}\n </>\n );\n\n const handleClick = () => {\n if (item.disabled) return;\n item.onClick?.();\n onItemClick?.(item);\n };\n\n if (!item.href) {\n return (\n <button\n type=\"button\"\n className={classes}\n aria-current={active ? \"page\" : undefined}\n aria-disabled={item.disabled ? \"true\" : undefined}\n disabled={item.disabled}\n title={collapsed ? title : undefined}\n onClick={handleClick}\n >\n {content}\n </button>\n );\n }\n\n if (item.disabled) {\n return (\n <div\n className={classes}\n aria-current={active ? \"page\" : undefined}\n aria-disabled=\"true\"\n title={collapsed ? title : undefined}\n >\n {content}\n </div>\n );\n }\n\n return (\n <a\n className={classes}\n href={item.href}\n target={item.target}\n rel={rel}\n aria-current={active ? \"page\" : undefined}\n title={collapsed ? title : undefined}\n onClick={handleClick}\n >\n {content}\n </a>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ //#region src/components/skeleton/skeleton.module.css
2
+ var skeleton = "uzi-skeleton-module__skeleton__fula5";
3
+ var skeleton_module_default = {
4
+ skeleton,
5
+ "skeleton-pulse": "uzi-skeleton-module__skeleton-pulse__Yp45W",
6
+ "radius-sm": "uzi-skeleton-module__radius-sm__FdccD",
7
+ "radius-md": "uzi-skeleton-module__radius-md__zH3RE",
8
+ "radius-lg": "uzi-skeleton-module__radius-lg__YVrHw",
9
+ "radius-full": "uzi-skeleton-module__radius-full__5o2m0"
10
+ };
11
+ //#endregion
12
+ export { skeleton_module_default as default, skeleton };
13
+
14
+ //# sourceMappingURL=index41.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index41.js","names":[],"sources":["../src/components/skeleton/skeleton.module.css"],"sourcesContent":[".skeleton {\n background: color-mix(in srgb, var(--muted-foreground) 14%, var(--background));\n animation: skeleton-pulse 1.6s ease-in-out infinite;\n}\n\n@keyframes skeleton-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.45; }\n}\n\n.radius-sm { border-radius: 4px; }\n.radius-md { border-radius: 8px; }\n.radius-lg { border-radius: 12px; }\n.radius-full { border-radius: 9999px; }\n"],"mappings":""}
@@ -0,0 +1,15 @@
1
+ //#region src/components/skeleton/skeleton.module.css
2
+ var skeleton = "uzi-skeleton-module__skeleton__fula5";
3
+ var skeleton_module_default = {
4
+ skeleton,
5
+ "skeleton-pulse": "uzi-skeleton-module__skeleton-pulse__Yp45W",
6
+ "radius-sm": "uzi-skeleton-module__radius-sm__FdccD",
7
+ "radius-md": "uzi-skeleton-module__radius-md__zH3RE",
8
+ "radius-lg": "uzi-skeleton-module__radius-lg__YVrHw",
9
+ "radius-full": "uzi-skeleton-module__radius-full__5o2m0"
10
+ };
11
+ //#endregion
12
+ exports.default = skeleton_module_default;
13
+ exports.skeleton = skeleton;
14
+
15
+ //# sourceMappingURL=index42.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index42.cjs","names":[],"sources":["../src/components/skeleton/skeleton.module.css"],"sourcesContent":[".skeleton {\n background: color-mix(in srgb, var(--muted-foreground) 14%, var(--background));\n animation: skeleton-pulse 1.6s ease-in-out infinite;\n}\n\n@keyframes skeleton-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.45; }\n}\n\n.radius-sm { border-radius: 4px; }\n.radius-md { border-radius: 8px; }\n.radius-lg { border-radius: 12px; }\n.radius-full { border-radius: 9999px; }\n"],"mappings":""}
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ import { cx } from "./index3.js";
3
+ import skeleton_module_default from "./index41.js";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region src/components/skeleton/Skeleton.tsx
6
+ function Skeleton({ width, height, radius = "md", className, style, ...rest }) {
7
+ return /* @__PURE__ */ jsx("div", {
8
+ className: cx(skeleton_module_default.skeleton, skeleton_module_default[`radius-${radius}`], className),
9
+ style: {
10
+ width,
11
+ height,
12
+ ...style
13
+ },
14
+ "aria-hidden": "true",
15
+ ...rest
16
+ });
17
+ }
18
+ //#endregion
19
+ export { Skeleton };
20
+
21
+ //# sourceMappingURL=index42.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index42.js","names":[],"sources":["../src/components/skeleton/Skeleton.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HTMLAttributes } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./skeleton.module.css\";\n\nexport type SkeletonProps = HTMLAttributes<HTMLDivElement> & {\n /** Width as a CSS value. */\n width?: string;\n /** Height as a CSS value. */\n height?: string;\n /** Border radius preset. Defaults to \"md\". */\n radius?: \"sm\" | \"md\" | \"lg\" | \"full\";\n};\n\nexport function Skeleton({\n width,\n height,\n radius = \"md\",\n className,\n style,\n ...rest\n}: SkeletonProps) {\n return (\n <div\n className={cx(styles.skeleton, styles[`radius-${radius}`], className)}\n style={{ width, height, ...style }}\n aria-hidden=\"true\"\n {...rest}\n />\n );\n}\n"],"mappings":";;;;;AAeA,SAAgB,SAAS,EACvB,OACA,QACA,SAAS,MACT,WACA,OACA,GAAG,QACa;CAChB,OACE,oBAAC,OAAD;EACE,WAAW,GAAG,wBAAO,UAAU,wBAAO,UAAU,WAAW,SAAS;EACpE,OAAO;GAAE;GAAO;GAAQ,GAAG;EAAM;EACjC,eAAY;EACZ,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ const require_cx = require("./index4.cjs");
3
+ const require_skeleton_module = require("./index42.cjs");
4
+ let react_jsx_runtime = require("react/jsx-runtime");
5
+ //#region src/components/skeleton/Skeleton.tsx
6
+ function Skeleton({ width, height, radius = "md", className, style, ...rest }) {
7
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8
+ className: require_cx.cx(require_skeleton_module.default.skeleton, require_skeleton_module.default[`radius-${radius}`], className),
9
+ style: {
10
+ width,
11
+ height,
12
+ ...style
13
+ },
14
+ "aria-hidden": "true",
15
+ ...rest
16
+ });
17
+ }
18
+ //#endregion
19
+ exports.Skeleton = Skeleton;
20
+
21
+ //# sourceMappingURL=index43.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index43.cjs","names":[],"sources":["../src/components/skeleton/Skeleton.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HTMLAttributes } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./skeleton.module.css\";\n\nexport type SkeletonProps = HTMLAttributes<HTMLDivElement> & {\n /** Width as a CSS value. */\n width?: string;\n /** Height as a CSS value. */\n height?: string;\n /** Border radius preset. Defaults to \"md\". */\n radius?: \"sm\" | \"md\" | \"lg\" | \"full\";\n};\n\nexport function Skeleton({\n width,\n height,\n radius = \"md\",\n className,\n style,\n ...rest\n}: SkeletonProps) {\n return (\n <div\n className={cx(styles.skeleton, styles[`radius-${radius}`], className)}\n style={{ width, height, ...style }}\n aria-hidden=\"true\"\n {...rest}\n />\n );\n}\n"],"mappings":";;;;;AAeA,SAAgB,SAAS,EACvB,OACA,QACA,SAAS,MACT,WACA,OACA,GAAG,QACa;CAChB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,WAAW,WAAA,GAAG,wBAAA,QAAO,UAAU,wBAAA,QAAO,UAAU,WAAW,SAAS;EACpE,OAAO;GAAE;GAAO;GAAQ,GAAG;EAAM;EACjC,eAAY;EACZ,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,15 @@
1
+ //#region src/components/progress/progress.module.css
2
+ var track = "uzi-progress-module__track__gM0oV";
3
+ var fill = "uzi-progress-module__fill__aLAbp";
4
+ var progress_module_default = {
5
+ track,
6
+ fill,
7
+ "tone-default": "uzi-progress-module__tone-default__fhf7o",
8
+ "tone-success": "uzi-progress-module__tone-success__FsGHD",
9
+ "tone-warning": "uzi-progress-module__tone-warning__UAttL",
10
+ "tone-danger": "uzi-progress-module__tone-danger__-L-Ee"
11
+ };
12
+ //#endregion
13
+ export { progress_module_default as default, fill, track };
14
+
15
+ //# sourceMappingURL=index43.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index43.js","names":[],"sources":["../src/components/progress/progress.module.css"],"sourcesContent":[".track {\n height: 8px;\n border-radius: 9999px;\n overflow: hidden;\n background: color-mix(in srgb, var(--border) 60%, transparent);\n}\n\n.fill {\n height: 100%;\n border-radius: 9999px;\n transition: width 0.4s ease;\n}\n\n.tone-default { background: var(--foreground); }\n.tone-success { background: var(--success); }\n.tone-warning { background: var(--warning); }\n.tone-danger { background: var(--destructive); }\n"],"mappings":""}
@@ -0,0 +1,17 @@
1
+ //#region src/components/progress/progress.module.css
2
+ var track = "uzi-progress-module__track__gM0oV";
3
+ var fill = "uzi-progress-module__fill__aLAbp";
4
+ var progress_module_default = {
5
+ track,
6
+ fill,
7
+ "tone-default": "uzi-progress-module__tone-default__fhf7o",
8
+ "tone-success": "uzi-progress-module__tone-success__FsGHD",
9
+ "tone-warning": "uzi-progress-module__tone-warning__UAttL",
10
+ "tone-danger": "uzi-progress-module__tone-danger__-L-Ee"
11
+ };
12
+ //#endregion
13
+ exports.default = progress_module_default;
14
+ exports.fill = fill;
15
+ exports.track = track;
16
+
17
+ //# sourceMappingURL=index44.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index44.cjs","names":[],"sources":["../src/components/progress/progress.module.css"],"sourcesContent":[".track {\n height: 8px;\n border-radius: 9999px;\n overflow: hidden;\n background: color-mix(in srgb, var(--border) 60%, transparent);\n}\n\n.fill {\n height: 100%;\n border-radius: 9999px;\n transition: width 0.4s ease;\n}\n\n.tone-default { background: var(--foreground); }\n.tone-success { background: var(--success); }\n.tone-warning { background: var(--warning); }\n.tone-danger { background: var(--destructive); }\n"],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import { cx } from "./index3.js";
2
+ import progress_module_default from "./index43.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/components/progress/Progress.tsx
5
+ function Progress({ value, tone = "default", className, "aria-label": ariaLabel, ...rest }) {
6
+ const clamped = Math.max(0, Math.min(100, value));
7
+ return /* @__PURE__ */ jsx("div", {
8
+ className: cx(progress_module_default.track, className),
9
+ role: "progressbar",
10
+ "aria-valuenow": clamped,
11
+ "aria-valuemin": 0,
12
+ "aria-valuemax": 100,
13
+ "aria-label": ariaLabel,
14
+ ...rest,
15
+ children: /* @__PURE__ */ jsx("div", {
16
+ className: cx(progress_module_default.fill, progress_module_default[`tone-${tone}`]),
17
+ style: { width: `${clamped}%` }
18
+ })
19
+ });
20
+ }
21
+ //#endregion
22
+ export { Progress };
23
+
24
+ //# sourceMappingURL=index44.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index44.js","names":[],"sources":["../src/components/progress/Progress.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./progress.module.css\";\n\nexport type ProgressTone = \"default\" | \"success\" | \"warning\" | \"danger\";\n\nexport type ProgressProps = HTMLAttributes<HTMLDivElement> & {\n /** Value 0–100. */\n value: number;\n /** Visual tone. Defaults to \"default\". */\n tone?: ProgressTone;\n /** Accessible label. */\n \"aria-label\"?: string;\n};\n\nexport function Progress({\n value,\n tone = \"default\",\n className,\n \"aria-label\": ariaLabel,\n ...rest\n}: ProgressProps) {\n const clamped = Math.max(0, Math.min(100, value));\n return (\n <div\n className={cx(styles.track, className)}\n role=\"progressbar\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={ariaLabel}\n {...rest}\n >\n <div\n className={cx(styles.fill, styles[`tone-${tone}`])}\n style={{ width: `${clamped}%` }}\n />\n </div>\n );\n}\n"],"mappings":";;;;AAeA,SAAgB,SAAS,EACvB,OACA,OAAO,WACP,WACA,cAAc,WACd,GAAG,QACa;CAChB,MAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC;CAChD,OACE,oBAAC,OAAD;EACE,WAAW,GAAG,wBAAO,OAAO,SAAS;EACrC,MAAK;EACL,iBAAe;EACf,iBAAe;EACf,iBAAe;EACf,cAAY;EACZ,GAAI;YAEJ,oBAAC,OAAD;GACE,WAAW,GAAG,wBAAO,MAAM,wBAAO,QAAQ,OAAO;GACjD,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG;EAC/B,CAAA;CACE,CAAA;AAET"}
@@ -0,0 +1,24 @@
1
+ const require_cx = require("./index4.cjs");
2
+ const require_progress_module = require("./index44.cjs");
3
+ let react_jsx_runtime = require("react/jsx-runtime");
4
+ //#region src/components/progress/Progress.tsx
5
+ function Progress({ value, tone = "default", className, "aria-label": ariaLabel, ...rest }) {
6
+ const clamped = Math.max(0, Math.min(100, value));
7
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8
+ className: require_cx.cx(require_progress_module.default.track, className),
9
+ role: "progressbar",
10
+ "aria-valuenow": clamped,
11
+ "aria-valuemin": 0,
12
+ "aria-valuemax": 100,
13
+ "aria-label": ariaLabel,
14
+ ...rest,
15
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
16
+ className: require_cx.cx(require_progress_module.default.fill, require_progress_module.default[`tone-${tone}`]),
17
+ style: { width: `${clamped}%` }
18
+ })
19
+ });
20
+ }
21
+ //#endregion
22
+ exports.Progress = Progress;
23
+
24
+ //# sourceMappingURL=index45.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index45.cjs","names":[],"sources":["../src/components/progress/Progress.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./progress.module.css\";\n\nexport type ProgressTone = \"default\" | \"success\" | \"warning\" | \"danger\";\n\nexport type ProgressProps = HTMLAttributes<HTMLDivElement> & {\n /** Value 0–100. */\n value: number;\n /** Visual tone. Defaults to \"default\". */\n tone?: ProgressTone;\n /** Accessible label. */\n \"aria-label\"?: string;\n};\n\nexport function Progress({\n value,\n tone = \"default\",\n className,\n \"aria-label\": ariaLabel,\n ...rest\n}: ProgressProps) {\n const clamped = Math.max(0, Math.min(100, value));\n return (\n <div\n className={cx(styles.track, className)}\n role=\"progressbar\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={ariaLabel}\n {...rest}\n >\n <div\n className={cx(styles.fill, styles[`tone-${tone}`])}\n style={{ width: `${clamped}%` }}\n />\n </div>\n );\n}\n"],"mappings":";;;;AAeA,SAAgB,SAAS,EACvB,OACA,OAAO,WACP,WACA,cAAc,WACd,GAAG,QACa;CAChB,MAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC;CAChD,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,WAAW,WAAA,GAAG,wBAAA,QAAO,OAAO,SAAS;EACrC,MAAK;EACL,iBAAe;EACf,iBAAe;EACf,iBAAe;EACf,cAAY;EACZ,GAAI;YAEJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GACE,WAAW,WAAA,GAAG,wBAAA,QAAO,MAAM,wBAAA,QAAO,QAAQ,OAAO;GACjD,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG;EAC/B,CAAA;CACE,CAAA;AAET"}
@@ -0,0 +1,13 @@
1
+ //#region src/components/segmented-toggle/segmented-toggle.module.css
2
+ var track = "uzi-segmented-toggle-module__track__M4fjm";
3
+ var option = "uzi-segmented-toggle-module__option__7cEZJ";
4
+ var label = "uzi-segmented-toggle-module__label__bDAIv";
5
+ var segmented_toggle_module_default = {
6
+ track,
7
+ option,
8
+ label
9
+ };
10
+ //#endregion
11
+ export { segmented_toggle_module_default as default, label, option, track };
12
+
13
+ //# sourceMappingURL=index45.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index45.js","names":[],"sources":["../src/components/segmented-toggle/segmented-toggle.module.css"],"sourcesContent":[".track {\n display: inline-flex;\n border-radius: 999px;\n border: 1px solid var(--border);\n background: var(--card);\n padding: 4px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n gap: 2px;\n}\n\n.option {\n border-radius: 999px;\n padding: 6px 16px;\n font-size: var(--uzi-control-font-size);\n font-weight: 500;\n line-height: var(--uzi-control-line-height);\n background: transparent;\n color: var(--muted-foreground);\n border: none;\n cursor: pointer;\n transition:\n color 120ms ease,\n background 120ms ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n white-space: nowrap;\n}\n\n.label {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.option:hover:not([aria-checked=\"true\"]):not(:disabled) {\n color: var(--foreground);\n}\n\n.option[aria-checked=\"true\"] {\n background: var(--foreground);\n color: var(--background);\n}\n\n.option:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.option:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n"],"mappings":""}
@@ -0,0 +1,16 @@
1
+ //#region src/components/segmented-toggle/segmented-toggle.module.css
2
+ var track = "uzi-segmented-toggle-module__track__M4fjm";
3
+ var option = "uzi-segmented-toggle-module__option__7cEZJ";
4
+ var label = "uzi-segmented-toggle-module__label__bDAIv";
5
+ var segmented_toggle_module_default = {
6
+ track,
7
+ option,
8
+ label
9
+ };
10
+ //#endregion
11
+ exports.default = segmented_toggle_module_default;
12
+ exports.label = label;
13
+ exports.option = option;
14
+ exports.track = track;
15
+
16
+ //# sourceMappingURL=index46.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index46.cjs","names":[],"sources":["../src/components/segmented-toggle/segmented-toggle.module.css"],"sourcesContent":[".track {\n display: inline-flex;\n border-radius: 999px;\n border: 1px solid var(--border);\n background: var(--card);\n padding: 4px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n gap: 2px;\n}\n\n.option {\n border-radius: 999px;\n padding: 6px 16px;\n font-size: var(--uzi-control-font-size);\n font-weight: 500;\n line-height: var(--uzi-control-line-height);\n background: transparent;\n color: var(--muted-foreground);\n border: none;\n cursor: pointer;\n transition:\n color 120ms ease,\n background 120ms ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n white-space: nowrap;\n}\n\n.label {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.option:hover:not([aria-checked=\"true\"]):not(:disabled) {\n color: var(--foreground);\n}\n\n.option[aria-checked=\"true\"] {\n background: var(--foreground);\n color: var(--background);\n}\n\n.option:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.option:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n"],"mappings":""}
@@ -0,0 +1,96 @@
1
+ "use client";
2
+ import { cx } from "./index3.js";
3
+ import segmented_toggle_module_default from "./index45.js";
4
+ import * as React from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ //#region src/components/segmented-toggle/SegmentedToggle.tsx
7
+ function SegmentedToggle({ options, value, onChange, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, className }) {
8
+ const itemRefs = React.useRef([]);
9
+ const selectedIndex = options.findIndex((opt) => opt.value === value);
10
+ const fallbackIndex = options.findIndex((opt) => !opt.disabled);
11
+ let lastEnabledIndex = -1;
12
+ for (let index = options.length - 1; index >= 0; index -= 1) if (!options[index]?.disabled) {
13
+ lastEnabledIndex = index;
14
+ break;
15
+ }
16
+ const tabbableIndex = selectedIndex >= 0 && !options[selectedIndex]?.disabled ? selectedIndex : fallbackIndex;
17
+ const focusItem = (index) => {
18
+ itemRefs.current[index]?.focus();
19
+ };
20
+ const findEnabledIndex = (startIndex, direction) => {
21
+ if (options.length === 0) return -1;
22
+ let nextIndex = startIndex;
23
+ for (let i = 0; i < options.length; i += 1) {
24
+ nextIndex = (nextIndex + direction + options.length) % options.length;
25
+ if (!options[nextIndex]?.disabled) return nextIndex;
26
+ }
27
+ return startIndex;
28
+ };
29
+ const selectIndex = (index) => {
30
+ const nextOption = options[index];
31
+ if (!nextOption || nextOption.disabled || nextOption.value === value) return;
32
+ onChange(nextOption.value);
33
+ };
34
+ const handleKeyDown = (event, index) => {
35
+ switch (event.key) {
36
+ case "ArrowRight":
37
+ case "ArrowDown": {
38
+ event.preventDefault();
39
+ const nextIndex = findEnabledIndex(index, 1);
40
+ focusItem(nextIndex);
41
+ selectIndex(nextIndex);
42
+ break;
43
+ }
44
+ case "ArrowLeft":
45
+ case "ArrowUp": {
46
+ event.preventDefault();
47
+ const nextIndex = findEnabledIndex(index, -1);
48
+ focusItem(nextIndex);
49
+ selectIndex(nextIndex);
50
+ break;
51
+ }
52
+ case "Home":
53
+ event.preventDefault();
54
+ focusItem(fallbackIndex);
55
+ if (fallbackIndex >= 0) selectIndex(fallbackIndex);
56
+ break;
57
+ case "End":
58
+ event.preventDefault();
59
+ if (lastEnabledIndex >= 0) {
60
+ focusItem(lastEnabledIndex);
61
+ selectIndex(lastEnabledIndex);
62
+ }
63
+ break;
64
+ default: break;
65
+ }
66
+ };
67
+ return /* @__PURE__ */ jsx("div", {
68
+ className: cx(segmented_toggle_module_default.track, className),
69
+ role: "radiogroup",
70
+ "aria-label": ariaLabel,
71
+ "aria-labelledby": ariaLabelledBy,
72
+ children: options.map((opt, index) => /* @__PURE__ */ jsx("button", {
73
+ ref: (node) => {
74
+ itemRefs.current[index] = node;
75
+ },
76
+ type: "button",
77
+ role: "radio",
78
+ "aria-checked": opt.value === value,
79
+ disabled: opt.disabled,
80
+ tabIndex: opt.disabled ? -1 : index === tabbableIndex ? 0 : -1,
81
+ onClick: () => {
82
+ if (opt.value !== value) onChange(opt.value);
83
+ },
84
+ onKeyDown: (event) => handleKeyDown(event, index),
85
+ className: cx(segmented_toggle_module_default.option),
86
+ children: /* @__PURE__ */ jsx("span", {
87
+ className: segmented_toggle_module_default.label,
88
+ children: opt.label
89
+ })
90
+ }, opt.value))
91
+ });
92
+ }
93
+ //#endregion
94
+ export { SegmentedToggle };
95
+
96
+ //# sourceMappingURL=index46.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index46.js","names":[],"sources":["../src/components/segmented-toggle/SegmentedToggle.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./segmented-toggle.module.css\";\n\nexport type SegmentedToggleOption<T extends string = string> = {\n label: ReactNode;\n value: T;\n disabled?: boolean;\n};\n\nexport type SegmentedToggleProps<T extends string = string> = {\n options: SegmentedToggleOption<T>[];\n value: T;\n onChange: (value: T) => void;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n className?: string;\n};\n\nexport function SegmentedToggle<T extends string = string>({\n options,\n value,\n onChange,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n className,\n}: SegmentedToggleProps<T>) {\n const itemRefs = React.useRef<Array<HTMLButtonElement | null>>([]);\n const selectedIndex = options.findIndex((opt) => opt.value === value);\n const fallbackIndex = options.findIndex((opt) => !opt.disabled);\n let lastEnabledIndex = -1;\n for (let index = options.length - 1; index >= 0; index -= 1) {\n if (!options[index]?.disabled) {\n lastEnabledIndex = index;\n break;\n }\n }\n const tabbableIndex =\n selectedIndex >= 0 && !options[selectedIndex]?.disabled\n ? selectedIndex\n : fallbackIndex;\n\n const focusItem = (index: number) => {\n itemRefs.current[index]?.focus();\n };\n\n const findEnabledIndex = (\n startIndex: number,\n direction: 1 | -1,\n ): number => {\n if (options.length === 0) return -1;\n\n let nextIndex = startIndex;\n for (let i = 0; i < options.length; i += 1) {\n nextIndex = (nextIndex + direction + options.length) % options.length;\n if (!options[nextIndex]?.disabled) {\n return nextIndex;\n }\n }\n\n return startIndex;\n };\n\n const selectIndex = (index: number) => {\n const nextOption = options[index];\n if (!nextOption || nextOption.disabled || nextOption.value === value) {\n return;\n }\n onChange(nextOption.value);\n };\n\n const handleKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n index: number,\n ) => {\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowDown\": {\n event.preventDefault();\n const nextIndex = findEnabledIndex(index, 1);\n focusItem(nextIndex);\n selectIndex(nextIndex);\n break;\n }\n case \"ArrowLeft\":\n case \"ArrowUp\": {\n event.preventDefault();\n const nextIndex = findEnabledIndex(index, -1);\n focusItem(nextIndex);\n selectIndex(nextIndex);\n break;\n }\n case \"Home\": {\n event.preventDefault();\n focusItem(fallbackIndex);\n if (fallbackIndex >= 0) {\n selectIndex(fallbackIndex);\n }\n break;\n }\n case \"End\": {\n event.preventDefault();\n if (lastEnabledIndex >= 0) {\n focusItem(lastEnabledIndex);\n selectIndex(lastEnabledIndex);\n }\n break;\n }\n default:\n break;\n }\n };\n\n return (\n <div\n className={cx(styles.track, className)}\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n {options.map((opt, index) => (\n <button\n key={opt.value}\n ref={(node) => {\n itemRefs.current[index] = node;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={opt.value === value}\n disabled={opt.disabled}\n tabIndex={\n opt.disabled\n ? -1\n : index === tabbableIndex\n ? 0\n : -1\n }\n onClick={() => {\n if (opt.value !== value) {\n onChange(opt.value);\n }\n }}\n onKeyDown={(event) => handleKeyDown(event, index)}\n className={cx(styles.option)}\n >\n <span className={styles.label}>{opt.label}</span>\n </button>\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;AAsBA,SAAgB,gBAA2C,EACzD,SACA,OACA,UACA,cAAc,WACd,mBAAmB,gBACnB,aAC0B;CAC1B,MAAM,WAAW,MAAM,OAAwC,CAAC,CAAC;CACjE,MAAM,gBAAgB,QAAQ,WAAW,QAAQ,IAAI,UAAU,KAAK;CACpE,MAAM,gBAAgB,QAAQ,WAAW,QAAQ,CAAC,IAAI,QAAQ;CAC9D,IAAI,mBAAmB;CACvB,KAAK,IAAI,QAAQ,QAAQ,SAAS,GAAG,SAAS,GAAG,SAAS,GACxD,IAAI,CAAC,QAAQ,MAAM,EAAE,UAAU;EAC7B,mBAAmB;EACnB;CACF;CAEF,MAAM,gBACJ,iBAAiB,KAAK,CAAC,QAAQ,cAAc,EAAE,WAC3C,gBACA;CAEN,MAAM,aAAa,UAAkB;EACnC,SAAS,QAAQ,MAAM,EAAE,MAAM;CACjC;CAEA,MAAM,oBACJ,YACA,cACW;EACX,IAAI,QAAQ,WAAW,GAAG,OAAO;EAEjC,IAAI,YAAY;EAChB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;GAC1C,aAAa,YAAY,YAAY,QAAQ,UAAU,QAAQ;GAC/D,IAAI,CAAC,QAAQ,UAAU,EAAE,UACvB,OAAO;EAEX;EAEA,OAAO;CACT;CAEA,MAAM,eAAe,UAAkB;EACrC,MAAM,aAAa,QAAQ;EAC3B,IAAI,CAAC,cAAc,WAAW,YAAY,WAAW,UAAU,OAC7D;EAEF,SAAS,WAAW,KAAK;CAC3B;CAEA,MAAM,iBACJ,OACA,UACG;EACH,QAAQ,MAAM,KAAd;GACE,KAAK;GACL,KAAK,aAAa;IAChB,MAAM,eAAe;IACrB,MAAM,YAAY,iBAAiB,OAAO,CAAC;IAC3C,UAAU,SAAS;IACnB,YAAY,SAAS;IACrB;GACF;GACA,KAAK;GACL,KAAK,WAAW;IACd,MAAM,eAAe;IACrB,MAAM,YAAY,iBAAiB,OAAO,EAAE;IAC5C,UAAU,SAAS;IACnB,YAAY,SAAS;IACrB;GACF;GACA,KAAK;IACH,MAAM,eAAe;IACrB,UAAU,aAAa;IACvB,IAAI,iBAAiB,GACnB,YAAY,aAAa;IAE3B;GAEF,KAAK;IACH,MAAM,eAAe;IACrB,IAAI,oBAAoB,GAAG;KACzB,UAAU,gBAAgB;KAC1B,YAAY,gBAAgB;IAC9B;IACA;GAEF,SACE;EACJ;CACF;CAEA,OACE,oBAAC,OAAD;EACE,WAAW,GAAG,gCAAO,OAAO,SAAS;EACrC,MAAK;EACL,cAAY;EACZ,mBAAiB;YAEhB,QAAQ,KAAK,KAAK,UACjB,oBAAC,UAAD;GAEE,MAAM,SAAS;IACb,SAAS,QAAQ,SAAS;GAC5B;GACA,MAAK;GACL,MAAK;GACL,gBAAc,IAAI,UAAU;GAC5B,UAAU,IAAI;GACd,UACE,IAAI,WACA,KACA,UAAU,gBACR,IACA;GAER,eAAe;IACb,IAAI,IAAI,UAAU,OAChB,SAAS,IAAI,KAAK;GAEtB;GACA,YAAY,UAAU,cAAc,OAAO,KAAK;GAChD,WAAW,GAAG,gCAAO,MAAM;aAE3B,oBAAC,QAAD;IAAM,WAAW,gCAAO;cAAQ,IAAI;GAAY,CAAA;EAC1C,GAxBD,IAAI,KAwBH,CACT;CACE,CAAA;AAET"}