@mostrom/app-shell 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bun.lock CHANGED
@@ -6,15 +6,13 @@
6
6
  "name": "@platform/app-shell",
7
7
  "dependencies": {
8
8
  "@base-ui/react": "^1.1.0",
9
- "@cloudscape-design/components": "*",
10
- "@cloudscape-design/global-styles": "*",
11
9
  "@dnd-kit/core": "^6.3.1",
12
10
  "@dnd-kit/modifiers": "^9.0.0",
13
11
  "@dnd-kit/sortable": "^10.0.0",
14
12
  "@dnd-kit/utilities": "^3.2.2",
15
13
  "@floating-ui/dom": "^1.7.5",
16
14
  "@hookform/resolvers": "^5.2.2",
17
- "@platform/service-catalog": "file:../service-catalog",
15
+ "@platform/service-catalog": "npm:@mostrom/service-catalog@latest",
18
16
  "@radix-ui/react-dropdown-menu": "^2.1.4",
19
17
  "@tanstack/react-table": "^8.21.3",
20
18
  "class-variance-authority": "^0.7.1",
@@ -52,18 +50,6 @@
52
50
 
53
51
  "@base-ui/utils": ["@base-ui/utils@0.2.4", "", { "dependencies": { "@babel/runtime": "^7.28.4", "@floating-ui/utils": "^0.2.10", "reselect": "^5.1.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-smZwpMhjO29v+jrZusBSc5T+IJ3vBb9cjIiBjtKcvWmRj9Z4DWGVR3efr1eHR56/bqY5a4qyY9ElkOY5ljo3ng=="],
54
52
 
55
- "@cloudscape-design/collection-hooks": ["@cloudscape-design/collection-hooks@1.0.82", "", { "dependencies": { "@cloudscape-design/component-toolkit": "^1.0.0-beta" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-e9l8aRGlwXuZ46lK3pSc7OsGj3eKiAzkNTGhTkjxSBa749K1dY/MZ001elJPWpq+ZI5rui5j5950cNPM5sG+sQ=="],
56
-
57
- "@cloudscape-design/component-toolkit": ["@cloudscape-design/component-toolkit@1.0.0-beta.138", "", { "dependencies": { "tslib": "^2.3.1", "weekstart": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-soKxjnmFvY5XroSVqsD0FkYI2ZclF0FipdM8cfrF+eGhuOe5Vs2kcVH+OJz4ZYJddgwaGHCbTO6s0iOA16yVeA=="],
58
-
59
- "@cloudscape-design/components": ["@cloudscape-design/components@3.0.1200", "", { "dependencies": { "@cloudscape-design/collection-hooks": "^1.0.0", "@cloudscape-design/component-toolkit": "^1.0.0-beta", "@cloudscape-design/test-utils-core": "^1.0.0", "@cloudscape-design/theming-runtime": "^1.0.0", "@dnd-kit/core": "^6.0.8", "@dnd-kit/sortable": "^7.0.2", "@dnd-kit/utilities": "^3.2.1", "ace-builds": "^1.34.0", "clsx": "^1.1.0", "d3-shape": "^1.3.7", "date-fns": "^2.25.0", "intl-messageformat": "^10.3.1", "mnth": "^2.0.0", "react-keyed-flatten-children": "^2.2.1", "react-transition-group": "^4.4.2", "tslib": "^2.4.0", "weekstart": "^1.1.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-V/2Ah+f2D4IbNTGu5gI+9dZTWf0V+CVpyKCVxSGlfiti/OLH5kjzeZTzFxSVVDH2ZzMm0CdZH1W8iw94wGnVvQ=="],
60
-
61
- "@cloudscape-design/global-styles": ["@cloudscape-design/global-styles@1.0.50", "", {}, "sha512-IF/z6yhFvN+jWJeXgpHqvs5Eib52R3xOIzPkX/HcoXcDIO818IIwx9cFFgnt9ZHKyduIlmQ1wtBbCdIixMISHw=="],
62
-
63
- "@cloudscape-design/test-utils-core": ["@cloudscape-design/test-utils-core@1.0.71", "", { "dependencies": { "css-selector-tokenizer": "^0.8.0", "css.escape": "^1.5.1" } }, "sha512-4rXQlsd6Rdg+KCNoltLa1+0wjgNugbduuK7L4nTa/Aw/gJIYqrTU78ip5A2VmbDhiE6fiGqtCFmU6LcKCMP//A=="],
64
-
65
- "@cloudscape-design/theming-runtime": ["@cloudscape-design/theming-runtime@1.0.91", "", { "dependencies": { "@material/material-color-utilities": "^0.3.0", "tslib": "^2.4.0" } }, "sha512-umIE/M+tzrFo9c4Skrh4AFFtaDC4eANkjp+xYikUj7ng6wTXj6kkSzxbVbg2fBEmIUgLYAzMHYbyKUzQWuz0ag=="],
66
-
67
53
  "@date-fns/tz": ["@date-fns/tz@1.4.1", "", {}, "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA=="],
68
54
 
69
55
  "@dnd-kit/accessibility": ["@dnd-kit/accessibility@3.1.1", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, ""],
@@ -84,21 +70,9 @@
84
70
 
85
71
  "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="],
86
72
 
87
- "@formatjs/ecma402-abstract": ["@formatjs/ecma402-abstract@2.3.6", "", { "dependencies": { "@formatjs/fast-memoize": "2.2.7", "@formatjs/intl-localematcher": "0.6.2", "decimal.js": "^10.4.3", "tslib": "^2.8.0" } }, "sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw=="],
88
-
89
- "@formatjs/fast-memoize": ["@formatjs/fast-memoize@2.2.7", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ=="],
90
-
91
- "@formatjs/icu-messageformat-parser": ["@formatjs/icu-messageformat-parser@2.11.4", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "@formatjs/icu-skeleton-parser": "1.8.16", "tslib": "^2.8.0" } }, "sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw=="],
92
-
93
- "@formatjs/icu-skeleton-parser": ["@formatjs/icu-skeleton-parser@1.8.16", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "tslib": "^2.8.0" } }, "sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ=="],
94
-
95
- "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.6.2", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA=="],
96
-
97
73
  "@hookform/resolvers": ["@hookform/resolvers@5.2.2", "", { "dependencies": { "@standard-schema/utils": "^0.3.0" }, "peerDependencies": { "react-hook-form": "^7.55.0" } }, "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA=="],
98
74
 
99
- "@material/material-color-utilities": ["@material/material-color-utilities@0.3.0", "", {}, "sha512-ztmtTd6xwnuh2/xu+Vb01btgV8SQWYCaK56CkRK8gEkWe5TuDyBcYJ0wgkMRn+2VcE9KUmhvkz+N9GHrqw/C0g=="],
100
-
101
- "@platform/service-catalog": ["@platform/service-catalog@file:../service-catalog", {}],
75
+ "@platform/service-catalog": ["@mostrom/service-catalog@0.1.3", "", {}, "sha512-q3GMS6sz4+KTRSFrI5zOPYInCYqnNp6HdZ4yjNq8J6X8Pn2HyEih4QVfB/C4LtJ5g6Qa6P6GS9/GEzctkAnJzA=="],
102
76
 
103
77
  "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="],
104
78
 
@@ -248,8 +222,6 @@
248
222
 
249
223
  "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="],
250
224
 
251
- "ace-builds": ["ace-builds@1.43.6", "", {}, "sha512-L1ddibQ7F3vyXR2k2fg+I8TQTPWVA6CKeDQr/h2+8CeyTp3W6EQL8xNFZRTztuP8xNOAqL3IYPqdzs31GCjDvg=="],
252
-
253
225
  "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="],
254
226
 
255
227
  "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],
@@ -258,12 +230,6 @@
258
230
 
259
231
  "cmdk": ["cmdk@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "^1.1.1", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-id": "^1.1.0", "@radix-ui/react-primitive": "^2.0.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg=="],
260
232
 
261
- "css-selector-tokenizer": ["css-selector-tokenizer@0.8.0", "", { "dependencies": { "cssesc": "^3.0.0", "fastparse": "^1.1.2" } }, "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg=="],
262
-
263
- "css.escape": ["css.escape@1.5.1", "", {}, "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="],
264
-
265
- "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
266
-
267
233
  "csstype": ["csstype@3.2.3", "", {}, ""],
268
234
 
269
235
  "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="],
@@ -276,11 +242,11 @@
276
242
 
277
243
  "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="],
278
244
 
279
- "d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="],
245
+ "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="],
280
246
 
