@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 @@
1
+ {"version":3,"file":"index35.cjs","names":[],"sources":["../src/components/theme-toggle-button/ThemeToggleButton.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { Button } from \"../button/Button\";\nimport { useTheme } from \"../../theme/ThemeProvider\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./theme-toggle-button.module.css\";\n\nexport type ThemeToggleButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\"\n> & {\n showLabel?: boolean;\n lightLabel?: string;\n darkLabel?: string;\n};\n\nfunction MoonIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" width=\"16\" height=\"16\" fill=\"none\">\n <path\n d=\"M20 15.2A8.5 8.5 0 0 1 8.8 4 9 9 0 1 0 20 15.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SunIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" width=\"16\" height=\"16\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <path\n d=\"M12 2.75v2.5M12 18.75v2.5M21.25 12h-2.5M5.25 12h-2.5M18.54 5.46l-1.77 1.77M7.23 16.77l-1.77 1.77M18.54 18.54l-1.77-1.77M7.23 7.23 5.46 5.46\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function ThemeToggleButton({\n showLabel = false,\n lightLabel = \"Light mode\",\n darkLabel = \"Dark mode\",\n className,\n onClick,\n ...rest\n}: ThemeToggleButtonProps) {\n const { resolvedTheme, toggleTheme } = useTheme();\n const nextThemeLabel = resolvedTheme === \"dark\" ? lightLabel : darkLabel;\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size={showLabel ? \"sm\" : \"icon\"}\n className={cx(showLabel && styles.withLabel, className)}\n aria-label={`Switch to ${nextThemeLabel.toLowerCase()}`}\n title={`Switch to ${nextThemeLabel.toLowerCase()}`}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) toggleTheme();\n }}\n {...rest}\n >\n {resolvedTheme === \"dark\" ? <SunIcon /> : <MoonIcon />}\n {showLabel && <span>{nextThemeLabel}</span>}\n </Button>\n );\n}\n"],"mappings":";;;;;;;AAiBA,SAAS,WAAW;CAClB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,SAAQ;EAAY,eAAY;EAAO,OAAM;EAAK,QAAO;EAAK,MAAK;YACtE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;EAChB,CAAA;CACE,CAAA;AAET;AAEA,SAAS,UAAU;CACjB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,SAAQ;EAAY,eAAY;EAAO,OAAM;EAAK,QAAO;EAAK,MAAK;YAAxE,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;GAAI,QAAO;GAAe,aAAY;EAAO,CAAA,GACvE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;EACf,CAAA,CACE;;AAET;AAEA,SAAgB,kBAAkB,EAChC,YAAY,OACZ,aAAa,cACb,YAAY,aACZ,WACA,SACA,GAAG,QACsB;CACzB,MAAM,EAAE,eAAe,gBAAgB,sBAAA,SAAS;CAChD,MAAM,iBAAiB,kBAAkB,SAAS,aAAa;CAE/D,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,eAAA,QAAD;EACE,MAAK;EACL,SAAQ;EACR,MAAM,YAAY,OAAO;EACzB,WAAW,WAAA,GAAG,aAAa,mCAAA,QAAO,WAAW,SAAS;EACtD,cAAY,aAAa,eAAe,YAAY;EACpD,OAAO,aAAa,eAAe,YAAY;EAC/C,UAAU,UAAU;GAClB,UAAU,KAAK;GACf,IAAI,CAAC,MAAM,kBAAkB,YAAY;EAC3C;EACA,GAAI;YAXN,CAaG,kBAAkB,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,CAAU,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,CAAW,CAAA,GACpD,aAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,eAAqB,CAAA,CACpC;;AAEZ"}
@@ -0,0 +1,25 @@
1
+ //#region src/components/top-bar/top-bar.module.css
2
+ var topBar = "uzi-top-bar-module__topBar__MJ-7S";
3
+ var topBarStatic = "uzi-top-bar-module__topBarStatic__JvEwt";
4
+ var topBarInner = "uzi-top-bar-module__topBarInner__PBbi8";
5
+ var topBarStart = "uzi-top-bar-module__topBarStart__DrdN2";
6
+ var topBarBrand = "uzi-top-bar-module__topBarBrand__80VV3";
7
+ var topBarBrandContent = "uzi-top-bar-module__topBarBrandContent__O4Uto";
8
+ var topBarCenter = "uzi-top-bar-module__topBarCenter__Kwxg-";
9
+ var topBarCenterGroup = "uzi-top-bar-module__topBarCenterGroup__7Ishp";
10
+ var topBarActions = "uzi-top-bar-module__topBarActions__mgMd8";
11
+ var top_bar_module_default = {
12
+ topBar,
13
+ topBarStatic,
14
+ topBarInner,
15
+ topBarStart,
16
+ topBarBrand,
17
+ topBarBrandContent,
18
+ topBarCenter,
19
+ topBarCenterGroup,
20
+ topBarActions
21
+ };
22
+ //#endregion
23
+ export { top_bar_module_default as default, topBar, topBarActions, topBarBrand, topBarBrandContent, topBarCenter, topBarCenterGroup, topBarInner, topBarStart, topBarStatic };
24
+
25
+ //# sourceMappingURL=index35.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index35.js","names":[],"sources":["../src/components/top-bar/top-bar.module.css"],"sourcesContent":[".topBar {\n position: sticky;\n top: 0;\n z-index: 30;\n border-bottom: 1px solid var(--ts-topbar-border, var(--border));\n background: var(--ts-topbar-bg, color-mix(in srgb, var(--background) 92%, transparent));\n box-shadow: var(--ts-topbar-shadow, 0 1px 2px rgba(0, 0, 0, 0.06));\n backdrop-filter: blur(12px);\n}\n\n.topBarStatic {\n position: relative;\n}\n\n.topBarInner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n min-height: 4.25rem;\n padding: env(safe-area-inset-top, 0) 1rem 0 1rem;\n}\n\n.topBarStart {\n display: flex;\n align-items: center;\n gap: 0.875rem;\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.topBarBrand {\n display: inline-flex;\n align-items: center;\n gap: 0.625rem;\n min-width: 0;\n color: var(--ts-topbar-brand-fg, var(--foreground));\n text-decoration: none;\n}\n\n.topBarBrandContent {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.topBarCenter {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 1 auto;\n min-width: 0;\n}\n\n.topBarCenterGroup {\n display: inline-flex;\n align-items: center;\n gap: 1rem;\n min-width: 0;\n}\n\n.topBarActions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 0.75rem;\n min-width: 0;\n flex: 1 1 auto;\n}\n\n@media (max-width: 768px) {\n .topBarInner {\n min-height: 4rem;\n gap: 0.75rem;\n padding-left: max(0.75rem, env(safe-area-inset-left));\n padding-right: max(0.75rem, env(safe-area-inset-right));\n }\n\n .topBarStart {\n gap: 0.75rem;\n }\n\n .topBarActions {\n gap: 0.5rem;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,34 @@
1
+ //#region src/components/top-bar/top-bar.module.css
2
+ var topBar = "uzi-top-bar-module__topBar__MJ-7S";
3
+ var topBarStatic = "uzi-top-bar-module__topBarStatic__JvEwt";
4
+ var topBarInner = "uzi-top-bar-module__topBarInner__PBbi8";
5
+ var topBarStart = "uzi-top-bar-module__topBarStart__DrdN2";
6
+ var topBarBrand = "uzi-top-bar-module__topBarBrand__80VV3";
7
+ var topBarBrandContent = "uzi-top-bar-module__topBarBrandContent__O4Uto";
8
+ var topBarCenter = "uzi-top-bar-module__topBarCenter__Kwxg-";
9
+ var topBarCenterGroup = "uzi-top-bar-module__topBarCenterGroup__7Ishp";
10
+ var topBarActions = "uzi-top-bar-module__topBarActions__mgMd8";
11
+ var top_bar_module_default = {
12
+ topBar,
13
+ topBarStatic,
14
+ topBarInner,
15
+ topBarStart,
16
+ topBarBrand,
17
+ topBarBrandContent,
18
+ topBarCenter,
19
+ topBarCenterGroup,
20
+ topBarActions
21
+ };
22
+ //#endregion
23
+ exports.default = top_bar_module_default;
24
+ exports.topBar = topBar;
25
+ exports.topBarActions = topBarActions;
26
+ exports.topBarBrand = topBarBrand;
27
+ exports.topBarBrandContent = topBarBrandContent;
28
+ exports.topBarCenter = topBarCenter;
29
+ exports.topBarCenterGroup = topBarCenterGroup;
30
+ exports.topBarInner = topBarInner;
31
+ exports.topBarStart = topBarStart;
32
+ exports.topBarStatic = topBarStatic;
33
+
34
+ //# sourceMappingURL=index36.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index36.cjs","names":[],"sources":["../src/components/top-bar/top-bar.module.css"],"sourcesContent":[".topBar {\n position: sticky;\n top: 0;\n z-index: 30;\n border-bottom: 1px solid var(--ts-topbar-border, var(--border));\n background: var(--ts-topbar-bg, color-mix(in srgb, var(--background) 92%, transparent));\n box-shadow: var(--ts-topbar-shadow, 0 1px 2px rgba(0, 0, 0, 0.06));\n backdrop-filter: blur(12px);\n}\n\n.topBarStatic {\n position: relative;\n}\n\n.topBarInner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n min-height: 4.25rem;\n padding: env(safe-area-inset-top, 0) 1rem 0 1rem;\n}\n\n.topBarStart {\n display: flex;\n align-items: center;\n gap: 0.875rem;\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.topBarBrand {\n display: inline-flex;\n align-items: center;\n gap: 0.625rem;\n min-width: 0;\n color: var(--ts-topbar-brand-fg, var(--foreground));\n text-decoration: none;\n}\n\n.topBarBrandContent {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.topBarCenter {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 1 auto;\n min-width: 0;\n}\n\n.topBarCenterGroup {\n display: inline-flex;\n align-items: center;\n gap: 1rem;\n min-width: 0;\n}\n\n.topBarActions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 0.75rem;\n min-width: 0;\n flex: 1 1 auto;\n}\n\n@media (max-width: 768px) {\n .topBarInner {\n min-height: 4rem;\n gap: 0.75rem;\n padding-left: max(0.75rem, env(safe-area-inset-left));\n padding-right: max(0.75rem, env(safe-area-inset-right));\n }\n\n .topBarStart {\n gap: 0.75rem;\n }\n\n .topBarActions {\n gap: 0.5rem;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,55 @@
1
+ "use client";
2
+ import { cx } from "./index3.js";
3
+ import { ThemeToggleButton } from "./index34.js";
4
+ import top_bar_module_default from "./index35.js";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/components/top-bar/TopBar.tsx
7
+ function TopBar({ leading, brand, brandHref, brandingLocation = "left", start, center, actions, showThemeToggle = false, themeToggleProps, className, innerClassName, isSticky, sticky = true, children, ...rest }) {
8
+ const shouldStick = isSticky ?? sticky;
9
+ const brandNode = !brand ? null : brandHref ? /* @__PURE__ */ jsx("a", {
10
+ href: brandHref,
11
+ className: top_bar_module_default.topBarBrand,
12
+ children: /* @__PURE__ */ jsx("span", {
13
+ className: top_bar_module_default.topBarBrandContent,
14
+ children: brand
15
+ })
16
+ }) : /* @__PURE__ */ jsx("div", {
17
+ className: top_bar_module_default.topBarBrand,
18
+ children: /* @__PURE__ */ jsx("span", {
19
+ className: top_bar_module_default.topBarBrandContent,
20
+ children: brand
21
+ })
22
+ });
23
+ return /* @__PURE__ */ jsx("header", {
24
+ className: cx(top_bar_module_default.topBar, !shouldStick && top_bar_module_default.topBarStatic, className),
25
+ ...rest,
26
+ children: /* @__PURE__ */ jsxs("div", {
27
+ className: cx(top_bar_module_default.topBarInner, innerClassName),
28
+ children: [
29
+ /* @__PURE__ */ jsxs("div", {
30
+ className: top_bar_module_default.topBarStart,
31
+ children: [
32
+ leading,
33
+ brandingLocation === "left" && brandNode,
34
+ start
35
+ ]
36
+ }),
37
+ brandNode && brandingLocation === "center" || center || children ? /* @__PURE__ */ jsx("div", {
38
+ className: top_bar_module_default.topBarCenter,
39
+ children: /* @__PURE__ */ jsxs("div", {
40
+ className: top_bar_module_default.topBarCenterGroup,
41
+ children: [brandingLocation === "center" && brandNode, center ?? children]
42
+ })
43
+ }) : null,
44
+ /* @__PURE__ */ jsxs("div", {
45
+ className: top_bar_module_default.topBarActions,
46
+ children: [showThemeToggle && /* @__PURE__ */ jsx(ThemeToggleButton, { ...themeToggleProps }), actions]
47
+ })
48
+ ]
49
+ })
50
+ });
51
+ }
52
+ //#endregion
53
+ export { TopBar };
54
+
55
+ //# sourceMappingURL=index36.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index36.js","names":[],"sources":["../src/components/top-bar/TopBar.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport {\n ThemeToggleButton,\n type ThemeToggleButtonProps,\n} from \"../theme-toggle-button/ThemeToggleButton\";\nimport styles from \"./top-bar.module.css\";\n\nexport type TopBarProps = HTMLAttributes<HTMLElement> & {\n leading?: ReactNode;\n brand?: ReactNode;\n brandHref?: string;\n brandingLocation?: \"left\" | \"center\";\n /** Content rendered after the brand in the left region (e.g. breadcrumbs, search). */\n start?: ReactNode;\n /** Content rendered in the center region. */\n center?: ReactNode;\n actions?: ReactNode;\n showThemeToggle?: boolean;\n themeToggleProps?: ThemeToggleButtonProps;\n innerClassName?: string;\n isSticky?: boolean;\n sticky?: boolean;\n};\n\nexport function TopBar({\n leading,\n brand,\n brandHref,\n brandingLocation = \"left\",\n start,\n center,\n actions,\n showThemeToggle = false,\n themeToggleProps,\n className,\n innerClassName,\n isSticky,\n sticky = true,\n children,\n ...rest\n}: TopBarProps) {\n const shouldStick = isSticky ?? sticky;\n const brandNode = !brand ? null : brandHref ? (\n <a href={brandHref} className={styles.topBarBrand}>\n <span className={styles.topBarBrandContent}>{brand}</span>\n </a>\n ) : (\n <div className={styles.topBarBrand}>\n <span className={styles.topBarBrandContent}>{brand}</span>\n </div>\n );\n\n return (\n <header\n className={cx(styles.topBar, !shouldStick && styles.topBarStatic, className)}\n {...rest}\n >\n <div className={cx(styles.topBarInner, innerClassName)}>\n <div className={styles.topBarStart}>\n {leading}\n {brandingLocation === \"left\" && brandNode}\n {start}\n </div>\n {(brandNode && brandingLocation === \"center\") || center || children ? (\n <div className={styles.topBarCenter}>\n <div className={styles.topBarCenterGroup}>\n {brandingLocation === \"center\" && brandNode}\n {center ?? children}\n </div>\n </div>\n ) : null}\n <div className={styles.topBarActions}>\n {showThemeToggle && <ThemeToggleButton {...themeToggleProps} />}\n {actions}\n </div>\n </div>\n </header>\n );\n}\n"],"mappings":";;;;;;AA2BA,SAAgB,OAAO,EACrB,SACA,OACA,WACA,mBAAmB,QACnB,OACA,QACA,SACA,kBAAkB,OAClB,kBACA,WACA,gBACA,UACA,SAAS,MACT,UACA,GAAG,QACW;CACd,MAAM,cAAc,YAAY;CAChC,MAAM,YAAY,CAAC,QAAQ,OAAO,YAChC,oBAAC,KAAD;EAAG,MAAM;EAAW,WAAW,uBAAO;YACpC,oBAAC,QAAD;GAAM,WAAW,uBAAO;aAAqB;EAAY,CAAA;CACxD,CAAA,IAEH,oBAAC,OAAD;EAAK,WAAW,uBAAO;YACrB,oBAAC,QAAD;GAAM,WAAW,uBAAO;aAAqB;EAAY,CAAA;CACtD,CAAA;CAGP,OACE,oBAAC,UAAD;EACE,WAAW,GAAG,uBAAO,QAAQ,CAAC,eAAe,uBAAO,cAAc,SAAS;EAC3E,GAAI;YAEJ,qBAAC,OAAD;GAAK,WAAW,GAAG,uBAAO,aAAa,cAAc;aAArD;IACE,qBAAC,OAAD;KAAK,WAAW,uBAAO;eAAvB;MACG;MACA,qBAAqB,UAAU;MAC/B;KACE;;IACH,aAAa,qBAAqB,YAAa,UAAU,WACzD,oBAAC,OAAD;KAAK,WAAW,uBAAO;eACrB,qBAAC,OAAD;MAAK,WAAW,uBAAO;gBAAvB,CACG,qBAAqB,YAAY,WACjC,UAAU,QACR;;IACF,CAAA,IACH;IACJ,qBAAC,OAAD;KAAK,WAAW,uBAAO;eAAvB,CACG,mBAAmB,oBAAC,mBAAD,EAAmB,GAAI,iBAAmB,CAAA,GAC7D,OACE;;GACF;;CACC,CAAA;AAEZ"}
@@ -0,0 +1,55 @@
1
+ "use client";
2
+ const require_cx = require("./index4.cjs");
3
+ const require_ThemeToggleButton = require("./index35.cjs");
4
+ const require_top_bar_module = require("./index36.cjs");
5
+ let react_jsx_runtime = require("react/jsx-runtime");
6
+ //#region src/components/top-bar/TopBar.tsx
7
+ function TopBar({ leading, brand, brandHref, brandingLocation = "left", start, center, actions, showThemeToggle = false, themeToggleProps, className, innerClassName, isSticky, sticky = true, children, ...rest }) {
8
+ const shouldStick = isSticky ?? sticky;
9
+ const brandNode = !brand ? null : brandHref ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
10
+ href: brandHref,
11
+ className: require_top_bar_module.default.topBarBrand,
12
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13
+ className: require_top_bar_module.default.topBarBrandContent,
14
+ children: brand
15
+ })
16
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
17
+ className: require_top_bar_module.default.topBarBrand,
18
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
19
+ className: require_top_bar_module.default.topBarBrandContent,
20
+ children: brand
21
+ })
22
+ });
23
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("header", {
24
+ className: require_cx.cx(require_top_bar_module.default.topBar, !shouldStick && require_top_bar_module.default.topBarStatic, className),
25
+ ...rest,
26
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
27
+ className: require_cx.cx(require_top_bar_module.default.topBarInner, innerClassName),
28
+ children: [
29
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
30
+ className: require_top_bar_module.default.topBarStart,
31
+ children: [
32
+ leading,
33
+ brandingLocation === "left" && brandNode,
34
+ start
35
+ ]
36
+ }),
37
+ brandNode && brandingLocation === "center" || center || children ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38
+ className: require_top_bar_module.default.topBarCenter,
39
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
40
+ className: require_top_bar_module.default.topBarCenterGroup,
41
+ children: [brandingLocation === "center" && brandNode, center ?? children]
42
+ })
43
+ }) : null,
44
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
45
+ className: require_top_bar_module.default.topBarActions,
46
+ children: [showThemeToggle && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ThemeToggleButton.ThemeToggleButton, { ...themeToggleProps }), actions]
47
+ })
48
+ ]
49
+ })
50
+ });
51
+ }
52
+ //#endregion
53
+ exports.TopBar = TopBar;
54
+
55
+ //# sourceMappingURL=index37.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index37.cjs","names":[],"sources":["../src/components/top-bar/TopBar.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport {\n ThemeToggleButton,\n type ThemeToggleButtonProps,\n} from \"../theme-toggle-button/ThemeToggleButton\";\nimport styles from \"./top-bar.module.css\";\n\nexport type TopBarProps = HTMLAttributes<HTMLElement> & {\n leading?: ReactNode;\n brand?: ReactNode;\n brandHref?: string;\n brandingLocation?: \"left\" | \"center\";\n /** Content rendered after the brand in the left region (e.g. breadcrumbs, search). */\n start?: ReactNode;\n /** Content rendered in the center region. */\n center?: ReactNode;\n actions?: ReactNode;\n showThemeToggle?: boolean;\n themeToggleProps?: ThemeToggleButtonProps;\n innerClassName?: string;\n isSticky?: boolean;\n sticky?: boolean;\n};\n\nexport function TopBar({\n leading,\n brand,\n brandHref,\n brandingLocation = \"left\",\n start,\n center,\n actions,\n showThemeToggle = false,\n themeToggleProps,\n className,\n innerClassName,\n isSticky,\n sticky = true,\n children,\n ...rest\n}: TopBarProps) {\n const shouldStick = isSticky ?? sticky;\n const brandNode = !brand ? null : brandHref ? (\n <a href={brandHref} className={styles.topBarBrand}>\n <span className={styles.topBarBrandContent}>{brand}</span>\n </a>\n ) : (\n <div className={styles.topBarBrand}>\n <span className={styles.topBarBrandContent}>{brand}</span>\n </div>\n );\n\n return (\n <header\n className={cx(styles.topBar, !shouldStick && styles.topBarStatic, className)}\n {...rest}\n >\n <div className={cx(styles.topBarInner, innerClassName)}>\n <div className={styles.topBarStart}>\n {leading}\n {brandingLocation === \"left\" && brandNode}\n {start}\n </div>\n {(brandNode && brandingLocation === \"center\") || center || children ? (\n <div className={styles.topBarCenter}>\n <div className={styles.topBarCenterGroup}>\n {brandingLocation === \"center\" && brandNode}\n {center ?? children}\n </div>\n </div>\n ) : null}\n <div className={styles.topBarActions}>\n {showThemeToggle && <ThemeToggleButton {...themeToggleProps} />}\n {actions}\n </div>\n </div>\n </header>\n );\n}\n"],"mappings":";;;;;;AA2BA,SAAgB,OAAO,EACrB,SACA,OACA,WACA,mBAAmB,QACnB,OACA,QACA,SACA,kBAAkB,OAClB,kBACA,WACA,gBACA,UACA,SAAS,MACT,UACA,GAAG,QACW;CACd,MAAM,cAAc,YAAY;CAChC,MAAM,YAAY,CAAC,QAAQ,OAAO,YAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;EAAG,MAAM;EAAW,WAAW,uBAAA,QAAO;YACpC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,WAAW,uBAAA,QAAO;aAAqB;EAAY,CAAA;CACxD,CAAA,IAEH,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,WAAW,uBAAA,QAAO;YACrB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,WAAW,uBAAA,QAAO;aAAqB;EAAY,CAAA;CACtD,CAAA;CAGP,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;EACE,WAAW,WAAA,GAAG,uBAAA,QAAO,QAAQ,CAAC,eAAe,uBAAA,QAAO,cAAc,SAAS;EAC3E,GAAI;YAEJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;GAAK,WAAW,WAAA,GAAG,uBAAA,QAAO,aAAa,cAAc;aAArD;IACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAW,uBAAA,QAAO;eAAvB;MACG;MACA,qBAAqB,UAAU;MAC/B;KACE;;IACH,aAAa,qBAAqB,YAAa,UAAU,WACzD,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAW,uBAAA,QAAO;eACrB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAW,uBAAA,QAAO;gBAAvB,CACG,qBAAqB,YAAY,WACjC,UAAU,QACR;;IACF,CAAA,IACH;IACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAW,uBAAA,QAAO;eAAvB,CACG,mBAAmB,iBAAA,GAAA,kBAAA,IAAA,CAAC,0BAAA,mBAAD,EAAmB,GAAI,iBAAmB,CAAA,GAC7D,OACE;;GACF;;CACC,CAAA;AAEZ"}
@@ -0,0 +1,35 @@
1
+ //#region src/components/app-shell/app-shell.module.css
2
+ var appShell = "uzi-app-shell-module__appShell__S0cVI";
3
+ var appShellAnimated = "uzi-app-shell-module__appShellAnimated__-CRIl";
4
+ var appShellOpen = "uzi-app-shell-module__appShellOpen__1rZUl";
5
+ var appShellCollapsed = "uzi-app-shell-module__appShellCollapsed__fSasN";
6
+ var appShellTopbar = "uzi-app-shell-module__appShellTopbar__rgXsW";
7
+ var appShellTopbarLeft = "uzi-app-shell-module__appShellTopbarLeft__-EVuB";
8
+ var appShellTopbarStart = "uzi-app-shell-module__appShellTopbarStart__XXQpq";
9
+ var appShellTopbarRight = "uzi-app-shell-module__appShellTopbarRight__l1G57";
10
+ var appShellBrand = "uzi-app-shell-module__appShellBrand__TXwyN";
11
+ var appShellHamburger = "uzi-app-shell-module__appShellHamburger__BciFA";
12
+ var appShellSidebar = "uzi-app-shell-module__appShellSidebar__oY7uj";
13
+ var appShellMain = "uzi-app-shell-module__appShellMain__eHP2r";
14
+ var appShellBackdrop = "uzi-app-shell-module__appShellBackdrop__y31xs";
15
+ var appShellSidebarOpen = "uzi-app-shell-module__appShellSidebarOpen__Z5AIo";
16
+ var app_shell_module_default = {
17
+ appShell,
18
+ appShellAnimated,
19
+ appShellOpen,
20
+ appShellCollapsed,
21
+ appShellTopbar,
22
+ appShellTopbarLeft,
23
+ appShellTopbarStart,
24
+ appShellTopbarRight,
25
+ appShellBrand,
26
+ appShellHamburger,
27
+ appShellSidebar,
28
+ appShellMain,
29
+ appShellBackdrop,
30
+ appShellSidebarOpen
31
+ };
32
+ //#endregion
33
+ export { appShell, appShellAnimated, appShellBackdrop, appShellBrand, appShellCollapsed, appShellHamburger, appShellMain, appShellOpen, appShellSidebar, appShellSidebarOpen, appShellTopbar, appShellTopbarLeft, appShellTopbarRight, appShellTopbarStart, app_shell_module_default as default };
34
+
35
+ //# sourceMappingURL=index37.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index37.js","names":[],"sources":["../src/components/app-shell/app-shell.module.css"],"sourcesContent":[".appShell {\n display: grid;\n grid-template-rows: calc(var(--app-shell-topbar-height, 64px) + env(safe-area-inset-top)) 1fr;\n grid-template-columns: var(--app-shell-sidebar-width, 240px) 1fr;\n height: 100vh;\n height: 100dvh;\n}\n\n.appShellAnimated {\n transition: grid-template-columns 200ms ease;\n}\n\n.appShell.appShellOpen {\n grid-template-columns: var(--app-shell-sidebar-width, 240px) 1fr;\n}\n\n.appShell.appShellCollapsed {\n grid-template-columns: 0 1fr;\n}\n\n.appShellTopbar {\n --ts-topbar-bg: var(--surface-topbar, color-mix(in srgb, var(--background) 92%, transparent));\n --ts-topbar-border: var(--border);\n --ts-topbar-brand-fg: var(--foreground);\n grid-column: 1 / -1;\n min-height: calc(var(--app-shell-topbar-height, 64px) + env(safe-area-inset-top));\n padding-left: 0;\n padding-right: 0;\n box-shadow: none;\n}\n\n.appShellTopbarLeft {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.appShellTopbarStart {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n}\n\n.appShellTopbarRight {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n flex-shrink: 0;\n}\n\n.appShellTopbarRight > * {\n min-width: 0;\n}\n\n.appShellBrand {\n font-size: 26px;\n color: var(--foreground);\n text-decoration: none;\n display: flex;\n align-items: center;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.appShellHamburger {\n background: transparent;\n border: none;\n padding: 0;\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--foreground);\n cursor: pointer;\n transition: background 120ms ease;\n}\n\n.appShellHamburger:hover {\n background: var(--accent);\n}\n\n.appShellHamburger:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.appShellHamburger svg {\n width: 28px;\n height: 28px;\n}\n\n.appShellSidebar {\n border-right: 1px solid var(--border);\n background: var(--panel);\n padding: 24px;\n overflow-y: auto;\n}\n\n.appShellAnimated .appShellSidebar {\n transition: transform 200ms ease, opacity 200ms ease;\n}\n\n.appShell.appShellCollapsed .appShellSidebar {\n transform: translateX(-110%);\n opacity: 0;\n pointer-events: none;\n}\n\n.appShellMain {\n overflow-y: auto;\n min-height: 0;\n flex: 1 1 0;\n}\n\n.appShellBackdrop {\n display: none;\n}\n\n@media (max-width: 960px) {\n .appShellBackdrop {\n display: block;\n position: fixed;\n inset: 0;\n top: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top));\n background: rgba(0, 0, 0, 0.5);\n z-index: 14;\n }\n\n .appShell {\n --app-shell-topbar-height: 56px;\n grid-template-columns: 1fr;\n grid-template-rows: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top)) 1fr;\n }\n\n .appShell.appShellOpen,\n .appShell.appShellCollapsed {\n grid-template-columns: 1fr;\n }\n\n .appShellSidebar {\n display: block;\n position: fixed;\n top: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top));\n left: 0;\n bottom: 0;\n width: var(--app-shell-sidebar-width, 240px);\n max-width: 80vw;\n background: var(--panel);\n padding: 16px 12px;\n transform: translateX(-105%);\n z-index: 15;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.35);\n }\n\n .appShellSidebar.appShellSidebarOpen {\n transform: translateX(0);\n }\n\n .appShellTopbar {\n padding-left: max(12px, env(safe-area-inset-left));\n padding-right: max(12px, env(safe-area-inset-right));\n gap: 10px;\n }\n\n .appShellTopbarLeft {\n gap: 10px;\n flex: 1;\n }\n\n .appShellTopbarStart {\n min-width: 0;\n }\n\n .appShellTopbarRight {\n gap: 6px;\n }\n\n .appShellBrand {\n font-size: 24px;\n max-width: 50vw;\n }\n\n .appShellHamburger {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n }\n\n .appShellHamburger svg {\n width: 24px;\n height: 24px;\n }\n}\n\n@media (max-width: 640px) {\n .appShellTopbar {\n gap: 8px;\n }\n\n .appShellBrand {\n font-size: 22px;\n max-width: 34vw;\n }\n\n .appShellTopbarRight {\n max-width: 44vw;\n }\n}\n\n@media (max-width: 480px) {\n .appShellBrand {\n font-size: 20px;\n max-width: 30vw;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,49 @@
1
+ //#region src/components/app-shell/app-shell.module.css
2
+ var appShell = "uzi-app-shell-module__appShell__S0cVI";
3
+ var appShellAnimated = "uzi-app-shell-module__appShellAnimated__-CRIl";
4
+ var appShellOpen = "uzi-app-shell-module__appShellOpen__1rZUl";
5
+ var appShellCollapsed = "uzi-app-shell-module__appShellCollapsed__fSasN";
6
+ var appShellTopbar = "uzi-app-shell-module__appShellTopbar__rgXsW";
7
+ var appShellTopbarLeft = "uzi-app-shell-module__appShellTopbarLeft__-EVuB";
8
+ var appShellTopbarStart = "uzi-app-shell-module__appShellTopbarStart__XXQpq";
9
+ var appShellTopbarRight = "uzi-app-shell-module__appShellTopbarRight__l1G57";
10
+ var appShellBrand = "uzi-app-shell-module__appShellBrand__TXwyN";
11
+ var appShellHamburger = "uzi-app-shell-module__appShellHamburger__BciFA";
12
+ var appShellSidebar = "uzi-app-shell-module__appShellSidebar__oY7uj";
13
+ var appShellMain = "uzi-app-shell-module__appShellMain__eHP2r";
14
+ var appShellBackdrop = "uzi-app-shell-module__appShellBackdrop__y31xs";
15
+ var appShellSidebarOpen = "uzi-app-shell-module__appShellSidebarOpen__Z5AIo";
16
+ var app_shell_module_default = {
17
+ appShell,
18
+ appShellAnimated,
19
+ appShellOpen,
20
+ appShellCollapsed,
21
+ appShellTopbar,
22
+ appShellTopbarLeft,
23
+ appShellTopbarStart,
24
+ appShellTopbarRight,
25
+ appShellBrand,
26
+ appShellHamburger,
27
+ appShellSidebar,
28
+ appShellMain,
29
+ appShellBackdrop,
30
+ appShellSidebarOpen
31
+ };
32
+ //#endregion
33
+ exports.appShell = appShell;
34
+ exports.appShellAnimated = appShellAnimated;
35
+ exports.appShellBackdrop = appShellBackdrop;
36
+ exports.appShellBrand = appShellBrand;
37
+ exports.appShellCollapsed = appShellCollapsed;
38
+ exports.appShellHamburger = appShellHamburger;
39
+ exports.appShellMain = appShellMain;
40
+ exports.appShellOpen = appShellOpen;
41
+ exports.appShellSidebar = appShellSidebar;
42
+ exports.appShellSidebarOpen = appShellSidebarOpen;
43
+ exports.appShellTopbar = appShellTopbar;
44
+ exports.appShellTopbarLeft = appShellTopbarLeft;
45
+ exports.appShellTopbarRight = appShellTopbarRight;
46
+ exports.appShellTopbarStart = appShellTopbarStart;
47
+ exports.default = app_shell_module_default;
48
+
49
+ //# sourceMappingURL=index38.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index38.cjs","names":[],"sources":["../src/components/app-shell/app-shell.module.css"],"sourcesContent":[".appShell {\n display: grid;\n grid-template-rows: calc(var(--app-shell-topbar-height, 64px) + env(safe-area-inset-top)) 1fr;\n grid-template-columns: var(--app-shell-sidebar-width, 240px) 1fr;\n height: 100vh;\n height: 100dvh;\n}\n\n.appShellAnimated {\n transition: grid-template-columns 200ms ease;\n}\n\n.appShell.appShellOpen {\n grid-template-columns: var(--app-shell-sidebar-width, 240px) 1fr;\n}\n\n.appShell.appShellCollapsed {\n grid-template-columns: 0 1fr;\n}\n\n.appShellTopbar {\n --ts-topbar-bg: var(--surface-topbar, color-mix(in srgb, var(--background) 92%, transparent));\n --ts-topbar-border: var(--border);\n --ts-topbar-brand-fg: var(--foreground);\n grid-column: 1 / -1;\n min-height: calc(var(--app-shell-topbar-height, 64px) + env(safe-area-inset-top));\n padding-left: 0;\n padding-right: 0;\n box-shadow: none;\n}\n\n.appShellTopbarLeft {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.appShellTopbarStart {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n}\n\n.appShellTopbarRight {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n flex-shrink: 0;\n}\n\n.appShellTopbarRight > * {\n min-width: 0;\n}\n\n.appShellBrand {\n font-size: 26px;\n color: var(--foreground);\n text-decoration: none;\n display: flex;\n align-items: center;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.appShellHamburger {\n background: transparent;\n border: none;\n padding: 0;\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--foreground);\n cursor: pointer;\n transition: background 120ms ease;\n}\n\n.appShellHamburger:hover {\n background: var(--accent);\n}\n\n.appShellHamburger:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.appShellHamburger svg {\n width: 28px;\n height: 28px;\n}\n\n.appShellSidebar {\n border-right: 1px solid var(--border);\n background: var(--panel);\n padding: 24px;\n overflow-y: auto;\n}\n\n.appShellAnimated .appShellSidebar {\n transition: transform 200ms ease, opacity 200ms ease;\n}\n\n.appShell.appShellCollapsed .appShellSidebar {\n transform: translateX(-110%);\n opacity: 0;\n pointer-events: none;\n}\n\n.appShellMain {\n overflow-y: auto;\n min-height: 0;\n flex: 1 1 0;\n}\n\n.appShellBackdrop {\n display: none;\n}\n\n@media (max-width: 960px) {\n .appShellBackdrop {\n display: block;\n position: fixed;\n inset: 0;\n top: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top));\n background: rgba(0, 0, 0, 0.5);\n z-index: 14;\n }\n\n .appShell {\n --app-shell-topbar-height: 56px;\n grid-template-columns: 1fr;\n grid-template-rows: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top)) 1fr;\n }\n\n .appShell.appShellOpen,\n .appShell.appShellCollapsed {\n grid-template-columns: 1fr;\n }\n\n .appShellSidebar {\n display: block;\n position: fixed;\n top: calc(var(--app-shell-topbar-height, 56px) + env(safe-area-inset-top));\n left: 0;\n bottom: 0;\n width: var(--app-shell-sidebar-width, 240px);\n max-width: 80vw;\n background: var(--panel);\n padding: 16px 12px;\n transform: translateX(-105%);\n z-index: 15;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.35);\n }\n\n .appShellSidebar.appShellSidebarOpen {\n transform: translateX(0);\n }\n\n .appShellTopbar {\n padding-left: max(12px, env(safe-area-inset-left));\n padding-right: max(12px, env(safe-area-inset-right));\n gap: 10px;\n }\n\n .appShellTopbarLeft {\n gap: 10px;\n flex: 1;\n }\n\n .appShellTopbarStart {\n min-width: 0;\n }\n\n .appShellTopbarRight {\n gap: 6px;\n }\n\n .appShellBrand {\n font-size: 24px;\n max-width: 50vw;\n }\n\n .appShellHamburger {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n }\n\n .appShellHamburger svg {\n width: 24px;\n height: 24px;\n }\n}\n\n@media (max-width: 640px) {\n .appShellTopbar {\n gap: 8px;\n }\n\n .appShellBrand {\n font-size: 22px;\n max-width: 34vw;\n }\n\n .appShellTopbarRight {\n max-width: 44vw;\n }\n}\n\n@media (max-width: 480px) {\n .appShellBrand {\n font-size: 20px;\n max-width: 30vw;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,150 @@
1
+ "use client";
2
+ import { cx } from "./index3.js";
3
+ import { TopBar } from "./index36.js";
4
+ import app_shell_module_default from "./index37.js";
5
+ import { useEffect, useId, useRef, useState } from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/components/app-shell/AppShell.tsx
8
+ var DESKTOP_BREAKPOINT = 960;
9
+ function getIsDesktop() {
10
+ if (typeof window === "undefined") return false;
11
+ return window.innerWidth >= DESKTOP_BREAKPOINT;
12
+ }
13
+ /**
14
+ * Responsive application shell with a collapsible sidebar and sticky top bar.
15
+ *
16
+ * - Sidebar opens by default on desktop, collapses on mobile.
17
+ * - Closes on outside click/scroll/touch when in mobile mode.
18
+ * - Provides optional hook to close the sidebar when a prop value changes
19
+ * (e.g., route transitions).
20
+ */
21
+ function AppShell({ children, sidebar, brand, brandHref, topbarStart, topbarEnd, showThemeToggle = false, themeToggleProps, topBarBrandingLocation = "left", className, sidebarClassName, topbarClassName, mainClassName, sidebarWidth, closeSidebarOnChangeKey, hamburgerLabel = "Toggle navigation", onSidebarToggle }) {
22
+ const [isDesktop, setIsDesktop] = useState(false);
23
+ const [sidebarOpen, setSidebarOpen] = useState(false);
24
+ const [transitionsReady, setTransitionsReady] = useState(false);
25
+ const prevIsDesktopRef = useRef(false);
26
+ const closeKeyRef = useRef(closeSidebarOnChangeKey);
27
+ const sidebarRef = useRef(null);
28
+ const hamburgerRef = useRef(null);
29
+ const mainRef = useRef(null);
30
+ const sidebarId = useId();
31
+ useEffect(() => {
32
+ const desktop = getIsDesktop();
33
+ setIsDesktop(desktop);
34
+ setSidebarOpen(desktop);
35
+ prevIsDesktopRef.current = desktop;
36
+ const transitionFrame = window.requestAnimationFrame(() => {
37
+ setTransitionsReady(true);
38
+ });
39
+ const handleResize = () => {
40
+ const nowDesktop = getIsDesktop();
41
+ setIsDesktop(nowDesktop);
42
+ if (nowDesktop !== prevIsDesktopRef.current) {
43
+ setSidebarOpen(nowDesktop);
44
+ prevIsDesktopRef.current = nowDesktop;
45
+ }
46
+ };
47
+ window.addEventListener("resize", handleResize);
48
+ return () => {
49
+ window.cancelAnimationFrame(transitionFrame);
50
+ window.removeEventListener("resize", handleResize);
51
+ };
52
+ }, []);
53
+ useEffect(() => {
54
+ if (isDesktop || !sidebarOpen) return;
55
+ const mainElement = mainRef.current;
56
+ const closeSidebar = () => setSidebarOpen(false);
57
+ const onPointerDown = (e) => {
58
+ const target = e.target;
59
+ if (!target) return;
60
+ if (sidebarRef.current?.contains(target)) return;
61
+ if (hamburgerRef.current?.contains(target)) return;
62
+ closeSidebar();
63
+ };
64
+ const timeoutId = window.setTimeout(() => {
65
+ document.addEventListener("pointerdown", onPointerDown);
66
+ window.addEventListener("scroll", closeSidebar, { passive: true });
67
+ mainElement?.addEventListener("scroll", closeSidebar, { passive: true });
68
+ document.addEventListener("touchmove", closeSidebar, { passive: true });
69
+ }, 10);
70
+ return () => {
71
+ window.clearTimeout(timeoutId);
72
+ document.removeEventListener("pointerdown", onPointerDown);
73
+ window.removeEventListener("scroll", closeSidebar);
74
+ mainElement?.removeEventListener("scroll", closeSidebar);
75
+ document.removeEventListener("touchmove", closeSidebar);
76
+ };
77
+ }, [sidebarOpen, isDesktop]);
78
+ useEffect(() => {
79
+ if (!isDesktop && closeKeyRef.current !== closeSidebarOnChangeKey) setSidebarOpen(false);
80
+ closeKeyRef.current = closeSidebarOnChangeKey;
81
+ }, [closeSidebarOnChangeKey, isDesktop]);
82
+ useEffect(() => {
83
+ onSidebarToggle?.(sidebarOpen);
84
+ }, [sidebarOpen, onSidebarToggle]);
85
+ const toggleSidebar = () => setSidebarOpen((open) => !open);
86
+ const sidebarWidthValue = sidebarWidth === void 0 ? void 0 : typeof sidebarWidth === "number" ? `${sidebarWidth}px` : sidebarWidth;
87
+ const shellStyle = sidebarWidthValue ? { ["--app-shell-sidebar-width"]: sidebarWidthValue } : void 0;
88
+ const shellClasses = cx(app_shell_module_default.appShell, transitionsReady && app_shell_module_default.appShellAnimated, sidebarOpen ? app_shell_module_default.appShellOpen : app_shell_module_default.appShellCollapsed, className);
89
+ const sidebarClasses = cx(app_shell_module_default.appShellSidebar, sidebarOpen && app_shell_module_default.appShellSidebarOpen, sidebarClassName);
90
+ return /* @__PURE__ */ jsxs("div", {
91
+ className: shellClasses,
92
+ style: shellStyle,
93
+ "data-app-shell": true,
94
+ "data-desktop": isDesktop ? "true" : "false",
95
+ "data-sidebar-open": sidebarOpen ? "true" : "false",
96
+ children: [
97
+ /* @__PURE__ */ jsx(TopBar, {
98
+ className: cx(app_shell_module_default.appShellTopbar, topbarClassName),
99
+ leading: /* @__PURE__ */ jsx("button", {
100
+ ref: hamburgerRef,
101
+ type: "button",
102
+ className: app_shell_module_default.appShellHamburger,
103
+ onClick: toggleSidebar,
104
+ "aria-label": hamburgerLabel,
105
+ "aria-expanded": sidebarOpen,
106
+ "aria-controls": sidebarId,
107
+ children: /* @__PURE__ */ jsx("svg", {
108
+ viewBox: "0 0 24 24",
109
+ "aria-hidden": "true",
110
+ children: /* @__PURE__ */ jsx("path", {
111
+ d: "M3 6h18M3 12h18M3 18h18",
112
+ stroke: "currentColor",
113
+ strokeWidth: "2.5",
114
+ strokeLinecap: "round"
115
+ })
116
+ })
117
+ }),
118
+ brand,
119
+ brandHref,
120
+ brandingLocation: topBarBrandingLocation,
121
+ start: topbarStart,
122
+ actions: topbarEnd,
123
+ showThemeToggle,
124
+ themeToggleProps
125
+ }),
126
+ !isDesktop && sidebarOpen && /* @__PURE__ */ jsx("div", {
127
+ className: app_shell_module_default.appShellBackdrop,
128
+ onClick: () => setSidebarOpen(false),
129
+ onTouchStart: () => setSidebarOpen(false),
130
+ "aria-hidden": "true"
131
+ }),
132
+ /* @__PURE__ */ jsx("aside", {
133
+ ref: sidebarRef,
134
+ id: sidebarId,
135
+ className: sidebarClasses,
136
+ "aria-label": "Sidebar navigation",
137
+ children: sidebar
138
+ }),
139
+ /* @__PURE__ */ jsx("main", {
140
+ ref: mainRef,
141
+ className: cx(app_shell_module_default.appShellMain, mainClassName),
142
+ children
143
+ })
144
+ ]
145
+ });
146
+ }
147
+ //#endregion
148
+ export { AppShell };
149
+
150
+ //# sourceMappingURL=index38.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index38.js","names":[],"sources":["../src/components/app-shell/AppShell.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport { TopBar, type TopBarProps } from \"../top-bar/TopBar\";\nimport styles from \"./app-shell.module.css\";\n\nconst DESKTOP_BREAKPOINT = 960;\n\nfunction getIsDesktop() {\n if (typeof window === \"undefined\") return false;\n return window.innerWidth >= DESKTOP_BREAKPOINT;\n}\n\nexport type AppShellProps = {\n /** Primary page content rendered in the main area. */\n children: ReactNode;\n /** Sidebar navigation or custom content. */\n sidebar: ReactNode;\n /** Brand element rendered next to the hamburger (text or JSX). */\n brand?: ReactNode;\n /** Optional brand href; when provided the brand renders as an anchor. */\n brandHref?: string;\n /** Optional content after the brand on the left side of the top bar. */\n topbarStart?: ReactNode;\n /** Optional content aligned to the right side of the top bar. */\n topbarEnd?: ReactNode;\n /** Optional built-in theme toggle for the top bar. */\n showThemeToggle?: boolean;\n themeToggleProps?: TopBarProps[\"themeToggleProps\"];\n topBarBrandingLocation?: TopBarProps[\"brandingLocation\"];\n /** Custom class names for styling overrides. */\n className?: string;\n sidebarClassName?: string;\n topbarClassName?: string;\n mainClassName?: string;\n /** Sets the sidebar width (e.g., `260`, `\"18rem\"`). */\n sidebarWidth?: number | string;\n /**\n * Closes the sidebar on mobile whenever this value changes.\n * Useful for reacting to route/pathname changes.\n */\n closeSidebarOnChangeKey?: unknown;\n /** Label for the hamburger button (aria-label). */\n hamburgerLabel?: string;\n /** Optional callback fired whenever the sidebar open state changes. */\n onSidebarToggle?: (open: boolean) => void;\n};\n\n/**\n * Responsive application shell with a collapsible sidebar and sticky top bar.\n *\n * - Sidebar opens by default on desktop, collapses on mobile.\n * - Closes on outside click/scroll/touch when in mobile mode.\n * - Provides optional hook to close the sidebar when a prop value changes\n * (e.g., route transitions).\n */\nexport function AppShell({\n children,\n sidebar,\n brand,\n brandHref,\n topbarStart,\n topbarEnd,\n showThemeToggle = false,\n themeToggleProps,\n topBarBrandingLocation = \"left\",\n className,\n sidebarClassName,\n topbarClassName,\n mainClassName,\n sidebarWidth,\n closeSidebarOnChangeKey,\n hamburgerLabel = \"Toggle navigation\",\n onSidebarToggle,\n}: AppShellProps) {\n const [isDesktop, setIsDesktop] = useState(false);\n const [sidebarOpen, setSidebarOpen] = useState(false);\n const [transitionsReady, setTransitionsReady] = useState(false);\n const prevIsDesktopRef = useRef(false);\n const closeKeyRef = useRef(closeSidebarOnChangeKey);\n\n const sidebarRef = useRef<HTMLElement | null>(null);\n const hamburgerRef = useRef<HTMLButtonElement | null>(null);\n const mainRef = useRef<HTMLElement | null>(null);\n const sidebarId = useId();\n\n useEffect(() => {\n const desktop = getIsDesktop();\n setIsDesktop(desktop);\n setSidebarOpen(desktop);\n prevIsDesktopRef.current = desktop;\n const transitionFrame = window.requestAnimationFrame(() => {\n setTransitionsReady(true);\n });\n\n const handleResize = () => {\n const nowDesktop = getIsDesktop();\n setIsDesktop(nowDesktop);\n if (nowDesktop !== prevIsDesktopRef.current) {\n setSidebarOpen(nowDesktop);\n prevIsDesktopRef.current = nowDesktop;\n }\n };\n\n window.addEventListener(\"resize\", handleResize);\n return () => {\n window.cancelAnimationFrame(transitionFrame);\n window.removeEventListener(\"resize\", handleResize);\n };\n }, []);\n\n // Close the sidebar when clicking outside or scrolling on mobile.\n useEffect(() => {\n if (isDesktop || !sidebarOpen) return;\n\n const mainElement = mainRef.current;\n const closeSidebar = () => setSidebarOpen(false);\n\n const onPointerDown = (e: PointerEvent) => {\n const target = e.target as Node | null;\n if (!target) return;\n if (sidebarRef.current?.contains(target)) return;\n if (hamburgerRef.current?.contains(target)) return;\n closeSidebar();\n };\n\n const timeoutId = window.setTimeout(() => {\n document.addEventListener(\"pointerdown\", onPointerDown);\n window.addEventListener(\"scroll\", closeSidebar, { passive: true });\n mainElement?.addEventListener(\"scroll\", closeSidebar, { passive: true });\n document.addEventListener(\"touchmove\", closeSidebar, { passive: true });\n }, 10);\n\n return () => {\n window.clearTimeout(timeoutId);\n document.removeEventListener(\"pointerdown\", onPointerDown);\n window.removeEventListener(\"scroll\", closeSidebar);\n mainElement?.removeEventListener(\"scroll\", closeSidebar);\n document.removeEventListener(\"touchmove\", closeSidebar);\n };\n }, [sidebarOpen, isDesktop]);\n\n // Allow consumers to request a mobile sidebar close when a value changes (e.g., pathname).\n useEffect(() => {\n if (!isDesktop && closeKeyRef.current !== closeSidebarOnChangeKey) {\n setSidebarOpen(false);\n }\n closeKeyRef.current = closeSidebarOnChangeKey;\n }, [closeSidebarOnChangeKey, isDesktop]);\n\n useEffect(() => {\n onSidebarToggle?.(sidebarOpen);\n }, [sidebarOpen, onSidebarToggle]);\n\n const toggleSidebar = () => setSidebarOpen((open) => !open);\n\n const sidebarWidthValue =\n sidebarWidth === undefined\n ? undefined\n : typeof sidebarWidth === \"number\"\n ? `${sidebarWidth}px`\n : sidebarWidth;\n\n const shellStyle: CSSProperties | undefined = sidebarWidthValue\n ? { [\"--app-shell-sidebar-width\" as string]: sidebarWidthValue }\n : undefined;\n\n const shellClasses = cx(\n styles.appShell,\n transitionsReady && styles.appShellAnimated,\n sidebarOpen ? styles.appShellOpen : styles.appShellCollapsed,\n className,\n );\n\n const sidebarClasses = cx(\n styles.appShellSidebar,\n sidebarOpen && styles.appShellSidebarOpen,\n sidebarClassName,\n );\n\n return (\n <div\n className={shellClasses}\n style={shellStyle}\n data-app-shell\n data-desktop={isDesktop ? \"true\" : \"false\"}\n data-sidebar-open={sidebarOpen ? \"true\" : \"false\"}\n >\n <TopBar\n className={cx(styles.appShellTopbar, topbarClassName)}\n leading={\n <button\n ref={hamburgerRef}\n type=\"button\"\n className={styles.appShellHamburger}\n onClick={toggleSidebar}\n aria-label={hamburgerLabel}\n aria-expanded={sidebarOpen}\n aria-controls={sidebarId}\n >\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M3 6h18M3 12h18M3 18h18\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n }\n brand={brand}\n brandHref={brandHref}\n brandingLocation={topBarBrandingLocation}\n start={topbarStart}\n actions={topbarEnd}\n showThemeToggle={showThemeToggle}\n themeToggleProps={themeToggleProps}\n />\n {!isDesktop && sidebarOpen && (\n <div\n className={styles.appShellBackdrop}\n onClick={() => setSidebarOpen(false)}\n onTouchStart={() => setSidebarOpen(false)}\n aria-hidden=\"true\"\n />\n )}\n <aside ref={sidebarRef} id={sidebarId} className={sidebarClasses} aria-label=\"Sidebar navigation\">\n {sidebar}\n </aside>\n <main ref={mainRef} className={cx(styles.appShellMain, mainClassName)}>\n {children}\n </main>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAcA,IAAM,qBAAqB;AAE3B,SAAS,eAAe;CACtB,IAAI,OAAO,WAAW,aAAa,OAAO;CAC1C,OAAO,OAAO,cAAc;AAC9B;;;;;;;;;AA6CA,SAAgB,SAAS,EACvB,UACA,SACA,OACA,WACA,aACA,WACA,kBAAkB,OAClB,kBACA,yBAAyB,QACzB,WACA,kBACA,iBACA,eACA,cACA,yBACA,iBAAiB,qBACjB,mBACgB;CAChB,MAAM,CAAC,WAAW,gBAAgB,SAAS,KAAK;CAChD,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CACpD,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,KAAK;CAC9D,MAAM,mBAAmB,OAAO,KAAK;CACrC,MAAM,cAAc,OAAO,uBAAuB;CAElD,MAAM,aAAa,OAA2B,IAAI;CAClD,MAAM,eAAe,OAAiC,IAAI;CAC1D,MAAM,UAAU,OAA2B,IAAI;CAC/C,MAAM,YAAY,MAAM;CAExB,gBAAgB;EACd,MAAM,UAAU,aAAa;EAC7B,aAAa,OAAO;EACpB,eAAe,OAAO;EACtB,iBAAiB,UAAU;EAC3B,MAAM,kBAAkB,OAAO,4BAA4B;GACzD,oBAAoB,IAAI;EAC1B,CAAC;EAED,MAAM,qBAAqB;GACzB,MAAM,aAAa,aAAa;GAChC,aAAa,UAAU;GACvB,IAAI,eAAe,iBAAiB,SAAS;IAC3C,eAAe,UAAU;IACzB,iBAAiB,UAAU;GAC7B;EACF;EAEA,OAAO,iBAAiB,UAAU,YAAY;EAC9C,aAAa;GACX,OAAO,qBAAqB,eAAe;GAC3C,OAAO,oBAAoB,UAAU,YAAY;EACnD;CACF,GAAG,CAAC,CAAC;CAGL,gBAAgB;EACd,IAAI,aAAa,CAAC,aAAa;EAE/B,MAAM,cAAc,QAAQ;EAC5B,MAAM,qBAAqB,eAAe,KAAK;EAE/C,MAAM,iBAAiB,MAAoB;GACzC,MAAM,SAAS,EAAE;GACjB,IAAI,CAAC,QAAQ;GACb,IAAI,WAAW,SAAS,SAAS,MAAM,GAAG;GAC1C,IAAI,aAAa,SAAS,SAAS,MAAM,GAAG;GAC5C,aAAa;EACf;EAEA,MAAM,YAAY,OAAO,iBAAiB;GACxC,SAAS,iBAAiB,eAAe,aAAa;GACtD,OAAO,iBAAiB,UAAU,cAAc,EAAE,SAAS,KAAK,CAAC;GACjE,aAAa,iBAAiB,UAAU,cAAc,EAAE,SAAS,KAAK,CAAC;GACvE,SAAS,iBAAiB,aAAa,cAAc,EAAE,SAAS,KAAK,CAAC;EACxE,GAAG,EAAE;EAEL,aAAa;GACX,OAAO,aAAa,SAAS;GAC7B,SAAS,oBAAoB,eAAe,aAAa;GACzD,OAAO,oBAAoB,UAAU,YAAY;GACjD,aAAa,oBAAoB,UAAU,YAAY;GACvD,SAAS,oBAAoB,aAAa,YAAY;EACxD;CACF,GAAG,CAAC,aAAa,SAAS,CAAC;CAG3B,gBAAgB;EACd,IAAI,CAAC,aAAa,YAAY,YAAY,yBACxC,eAAe,KAAK;EAEtB,YAAY,UAAU;CACxB,GAAG,CAAC,yBAAyB,SAAS,CAAC;CAEvC,gBAAgB;EACd,kBAAkB,WAAW;CAC/B,GAAG,CAAC,aAAa,eAAe,CAAC;CAEjC,MAAM,sBAAsB,gBAAgB,SAAS,CAAC,IAAI;CAE1D,MAAM,oBACJ,iBAAiB,KAAA,IACb,KAAA,IACA,OAAO,iBAAiB,WACtB,GAAG,aAAa,MAChB;CAER,MAAM,aAAwC,oBAC1C,GAAG,8BAAwC,kBAAkB,IAC7D,KAAA;CAEJ,MAAM,eAAe,GACnB,yBAAO,UACP,oBAAoB,yBAAO,kBAC3B,cAAc,yBAAO,eAAe,yBAAO,mBAC3C,SACF;CAEA,MAAM,iBAAiB,GACrB,yBAAO,iBACP,eAAe,yBAAO,qBACtB,gBACF;CAEA,OACE,qBAAC,OAAD;EACE,WAAW;EACX,OAAO;EACP,kBAAA;EACA,gBAAc,YAAY,SAAS;EACnC,qBAAmB,cAAc,SAAS;YAL5C;GAOE,oBAAC,QAAD;IACE,WAAW,GAAG,yBAAO,gBAAgB,eAAe;IACpD,SACE,oBAAC,UAAD;KACE,KAAK;KACL,MAAK;KACL,WAAW,yBAAO;KAClB,SAAS;KACT,cAAY;KACZ,iBAAe;KACf,iBAAe;eAEf,oBAAC,OAAD;MAAK,SAAQ;MAAY,eAAY;gBACnC,oBAAC,QAAD;OAAM,GAAE;OAA0B,QAAO;OAAe,aAAY;OAAM,eAAc;MAAS,CAAA;KAC9F,CAAA;IACC,CAAA;IAEH;IACI;IACX,kBAAkB;IAClB,OAAO;IACP,SAAS;IACQ;IACC;GACnB,CAAA;GACA,CAAC,aAAa,eACb,oBAAC,OAAD;IACE,WAAW,yBAAO;IAClB,eAAe,eAAe,KAAK;IACnC,oBAAoB,eAAe,KAAK;IACxC,eAAY;GACb,CAAA;GAEH,oBAAC,SAAD;IAAO,KAAK;IAAY,IAAI;IAAW,WAAW;IAAgB,cAAW;cAC1E;GACI,CAAA;GACP,oBAAC,QAAD;IAAM,KAAK;IAAS,WAAW,GAAG,yBAAO,cAAc,aAAa;IACjE;GACG,CAAA;EACH;;AAET"}