@godxjp/ui 5.0.2 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/README.md +101 -142
  2. package/dist/app/index.d.ts +140 -0
  3. package/dist/app/index.js +38 -0
  4. package/dist/app.prop-IobwLwaM.d.ts +90 -0
  5. package/dist/checkbox-NkFkqsQ8.d.ts +13 -0
  6. package/dist/chunk-2XW7J3EI.js +226 -0
  7. package/dist/chunk-3F2AKYRD.js +416 -0
  8. package/dist/chunk-3KPEZ5CF.js +37 -0
  9. package/dist/chunk-3UGU5TYP.js +89 -0
  10. package/dist/chunk-6RA3KSVK.js +588 -0
  11. package/dist/chunk-7NZFVD24.js +122 -0
  12. package/dist/chunk-7PWBC4BY.js +25 -0
  13. package/dist/chunk-7S7MYFXE.js +61 -0
  14. package/dist/chunk-7WRZG2IG.js +71 -0
  15. package/dist/chunk-B775Y6BE.js +1 -0
  16. package/dist/chunk-BHV2FUOA.js +111 -0
  17. package/dist/chunk-BI3HERR7.js +70 -0
  18. package/dist/chunk-BPSKQUL2.js +68 -0
  19. package/dist/chunk-CDWPQ5RP.js +187 -0
  20. package/dist/chunk-CP2LET6N.js +244 -0
  21. package/dist/chunk-CQBADMFG.js +20 -0
  22. package/dist/chunk-CRERCLIZ.js +33 -0
  23. package/dist/chunk-DU6ZYZRP.js +238 -0
  24. package/dist/chunk-DY5C44UP.js +55 -0
  25. package/dist/chunk-E4HJNQ62.js +117 -0
  26. package/dist/chunk-E76QIYSY.js +93 -0
  27. package/dist/chunk-F7PG4OEV.js +37 -0
  28. package/dist/chunk-GDSVW62T.js +171 -0
  29. package/dist/chunk-H2FHJOLU.js +178 -0
  30. package/dist/chunk-HJEBRCXL.js +55 -0
  31. package/dist/chunk-ICM6XBST.js +16 -0
  32. package/dist/chunk-IK7I3ABN.js +88 -0
  33. package/dist/chunk-L6J44O74.js +144 -0
  34. package/dist/chunk-LDSLS6HE.js +1 -0
  35. package/dist/chunk-LVNUHUEZ.js +191 -0
  36. package/dist/chunk-M64MVRLS.js +92 -0
  37. package/dist/chunk-NGQW3KEM.js +402 -0
  38. package/dist/chunk-NZ4FOC5N.js +559 -0
  39. package/dist/chunk-PIIRNAXA.js +26 -0
  40. package/dist/chunk-S66TJXJU.js +33 -0
  41. package/dist/chunk-SMLKNECP.js +133 -0
  42. package/dist/chunk-TAHBM3F2.js +66 -0
  43. package/dist/chunk-TO33OY4L.js +150 -0
  44. package/dist/chunk-TO7URV7U.js +51 -0
  45. package/dist/chunk-TOO5AEKL.js +81 -0
  46. package/dist/chunk-U3GHAOIJ.js +299 -0
  47. package/dist/chunk-U7N2A7A3.js +9 -0
  48. package/dist/chunk-UX634MYF.js +123 -0
  49. package/dist/chunk-V6UWJKZF.js +28 -0
  50. package/dist/chunk-VOHTRR5X.js +28 -0
  51. package/dist/chunk-WRFKVUPW.js +332 -0
  52. package/dist/chunk-WXW43RK5.js +24 -0
  53. package/dist/chunk-XG7XDYIM.js +60 -0
  54. package/dist/chunk-YFCQKO3B.js +842 -0
  55. package/dist/chunk-ZDWXGWLY.js +73 -0
  56. package/dist/chunk-ZLK5SPT6.js +11 -0
  57. package/dist/chunk-ZS6DTAM2.js +31 -0
  58. package/dist/chunk-ZT5UEUBO.js +1 -0
  59. package/dist/components/admin/index.d.ts +80 -0
  60. package/dist/components/admin/index.js +38 -0
  61. package/dist/components/data-display/badge.d.ts +12 -0
  62. package/dist/components/data-display/badge.js +3 -0
  63. package/dist/components/data-display/card.d.ts +87 -0
  64. package/dist/components/data-display/card.js +2 -0
  65. package/dist/components/data-display/index.d.ts +72 -0
  66. package/dist/components/data-display/index.js +89 -0
  67. package/dist/components/data-display/popover.d.ts +13 -0
  68. package/dist/components/data-display/popover.js +2 -0
  69. package/dist/components/data-display/scroll-area.d.ts +7 -0
  70. package/dist/components/data-display/scroll-area.js +2 -0
  71. package/dist/components/data-display/table.d.ts +10 -0
  72. package/dist/components/data-display/table.js +3 -0
  73. package/dist/components/data-entry/autocomplete.d.ts +16 -0
  74. package/dist/components/data-entry/autocomplete.js +8 -0
  75. package/dist/components/data-entry/calendar.d.ts +16 -0
  76. package/dist/components/data-entry/calendar.js +4 -0
  77. package/dist/components/data-entry/cascader.d.ts +32 -0
  78. package/dist/components/data-entry/cascader.js +13 -0
  79. package/dist/components/data-entry/checkbox.d.ts +13 -0
  80. package/dist/components/data-entry/checkbox.js +4 -0
  81. package/dist/components/data-entry/color-picker.d.ts +16 -0
  82. package/dist/components/data-entry/color-picker.js +6 -0
  83. package/dist/components/data-entry/command.d.ts +69 -0
  84. package/dist/components/data-entry/command.js +3 -0
  85. package/dist/components/data-entry/date-picker.d.ts +16 -0
  86. package/dist/components/data-entry/date-picker.js +8 -0
  87. package/dist/components/data-entry/date-range-picker.d.ts +16 -0
  88. package/dist/components/data-entry/date-range-picker.js +8 -0
  89. package/dist/components/data-entry/index.d.ts +53 -0
  90. package/dist/components/data-entry/index.js +152 -0
  91. package/dist/components/data-entry/input.d.ts +6 -0
  92. package/dist/components/data-entry/input.js +2 -0
  93. package/dist/components/data-entry/label.d.ts +8 -0
  94. package/dist/components/data-entry/label.js +2 -0
  95. package/dist/components/data-entry/radio.d.ts +24 -0
  96. package/dist/components/data-entry/radio.js +4 -0
  97. package/dist/components/data-entry/select.d.ts +18 -0
  98. package/dist/components/data-entry/select.js +3 -0
  99. package/dist/components/data-entry/slider.d.ts +16 -0
  100. package/dist/components/data-entry/slider.js +2 -0
  101. package/dist/components/data-entry/switch.d.ts +17 -0
  102. package/dist/components/data-entry/switch.js +2 -0
  103. package/dist/components/data-entry/textarea.d.ts +6 -0
  104. package/dist/components/data-entry/textarea.js +3 -0
  105. package/dist/components/data-entry/time-picker.d.ts +16 -0
  106. package/dist/components/data-entry/time-picker.js +7 -0
  107. package/dist/components/data-entry/transfer.d.ts +17 -0
  108. package/dist/components/data-entry/transfer.js +11 -0
  109. package/dist/components/data-entry/tree-select.d.ts +26 -0
  110. package/dist/components/data-entry/tree-select.js +13 -0
  111. package/dist/components/data-entry/upload.d.ts +42 -0
  112. package/dist/components/data-entry/upload.js +11 -0
  113. package/dist/components/feedback/alert.d.ts +60 -0
  114. package/dist/components/feedback/alert.js +7 -0
  115. package/dist/components/feedback/dialog.d.ts +64 -0
  116. package/dist/components/feedback/dialog.js +7 -0
  117. package/dist/components/feedback/index.d.ts +16 -0
  118. package/dist/components/feedback/index.js +14 -0
  119. package/dist/components/feedback/sheet.d.ts +24 -0
  120. package/dist/components/feedback/sheet.js +2 -0
  121. package/dist/components/feedback/sonner.d.ts +6 -0
  122. package/dist/components/feedback/sonner.js +1 -0
  123. package/dist/components/general/button.d.ts +20 -0
  124. package/dist/components/general/button.js +2 -0
  125. package/dist/components/general/index.d.ts +6 -0
  126. package/dist/components/general/index.js +2 -0
  127. package/dist/components/layout/index.d.ts +71 -0
  128. package/dist/components/layout/index.js +5 -0
  129. package/dist/components/navigation/dropdown-menu.d.ts +28 -0
  130. package/dist/components/navigation/dropdown-menu.js +2 -0
  131. package/dist/components/navigation/index.d.ts +32 -0
  132. package/dist/components/navigation/index.js +12 -0
  133. package/dist/components/navigation/pagination.d.ts +11 -0
  134. package/dist/components/navigation/pagination.js +7 -0
  135. package/dist/components/navigation/steps.d.ts +12 -0
  136. package/dist/components/navigation/steps.js +3 -0
  137. package/dist/components/navigation/tabs-items.d.ts +12 -0
  138. package/dist/components/navigation/tabs-items.js +3 -0
  139. package/dist/components/navigation/tabs.d.ts +12 -0
  140. package/dist/components/navigation/tabs.js +2 -0
  141. package/dist/components/query/index.d.ts +43 -0
  142. package/dist/components/query/index.js +8 -0
  143. package/dist/components/ui/index.d.ts +57 -0
  144. package/dist/components/ui/index.js +37 -0
  145. package/dist/content.prop-D1Dd3TAc.d.ts +31 -0
  146. package/dist/data-display.prop-DNTAzmDy.d.ts +58 -0
  147. package/dist/data-entry.prop-BEGA1lTq.d.ts +323 -0
  148. package/dist/data-table-D1u_rKLK.d.ts +83 -0
  149. package/dist/data.prop-BVvfKC_g.d.ts +41 -0
  150. package/dist/feedback.prop-BmxUlpAW.d.ts +64 -0
  151. package/dist/filter-bar-B7OGFO9S.d.ts +10 -0
  152. package/dist/form/index.d.ts +21 -0
  153. package/dist/form/index.js +4 -0
  154. package/dist/form.prop-BHgpuFFm.d.ts +41 -0
  155. package/dist/format-date-ByyZoqI5.d.ts +51 -0
  156. package/dist/general.prop-D7brMPNL.d.ts +16 -0
  157. package/dist/i18n/index.d.ts +217 -0
  158. package/dist/i18n/index.js +2 -0
  159. package/dist/index.d.ts +46 -26
  160. package/dist/index.js +39 -13062
  161. package/dist/inline-C5u6ptJV.d.ts +10 -0
  162. package/dist/interaction.prop-Cdn7wOtq.d.ts +25 -0
  163. package/dist/layout.prop-4TCNvyQZ.d.ts +20 -0
  164. package/dist/layout.prop-C795F0qg.d.ts +112 -0
  165. package/dist/lib/datetime/index.d.ts +31 -0
  166. package/dist/lib/datetime/index.js +1 -0
  167. package/dist/lib/utils.d.ts +5 -0
  168. package/dist/lib/utils.js +1 -0
  169. package/dist/navigation.prop-DpZqcXey.d.ts +78 -0
  170. package/dist/navigation.prop-DxBiClEH.d.ts +20 -0
  171. package/dist/props/components/index.d.ts +27 -0
  172. package/dist/props/components/index.js +1 -0
  173. package/dist/props/index.d.ts +28 -0
  174. package/dist/props/index.js +3 -0
  175. package/dist/props/registry.d.ts +649 -0
  176. package/dist/props/registry.js +1 -0
  177. package/dist/props/vocabulary/index.d.ts +7 -0
  178. package/dist/props/vocabulary/index.js +1 -0
  179. package/dist/query.prop-hIPrk2zI.d.ts +71 -0
  180. package/dist/search-input-uP01rY1L.d.ts +22 -0
  181. package/dist/shared.prop-BNRJc9K0.d.ts +45 -0
  182. package/dist/styles/alert-layout.css +191 -0
  183. package/dist/styles/badge-layout.css +22 -0
  184. package/dist/styles/card-layout.css +373 -0
  185. package/dist/styles/control.css +504 -0
  186. package/dist/styles/data-display-layout.css +246 -0
  187. package/dist/styles/density.css +43 -0
  188. package/dist/styles/dialog-layout.css +84 -0
  189. package/dist/styles/index.css +105 -0
  190. package/dist/styles/layout.css +479 -0
  191. package/dist/styles/shell-layout.css +604 -0
  192. package/dist/styles/table-layout.css +109 -0
  193. package/dist/theme/example.service.css +37 -0
  194. package/dist/tokens/base.css +13 -0
  195. package/dist/tokens/foundation.css +151 -0
  196. package/dist/tokens/primitives/badge.css +13 -0
  197. package/dist/tokens/primitives/card.css +29 -0
  198. package/dist/tokens/primitives/control.css +55 -0
  199. package/dist/tokens/primitives/feedback.css +17 -0
  200. package/dist/tokens/primitives/layout.css +20 -0
  201. package/dist/tokens/primitives/navigation.css +13 -0
  202. package/dist/tokens/primitives/table.css +10 -0
  203. package/dist/types-mvzYGrma.d.ts +37 -0
  204. package/dist/use-toast-Dol5bdY3.d.ts +34 -0
  205. package/package.json +279 -117
  206. package/scripts/ui-audit.mjs +179 -0
  207. package/BRAND.md +0 -296
  208. package/CHANGELOG.md +0 -668
  209. package/config/eslint.js +0 -54
  210. package/config/prettier.cjs +0 -20
  211. package/config/tsconfig.base.json +0 -22
  212. package/config/vitest.base.ts +0 -26
  213. package/dist/MiniMonth-YAmPGEpC.d.ts +0 -143
  214. package/dist/Table.types-BbsxoIYE.d.ts +0 -352
  215. package/dist/color-DO0qqUAb.d.ts +0 -38
  216. package/dist/components/composites.d.ts +0 -963
  217. package/dist/components/composites.js +0 -7343
  218. package/dist/components/composites.js.map +0 -1
  219. package/dist/components/primitives.d.ts +0 -2744
  220. package/dist/components/primitives.js +0 -7356
  221. package/dist/components/primitives.js.map +0 -1
  222. package/dist/components/shell.d.ts +0 -182
  223. package/dist/components/shell.js +0 -774
  224. package/dist/components/shell.js.map +0 -1
  225. package/dist/hooks.d.ts +0 -100
  226. package/dist/hooks.js +0 -558
  227. package/dist/hooks.js.map +0 -1
  228. package/dist/i18n.d.ts +0 -61
  229. package/dist/i18n.js +0 -860
  230. package/dist/i18n.js.map +0 -1
  231. package/dist/index.js.map +0 -1
  232. package/dist/padding-DY0JV5Ja.d.ts +0 -16
  233. package/dist/preferences.d.ts +0 -132
  234. package/dist/preferences.js +0 -262
  235. package/dist/preferences.js.map +0 -1
  236. package/dist/props.d.ts +0 -86
  237. package/dist/props.js +0 -16
  238. package/dist/props.js.map +0 -1
  239. package/dist/size-CQwNvOWd.d.ts +0 -19
  240. package/dist/types-LTj-2bl-.d.ts +0 -30
  241. package/dist/useTableViews-D5NIAJ7h.d.ts +0 -154
  242. package/src/tokens/tailwind.css +0 -158