281
247
  "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="],
282
248
 
283
- "d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="],
249
+ "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="],
284
250
 
285
251
  "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="],
286
252
 
@@ -292,8 +258,6 @@
292
258
 
293
259
  "date-fns-jalali": ["date-fns-jalali@4.1.0-0", "", {}, "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg=="],
294
260
 
295
- "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="],
296
-
297
261
  "decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="],
298
262
 
299
263
  "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="],
@@ -304,14 +268,10 @@
304
268
 
305
269
  "fast-equals": ["fast-equals@5.4.0", "", {}, "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw=="],
306
270
 
307
- "fastparse": ["fastparse@1.1.2", "", {}, "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ=="],
308
-
309
271
  "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="],
310
272
 
311
273
  "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="],
312
274
 
313
- "intl-messageformat": ["intl-messageformat@10.7.18", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "@formatjs/fast-memoize": "2.2.7", "@formatjs/icu-messageformat-parser": "2.11.4", "tslib": "^2.8.0" } }, "sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g=="],
314
-
315
275
  "js-tokens": ["js-tokens@4.0.0", "", {}, ""],
316
276
 
317
277
  "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="],
@@ -320,8 +280,6 @@
320
280
 
321
281
  "lucide-react": ["lucide-react@0.563.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA=="],
322
282
 
