-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
137 lines (127 loc) · 5.13 KB
/
Copy pathindex.html
File metadata and controls
137 lines (127 loc) · 5.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!--
아래 블록은 빌드 시 scripts/prerender.mjs가 라우트별로 다시 생성합니다.
운영 기준 원본은 src/shared/seo/routeMeta.ts이고, 여기 값은 `npm run dev`용 기본값입니다.
마커(seo:start / seo:end)를 지우면 프리렌더가 실패합니다.
-->
<!--seo:start-->
<title>Calio(캘리오) | 말 한마디로 일정이 완성되는 AI 일정 관리</title>
<meta
name="description"
content="Calio는 자연어로 말하면 AI가 일정과 할 일을 자동으로 등록해주는 일정 관리 서비스입니다. 반복 일정 추천부터 친구와의 일정 공유까지 한 곳에서 관리하세요."
/>
<link rel="canonical" href="%SITE_URL%/" />
<meta name="robots" content="index, follow" />
<meta name="theme-color" content="#fafafa" />
<!--seo:end-->
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<!-- 검색 결과에 서비스 정보를 리치하게 노출하기 위한 구조화 데이터입니다. -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Calio",
"alternateName": "캘리오",
"url": "%SITE_URL%/",
"applicationCategory": "BusinessApplication",
"operatingSystem": "Web",
"inLanguage": "ko-KR",
"description": "자연어로 말하면 AI가 일정과 할 일을 자동으로 등록해주는 일정 관리 서비스입니다.",
"featureList": [
"말하면 바로 등록돼요",
"캘리오가 먼저 제안해요",
"일정도, 할 일도 여기 다 있어요",
"친구와 함께하는 일정도 쉽게"
],
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "KRW"
}
}
</script>
<!--
웹폰트는 JS 실행 이후가 아니라 HTML 파싱 단계에서 요청되어야 LCP가 빨라집니다.
(이전에는 Emotion GlobalStyle 안에 있어서 번들 실행 후에야 다운로드가 시작됐습니다.)
-->
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
<link
rel="preload"
as="font"
type="font/woff"
href="https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2001@1.1/GmarketSansMedium.woff"
crossorigin
/>
<style>
@font-face {
font-family: 'GmarketSansMedium';
src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2001@1.1/GmarketSansMedium.woff')
format('woff');
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'KIMM_Light';
src: url('https://cdn.jsdelivr.net/gh/fontbee/font@main/Kimm/KIMM_Light.woff2')
format('woff2');
font-weight: 300;
font-style: normal;
font-display: swap;
}
/*
프리렌더된 라우트는 Emotion 리셋이 아래 <style>로 함께 들어오지만,
본문 없이 메타만 만드는 라우트에는 그게 없습니다.
그 경우에도 기본 body margin(8px) 때문에 첫 페인트가 밀리지 않도록 최소한만 둡니다.
*/
html,
body {
margin: 0;
padding: 0;
}
body {
background-color: #fafafa;
}
</style>
</head>
<body>
<div id="modal-root"></div>
<div id="root"></div>
<script>
/*
#root의 정적 HTML은 data-prerender-path 경로 전용으로 생성된 내용입니다.
(1) 다른 경로가 이 HTML을 받았거나 (SPA fallback)
(2) 마지막으로 확인된 상태가 로그인이면 (로그인 후 화면은 프리렌더 대상이 아님)
React가 마운트되기 전에 먼저 비워, 잘못된 화면이 잠깐 보이지 않게 합니다.
module 스크립트는 defer라서 이 스크립트가 항상 먼저 실행됩니다.
*/
;(function () {
var root = document.getElementById('root')
if (!root) return
try {
var normalize = function (value) {
return value.length > 1 ? value.replace(/\/$/, '') : value
}
var isLoggedIn = false
try {
/* 키는 useAuthStore.ts의 AUTH_HINT_KEY와 같아야 합니다. 변경 시 함께 수정하세요. */
isLoggedIn = localStorage.getItem('calio.isLoggedIn') === '1'
} catch (error) {
/* localStorage를 못 쓰는 환경이면 로그인 힌트만 포기합니다. */
}
var prerenderPath = normalize(root.getAttribute('data-prerender-path') || '/')
if (isLoggedIn || prerenderPath !== normalize(window.location.pathname)) {
root.textContent = ''
}
} catch (error) {
/* 힌트를 못 읽으면 정적 HTML을 그대로 두고 React 마운트에 맡깁니다. */
}
})()
</script>
<script type="module" src="/src/app/main.tsx"></script>
</body>
</html>