@@ -1,774 +0,0 @@
1
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { ChevronDown, PanelLeftOpen, PanelLeftClose, Search, Bell, SlidersHorizontal, X, Check, Clock } from 'lucide-react';
3
- import { useTranslation } from 'react-i18next';
4
- import { clsx } from 'clsx';
5
- import { twMerge } from 'tailwind-merge';
6
- import * as Dialog from '@radix-ui/react-dialog';
7
- import { useState, useRef, useEffect, useCallback } from 'react';
8
- import i18next from 'i18next';
9
- import 'i18next-browser-languagedetector';
10
- import * as Popover from '@radix-ui/react-popover';
11
- import * as VisuallyHidden from '@radix-ui/react-visually-hidden';
12
- import { Command } from 'cmdk';
13
-
14
- // src/components/shell/AppShell.tsx
15
- function AppShell({
16
- sidebar,
17
- topbar,
18
- topbarLeft,
19
- topbarRight,
20
- logo,
21
- breadcrumb,
22
- footer,
23
- children,
24
- sidebarCollapsed = false
25
- }) {
26
- const resolvedTopbar = topbar !== void 0 ? topbar : /* @__PURE__ */ jsxs("div", { className: "app-topbar-rail", children: [
27
- logo !== void 0 && /* @__PURE__ */ jsx("div", { className: "app-topbar-logo", children: logo }),
28
- topbarLeft !== void 0 && /* @__PURE__ */ jsx("div", { className: "app-topbar-left", children: topbarLeft }),
29
- /* @__PURE__ */ jsx("div", { className: "app-topbar-spacer" }),
30
- topbarRight !== void 0 && /* @__PURE__ */ jsx("div", { className: "app-topbar-right", children: topbarRight })
31
- ] });
32
- return /* @__PURE__ */ jsxs("div", { className: "app-root", "data-collapsed": sidebarCollapsed, children: [
33
- /* @__PURE__ */ jsx("aside", { className: "app-sidebar", children: sidebar }),
34
- /* @__PURE__ */ jsx("header", { className: "app-topbar", children: resolvedTopbar }),
35
- /* @__PURE__ */ jsxs("main", { className: "app-main", children: [
36
- breadcrumb !== void 0 && /* @__PURE__ */ jsx("div", { className: "app-breadcrumb", children: breadcrumb }),
37
- children
38
- ] }),
39
- footer !== void 0 && /* @__PURE__ */ jsx("footer", { className: "app-footer", children: footer })
40
- ] });
41
- }
42
- function cn(...inputs) {
43
- return twMerge(clsx(inputs));
44
- }
45
- function Sidebar({
46
- activeId,
47
- onSelect,
48
- sections,
49
- product,
50
- onProductClick,
51
- brand,
52
- collapsed = false,
53
- footer
54
- }) {
55
- const { t } = useTranslation();
56
- return /* @__PURE__ */ jsxs("div", { className: "sb-root", "data-collapsed": collapsed ? "true" : void 0, style: { display: "contents" }, children: [
57
- brand !== void 0 ? /* @__PURE__ */ jsx("div", { className: "sb-brand", children: brand }) : product ? /* @__PURE__ */ jsxs(
58
- "button",
59
- {
60
- type: "button",
61
- className: "sb-product",
62
- onClick: onProductClick,
63
- "aria-label": product.name,
64
- children: [
65
- /* @__PURE__ */ jsx(
66
- "span",
67
- {
68
- className: "sb-logo-mark",
69
- style: { background: product.color },
70
- children: product.name[0]?.toUpperCase() ?? "?"
71
- }
72
- ),
73
- !collapsed && /* @__PURE__ */ jsxs(
74
- "span",
75
- {
76
- className: "sb-product-meta col flex-1 min-w-0",
77
- style: { display: "flex" },
78
- children: [
79
- /* @__PURE__ */ jsx("span", { className: "sb-product-name", children: product.name }),
80
- /* @__PURE__ */ jsx("span", { className: "sb-product-tenant", children: product.role })
81
- ]
82
- }
83
- ),
84
- !collapsed && /* @__PURE__ */ jsx("span", { className: "sb-product-tenant shrink-0", children: /* @__PURE__ */ jsx(ChevronDown, { size: 14 }) })
85
- ]
86
- }
87
- ) : null,
88
- /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto", children: sections.map((section, i) => /* @__PURE__ */ jsxs("div", { className: "sb-section", children: [
89
- section.label && !collapsed && /* @__PURE__ */ jsx("div", { className: "sb-section-label", children: section.label }),
90
- /* @__PURE__ */ jsx("div", { className: "sb-nav", role: "navigation", children: section.items.map((item) => {
91
- const Icon = item.icon;
92
- const isActive = item.id === activeId;
93
- return /* @__PURE__ */ jsxs(
94
- "button",
95
- {
96
- type: "button",
97
- className: cn("sb-nav-item"),
98
- "data-active": isActive,
99
- "aria-label": collapsed ? item.label : void 0,
100
- "aria-current": isActive ? "page" : void 0,
101
- "aria-disabled": item.disabled,
102
- title: collapsed ? item.label : void 0,
103
- onClick: () => !item.disabled && onSelect(item.id),
104
- children: [
105
- /* @__PURE__ */ jsx("span", { className: "sb-icon", children: /* @__PURE__ */ jsx(Icon, { size: 16 }) }),
106
- !collapsed && /* @__PURE__ */ jsx("span", { className: "sb-label", children: item.label }),
107
- !collapsed && item.badge !== void 0 && item.badge !== "" && /* @__PURE__ */ jsx("span", { className: "sb-badge", children: item.badge })
108
- ]
109
- },
110
- item.id
111
- );
112
- }) })
113
- ] }, section.label ?? i)) }),
114
- footer && /* @__PURE__ */ jsx("div", { className: "sb-footer", children: footer })
115
- ] });
116
- }
117
- function Topbar({
118
- product,
119
- project,
120
- onProductOpen,
121
- onProjectOpen,
122
- onSearchOpen,
123
- onTweaksOpen,
124
- collapsed = false,
125
- onToggleCollapsed,
126
- rightSlot,
127
- unread = false,
128
- onNotificationsOpen,
129
- user
130
- }) {
131
- const { t } = useTranslation();
132
- return /* @__PURE__ */ jsxs(Fragment, { children: [
133
- onToggleCollapsed && /* @__PURE__ */ jsx(
134
- "button",
135
- {
136
- type: "button",
137
- className: "tb-icon-btn",
138
- "aria-label": t("shell.sidebarCollapse"),
139
- "aria-pressed": collapsed,
140
- onClick: onToggleCollapsed,
141
- children: collapsed ? /* @__PURE__ */ jsx(PanelLeftOpen, { size: 16 }) : /* @__PURE__ */ jsx(PanelLeftClose, { size: 16 })
142
- }
143
- ),
144
- /* @__PURE__ */ jsxs("div", { className: "tb-switcher", children: [
145
- /* @__PURE__ */ jsxs(
146
- "button",
147
- {
148
- type: "button",
149
- className: "tb-chip",
150
- "aria-label": product.name,
151
- onClick: onProductOpen,
152
- children: [
153
- /* @__PURE__ */ jsx(
154
- "span",
155
- {
156
- className: "tb-chip-icon",
157
- style: { background: product.color },
158
- children: product.name[0]?.toUpperCase() ?? "?"
159
- }
160
- ),
161
- /* @__PURE__ */ jsx("span", { className: "tb-chip-label", children: product.name }),
162
- /* @__PURE__ */ jsx("span", { className: "tb-chip-caret", children: /* @__PURE__ */ jsx(ChevronDown, { size: 12 }) })
163
- ]
164
- }
165
- ),
166
- /* @__PURE__ */ jsx("span", { className: "tb-chip-sep", children: "/" }),
167
- /* @__PURE__ */ jsxs(
168
- "button",
169
- {
170
- type: "button",
171
- className: cn("tb-chip", !project && "tb-chip-empty"),
172
- "aria-label": project ? project.name : t("shell.pickProject"),
173
- onClick: onProjectOpen,
174
- children: [
175
- /* @__PURE__ */ jsx("span", { className: "tb-chip-label", children: project ? project.name : t("shell.pickProject") }),
176
- /* @__PURE__ */ jsx("span", { className: "tb-chip-caret", children: /* @__PURE__ */ jsx(ChevronDown, { size: 12 }) })
177
- ]
178
- }
179
- )
180
- ] }),
181
- /* @__PURE__ */ jsxs(
182
- "button",
183
- {
184
- type: "button",
185
- className: "tb-search ml-auto",
186
- onClick: onSearchOpen,
187
- children: [
188
- /* @__PURE__ */ jsx(Search, { size: 14 }),
189
- /* @__PURE__ */ jsxs("span", { children: [
190
- t("common.search"),
191
- "\u2026"
192
- ] }),
193
- /* @__PURE__ */ jsx("kbd", { className: "kbd", children: "\u2318K" })
194
- ]
195
- }
196
- ),
197
- rightSlot,
198
- onNotificationsOpen && /* @__PURE__ */ jsxs(
199
- "button",
200
- {
201
- type: "button",
202
- className: "tb-icon-btn tb-bell",
203
- "aria-label": t("topbar.notifications", { defaultValue: "Notifications" }),
204
- onClick: onNotificationsOpen,
205
- children: [
206
- /* @__PURE__ */ jsx(Bell, { size: 16 }),
207
- unread && /* @__PURE__ */ jsx("span", { className: "tb-bell-dot", "aria-hidden": true })
208
- ]
209
- }
210
- ),
211
- user,
212
- onTweaksOpen && /* @__PURE__ */ jsx(
213
- "button",
214
- {
215
- type: "button",
216
- className: "tb-icon-btn",
217
- "aria-label": t("tweaks.title"),
218
- onClick: onTweaksOpen,
219
- children: /* @__PURE__ */ jsx(SlidersHorizontal, { size: 16 })
220
- }
221
- )
222
- ] });
223
- }
224
- var SUPPORTED_LOCALES = ["ja", "en", "vi", "fil"];
225
- var GODX_LOCALE_STORAGE_KEY = "godx.locale";
226
- var i18n_default = i18next;
227
-
228
- // src/hooks/useTweaks.ts
229
- var STORAGE_KEY = "godx.tweaks";
230
- var DEFAULTS = {
231
- density: "default",
232
- theme: "light",
233
- tenant: "godx",
234
- locale: "ja",
235
- sidebarCollapsed: false
236
- };
237
- function loadInitial() {
238
- if (typeof window === "undefined") return DEFAULTS;
239
- try {
240
- const raw = window.localStorage.getItem(STORAGE_KEY);
241
- const stored = raw ? JSON.parse(raw) : {};
242
- const detected = i18n_default.language?.slice(0, 2) || "ja";
243
- return {
244
- ...DEFAULTS,
245
- ...stored,
246
- locale: stored.locale ?? detected
247
- };
248
- } catch {
249
- return DEFAULTS;
250
- }
251
- }
252
- function useTweaks() {
253
- const [tweaks, setTweaks] = useState(loadInitial);
254
- useEffect(() => {
255
- try {
256
- window.localStorage.setItem(STORAGE_KEY, JSON.stringify(tweaks));
257
- } catch {
258
- }
259
- }, [tweaks]);
260
- useEffect(() => {
261
- const html = document.documentElement;
262
- html.dataset.theme = tweaks.theme;
263
- html.dataset.density = tweaks.density;
264
- html.dataset.tenant = tweaks.tenant;
265
- html.lang = tweaks.locale;
266
- }, [tweaks.theme, tweaks.density, tweaks.tenant, tweaks.locale]);
267
- useEffect(() => {
268
- if (!i18n_default.isInitialized) return;
269
- if (i18n_default.language?.slice(0, 2) !== tweaks.locale) {
270
- void i18n_default.changeLanguage(tweaks.locale);
271
- try {
272
- window.localStorage.setItem(GODX_LOCALE_STORAGE_KEY, tweaks.locale);
273
- } catch {
274
- }
275
- }
276
- }, [tweaks.locale]);
277
- const setTweak = useCallback((key, value) => {
278
- setTweaks((prev) => ({ ...prev, [key]: value }));
279
- }, []);
280
- return { tweaks, setTweak, setTweaks };
281
- }
282
- function TweaksPanel({ open, onOpenChange, products = [] }) {
283
- const { t } = useTranslation();
284
- const { tweaks, setTweak } = useTweaks();
285
- return /* @__PURE__ */ jsx(Dialog.Root, { open, onOpenChange, children: /* @__PURE__ */ jsxs(Dialog.Portal, { children: [
286
- /* @__PURE__ */ jsx(Dialog.Overlay, { className: "fixed inset-0 z-40 bg-black/30 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0" }),
287
- /* @__PURE__ */ jsxs(
288
- Dialog.Content,
289
- {
290
- className: "fixed right-0 top-0 z-50 h-full w-80 bg-popover text-popover-foreground border-l border-border shadow-2xl data-[state=open]:animate-in data-[state=open]:slide-in-from-right",
291
- "aria-describedby": void 0,
292
- children: [
293
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-border px-4 h-12", children: [
294
- /* @__PURE__ */ jsx(Dialog.Title, { className: "font-medium text-sm", children: t("tweaks.title") }),
295
- /* @__PURE__ */ jsx(Dialog.Close, { asChild: true, children: /* @__PURE__ */ jsx("button", { className: "tb-icon-btn", "aria-label": "Close", children: /* @__PURE__ */ jsx(X, { size: 14 }) }) })
296
- ] }),
297
- /* @__PURE__ */ jsxs("div", { className: "overflow-y-auto h-[calc(100%-3rem)] p-4 flex flex-col gap-6", children: [
298
- /* @__PURE__ */ jsxs(Section, { label: t("tweaks.display"), children: [
299
- /* @__PURE__ */ jsx(
300
- Radio,
301
- {
302
- label: t("tweaks.density"),
303
- value: tweaks.density,
304
- onChange: (v) => setTweak("density", v),
305
- options: [
306
- { value: "compact", label: t("tweaks.densityCompact") },
307
- { value: "default", label: t("tweaks.densityDefault") },
308
- { value: "comfortable", label: t("tweaks.densityComfortable") }
309
- ]
310
- }
311
- ),
312
- /* @__PURE__ */ jsx(
313
- Radio,
314
- {
315
- label: t("tweaks.theme"),
316
- value: tweaks.theme,
317
- onChange: (v) => setTweak("theme", v),
318
- options: [
319
- { value: "light", label: t("tweaks.themeLight") },
320
- { value: "dark", label: t("tweaks.themeDark") }
321
- ]
322
- }
323
- ),
324
- /* @__PURE__ */ jsx(
325
- Toggle,
326
- {
327
- label: t("shell.sidebarCollapse"),
328
- value: tweaks.sidebarCollapsed,
329
- onChange: (v) => setTweak("sidebarCollapsed", v)
330
- }
331
- )
332
- ] }),
333
- products.length > 0 && /* @__PURE__ */ jsx(Section, { label: t("tweaks.product"), children: /* @__PURE__ */ jsx(
334
- Select,
335
- {
336
- label: t("tweaks.product"),
337
- value: tweaks.tenant,
338
- onChange: (v) => setTweak("tenant", v),
339
- options: products.map((p) => ({ value: p.tenant, label: p.name }))
340
- }
341
- ) }),
342
- /* @__PURE__ */ jsx(Section, { label: t("tweaks.locale"), children: /* @__PURE__ */ jsx(
343
- Radio,
344
- {
345
- label: t("tweaks.language"),
346
- value: tweaks.locale,
347
- onChange: (v) => setTweak("locale", v),
348
- options: SUPPORTED_LOCALES.map((code) => ({
349
- value: code,
350
- label: { ja: "\u65E5\u672C\u8A9E", en: "English", vi: "Ti\u1EBFng Vi\u1EC7t", fil: "Filipino" }[code] ?? code
351
- }))
352
- }
353
- ) })
354
- ] })
355
- ]
356
- }
357
- )
358
- ] }) });
359
- }
360
- function Section({ label, children }) {
361
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
362
- /* @__PURE__ */ jsx("div", { className: "text-[10px] font-medium uppercase tracking-wider text-muted-foreground", children: label }),
363
- children
364
- ] });
365
- }
366
- function Radio({
367
- label,
368
- value,
369
- onChange,
370
- options
371
- }) {
372
- return /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1", children: [
373
- /* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-foreground", children: label }),
374
- /* @__PURE__ */ jsx("div", { className: "grid auto-cols-fr grid-flow-col rounded-md border border-border overflow-hidden", children: options.map((opt) => /* @__PURE__ */ jsx(
375
- "button",
376
- {
377
- type: "button",
378
- "data-active": opt.value === value,
379
- onClick: () => onChange(opt.value),
380
- className: "px-2 py-1 text-xs hover:bg-accent/40 data-[active=true]:bg-primary data-[active=true]:text-primary-foreground",
381
- children: opt.label
382
- },
383
- opt.value
384
- )) })
385
- ] });
386
- }
387
- function Toggle({
388
- label,
389
- value,
390
- onChange
391
- }) {
392
- return /* @__PURE__ */ jsxs("label", { className: "flex items-center justify-between gap-2 text-xs", children: [
393
- /* @__PURE__ */ jsx("span", { className: "font-medium", children: label }),
394
- /* @__PURE__ */ jsx(
395
- "button",
396
- {
397
- type: "button",
398
- role: "switch",
399
- "aria-checked": value,
400
- onClick: () => onChange(!value),
401
- className: "relative inline-flex h-5 w-9 items-center rounded-full bg-input data-[on=true]:bg-primary transition-colors",
402
- "data-on": value,
403
- children: /* @__PURE__ */ jsx(
404
- "span",
405
- {
406
- className: "inline-block h-4 w-4 transform rounded-full bg-white shadow-sm transition-transform translate-x-0.5 data-[on=true]:translate-x-4",
407
- "data-on": value
408
- }
409
- )
410
- }
411
- )
412
- ] });
413
- }
414
- function Select({
415
- label,
416
- value,
417
- onChange,
418
- options
419
- }) {
420
- return /* @__PURE__ */ jsxs("label", { className: "flex flex-col gap-1", children: [
421
- /* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-foreground", children: label }),
422
- /* @__PURE__ */ jsx(
423
- "select",
424
- {
425
- className: "input",
426
- value,
427
- onChange: (e) => onChange(e.target.value),
428
- children: options.map((opt) => /* @__PURE__ */ jsx("option", { value: opt.value, children: opt.label }, opt.value))
429
- }
430
- )
431
- ] });
432
- }
433
- function ProductSwitcher({
434
- trigger,
435
- activeId,
436
- products = [],
437
- onSelect,
438
- open,
439
- onOpenChange
440
- }) {
441
- const { t } = useTranslation();
442
- const [query, setQuery] = useState("");
443
- const q = query.trim().toLowerCase();
444
- const filtered = q ? products.filter(
445
- (p) => p.name.toLowerCase().includes(q) || p.role.toLowerCase().includes(q)
446
- ) : products;
447
- return /* @__PURE__ */ jsxs(Popover.Root, { open, onOpenChange, children: [
448
- /* @__PURE__ */ jsx(Popover.Trigger, { asChild: true, children: trigger }),
449
- /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsxs(
450
- Popover.Content,
451
- {
452
- align: "start",
453
- sideOffset: 4,
454
- className: "sw-pop",
455
- onOpenAutoFocus: (e) => e.preventDefault(),
456
- children: [
457
- /* @__PURE__ */ jsxs("div", { className: "sw-pop-search", children: [
458
- /* @__PURE__ */ jsx(Search, { size: 14, className: "text-muted-foreground" }),
459
- /* @__PURE__ */ jsx(
460
- "input",
461
- {
462
- autoFocus: true,
463
- value: query,
464
- onChange: (e) => setQuery(e.target.value),
465
- placeholder: t("shell.searchProducts"),
466
- className: "flex-1 bg-transparent outline-none"
467
- }
468
- ),
469
- /* @__PURE__ */ jsx("kbd", { className: "kbd", children: "esc" })
470
- ] }),
471
- /* @__PURE__ */ jsxs("div", { className: "sw-pop-list", children: [
472
- /* @__PURE__ */ jsx("div", { className: "sw-pop-section", children: /* @__PURE__ */ jsxs("span", { children: [
473
- t("nav.products"),
474
- " \xB7 ",
475
- filtered.length
476
- ] }) }),
477
- filtered.length === 0 ? /* @__PURE__ */ jsx("div", { className: "sw-pop-empty", children: "\u2014" }) : filtered.map((p) => {
478
- const isActive = p.id === activeId;
479
- return /* @__PURE__ */ jsxs(
480
- "button",
481
- {
482
- type: "button",
483
- className: cn("sw-pop-item w-full text-left"),
484
- "data-active": isActive,
485
- onClick: () => {
486
- onSelect(p);
487
- setQuery("");
488
- },
489
- children: [
490
- /* @__PURE__ */ jsx(
491
- "span",
492
- {
493
- className: "sb-logo-mark",
494
- style: { background: p.color },
495
- children: p.name[0]?.toUpperCase() ?? "?"
496
- }
497
- ),
498
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col min-w-0 flex-1", children: [
499
- /* @__PURE__ */ jsx("span", { className: "text-sm font-medium truncate", children: p.name }),
500
- /* @__PURE__ */ jsx("span", { className: "text-[10px] text-muted-foreground truncate", children: p.role })
501
- ] }),
502
- /* @__PURE__ */ jsxs("span", { className: "sw-pop-item-meta", children: [
503
- p.projects.length,
504
- " \xB7 ",
505
- p.devs
506
- ] }),
507
- isActive && /* @__PURE__ */ jsx(Check, { size: 12, className: "text-primary" })
508
- ]
509
- },
510
- p.id
511
- );
512
- })
513
- ] })
514
- ]
515
- }
516
- ) })
517
- ] });
518
- }
519
- function ProjectSwitcher({
520
- trigger,
521
- activeProductId,
522
- activeProjectId,
523
- recent = [],
524
- products = [],
525
- onSelect,
526
- open,
527
- onOpenChange
528
- }) {
529
- const { t } = useTranslation();
530
- const [query, setQuery] = useState("");
531
- const productById = new Map(products.map((p) => [p.id, p]));
532
- const recentResolved = recent.map((r) => {
533
- const product = productById.get(r.productId);
534
- const project = product?.projects.find((p) => p.id === r.projectId);
535
- return product && project ? { product, project } : null;
536
- }).filter((x) => !!x).slice(0, 3);
537
- const q = query.trim().toLowerCase();
538
- const filteredProducts = products.map((product) => ({
539
- product,
540
- projects: q ? product.projects.filter(
541
- (p) => p.name.toLowerCase().includes(q) || p.stack.toLowerCase().includes(q)
542
- ) : product.projects
543
- })).filter((group) => group.projects.length > 0);
544
- return /* @__PURE__ */ jsxs(Popover.Root, { open, onOpenChange, children: [
545
- /* @__PURE__ */ jsx(Popover.Trigger, { asChild: true, children: trigger }),
546
- /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsxs(
547
- Popover.Content,
548
- {
549
- align: "start",
550
- sideOffset: 4,
551
- className: "sw-pop",
552
- style: { width: 420 },
553
- onOpenAutoFocus: (e) => e.preventDefault(),
554
- children: [
555
- /* @__PURE__ */ jsxs("div", { className: "sw-pop-search", children: [
556
- /* @__PURE__ */ jsx(Search, { size: 14, className: "text-muted-foreground" }),
557
- /* @__PURE__ */ jsx(
558
- "input",
559
- {
560
- autoFocus: true,
561
- value: query,
562
- onChange: (e) => setQuery(e.target.value),
563
- placeholder: t("shell.searchProjects"),
564
- className: "flex-1 bg-transparent outline-none"
565
- }
566
- ),
567
- /* @__PURE__ */ jsx("kbd", { className: "kbd", children: "esc" })
568
- ] }),
569
- /* @__PURE__ */ jsxs("div", { className: "sw-pop-list", children: [
570
- !q && recentResolved.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
571
- /* @__PURE__ */ jsx("div", { className: "sw-pop-section", children: /* @__PURE__ */ jsx("span", { children: t("shell.recent") }) }),
572
- recentResolved.map(({ product, project }) => /* @__PURE__ */ jsxs(
573
- "button",
574
- {
575
- type: "button",
576
- className: "sw-pop-item w-full text-left",
577
- onClick: () => onSelect(project, product),
578
- children: [
579
- /* @__PURE__ */ jsx(Clock, { size: 12, className: "text-muted-foreground" }),
580
- /* @__PURE__ */ jsx("span", { className: "flex-1 min-w-0 truncate font-mono text-xs", children: project.name }),
581
- /* @__PURE__ */ jsx("span", { className: "sw-pop-item-meta truncate", children: product.name })
582
- ]
583
- },
584
- `${product.id}:${project.id}`
585
- ))
586
- ] }),
587
- filteredProducts.length === 0 && /* @__PURE__ */ jsx("div", { className: "sw-pop-empty", children: "\u2014" }),
588
- filteredProducts.map(({ product, projects }) => /* @__PURE__ */ jsxs("div", { children: [
589
- /* @__PURE__ */ jsxs("div", { className: "sw-pop-section", children: [
590
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
591
- /* @__PURE__ */ jsx(
592
- "span",
593
- {
594
- className: "sb-logo-mark",
595
- style: { background: product.color, width: 12, height: 12, fontSize: 8 },
596
- children: product.name[0]?.toUpperCase() ?? "?"
597
- }
598
- ),
599
- product.name
600
- ] }),
601
- /* @__PURE__ */ jsx("span", { children: projects.length })
602
- ] }),
603
- projects.map((project) => {
604
- const isActive = product.id === activeProductId && project.id === activeProjectId;
605
- return /* @__PURE__ */ jsxs(
606
- "button",
607
- {
608
- type: "button",
609
- className: cn("sw-pop-item w-full text-left"),
610
- "data-active": isActive,
611
- onClick: () => onSelect(project, product),
612
- children: [
613
- /* @__PURE__ */ jsx("span", { className: "font-mono text-xs truncate flex-1 min-w-0", children: project.name }),
614
- /* @__PURE__ */ jsx("span", { className: "sw-kind-chip", children: project.kind }),
615
- /* @__PURE__ */ jsxs("span", { className: "sw-pop-item-meta", children: [
616
- project.stack,
617
- " \xB7 ",
618
- project.devs,
619
- "d \xB7 ",
620
- project.openIssues,
621
- "\u2197 \xB7",
622
- " ",
623
- project.prs,
624
- "pr"
625
- ] }),
626
- isActive && /* @__PURE__ */ jsx(Check, { size: 12, className: "text-primary" })
627
- ]
628
- },
629
- project.id
630
- );
631
- })
632
- ] }, product.id))
633
- ] }),
634
- /* @__PURE__ */ jsxs("div", { className: "sw-pop-foot", children: [
635
- /* @__PURE__ */ jsx("span", { children: t("shell.browseAllProducts") }),
636
- /* @__PURE__ */ jsxs("span", { className: "ml-auto", children: [
637
- /* @__PURE__ */ jsx("kbd", { className: "kbd", children: "\u2191\u2193" }),
638
- " ",
639
- /* @__PURE__ */ jsx("kbd", { className: "kbd", children: "\u23CE" })
640
- ] })
641
- ] })
642
- ]
643
- }
644
- ) })
645
- ] });
646
- }
647
- function CommandPalette({ open, onOpenChange, commands }) {
648
- const { t } = useTranslation();
649
- const inputRef = useRef(null);
650
- useEffect(() => {
651
- const handler = (e) => {
652
- const isModifier = e.metaKey || e.ctrlKey;
653
- if (isModifier && e.key.toLowerCase() === "k") {
654
- e.preventDefault();
655
- onOpenChange(!open);
656
- } else if (e.key === "Escape" && open) {
657
- onOpenChange(false);
658
- }
659
- };
660
- window.addEventListener("keydown", handler);
661
- return () => window.removeEventListener("keydown", handler);
662
- }, [open, onOpenChange]);
663
- const groups = /* @__PURE__ */ new Map();
664
- for (const cmd of commands) {
665
- const key = cmd.group ?? "";
666
- const arr = groups.get(key) ?? [];
667
- arr.push(cmd);
668
- groups.set(key, arr);
669
- }
670
- return /* @__PURE__ */ jsx(Dialog.Root, { open, onOpenChange, children: /* @__PURE__ */ jsxs(Dialog.Portal, { children: [
671
- /* @__PURE__ */ jsx(Dialog.Overlay, { className: "fixed inset-0 z-50 bg-black/30 backdrop-blur-sm" }),
672
- /* @__PURE__ */ jsxs(
673
- Dialog.Content,
674
- {
675
- className: "fixed left-1/2 top-[20%] z-50 w-[min(560px,calc(100vw-2rem))] -translate-x-1/2 rounded-lg border border-border bg-popover text-popover-foreground shadow-2xl outline-none",
676
- "aria-describedby": void 0,
677
- children: [
678
- /* @__PURE__ */ jsx(VisuallyHidden.Root, { children: /* @__PURE__ */ jsx(Dialog.Title, { children: t("common.search") }) }),
679
- /* @__PURE__ */ jsxs(Command, { label: "Command palette", className: "flex flex-col", children: [
680
- /* @__PURE__ */ jsx(
681
- Command.Input,
682
- {
683
- ref: inputRef,
684
- autoFocus: true,
685
- placeholder: `${t("common.search")}\u2026`,
686
- className: "w-full border-b border-border bg-transparent px-4 py-3 text-sm outline-none placeholder:text-muted-foreground"
687
- }
688
- ),
689
- /* @__PURE__ */ jsxs(Command.List, { className: "max-h-80 overflow-y-auto p-1", children: [
690
- /* @__PURE__ */ jsx(Command.Empty, { className: "px-3 py-6 text-center text-xs text-muted-foreground", children: "\u2014" }),
691
- [...groups.entries()].map(([groupLabel, items]) => /* @__PURE__ */ jsx(
692
- Command.Group,
693
- {
694
- heading: groupLabel ? /* @__PURE__ */ jsx("span", { className: "px-2 py-1 text-[10px] uppercase tracking-wider text-muted-foreground", children: groupLabel }) : void 0,
695
- children: items.map((cmd) => /* @__PURE__ */ jsxs(
696
- Command.Item,
697
- {
698
- value: cmd.label,
699
- onSelect: () => {
700
- cmd.onSelect();
701
- onOpenChange(false);
702
- },
703
- className: "flex items-center gap-2 rounded-md px-3 py-2 text-sm cursor-pointer data-[selected=true]:bg-accent",
704
- children: [
705
- /* @__PURE__ */ jsx("span", { className: "flex-1", children: cmd.label }),
706
- cmd.hint && /* @__PURE__ */ jsx("span", { className: "text-[10px] text-muted-foreground", children: cmd.hint })
707
- ]
708
- },
709
- cmd.id
710
- ))
711
- },
712
- groupLabel || "default"
713
- ))
714
- ] }),
715
- /* @__PURE__ */ jsxs("div", { className: "border-t border-border px-3 py-2 text-[10px] text-muted-foreground flex items-center gap-3", children: [
716
- /* @__PURE__ */ jsxs("span", { children: [
717
- /* @__PURE__ */ jsx("kbd", { className: "kbd", children: "\u2191\u2193" }),
718
- " navigate"
719
- ] }),
720
- /* @__PURE__ */ jsxs("span", { children: [
721
- /* @__PURE__ */ jsx("kbd", { className: "kbd", children: "\u23CE" }),
722
- " select"
723
- ] }),
724
- /* @__PURE__ */ jsxs("span", { className: "ml-auto", children: [
725
- /* @__PURE__ */ jsx("kbd", { className: "kbd", children: "esc" }),
726
- " close"
727
- ] })
728
- ] })
729
- ] })
730
- ]
731
- }
732
- )
733
- ] }) });
734
- }
735
- function PageContent({
736
- title,
737
- subtitle,
738
- extra,
739
- breadcrumb,
740
- tabs,
741
- children,
742
- footer,
743
- padding = "default",
744
- header = "default",
745
- className
746
- }) {
747
- const showHeader = header !== "none" && (breadcrumb || title || subtitle || extra);
748
- return /* @__PURE__ */ jsxs(
749
- "section",
750
- {
751
- className: cn("page-content", className),
752
- "data-padding": padding,
753
- children: [
754
- showHeader && /* @__PURE__ */ jsxs("header", { className: "page-content-header", children: [
755
- breadcrumb && /* @__PURE__ */ jsx("div", { className: "page-content-breadcrumb", children: breadcrumb }),
756
- /* @__PURE__ */ jsxs("div", { className: "page-content-titlebar", children: [
757
- /* @__PURE__ */ jsxs("div", { className: "page-content-titlegroup", children: [
758
- title && /* @__PURE__ */ jsx("h1", { className: "page-content-title", children: title }),
759
- subtitle && /* @__PURE__ */ jsx("p", { className: "page-content-subtitle", children: subtitle })
760
- ] }),
761
- extra && /* @__PURE__ */ jsx("div", { className: "page-content-extra", children: extra })
762
- ] }),
763
- tabs && /* @__PURE__ */ jsx("div", { className: "page-content-tabs", children: tabs })
764
- ] }),
765
- children !== void 0 && /* @__PURE__ */ jsx("div", { className: "page-content-body", children }),
766
- footer && /* @__PURE__ */ jsx("footer", { className: "page-content-footer", children: footer })
767
- ]
768
- }
769
- );
770
- }
771
-
772
- export { AppShell, CommandPalette, PageContent, ProductSwitcher, ProjectSwitcher, Sidebar, Topbar, TweaksPanel };
773
- //# sourceMappingURL=shell.js.map
774
- //# sourceMappingURL=shell.js.map