323
- "mnth": ["mnth@2.0.0", "", { "dependencies": { "@babel/runtime": "^7.8.0" } }, "sha512-3ZH4UWBGpAwCKdfjynLQpUDVZWMe6vRHwarIpMdGLUp89CVR9hjzgyWERtMyqx+fPEqQ/PsAxFwvwPxLFxW40A=="],
324
-
325
283
  "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="],
326
284
 
327
285
  "object-assign": ["object-assign@4.1.1", "", {}, ""],
@@ -340,8 +298,6 @@
340
298
 
341
299
  "react-is": ["react-is@18.3.1", "", {}, ""],
342
300
 
343
- "react-keyed-flatten-children": ["react-keyed-flatten-children@2.2.1", "", { "dependencies": { "react-is": "^18.2.0" }, "peerDependencies": { "react": ">=15.0.0" } }, "sha512-6yBLVO6suN8c/OcJk1mzIrUHdeEzf5rtRVBhxEXAHO49D7SlJ70cG4xrSJrBIAG7MMeQ+H/T151mM2dRDNnFaA=="],
344
-
345
301
  "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="],
346
302
 
347
303
  "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="],
@@ -382,22 +338,8 @@
382
338
 
383
339
  "victory-vendor": ["victory-vendor@36.9.2", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ=="],
384
340
 
385
- "weekstart": ["weekstart@1.1.0", "", {}, "sha512-ZO3I7c7J9nwGN1PZKZeBYAsuwWEsCOZi5T68cQoVNYrzrpp5Br0Bgi0OF4l8kH/Ez7nKfxa5mSsXjsgris3+qg=="],
386
-
387
341
  "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
388
342
 
389
- "@cloudscape-design/component-toolkit/weekstart": ["weekstart@2.0.0", "", {}, "sha512-HjYc14IQUwDcnGICuc8tVtqAd6EFpoAQMqgrqcNtWWZB+F1b7iTq44GzwM1qvnH4upFgbhJsaNHuK93NOFheSg=="],
390
-
391
- "@cloudscape-design/components/@dnd-kit/sortable": ["@dnd-kit/sortable@7.0.2", "", { "dependencies": { "@dnd-kit/utilities": "^3.2.0", "tslib": "^2.0.0" }, "peerDependencies": { "@dnd-kit/core": "^6.0.7", "react": ">=16.8.0" } }, "sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA=="],
392
-
393
- "@cloudscape-design/components/clsx": ["clsx@1.2.1", "", {}, "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="],
394
-
395
- "@cloudscape-design/components/date-fns": ["date-fns@2.30.0", "", { "dependencies": { "@babel/runtime": "^7.21.0" } }, "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw=="],
396
-
397
343
  "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
398
-
399
- "victory-vendor/d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="],
400
-
401
- "victory-vendor/d3-shape/d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="],
402
344
  }
