@cwygoda/service-catalog-ui 1.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.
Potentially problematic release.
This version of @cwygoda/service-catalog-ui might be problematic. Click here for more details.
- package/dist/__mocks__/app-environment.d.ts +4 -0
- package/dist/__mocks__/app-environment.js +4 -0
- package/dist/__mocks__/app-state.d.ts +12 -0
- package/dist/__mocks__/app-state.js +10 -0
- package/dist/adapters/index.d.ts +1 -0
- package/dist/adapters/index.js +1 -0
- package/dist/adapters/static-json.adapter.d.ts +2 -0
- package/dist/adapters/static-json.adapter.js +34 -0
- package/dist/components/BpmnDiagram.svelte +360 -0
- package/dist/components/BpmnDiagram.svelte.d.ts +7 -0
- package/dist/components/Breadcrumbs.svelte +32 -0
- package/dist/components/Breadcrumbs.svelte.d.ts +11 -0
- package/dist/components/DomainCard.svelte +29 -0
- package/dist/components/DomainCard.svelte.d.ts +9 -0
- package/dist/components/DomainCard.test.d.ts +1 -0
- package/dist/components/DomainCard.test.js +45 -0
- package/dist/components/Header.svelte +110 -0
- package/dist/components/Header.svelte.d.ts +3 -0
- package/dist/components/NavModeToggle.svelte +28 -0
- package/dist/components/NavModeToggle.svelte.d.ts +18 -0
- package/dist/components/NavTree.svelte +182 -0
- package/dist/components/NavTree.svelte.d.ts +9 -0
- package/dist/components/ServiceCard.svelte +26 -0
- package/dist/components/ServiceCard.svelte.d.ts +7 -0
- package/dist/components/ServiceCard.test.d.ts +1 -0
- package/dist/components/ServiceCard.test.js +36 -0
- package/dist/components/ServiceGraph.svelte +348 -0
- package/dist/components/ServiceGraph.svelte.d.ts +10 -0
- package/dist/components/ThemeToggle.svelte +29 -0
- package/dist/components/ThemeToggle.svelte.d.ts +18 -0
- package/dist/components/ThemeToggle.test.d.ts +1 -0
- package/dist/components/ThemeToggle.test.js +52 -0
- package/dist/components/UseCaseCard.svelte +57 -0
- package/dist/components/UseCaseCard.svelte.d.ts +7 -0
- package/dist/components/UseCaseCard.test.d.ts +1 -0
- package/dist/components/UseCaseCard.test.js +87 -0
- package/dist/components/index.d.ts +10 -0
- package/dist/components/index.js +10 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/ports/catalog.port.d.ts +5 -0
- package/dist/ports/catalog.port.js +1 -0
- package/dist/ports/index.d.ts +1 -0
- package/dist/ports/index.js +1 -0
- package/dist/stores/index.d.ts +3 -0
- package/dist/stores/index.js +2 -0
- package/dist/stores/nav-mode.svelte.d.ts +7 -0
- package/dist/stores/nav-mode.svelte.js +32 -0
- package/dist/stores/theme.svelte.d.ts +8 -0
- package/dist/stores/theme.svelte.js +61 -0
- package/dist/utils/fetch-catalog.d.ts +6 -0
- package/dist/utils/fetch-catalog.js +26 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { browser } from '$app/environment';
|
|
2
|
+
const STORAGE_KEY = 'nav-mode';
|
|
3
|
+
function getInitialMode() {
|
|
4
|
+
if (browser) {
|
|
5
|
+
const stored = localStorage.getItem(STORAGE_KEY);
|
|
6
|
+
if (stored === 'tree' || stored === 'flat') {
|
|
7
|
+
return stored;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return 'flat';
|
|
11
|
+
}
|
|
12
|
+
function createNavModeStore() {
|
|
13
|
+
let mode = $state(getInitialMode());
|
|
14
|
+
return {
|
|
15
|
+
get mode() {
|
|
16
|
+
return mode;
|
|
17
|
+
},
|
|
18
|
+
toggle() {
|
|
19
|
+
mode = mode === 'flat' ? 'tree' : 'flat';
|
|
20
|
+
if (browser) {
|
|
21
|
+
localStorage.setItem(STORAGE_KEY, mode);
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
setMode(newMode) {
|
|
25
|
+
mode = newMode;
|
|
26
|
+
if (browser) {
|
|
27
|
+
localStorage.setItem(STORAGE_KEY, mode);
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export const navModeStore = createNavModeStore();
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
const STORAGE_KEY = 'theme';
|
|
2
|
+
function getStoredTheme() {
|
|
3
|
+
if (typeof localStorage === 'undefined')
|
|
4
|
+
return 'system';
|
|
5
|
+
const stored = localStorage.getItem(STORAGE_KEY);
|
|
6
|
+
if (stored === 'light' || stored === 'dark' || stored === 'system') {
|
|
7
|
+
return stored;
|
|
8
|
+
}
|
|
9
|
+
return 'system';
|
|
10
|
+
}
|
|
11
|
+
function getSystemTheme() {
|
|
12
|
+
if (typeof window === 'undefined')
|
|
13
|
+
return 'light';
|
|
14
|
+
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
15
|
+
}
|
|
16
|
+
function applyTheme(theme) {
|
|
17
|
+
if (typeof document === 'undefined')
|
|
18
|
+
return;
|
|
19
|
+
const resolved = theme === 'system' ? getSystemTheme() : theme;
|
|
20
|
+
const root = document.documentElement;
|
|
21
|
+
if (resolved === 'dark') {
|
|
22
|
+
root.classList.add('dark');
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
root.classList.remove('dark');
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Simple reactive state using $state rune at module level
|
|
29
|
+
let currentTheme = $state('system');
|
|
30
|
+
export const theme = {
|
|
31
|
+
get current() {
|
|
32
|
+
return currentTheme;
|
|
33
|
+
},
|
|
34
|
+
get resolved() {
|
|
35
|
+
return currentTheme === 'system' ? getSystemTheme() : currentTheme;
|
|
36
|
+
},
|
|
37
|
+
init() {
|
|
38
|
+
if (typeof window === 'undefined')
|
|
39
|
+
return;
|
|
40
|
+
// Load stored theme
|
|
41
|
+
currentTheme = getStoredTheme();
|
|
42
|
+
// Listen for system theme changes
|
|
43
|
+
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
44
|
+
mediaQuery.addEventListener('change', () => {
|
|
45
|
+
if (currentTheme === 'system') {
|
|
46
|
+
applyTheme('system');
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
set(newTheme) {
|
|
51
|
+
currentTheme = newTheme;
|
|
52
|
+
if (typeof localStorage !== 'undefined') {
|
|
53
|
+
localStorage.setItem(STORAGE_KEY, newTheme);
|
|
54
|
+
}
|
|
55
|
+
applyTheme(newTheme);
|
|
56
|
+
},
|
|
57
|
+
toggle() {
|
|
58
|
+
const next = this.resolved === 'dark' ? 'light' : 'dark';
|
|
59
|
+
this.set(next);
|
|
60
|
+
},
|
|
61
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Catalog } from '@cwygoda/service-catalog-core/domain';
|
|
2
|
+
/**
|
|
3
|
+
* Fetches and validates catalog.json with proper error handling.
|
|
4
|
+
* Use in SvelteKit load functions.
|
|
5
|
+
*/
|
|
6
|
+
export declare function fetchCatalog(fetch: typeof globalThis.fetch, path?: string): Promise<Catalog>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { error } from '@sveltejs/kit';
|
|
2
|
+
import { Value } from '@sinclair/typebox/value';
|
|
3
|
+
import { CatalogSchema } from '@cwygoda/service-catalog-core/schemas';
|
|
4
|
+
/**
|
|
5
|
+
* Fetches and validates catalog.json with proper error handling.
|
|
6
|
+
* Use in SvelteKit load functions.
|
|
7
|
+
*/
|
|
8
|
+
export async function fetchCatalog(fetch, path = '/catalog.json') {
|
|
9
|
+
const response = await fetch(path);
|
|
10
|
+
if (!response.ok) {
|
|
11
|
+
error(response.status, `Failed to load catalog: ${response.statusText}`);
|
|
12
|
+
}
|
|
13
|
+
let data;
|
|
14
|
+
try {
|
|
15
|
+
data = await response.json();
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
error(500, 'Invalid JSON in catalog');
|
|
19
|
+
}
|
|
20
|
+
if (!Value.Check(CatalogSchema, data)) {
|
|
21
|
+
const errors = [...Value.Errors(CatalogSchema, data)];
|
|
22
|
+
const message = errors.map((e) => `${e.path}: ${e.message}`).join('; ');
|
|
23
|
+
error(500, `Invalid catalog data: ${message}`);
|
|
24
|
+
}
|
|
25
|
+
return data;
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { fetchCatalog } from './fetch-catalog.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { fetchCatalog } from './fetch-catalog.js';
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cwygoda/service-catalog-ui",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"svelte": "./dist/index.js",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"svelte": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"./components": {
|
|
12
|
+
"types": "./dist/components/index.d.ts",
|
|
13
|
+
"svelte": "./dist/components/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./stores": {
|
|
16
|
+
"types": "./dist/stores/index.d.ts",
|
|
17
|
+
"svelte": "./dist/stores/index.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist"
|
|
22
|
+
],
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@sinclair/typebox": "^0.34.0",
|
|
25
|
+
"@cwygoda/service-catalog-core": "1.0.1"
|
|
26
|
+
},
|
|
27
|
+
"peerDependencies": {
|
|
28
|
+
"@sveltejs/kit": "^2.0.0",
|
|
29
|
+
"bpmn-js": "^18.0.0",
|
|
30
|
+
"d3": "^7.0.0",
|
|
31
|
+
"svelte": "^5.0.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@sveltejs/kit": "^2.50.2",
|
|
35
|
+
"@sveltejs/package": "^2.0.0",
|
|
36
|
+
"@sveltejs/vite-plugin-svelte": "^6.2.4",
|
|
37
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
38
|
+
"@testing-library/svelte": "^5.2.0",
|
|
39
|
+
"@testing-library/user-event": "^14.6.1",
|
|
40
|
+
"@types/d3": "^7.4.3",
|
|
41
|
+
"jsdom": "^26.0.0",
|
|
42
|
+
"svelte": "^5.49.2",
|
|
43
|
+
"svelte-check": "^4.3.6",
|
|
44
|
+
"typescript": "^5.7.0",
|
|
45
|
+
"vite": "^7.3.1",
|
|
46
|
+
"vitest": "^3.0.0"
|
|
47
|
+
},
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "svelte-kit sync && svelte-package",
|
|
50
|
+
"test": "vitest run",
|
|
51
|
+
"test:watch": "vitest",
|
|
52
|
+
"typecheck": "svelte-kit sync && svelte-check"
|
|
53
|
+
}
|
|
54
|
+
}
|