diff --git a/index.html b/index.html index 97f9ef6..4f90b57 100644 --- a/index.html +++ b/index.html @@ -5,20 +5,6 @@ - = 0.11.8 < 2.x" + }, + "peerDependencies": { + "tslib": ">= 1.0.0" + } + }, + "node_modules/@microsoft/applicationinsights-cfgsync-js": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-cfgsync-js/-/applicationinsights-cfgsync-js-3.3.9.tgz", + "integrity": "sha512-/7HpyjvKnKp4UGZ6U3pNXjpdPWRXcDyxlAkE3D3/TtgLbiTLfraLQuQAi/zTnJPFqkb3/TcS3wmDtnVea83w2Q==", + "license": "MIT", + "dependencies": { + "@microsoft/applicationinsights-common": "3.3.9", + "@microsoft/applicationinsights-core-js": "3.3.9", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.4 < 2.x", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" + }, + "peerDependencies": { + "tslib": ">= 1.0.0" + } + }, + "node_modules/@microsoft/applicationinsights-channel-js": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.3.9.tgz", + "integrity": "sha512-/yEgSe6vT2ycQJkXu6VF04TB5XBurk46ECV7uo6KkNhWyDEctAk1VDWB7EqXYdwLhKMbNOYX1pvz7fj43fGNqg==", + "license": "MIT", + "dependencies": { + "@microsoft/applicationinsights-common": "3.3.9", + "@microsoft/applicationinsights-core-js": "3.3.9", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.4 < 2.x", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" + }, + "peerDependencies": { + "tslib": ">= 1.0.0" + } + }, + "node_modules/@microsoft/applicationinsights-common": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.3.9.tgz", + "integrity": "sha512-IgruOuDBxmBK9jYo7SqLJG7Z9OwmAmlvHET49srpN6pqQlEjRpjD1nfA3Ps4RSEbF89a/ad2phQaBp8jvm122g==", + "license": "MIT", + "dependencies": { + "@microsoft/applicationinsights-core-js": "3.3.9", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" + }, + "peerDependencies": { + "tslib": ">= 1.0.0" + } + }, + "node_modules/@microsoft/applicationinsights-core-js": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.3.9.tgz", + "integrity": "sha512-xliiE9H09xCycndlua4QjajN8q5k/ET6VCv+e0Jjodxr9+cmoOP/6QY9dun9ptokuwR8TK0qOaIJ8z4fgslVSA==", + "license": "MIT", + "dependencies": { + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.4 < 2.x", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" + }, + "peerDependencies": { + "tslib": ">= 1.0.0" + } + }, + "node_modules/@microsoft/applicationinsights-dependencies-js": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-dependencies-js/-/applicationinsights-dependencies-js-3.3.9.tgz", + "integrity": "sha512-I8MiU0S2EB0H+Pz2X5PaV1BcqLHmWRSJDVhvxATvLGshwCRNSoXPSNf4Ami2mjVBKNH9GrSj01s6vrSUrSBsoQ==", + "license": "MIT", + "dependencies": { + "@microsoft/applicationinsights-common": "3.3.9", + "@microsoft/applicationinsights-core-js": "3.3.9", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.4 < 2.x", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" + }, + "peerDependencies": { + "tslib": ">= 1.0.0" + } + }, + "node_modules/@microsoft/applicationinsights-properties-js": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-properties-js/-/applicationinsights-properties-js-3.3.9.tgz", + "integrity": "sha512-8CPrqLgFCrFMaUWQoHEXMGSG6Ykn9wxfDxBeEHI6yUSvnkeolnP0Mwg+6NRdHcVbiNnO4itGBJC+Icu0Eq7Xeg==", + "license": "MIT", + "dependencies": { + "@microsoft/applicationinsights-common": "3.3.9", + "@microsoft/applicationinsights-core-js": "3.3.9", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" + }, + "peerDependencies": { + "tslib": ">= 1.0.0" + } + }, + "node_modules/@microsoft/applicationinsights-shims": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz", + "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==", + "license": "MIT", + "dependencies": { + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" + } + }, + "node_modules/@microsoft/applicationinsights-web": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web/-/applicationinsights-web-3.3.9.tgz", + "integrity": "sha512-sphOpJwjq0AVcUCxaoZYeB9nsMcxRgpZ6Jt8raqMIn0WdvgcSi51yFW4BE2gk8G8z4E8umnkEvYIb8SmEpkm1A==", + "license": "MIT", + "dependencies": { + "@microsoft/applicationinsights-analytics-js": "3.3.9", + "@microsoft/applicationinsights-cfgsync-js": "3.3.9", + "@microsoft/applicationinsights-channel-js": "3.3.9", + "@microsoft/applicationinsights-common": "3.3.9", + "@microsoft/applicationinsights-core-js": "3.3.9", + "@microsoft/applicationinsights-dependencies-js": "3.3.9", + "@microsoft/applicationinsights-properties-js": "3.3.9", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.4 < 2.x", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" + }, + "peerDependencies": { + "tslib": ">= 1.0.0" + } + }, + "node_modules/@microsoft/dynamicproto-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.3.tgz", + "integrity": "sha512-JTWTU80rMy3mdxOjjpaiDQsTLZ6YSGGqsjURsY6AUQtIj0udlF/jYmhdLZu8693ZIC0T1IwYnFa0+QeiMnziBA==", + "license": "MIT", + "dependencies": { + "@nevware21/ts-utils": ">= 0.10.4 < 2.x" + } + }, + "node_modules/@nevware21/ts-async": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.5.4.tgz", + "integrity": "sha512-IBTyj29GwGlxfzXw2NPnzty+w0Adx61Eze1/lknH/XIVdxtF9UnOpk76tnrHXWa6j84a1RR9hsOcHQPFv9qJjA==", + "license": "MIT", + "dependencies": { + "@nevware21/ts-utils": ">= 0.11.6 < 2.x" + } + }, + "node_modules/@nevware21/ts-utils": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.12.5.tgz", + "integrity": "sha512-JPQZWPKQJjj7kAftdEZL0XDFfbMgXCGiUAZe0d7EhLC3QlXTlZdSckGqqRIQ2QNl0VTEZyZUvRBw6Ednw089Fw==", + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4765,6 +4934,12 @@ "typescript": ">=4.8.4" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/package.json b/package.json index 95f74a6..5f3d119 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "vitest": "^3.2.2" }, "dependencies": { + "@microsoft/applicationinsights-web": "^3.3.9", "@vitejs/plugin-react": "^4.3.4", "@vitejs/plugin-vue": "^5.2.1", "marked": "^15.0.7", diff --git a/public/docs/get-started/docker-concepts/building-images/build-tag-and-publish-an-image.md b/public/docs/get-started/docker-concepts/building-images/build-tag-and-publish-an-image.md index 6bb8a52..29884e5 100644 --- a/public/docs/get-started/docker-concepts/building-images/build-tag-and-publish-an-image.md +++ b/public/docs/get-started/docker-concepts/building-images/build-tag-and-publish-an-image.md @@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/building-images/multi-stage-builds.md b/public/docs/get-started/docker-concepts/building-images/multi-stage-builds.md index cd961d9..33a4fc4 100644 --- a/public/docs/get-started/docker-concepts/building-images/multi-stage-builds.md +++ b/public/docs/get-started/docker-concepts/building-images/multi-stage-builds.md @@ -1,10 +1,14 @@ # Multi-stage builds
diff --git a/public/docs/get-started/docker-concepts/building-images/understanding-image-layers.md b/public/docs/get-started/docker-concepts/building-images/understanding-image-layers.md index 673abf5..44d080e 100644 --- a/public/docs/get-started/docker-concepts/building-images/understanding-image-layers.md +++ b/public/docs/get-started/docker-concepts/building-images/understanding-image-layers.md @@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/building-images/using-the-build-cache.md b/public/docs/get-started/docker-concepts/building-images/using-the-build-cache.md index 2bfc09e..10c2f30 100644 --- a/public/docs/get-started/docker-concepts/building-images/using-the-build-cache.md +++ b/public/docs/get-started/docker-concepts/building-images/using-the-build-cache.md @@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/building-images/writing-a-dockerfile.md b/public/docs/get-started/docker-concepts/building-images/writing-a-dockerfile.md index ec640e6..e8db04d 100644 --- a/public/docs/get-started/docker-concepts/building-images/writing-a-dockerfile.md +++ b/public/docs/get-started/docker-concepts/building-images/writing-a-dockerfile.md @@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/running-containers/multi-container-applications.md b/public/docs/get-started/docker-concepts/running-containers/multi-container-applications.md index ca9e8a9..8b2b0cd 100644 --- a/public/docs/get-started/docker-concepts/running-containers/multi-container-applications.md +++ b/public/docs/get-started/docker-concepts/running-containers/multi-container-applications.md @@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/running-containers/overriding-container-defaults.md b/public/docs/get-started/docker-concepts/running-containers/overriding-container-defaults.md index c75712d..e352108 100644 --- a/public/docs/get-started/docker-concepts/running-containers/overriding-container-defaults.md +++ b/public/docs/get-started/docker-concepts/running-containers/overriding-container-defaults.md @@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/running-containers/persisting-container-data.md b/public/docs/get-started/docker-concepts/running-containers/persisting-container-data.md index 6337281..912b8f4 100644 --- a/public/docs/get-started/docker-concepts/running-containers/persisting-container-data.md +++ b/public/docs/get-started/docker-concepts/running-containers/persisting-container-data.md @@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/running-containers/publishing-ports.md b/public/docs/get-started/docker-concepts/running-containers/publishing-ports.md index a8daa0f..77f45db 100644 --- a/public/docs/get-started/docker-concepts/running-containers/publishing-ports.md +++ b/public/docs/get-started/docker-concepts/running-containers/publishing-ports.md @@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/running-containers/sharing-local-files.md b/public/docs/get-started/docker-concepts/running-containers/sharing-local-files.md index f706fa9..9d38239 100644 --- a/public/docs/get-started/docker-concepts/running-containers/sharing-local-files.md +++ b/public/docs/get-started/docker-concepts/running-containers/sharing-local-files.md @@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/the-basics/what-is-a-container.md b/public/docs/get-started/docker-concepts/the-basics/what-is-a-container.md index 0e8432b..7ea6c57 100644 --- a/public/docs/get-started/docker-concepts/the-basics/what-is-a-container.md +++ b/public/docs/get-started/docker-concepts/the-basics/what-is-a-container.md @@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/the-basics/what-is-a-registry.md b/public/docs/get-started/docker-concepts/the-basics/what-is-a-registry.md index d49ec3e..91baf23 100644 --- a/public/docs/get-started/docker-concepts/the-basics/what-is-a-registry.md +++ b/public/docs/get-started/docker-concepts/the-basics/what-is-a-registry.md @@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/the-basics/what-is-an-image.md b/public/docs/get-started/docker-concepts/the-basics/what-is-an-image.md index 59fefa6..c4642c0 100644 --- a/public/docs/get-started/docker-concepts/the-basics/what-is-an-image.md +++ b/public/docs/get-started/docker-concepts/the-basics/what-is-an-image.md @@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/the-basics/what-is-docker-compose.md b/public/docs/get-started/docker-concepts/the-basics/what-is-docker-compose.md index fe04a51..bd034dd 100644 --- a/public/docs/get-started/docker-concepts/the-basics/what-is-docker-compose.md +++ b/public/docs/get-started/docker-concepts/the-basics/what-is-docker-compose.md @@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/introduction/build-and-push-first-image.md b/public/docs/get-started/introduction/build-and-push-first-image.md index 0ab46dc..787b172 100644 --- a/public/docs/get-started/introduction/build-and-push-first-image.md +++ b/public/docs/get-started/introduction/build-and-push-first-image.md @@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/introduction/develop-with-containers.md b/public/docs/get-started/introduction/develop-with-containers.md index e1a2529..81a5819 100644 --- a/public/docs/get-started/introduction/develop-with-containers.md +++ b/public/docs/get-started/introduction/develop-with-containers.md @@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/introduction/get-docker-desktop.md b/public/docs/get-started/introduction/get-docker-desktop.md index 8cd678c..15fcfe7 100644 --- a/public/docs/get-started/introduction/get-docker-desktop.md +++ b/public/docs/get-started/introduction/get-docker-desktop.md @@ -2,10 +2,12 @@
diff --git a/src/scripts/main.ts b/src/scripts/main.ts index 0c11298..62dab0b 100644 --- a/src/scripts/main.ts +++ b/src/scripts/main.ts @@ -6,6 +6,34 @@ import './components/card-component'; import { initializeMarkdownLoader } from './load_md'; import { initializeTableContents } from './table-contents'; import { initializeBreadcrumb } from './breadcrumb'; +import { ApplicationInsights } from '@microsoft/applicationinsights-web'; + +// Application Insights 초기화 +const appInsights = new ApplicationInsights({ + config: { + connectionString: + 'InstrumentationKey=7bea0293-01dc-409c-9471-3a65567b11ed;IngestionEndpoint=https://koreacentral-0.in.applicationinsights.azure.com/;LiveEndpoint=https://koreacentral.livediagnostics.monitor.azure.com/;ApplicationId=ddbe985c-4d7a-41e4-80a8-a3961068933b', + enableAutoRouteTracking: true, // SPA 라우팅 자동 추적 + enableCorsCorrelation: true, + enableRequestHeaderTracking: true, + enableResponseHeaderTracking: false, // 서버 응답 헤더 수집 불필요 + enableAjaxErrorStatusText: true, + enableAjaxPerfTracking: true, + enableUnhandledPromiseRejectionTracking: true, + disableAjaxTracking: false, + disableFetchTracking: false, + loggingLevelConsole: 0, // 콘솔 로깅 비활성화 + loggingLevelTelemetry: 1, + maxBatchSizeInBytes: 10000, + maxBatchInterval: 15000, + disableDataLossAnalysis: true, + disableCorrelationHeaders: false, + distributedTracingMode: 0, // 단일 서비스이므로 분산 추적 비활성화 + enablePerfMgr: false, + }, +}); +appInsights.loadAppInsights(); +appInsights.trackPageView(); // Manually call trackPageView to establish the current user/session/pageview document.addEventListener('DOMContentLoaded', async () => { try { diff --git a/src/styles/style.css b/src/styles/style.css index 8f3e27e..a1527d8 100644 --- a/src/styles/style.css +++ b/src/styles/style.css @@ -1,5 +1,45 @@ @import 'tailwindcss'; +/* 기본 폰트 설정 */ +@layer base { + /* 한국어 텍스트에 최적화된 시스템 폰트 스택 */ + html { + font-family: + -apple-system, BlinkMacSystemFont, 'Apple SD Gothic Neo', 'Noto Sans KR', + 'Malgun Gothic', '맑은 고딕', 'Segoe UI', Roboto, 'Helvetica Neue', Arial, + sans-serif; + } + + /* 외부 웹폰트 최적화 (Google Fonts 등) */ + @font-face { + font-family: 'Google Fonts Fallback'; + src: local('system-ui'), local('-apple-system'); + font-display: swap; + } +} + +/* YouTube iframe 최적화 */ +@layer components { + .youtube-video { + @apply relative mx-auto w-full; + aspect-ratio: 16 / 9; /* 모던 브라우저용 */ + /* 레거시 브라우저 대체 */ + padding-bottom: 56.25%; /* 16:9 종횡비 */ + } + + /* 모던 브라우저에서 padding-bottom 제거 */ + @supports (aspect-ratio: 16 / 9) { + .youtube-video { + padding-bottom: 0; + } + } + + .youtube-video iframe { + @apply absolute top-0 left-0 h-full w-full rounded-lg; + border: none; /* frameborder 대체 */ + } +} + /* 카드 컴포넌트 스타일 */ @layer components { .card {