403
345
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mostrom/app-shell",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "exports": {
@@ -29,7 +29,7 @@
29
29
  "@dnd-kit/utilities": "^3.2.2",
30
30
  "@floating-ui/dom": "^1.7.5",
31
31
  "@hookform/resolvers": "^5.2.2",
32
- "@platform/service-catalog": "npm:@mostrom/service-catalog@^0.1.3",
32
+ "@platform/service-catalog": "npm:@mostrom/service-catalog@^0.1.5",
33
33
  "@radix-ui/react-dropdown-menu": "^2.1.4",
34
34
  "@tanstack/react-table": "^8.21.3",
35
35
  "class-variance-authority": "^0.7.1",
package/src/AppShell.tsx CHANGED
@@ -157,12 +157,6 @@ export interface AppShellProps {
157
157
  */
158
158
  appsMenuItems?: MenuDropdownItems;
159
159
 
160
- /**
161
- * Menu items for the Categories button.
162
- * Displays the available service categories.
163
- */
164
- categoriesMenuItems?: MenuDropdownItems;
165
-
166
160
  /**
167
161
  * Menu items for the Settings dropdown.
168
162
  * Contains user preferences, notifications settings, and integrations.
@@ -178,9 +172,6 @@ export interface AppShellProps {
178
172
  /** Callback when an item in the All Services menu is clicked */
179
173
  onAppsMenuItemClick?: MenuItemClickHandler;
180
174
 
181
- /** Callback when an item in the Categories menu is clicked */
182
- onCategoriesMenuItemClick?: MenuItemClickHandler;
183
-
184
175
  /** Callback when an item in the Settings menu is clicked */
185
176
  onSettingsMenuItemClick?: MenuItemClickHandler;
186
177
 
@@ -315,11 +306,9 @@ export function AppShell({
315
306
  searchValue,
316
307
  searchPlaceholder,
317
308
  appsMenuItems,
318
- categoriesMenuItems,
319
309
  settingsMenuItems,
320
310
  userMenuItems,
321
311
  onAppsMenuItemClick,
322
- onCategoriesMenuItemClick,
323
312
  onSettingsMenuItemClick,
324
313
  onUserMenuItemClick,
325
314
  onThemeToggle,
@@ -562,31 +551,6 @@ export function AppShell({
562
551
  }));
563
552
  }, [serviceCatalog, serviceGroups]);
564
553
 
565
- const catalogCategoryMenuItems = React.useMemo<MenuDropdownItems>(() => {
566
- if (!serviceCatalog) {
567
- return [{ id: "loading", text: "Loading categories", disabled: true }];
568
- }
569
-
570
- const categoryHrefById = new Map<string, string>();
571
-
572
- for (const group of serviceGroups) {
573
- const serviceHref = group.services[0]?.href;
574
- if (serviceHref && serviceHref.startsWith("/")) {
575
- const rootSegment = serviceHref.split("/").filter(Boolean)[0];
576
- if (rootSegment) {
577
- categoryHrefById.set(group.category.id, `/${rootSegment}/`);
578
- }
579
- }
580
- }
581
-
582
- return serviceCatalog.categories.map((category) => ({
583
- id: category.id,
584
- text: category.label,
585
- description: category.description,
586
- href: categoryHrefById.get(category.id),
587
- }));
588
- }, [serviceCatalog, serviceGroups]);
589
-
590
554
  const hasSearchQuery = searchInputValue.trim().length > 0;
591
555
 
592
556
  const searchResults = React.useMemo(() => {
@@ -667,8 +631,6 @@ export function AppShell({
667
631
  ) : undefined;
668
632
 
669
633
  const resolvedAppsMenuItems = appsMenuItems ?? catalogMenuItems ?? EMPTY_MENU_ITEMS;
670
- const resolvedCategoriesMenuItems =
671
- categoriesMenuItems ?? catalogCategoryMenuItems ?? EMPTY_MENU_ITEMS;
672
634
  const resolvedIdentity =
673
635
  identity ?? {
674
636
  logo: {
@@ -724,8 +686,6 @@ export function AppShell({
724
686
  <GlobalHeaderSearch
725
687
  appsMenuItems={resolvedAppsMenuItems}
726
688
  onAppsMenuItemClick={onAppsMenuItemClick}
727
- categoriesMenuItems={resolvedCategoriesMenuItems}
728
- onCategoriesMenuItemClick={onCategoriesMenuItemClick}
729
689
  searchValue={searchInputValue}
730
690
  onSearchChange={handleSearchValueChange}
731
691
  onSearchSelect={handleSearchSelect}
@@ -10,8 +10,6 @@ import {
10
10
  export type GlobalHeaderSearchProps = {
11
11
  appsMenuItems: MenuDropdownItems;
12
12
  onAppsMenuItemClick?: MenuItemClickHandler;
13
- categoriesMenuItems: MenuDropdownItems;
14
- onCategoriesMenuItemClick?: MenuItemClickHandler;
15
13
  searchValue: string;
16
14
  onSearchChange: (value: string) => void;
17
15
  onSearchSelect: (option: SearchOption) => void;
@@ -24,8 +22,6 @@ export type GlobalHeaderSearchProps = {
24
22
  export function GlobalHeaderSearch({
25
23
  appsMenuItems,
26
24
  onAppsMenuItemClick,
27
- categoriesMenuItems,
28
- onCategoriesMenuItemClick,
29
25
  searchValue,
30
26
  onSearchChange,
31
27
  onSearchSelect,
@@ -39,9 +35,7 @@ export function GlobalHeaderSearch({
39
35
  <span className="app-shell-separator">|</span>
40
36
  <ServicesMenu
41
37
  appsMenuItems={appsMenuItems}
42
- categoriesMenuItems={categoriesMenuItems}
43
38
  onAppsMenuItemClick={onAppsMenuItemClick}
44
- onCategoriesMenuItemClick={onCategoriesMenuItemClick}
45
39
  />
46
40
  <GlobalSearch
47
41
  value={searchValue}
@@ -1,6 +1,13 @@
1
- import { useState, useMemo, type MouseEvent } from "react";
1
+ import { useMemo, type MouseEvent } from "react";
2
2
 
3
- import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
3
+ import {
4
+ NavigationMenu,
5
+ NavigationMenuContent,
6
+ NavigationMenuItem,
7
+ NavigationMenuLink,
8
+ NavigationMenuList,
9
+ NavigationMenuTrigger,
10
+ } from "@/components/ui/navigation-menu";
4
11
 
5
12
  // Menu dropdown types
6
13
  export interface MenuDropdownItem {
@@ -31,9 +38,7 @@ export type MenuItemClickHandler = (detail: MenuItemClickDetail) => void;
31
38
 
32
39
  export type ServicesMenuProps = {
33
40
  appsMenuItems: MenuDropdownItems;
34
- categoriesMenuItems: MenuDropdownItems;
35
41
  onAppsMenuItemClick?: MenuItemClickHandler;
36
- onCategoriesMenuItemClick?: MenuItemClickHandler;
37
42
  };
38
43
 
39
44
  type MenuItem = MenuDropdownItemOrGroup;
@@ -71,32 +76,11 @@ const flattenItems = (items: MenuDropdownItems): MenuDropdownItem[] => {
71
76
  return result;
72
77
  };
73
78
 
74
- const normalizeGroups = (
75
- items: MenuDropdownItems,
76
- ): Array<{ title?: string; items: MenuDropdownItem[] }> =>
77
- items.map((item) => {
78
- if (isGroup(item)) {
79
- return { title: item.text, items: flattenItems(item.items) };
80
- }
81
-
82
- return { title: undefined, items: [item as MenuDropdownItem] };
83
- });
84
-
85
79
  export function ServicesMenu({
86
80
  appsMenuItems,
87
- categoriesMenuItems,
88
81
  onAppsMenuItemClick,
89
- onCategoriesMenuItemClick,
90
82
  }: ServicesMenuProps) {
91
- const [open, setOpen] = useState(false);
92
- const categories = useMemo(
93
- () => flattenItems(categoriesMenuItems),
94
- [categoriesMenuItems],
95
- );
96
- const groups = useMemo(
97
- () => normalizeGroups(appsMenuItems),
98
- [appsMenuItems],
99
- );
83
+ const items = useMemo(() => flattenItems(appsMenuItems), [appsMenuItems]);
100
84
 
101
85
  const handleItemClick =
102
86
  (item: MenuDropdownItem) => (event: MouseEvent<HTMLElement>) => {
@@ -111,136 +95,48 @@ export function ServicesMenu({
111
95
  href: item.href,
112
96
  external: item.external,
113
97
  });
114
-
115
- setOpen(false);
116
- };
117
-
118
- const handleCategoryClick =
119
- (item: MenuDropdownItem) => (event: MouseEvent<HTMLElement>) => {
120
- if (item.disabled) {
121
- event.preventDefault();
122
- event.stopPropagation();
123
- return;
124
- }
125
-
126
- if (onCategoriesMenuItemClick) {
127
- event.preventDefault();
128
- onCategoriesMenuItemClick({
129
- id: item.id,
130
- href: item.href,
131
- external: item.external,
132
- });
133
- }
134
-
135
- setOpen(false);
136
98
  };
137
99
 
138
100
  return (
139
- <DropdownMenu.Root open={open} onOpenChange={setOpen}>
140
- <DropdownMenu.Trigger asChild>
141
- <button type="button" aria-label="All services" className="app-shell-apps-button">
142
- <span className="app-shell-apps-icon">
143
- <DotsNineIcon />
144
- </span>
145
- </button>
146
- </DropdownMenu.Trigger>
147
-
148
- <DropdownMenu.Portal>
149
- <DropdownMenu.Content
150
- className="app-shell-services-dropdown"
151
- sideOffset={8}
152
- align="start"
153
- avoidCollisions={false}
154
- >
155
- <div className="app-shell-services-menu" role="menu">
156
- <div className="app-shell-services-categories" role="presentation">
157
- <div className="app-shell-services-categories-title">Categories</div>
158
- <ul>
159
- {categories.map((category) => (
160
- <li key={category.id}>
161
- {category.href ? (
162
- <a
163
- className="app-shell-services-category"
164
- href={category.href}
165
- target={category.external ? "_blank" : undefined}
166
- rel={category.external ? "noopener noreferrer" : undefined}
167
- aria-disabled={category.disabled || undefined}
168
- onClick={handleCategoryClick(category)}
169
- >
170
- {category.text}
171
- </a>
172
- ) : (
173
- <button
174
- type="button"
175
- className="app-shell-services-category"
176
- disabled={category.disabled}
177
- onClick={handleCategoryClick(category)}
178
- >
179
- {category.text}
180
- </button>
181
- )}
182
- </li>
183
- ))}
184
- </ul>
185
- </div>
186
- <div className="app-shell-services-divider" aria-hidden="true" />
187
- <div className="app-shell-services-list" role="presentation">
188
- {groups.map((group, groupIndex) => (
189
- <div className="app-shell-services-group" key={`${group.title}-${groupIndex}`}>
190
- {group.title ? (
191
- <div className="app-shell-services-group-title">{group.title}</div>
192
- ) : null}
193
- <ul>
194
- {group.items.map((item) => {
195
- const isDisabled = Boolean(item.disabled);
196
- const content = (
197
- <>
198
- <span className="app-shell-services-item-text">{item.text}</span>
199
- {item.description ? (
200
- <span className="app-shell-services-item-description">
201
- {item.description}
202
- </span>
203
- ) : null}
204
- </>
205
- );
206
-
207
- if (item.href) {
208
- return (
209
- <li key={item.id}>
210
- <a
211
- className="app-shell-services-item"
212
- href={item.href}
213
- target={item.external ? "_blank" : undefined}
214
- rel={item.external ? "noopener noreferrer" : undefined}
215
- aria-disabled={isDisabled || undefined}
216
- onClick={handleItemClick(item)}
217
- >
218
- {content}
219
- </a>
220
- </li>
221
- );
222
- }
223
-
224
- return (
225
- <li key={item.id}>
226
- <button
227
- type="button"
228
- className="app-shell-services-item"
229
- disabled={isDisabled}
230
- onClick={handleItemClick(item)}
231
- >
232
- {content}
233
- </button>
234
- </li>
235
- );
236
- })}
237
- </ul>
238
- </div>
101
+ <NavigationMenu>
102
+ <NavigationMenuList>
103
+ <NavigationMenuItem>
104
+ <NavigationMenuTrigger className="app-shell-apps-button h-9 w-9 p-0 bg-transparent hover:bg-transparent data-[state=open]:bg-transparent">
105
+ <span className="app-shell-apps-icon">
106
+ <DotsNineIcon />
107
+ </span>
108
+ </NavigationMenuTrigger>
109
+ <NavigationMenuContent>
110
+ <ul className="grid w-[400px] gap-2 p-2 md:w-[500px] md:grid-cols-2">
111
+ {items.map((item) => (
112
+ <li key={item.id}>
113
+ <NavigationMenuLink
114
+ asChild
115
+ className="flex flex-col items-start gap-1 p-3 rounded-md hover:bg-accent"
116
+ >
117
+ <a
118
+ href={item.href || "#"}
119
+ target={item.external ? "_blank" : undefined}
120
+ rel={item.external ? "noopener noreferrer" : undefined}
121
+ aria-disabled={item.disabled || undefined}
122
+ onClick={handleItemClick(item)}
123
+ >
124
+ <div className="text-sm leading-none font-medium">
125
+ {item.text}
126
+ </div>
127
+ {item.description && (
128
+ <p className="text-muted-foreground line-clamp-2 text-sm leading-snug">
129
+ {item.description}
130
+ </p>
131
+ )}
132
+ </a>
133
+ </NavigationMenuLink>
134
+ </li>
239
135
  ))}
240
- </div>
241
- </div>
242
- </DropdownMenu.Content>
243
- </DropdownMenu.Portal>
244
- </DropdownMenu.Root>
136
+ </ul>
137
+ </NavigationMenuContent>
138
+ </NavigationMenuItem>
139
+ </NavigationMenuList>
140
+ </NavigationMenu>
245
141
  );
246
142
  }
@@ -225,4 +225,4 @@ export function AppSidebar({
225
225
  );
226
226
  }
227
227
 
228
- export { useSidebar, SidebarProvider, SidebarTrigger, SidebarInset } from "./ui/sidebar";
228
+ export { useSidebar, SidebarProvider, SidebarTrigger, SidebarInset } from "../ui/sidebar";
@@ -0,0 +1,69 @@
1
+ import {
2
+ NavigationMenu,
3
+ NavigationMenuContent,
4
+ NavigationMenuItem,
5
+ NavigationMenuLink,
6
+ NavigationMenuList,
7
+ NavigationMenuTrigger,
8
+ } from "@/components/ui/navigation-menu"
9
+
10
+ const components = [
11
+ {
12
+ title: "Alert Dialog",
13
+ href: "#",
14
+ description:
15
+ "A modal dialog that interrupts the user with important content.",
16
+ },
17
+ {
18
+ title: "Hover Card",
19
+ href: "#",
20
+ description:
21
+ "For sighted users to preview content available behind a link.",
22
+ },
23
+ {
24
+ title: "Progress",
25
+ href: "#",
26
+ description:
27
+ "Displays an indicator showing the completion progress of a task.",
28
+ },
29
+ {
30
+ title: "Scroll-area",
31
+ href: "#",
32
+ description: "Visually or semantically separates content.",
33
+ },
34
+ ]
35
+
36
+ export function Pattern() {
37
+ return (
38
+ <div className="flex items-center justify-center">
39
+ <NavigationMenu>
40
+ <NavigationMenuList>
41
+ <NavigationMenuItem>
42
+ <NavigationMenuTrigger>Components</NavigationMenuTrigger>
43
+ <NavigationMenuContent>
44
+ <ul className="grid w-[400px] gap-2 md:w-[500px] md:grid-cols-2">
45
+ {components.map((component) => (
46
+ <li key={component.title}>
47
+ <NavigationMenuLink
48
+ asChild
49
+ className="flex flex-col items-start gap-2 p-3"
50
+ >
51
+ <a href={component.href}>
52
+ <div className="text-sm leading-none font-medium">
53
+ {component.title}
54
+ </div>
55
+ <p className="text-muted-foreground line-clamp-2 text-sm leading-snug">
56
+ {component.description}
57
+ </p>
58
+ </a>
59
+ </NavigationMenuLink>
60
+ </li>
61
+ ))}
62
+ </ul>
63
+ </NavigationMenuContent>
64
+ </NavigationMenuItem>
65
+ </NavigationMenuList>
66
+ </NavigationMenu>
67
+ </div>
68
+ )
69
+ }