Initial commit: D.intelligence design system files

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-24 18:10:13 +09:00
commit 796afc823c
49 changed files with 5625 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
.DS_Store
.claude/settings.local.json

BIN
.thumbnail Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/logos/horizontal.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

BIN
assets/logos/motto.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
assets/logos/square.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

1748
deck-stage.js Normal file

File diff suppressed because it is too large Load Diff

348
styles.css Normal file
View File

@@ -0,0 +1,348 @@
/* ============================================================
D.intelligence Design System v2026 — Stylesheet
Evolution of 2025 Edition + Brand Guide v1.2
============================================================ */
/* -------- Fonts -------- */
@font-face {
font-family: 'DM Sans';
src: url('assets/fonts/DMSans-Regular.ttf') format('truetype');
font-weight: 400; font-style: normal; font-display: swap;
}
@font-face {
font-family: 'DM Sans';
src: url('assets/fonts/DMSans-Italic.ttf') format('truetype');
font-weight: 400; font-style: italic; font-display: swap;
}
@font-face {
font-family: 'DM Sans';
src: url('assets/fonts/DMSans-Medium.ttf') format('truetype');
font-weight: 500; font-style: normal; font-display: swap;
}
@font-face {
font-family: 'DM Sans';
src: url('assets/fonts/DMSans-Bold.ttf') format('truetype');
font-weight: 700; font-style: normal; font-display: swap;
}
@font-face {
font-family: 'Apple SD Gothic Neo';
src: url('assets/fonts/AppleSDGothicNeoL.ttf') format('truetype');
font-weight: 300; font-display: swap;
}
@font-face {
font-family: 'Apple SD Gothic Neo';
src: url('assets/fonts/AppleSDGothicNeoM.ttf') format('truetype');
font-weight: 500; font-display: swap;
}
@font-face {
font-family: 'Apple SD Gothic Neo';
src: url('assets/fonts/AppleSDGothicNeoB.ttf') format('truetype');
font-weight: 700; font-display: swap;
}
@font-face {
font-family: 'Apple SD Gothic Neo';
src: url('assets/fonts/AppleSDGothicNeoEB.ttf') format('truetype');
font-weight: 800; font-display: swap;
}
@font-face {
font-family: 'Apple SD Gothic Neo';
src: url('assets/fonts/AppleSDGothicNeoH.ttf') format('truetype');
font-weight: 900; font-display: swap;
}
/* -------- Tokens -------- */
:root {
--beige: #E5E1D2;
--beige-soft: #EFEBDE;
--brown: #231815;
--brown-soft: #2E2420;
--olive: #CEDC00;
--olive-soft: #E5EE7A;
--blue: #0075C0;
--blue-soft: #4DA3D6;
--black: #000000;
--gray: #727171;
--gray-light: #BFBFBF;
--gray-bg: #F2F2F2;
--warm-gray: #C8C4B8;
--warm-gray-soft: #DAD6CB;
--white: #FFFFFF;
--font-en: 'DM Sans', 'Helvetica Neue', Arial, sans-serif;
--font-kr: 'Apple SD Gothic Neo', 'DM Sans', sans-serif;
--font-mono: 'JetBrains Mono', 'Menlo', monospace;
}
/* -------- Stage base -------- */
deck-stage {
--bg: var(--white);
--stage-bg: #0a0a0a;
}
section[data-screen-label] {
background: var(--white);
color: var(--brown);
font-family: var(--font-en);
position: relative;
overflow: hidden;
width: 1920px;
height: 1080px;
box-sizing: border-box;
}
/* -------- Slide chrome: header bar + footer -------- */
.s-header {
position: absolute;
top: 56px;
left: 96px;
right: 96px;
display: flex;
justify-content: space-between;
align-items: baseline;
font-family: var(--font-en);
font-size: 14px;
font-weight: 400;
letter-spacing: 0.08em;
color: var(--warm-gray);
text-transform: uppercase;
z-index: 5;
}
.s-header .s-sys {
color: var(--warm-gray);
}
.s-header .s-section-id {
color: var(--gray);
font-weight: 500;
letter-spacing: 0.12em;
}
.s-footer {
position: absolute;
bottom: 56px;
left: 96px;
right: 96px;
display: flex;
justify-content: space-between;
align-items: baseline;
font-family: var(--font-en);
font-size: 13px;
font-weight: 400;
letter-spacing: 0.06em;
color: var(--gray);
z-index: 5;
}
.s-footer .s-tag { font-style: italic; letter-spacing: 0.02em; color: var(--brown); opacity: 0.55; }
.s-footer .s-page { font-weight: 500; letter-spacing: 0.08em; }
.s-three-dots {
position: absolute;
top: 56px;
right: 96px;
display: flex;
gap: 10px;
z-index: 6;
}
.s-three-dots i {
width: 8px; height: 8px; border-radius: 50%;
background: var(--brown);
display: block;
}
.s-three-dots.olive i { background: var(--olive); }
.s-three-dots.beige i { background: var(--warm-gray); }
.s-three-dots.white i { background: var(--white); }
/* -------- Cover / Section dividers --------
These selectors share specificity with the base section[data-screen-label]
rule above (0,1,1). The base rule sets background:white; these must be
equally-or-more specific to win. Use section.s-cover etc.
---------------------------------------------------------------- */
section.s-cover {
background: var(--beige);
}
section.s-section {
background: var(--beige);
}
section.s-dark {
background: var(--brown);
color: var(--beige);
}
section.s-dark .s-header,
section.s-dark .s-footer { color: var(--warm-gray); }
section.s-dark .s-footer .s-tag { color: var(--beige); opacity: 0.6; }
/* -------- Section title with vertical-line accent -------- */
.section-title-block {
position: absolute;
left: 96px;
top: 50%;
transform: translateY(-50%);
display: flex;
gap: 36px;
}
.v-line {
width: 1px;
background: var(--gray);
align-self: stretch;
flex-shrink: 0;
}
.s-section .v-line { background: var(--warm-gray); }
.s-dark .v-line { background: var(--warm-gray); opacity: 0.5; }
.section-title-block .eyebrow {
font-family: var(--font-en);
font-size: 16px;
font-weight: 500;
letter-spacing: 0.32em;
text-transform: uppercase;
color: var(--gray);
margin-bottom: 28px;
}
.s-dark .section-title-block .eyebrow { color: var(--warm-gray); }
.section-title-block .num {
font-family: var(--font-en);
font-size: 14px;
font-weight: 500;
letter-spacing: 0.2em;
color: var(--olive);
margin-bottom: 24px;
}
.section-title-block h1 {
font-family: var(--font-en);
font-size: 112px;
font-weight: 700;
line-height: 1;
letter-spacing: -0.02em;
color: var(--brown);
margin: 0;
}
.s-dark .section-title-block h1 { color: var(--beige); }
.section-title-block .kr {
font-family: var(--font-kr);
font-size: 32px;
font-weight: 500;
color: var(--brown);
margin-top: 28px;
letter-spacing: -0.01em;
}
.s-dark .section-title-block .kr { color: var(--warm-gray); }
.section-title-block .desc {
font-family: var(--font-en);
font-size: 18px;
line-height: 1.55;
color: var(--gray);
max-width: 520px;
margin-top: 36px;
}
/* -------- Content slides -------- */
.content-title {
font-family: var(--font-en);
font-size: 44px;
font-weight: 700;
letter-spacing: -0.015em;
color: var(--brown);
line-height: 1.05;
margin: 0;
}
.content-title .module-code {
display: inline-block;
font-family: var(--font-en);
font-size: 18px;
font-weight: 500;
letter-spacing: 0.18em;
color: var(--olive);
vertical-align: top;
margin-right: 18px;
padding-top: 12px;
}
.content-subtitle {
font-family: var(--font-en);
font-size: 18px;
line-height: 1.5;
color: var(--gray);
margin: 16px 0 0;
max-width: 1000px;
}
.content-kr {
font-family: var(--font-kr);
font-weight: 500;
color: var(--brown);
}
.content-body {
position: absolute;
top: 220px;
left: 96px;
right: 96px;
bottom: 140px;
}
/* -------- Utilities -------- */
.mono { font-family: var(--font-mono); }
.hairline { border-top: 1px solid var(--gray-light); }
.divider { height: 1px; background: var(--gray-light); }
.uppercase-label {
font-family: var(--font-en);
font-size: 12px;
font-weight: 500;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--gray);
}
/* swatch helpers */
.swatch {
border: 1px solid var(--gray-light);
border-radius: 0;
position: relative;
}
/* Card */
.card {
background: var(--white);
border: 1px solid var(--gray-light);
padding: 28px;
}
.card.flat { background: var(--gray-bg); border: none; }
/* Tag pill */
.tag {
display: inline-block;
font-family: var(--font-en);
font-size: 12px;
font-weight: 500;
letter-spacing: 0.16em;
text-transform: uppercase;
padding: 4px 10px;
border: 1px solid var(--brown);
color: var(--brown);
}
.tag.di { border-color: var(--blue); color: var(--blue); }
.tag.md { border-color: var(--brown); color: var(--brown); }
.tag.mpo { border-color: var(--olive); color: #8a9400; background: rgba(206,220,0,0.12); }
.tag.bvt { border-color: var(--brown); color: var(--white); background: var(--brown); }
/* phase badge */
.phase-badge {
display: inline-flex;
align-items: center;
gap: 12px;
font-family: var(--font-en);
font-size: 13px;
font-weight: 500;
letter-spacing: 0.22em;
text-transform: uppercase;
}
.phase-badge .num {
font-size: 12px;
background: var(--brown);
color: var(--beige);
padding: 3px 8px;
letter-spacing: 0.12em;
}
/* Tweaks panel slot */
#tweaks-root { z-index: 9999; }

170
tweaks-app.jsx Normal file
View File

@@ -0,0 +1,170 @@
// D.intelligence Design System — Tweaks app
// Lets viewers explore alternative visual treatments for the brand system.
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"coverBg": "beige",
"accent": "olive",
"density": "regular",
"motif": "all",
"showGrid": false,
"monoTone": false
}/*EDITMODE-END*/;
function applyTweaks(t) {
const root = document.documentElement.style;
// Cover background tone
const coverBgMap = {
beige: { bg: '#E5E1D2', text: '#231815' },
brown: { bg: '#231815', text: '#E5E1D2' },
white: { bg: '#FFFFFF', text: '#231815' },
olive: { bg: '#CEDC00', text: '#231815' },
};
const cov = coverBgMap[t.coverBg] || coverBgMap.beige;
document.querySelectorAll('section.s-cover, section.s-section').forEach(s => {
// only flip sections that don't already have inline background:var(--white) (content slides)
const inline = s.getAttribute('style') || '';
if (!inline.includes('background:var(--white)')) {
s.style.background = cov.bg;
}
});
// Accent color
const accentMap = {
olive: '#CEDC00',
blue: '#0075C0',
none: '#727171',
};
root.setProperty('--olive', accentMap[t.accent] || accentMap.olive);
// Density — adjusts global font-size on stage via deck-stage element
const densityMap = {
compact: 0.92,
regular: 1.0,
spacious: 1.08,
};
const stage = document.querySelector('deck-stage');
if (stage) {
stage.style.setProperty('--dc-density', densityMap[t.density] || 1);
}
// apply as CSS variable on body
document.body.style.setProperty('--type-scale', densityMap[t.density] || 1);
document.querySelectorAll('section[data-screen-label]').forEach(s => {
s.style.zoom = densityMap[t.density] || 1;
});
// Motif visibility
document.querySelectorAll('.s-three-dots').forEach(el => {
el.style.display = (t.motif === 'all' || t.motif === 'dots') ? 'flex' : 'none';
});
// vertical lines on section dividers — find via the inline style pattern
document.querySelectorAll('section.s-section div[style*="width:1px"]').forEach(el => {
el.style.visibility = (t.motif === 'all' || t.motif === 'line') ? 'visible' : 'hidden';
});
// Grid overlay
let grid = document.getElementById('__grid_overlay');
if (t.showGrid) {
if (!grid) {
grid = document.createElement('div');
grid.id = '__grid_overlay';
grid.style.cssText = `
position:absolute; inset:0; pointer-events:none; z-index:99;
background-image:
linear-gradient(to right, rgba(0,117,192,0.18) 0.5px, transparent 0.5px),
linear-gradient(to bottom, rgba(0,117,192,0.18) 0.5px, transparent 0.5px);
background-size:140px 60px;
`;
document.querySelectorAll('section[data-screen-label]').forEach(s => {
const g = grid.cloneNode();
// margin guides
const margin = document.createElement('div');
margin.style.cssText = `position:absolute; inset:56px 96px; border:0.5px dashed rgba(0,117,192,0.5); pointer-events:none;`;
g.appendChild(margin);
s.appendChild(g);
});
}
} else {
document.querySelectorAll('#__grid_overlay').forEach(g => g.remove());
}
// Mono tone (preview without olive accent)
if (t.monoTone) {
root.setProperty('--olive', '#727171');
}
}
function App() {
const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
React.useEffect(() => {
// small delay so deck-stage has rendered its shadow children
const id = setTimeout(() => applyTweaks(t), 60);
return () => clearTimeout(id);
}, [t]);
return (
<TweaksPanel>
<TweakSection label="Background" />
<TweakRadio
label="Cover / Section BG"
value={t.coverBg}
options={[
{ value: 'beige', label: 'Beige' },
{ value: 'brown', label: 'Brown' },
{ value: 'white', label: 'White' },
{ value: 'olive', label: 'Olive' },
]}
onChange={(v) => setTweak('coverBg', v)}
/>
<TweakSection label="Accent" />
<TweakRadio
label="Accent color"
value={t.accent}
options={[
{ value: 'olive', label: 'Olive' },
{ value: 'blue', label: 'Blue' },
{ value: 'none', label: 'None' },
]}
onChange={(v) => setTweak('accent', v)}
/>
<TweakToggle
label="Mono tone preview"
value={t.monoTone}
onChange={(v) => setTweak('monoTone', v)}
/>
<TweakSection label="Layout" />
<TweakRadio
label="Type density"
value={t.density}
options={[
{ value: 'compact', label: 'Compact' },
{ value: 'regular', label: 'Regular' },
{ value: 'spacious', label: 'Spacious' },
]}
onChange={(v) => setTweak('density', v)}
/>
<TweakSelect
label="Motif visibility"
value={t.motif}
options={[
{ value: 'all', label: 'All motifs' },
{ value: 'dots', label: 'Three-dot only' },
{ value: 'line', label: 'Vertical line only' },
{ value: 'none', label: 'Minimal' },
]}
onChange={(v) => setTweak('motif', v)}
/>
<TweakToggle
label="Grid overlay"
value={t.showGrid}
onChange={(v) => setTweak('showGrid', v)}
/>
</TweaksPanel>
);
}
const root = ReactDOM.createRoot(document.getElementById('tweaks-root'));
root.render(<App />);

568
tweaks-panel.jsx Normal file
View File

@@ -0,0 +1,568 @@
// tweaks-panel.jsx
// Reusable Tweaks shell + form-control helpers.
//
// Owns the host protocol (listens for __activate_edit_mode / __deactivate_edit_mode,
// posts __edit_mode_available / __edit_mode_set_keys / __edit_mode_dismissed) so
// individual prototypes don't re-roll it. Ships a consistent set of controls so you
// don't hand-draw <input type="range">, segmented radios, steppers, etc.
//
// Usage (in an HTML file that loads React + Babel):
//
// const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
// "primaryColor": "#D97757",
// "palette": ["#D97757", "#29261b", "#f6f4ef"],
// "fontSize": 16,
// "density": "regular",
// "dark": false
// }/*EDITMODE-END*/;
//
// function App() {
// const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
// return (
// <div style={{ fontSize: t.fontSize, color: t.primaryColor }}>
// Hello
// <TweaksPanel>
// <TweakSection label="Typography" />
// <TweakSlider label="Font size" value={t.fontSize} min={10} max={32} unit="px"
// onChange={(v) => setTweak('fontSize', v)} />
// <TweakRadio label="Density" value={t.density}
// options={['compact', 'regular', 'comfy']}
// onChange={(v) => setTweak('density', v)} />
// <TweakSection label="Theme" />
// <TweakColor label="Primary" value={t.primaryColor}
// options={['#D97757', '#2A6FDB', '#1F8A5B', '#7A5AE0']}
// onChange={(v) => setTweak('primaryColor', v)} />
// <TweakColor label="Palette" value={t.palette}
// options={[['#D97757', '#29261b', '#f6f4ef'],
// ['#475569', '#0f172a', '#f1f5f9']]}
// onChange={(v) => setTweak('palette', v)} />
// <TweakToggle label="Dark mode" value={t.dark}
// onChange={(v) => setTweak('dark', v)} />
// </TweaksPanel>
// </div>
// );
// }
//
// ─────────────────────────────────────────────────────────────────────────────
const __TWEAKS_STYLE = `
.twk-panel{position:fixed;right:16px;bottom:16px;z-index:2147483646;width:280px;
max-height:calc(100vh - 32px);display:flex;flex-direction:column;
transform:scale(var(--dc-inv-zoom,1));transform-origin:bottom right;
background:rgba(250,249,247,.78);color:#29261b;
-webkit-backdrop-filter:blur(24px) saturate(160%);backdrop-filter:blur(24px) saturate(160%);
border:.5px solid rgba(255,255,255,.6);border-radius:14px;
box-shadow:0 1px 0 rgba(255,255,255,.5) inset,0 12px 40px rgba(0,0,0,.18);
font:11.5px/1.4 ui-sans-serif,system-ui,-apple-system,sans-serif;overflow:hidden}
.twk-hd{display:flex;align-items:center;justify-content:space-between;
padding:10px 8px 10px 14px;cursor:move;user-select:none}
.twk-hd b{font-size:12px;font-weight:600;letter-spacing:.01em}
.twk-x{appearance:none;border:0;background:transparent;color:rgba(41,38,27,.55);
width:22px;height:22px;border-radius:6px;cursor:default;font-size:13px;line-height:1}
.twk-x:hover{background:rgba(0,0,0,.06);color:#29261b}
.twk-body{padding:2px 14px 14px;display:flex;flex-direction:column;gap:10px;
overflow-y:auto;overflow-x:hidden;min-height:0;
scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.15) transparent}
.twk-body::-webkit-scrollbar{width:8px}
.twk-body::-webkit-scrollbar-track{background:transparent;margin:2px}
.twk-body::-webkit-scrollbar-thumb{background:rgba(0,0,0,.15);border-radius:4px;
border:2px solid transparent;background-clip:content-box}
.twk-body::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,.25);
border:2px solid transparent;background-clip:content-box}
.twk-row{display:flex;flex-direction:column;gap:5px}
.twk-row-h{flex-direction:row;align-items:center;justify-content:space-between;gap:10px}
.twk-lbl{display:flex;justify-content:space-between;align-items:baseline;
color:rgba(41,38,27,.72)}
.twk-lbl>span:first-child{font-weight:500}
.twk-val{color:rgba(41,38,27,.5);font-variant-numeric:tabular-nums}
.twk-sect{font-size:10px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
color:rgba(41,38,27,.45);padding:10px 0 0}
.twk-sect:first-child{padding-top:0}
.twk-field{appearance:none;box-sizing:border-box;width:100%;min-width:0;height:26px;padding:0 8px;
border:.5px solid rgba(0,0,0,.1);border-radius:7px;
background:rgba(255,255,255,.6);color:inherit;font:inherit;outline:none}
.twk-field:focus{border-color:rgba(0,0,0,.25);background:rgba(255,255,255,.85)}
select.twk-field{padding-right:22px;
background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'><path fill='rgba(0,0,0,.5)' d='M0 0h10L5 6z'/></svg>");
background-repeat:no-repeat;background-position:right 8px center}
.twk-slider{appearance:none;-webkit-appearance:none;width:100%;height:4px;margin:6px 0;
border-radius:999px;background:rgba(0,0,0,.12);outline:none}
.twk-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;
width:14px;height:14px;border-radius:50%;background:#fff;
border:.5px solid rgba(0,0,0,.12);box-shadow:0 1px 3px rgba(0,0,0,.2);cursor:default}
.twk-slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;
background:#fff;border:.5px solid rgba(0,0,0,.12);box-shadow:0 1px 3px rgba(0,0,0,.2);cursor:default}
.twk-seg{position:relative;display:flex;padding:2px;border-radius:8px;
background:rgba(0,0,0,.06);user-select:none}
.twk-seg-thumb{position:absolute;top:2px;bottom:2px;border-radius:6px;
background:rgba(255,255,255,.9);box-shadow:0 1px 2px rgba(0,0,0,.12);
transition:left .15s cubic-bezier(.3,.7,.4,1),width .15s}
.twk-seg.dragging .twk-seg-thumb{transition:none}
.twk-seg button{appearance:none;position:relative;z-index:1;flex:1;border:0;
background:transparent;color:inherit;font:inherit;font-weight:500;min-height:22px;
border-radius:6px;cursor:default;padding:4px 6px;line-height:1.2;
overflow-wrap:anywhere}
.twk-toggle{position:relative;width:32px;height:18px;border:0;border-radius:999px;
background:rgba(0,0,0,.15);transition:background .15s;cursor:default;padding:0}
.twk-toggle[data-on="1"]{background:#34c759}
.twk-toggle i{position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;
background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.25);transition:transform .15s}
.twk-toggle[data-on="1"] i{transform:translateX(14px)}
.twk-num{display:flex;align-items:center;box-sizing:border-box;min-width:0;height:26px;padding:0 0 0 8px;
border:.5px solid rgba(0,0,0,.1);border-radius:7px;background:rgba(255,255,255,.6)}
.twk-num-lbl{font-weight:500;color:rgba(41,38,27,.6);cursor:ew-resize;
user-select:none;padding-right:8px}
.twk-num input{flex:1;min-width:0;height:100%;border:0;background:transparent;
font:inherit;font-variant-numeric:tabular-nums;text-align:right;padding:0 8px 0 0;
outline:none;color:inherit;-moz-appearance:textfield}
.twk-num input::-webkit-inner-spin-button,.twk-num input::-webkit-outer-spin-button{
-webkit-appearance:none;margin:0}
.twk-num-unit{padding-right:8px;color:rgba(41,38,27,.45)}
.twk-btn{appearance:none;height:26px;padding:0 12px;border:0;border-radius:7px;
background:rgba(0,0,0,.78);color:#fff;font:inherit;font-weight:500;cursor:default}
.twk-btn:hover{background:rgba(0,0,0,.88)}
.twk-btn.secondary{background:rgba(0,0,0,.06);color:inherit}
.twk-btn.secondary:hover{background:rgba(0,0,0,.1)}
.twk-swatch{appearance:none;-webkit-appearance:none;width:56px;height:22px;
border:.5px solid rgba(0,0,0,.1);border-radius:6px;padding:0;cursor:default;
background:transparent;flex-shrink:0}
.twk-swatch::-webkit-color-swatch-wrapper{padding:0}
.twk-swatch::-webkit-color-swatch{border:0;border-radius:5.5px}
.twk-swatch::-moz-color-swatch{border:0;border-radius:5.5px}
.twk-chips{display:flex;gap:6px}
.twk-chip{position:relative;appearance:none;flex:1;min-width:0;height:46px;
padding:0;border:0;border-radius:6px;overflow:hidden;cursor:default;
box-shadow:0 0 0 .5px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.06);
transition:transform .12s cubic-bezier(.3,.7,.4,1),box-shadow .12s}
.twk-chip:hover{transform:translateY(-1px);
box-shadow:0 0 0 .5px rgba(0,0,0,.18),0 4px 10px rgba(0,0,0,.12)}
.twk-chip[data-on="1"]{box-shadow:0 0 0 1.5px rgba(0,0,0,.85),
0 2px 6px rgba(0,0,0,.15)}
.twk-chip>span{position:absolute;top:0;bottom:0;right:0;width:34%;
display:flex;flex-direction:column;box-shadow:-1px 0 0 rgba(0,0,0,.1)}
.twk-chip>span>i{flex:1;box-shadow:0 -1px 0 rgba(0,0,0,.1)}
.twk-chip>span>i:first-child{box-shadow:none}
.twk-chip svg{position:absolute;top:6px;left:6px;width:13px;height:13px;
filter:drop-shadow(0 1px 1px rgba(0,0,0,.3))}
`;
// ── useTweaks ───────────────────────────────────────────────────────────────
// Single source of truth for tweak values. setTweak persists via the host
// (__edit_mode_set_keys → host rewrites the EDITMODE block on disk).
function useTweaks(defaults) {
const [values, setValues] = React.useState(defaults);
// Accepts either setTweak('key', value) or setTweak({ key: value, ... }) so a
// useState-style call doesn't write a "[object Object]" key into the persisted
// JSON block.
const setTweak = React.useCallback((keyOrEdits, val) => {
const edits = typeof keyOrEdits === 'object' && keyOrEdits !== null
? keyOrEdits : { [keyOrEdits]: val };
setValues((prev) => ({ ...prev, ...edits }));
window.parent.postMessage({ type: '__edit_mode_set_keys', edits }, '*');
// Same-window signal so in-page listeners (deck-stage rail thumbnails)
// can react — the parent message only reaches the host, not peers.
window.dispatchEvent(new CustomEvent('tweakchange', { detail: edits }));
}, []);
return [values, setTweak];
}
// ── TweaksPanel ─────────────────────────────────────────────────────────────
// Floating shell. Registers the protocol listener BEFORE announcing
// availability — if the announce ran first, the host's activate could land
// before our handler exists and the toolbar toggle would silently no-op.
// The close button posts __edit_mode_dismissed so the host's toolbar toggle
// flips off in lockstep; the host echoes __deactivate_edit_mode back which
// is what actually hides the panel.
function TweaksPanel({ title = 'Tweaks', noDeckControls = false, children }) {
const [open, setOpen] = React.useState(false);
const dragRef = React.useRef(null);
// Auto-inject a rail toggle when a <deck-stage> is on the page. The
// toggle drives the deck's per-viewer _railVisible via window message;
// state is mirrored from the same localStorage key the deck reads so
// the control reflects reality across reloads. The mechanism is the
// message — authors who want custom placement can post it directly
// and pass noDeckControls to suppress this one.
const hasDeckStage = React.useMemo(
() => typeof document !== 'undefined' && !!document.querySelector('deck-stage'),
[],
);
// deck-stage enables its rail in connectedCallback, but this panel can
// mount before that element has upgraded. The initial read catches the
// common case; the listener covers mounting first. (Older deck-stage.js
// copies still wait for the host's __omelette_rail_enabled postMessage —
// same listener handles those.)
const [railEnabled, setRailEnabled] = React.useState(
() => hasDeckStage && !!document.querySelector('deck-stage')?._railEnabled,
);
React.useEffect(() => {
if (!hasDeckStage || railEnabled) return undefined;
const onMsg = (e) => {
if (e.data && e.data.type === '__omelette_rail_enabled') setRailEnabled(true);
};
window.addEventListener('message', onMsg);
return () => window.removeEventListener('message', onMsg);
}, [hasDeckStage, railEnabled]);
const [railVisible, setRailVisible] = React.useState(() => {
try { return localStorage.getItem('deck-stage.railVisible') !== '0'; } catch (e) { return true; }
});
const toggleRail = (on) => {
setRailVisible(on);
window.postMessage({ type: '__deck_rail_visible', on }, '*');
};
const offsetRef = React.useRef({ x: 16, y: 16 });
const PAD = 16;
const clampToViewport = React.useCallback(() => {
const panel = dragRef.current;
if (!panel) return;
const w = panel.offsetWidth, h = panel.offsetHeight;
const maxRight = Math.max(PAD, window.innerWidth - w - PAD);
const maxBottom = Math.max(PAD, window.innerHeight - h - PAD);
offsetRef.current = {
x: Math.min(maxRight, Math.max(PAD, offsetRef.current.x)),
y: Math.min(maxBottom, Math.max(PAD, offsetRef.current.y)),
};
panel.style.right = offsetRef.current.x + 'px';
panel.style.bottom = offsetRef.current.y + 'px';
}, []);
React.useEffect(() => {
if (!open) return;
clampToViewport();
if (typeof ResizeObserver === 'undefined') {
window.addEventListener('resize', clampToViewport);
return () => window.removeEventListener('resize', clampToViewport);
}
const ro = new ResizeObserver(clampToViewport);
ro.observe(document.documentElement);
return () => ro.disconnect();
}, [open, clampToViewport]);
React.useEffect(() => {
const onMsg = (e) => {
const t = e?.data?.type;
if (t === '__activate_edit_mode') setOpen(true);
else if (t === '__deactivate_edit_mode') setOpen(false);
};
window.addEventListener('message', onMsg);
window.parent.postMessage({ type: '__edit_mode_available' }, '*');
return () => window.removeEventListener('message', onMsg);
}, []);
const dismiss = () => {
setOpen(false);
window.parent.postMessage({ type: '__edit_mode_dismissed' }, '*');
};
const onDragStart = (e) => {
const panel = dragRef.current;
if (!panel) return;
const r = panel.getBoundingClientRect();
const sx = e.clientX, sy = e.clientY;
const startRight = window.innerWidth - r.right;
const startBottom = window.innerHeight - r.bottom;
const move = (ev) => {
offsetRef.current = {
x: startRight - (ev.clientX - sx),
y: startBottom - (ev.clientY - sy),
};
clampToViewport();
};
const up = () => {
window.removeEventListener('mousemove', move);
window.removeEventListener('mouseup', up);
};
window.addEventListener('mousemove', move);
window.addEventListener('mouseup', up);
};
if (!open) return null;
return (
<>
<style>{__TWEAKS_STYLE}</style>
<div ref={dragRef} className="twk-panel" data-noncommentable=""
style={{ right: offsetRef.current.x, bottom: offsetRef.current.y }}>
<div className="twk-hd" onMouseDown={onDragStart}>
<b>{title}</b>
<button className="twk-x" aria-label="Close tweaks"
onMouseDown={(e) => e.stopPropagation()}
onClick={dismiss}>✕</button>
</div>
<div className="twk-body">
{children}
{hasDeckStage && railEnabled && !noDeckControls && (
<TweakSection label="Deck">
<TweakToggle label="Thumbnail rail" value={railVisible} onChange={toggleRail} />
</TweakSection>
)}
</div>
</div>
</>
);
}
// ── Layout helpers ──────────────────────────────────────────────────────────
function TweakSection({ label, children }) {
return (
<>
<div className="twk-sect">{label}</div>
{children}
</>
);
}
function TweakRow({ label, value, children, inline = false }) {
return (
<div className={inline ? 'twk-row twk-row-h' : 'twk-row'}>
<div className="twk-lbl">
<span>{label}</span>
{value != null && <span className="twk-val">{value}</span>}
</div>
{children}
</div>
);
}
// ── Controls ────────────────────────────────────────────────────────────────
function TweakSlider({ label, value, min = 0, max = 100, step = 1, unit = '', onChange }) {
return (
<TweakRow label={label} value={`${value}${unit}`}>
<input type="range" className="twk-slider" min={min} max={max} step={step}
value={value} onChange={(e) => onChange(Number(e.target.value))} />
</TweakRow>
);
}
function TweakToggle({ label, value, onChange }) {
return (
<div className="twk-row twk-row-h">
<div className="twk-lbl"><span>{label}</span></div>
<button type="button" className="twk-toggle" data-on={value ? '1' : '0'}
role="switch" aria-checked={!!value}
onClick={() => onChange(!value)}><i /></button>
</div>
);
}
function TweakRadio({ label, value, options, onChange }) {
const trackRef = React.useRef(null);
const [dragging, setDragging] = React.useState(false);
// The active value is read by pointer-move handlers attached for the lifetime
// of a drag — ref it so a stale closure doesn't fire onChange for every move.
const valueRef = React.useRef(value);
valueRef.current = value;
// Segments wrap mid-word once per-segment width runs out. The track is
// ~248px (280 panel − 28 body pad − 4 seg pad), each button loses 12px
// to its own padding, and 11.5px system-ui averages ~6.3px/char — so 2
// options fit ~16 chars each, 3 fit ~10. Past that (or >3 options), fall
// back to a dropdown rather than wrap.
const labelLen = (o) => String(typeof o === 'object' ? o.label : o).length;
const maxLen = options.reduce((m, o) => Math.max(m, labelLen(o)), 0);
const fitsAsSegments = maxLen <= ({ 2: 16, 3: 10 }[options.length] ?? 0);
if (!fitsAsSegments) {
// <select> emits strings — map back to the original option value so the
// fallback stays type-preserving (numbers, booleans) like the segment path.
const resolve = (s) => {
const m = options.find((o) => String(typeof o === 'object' ? o.value : o) === s);
return m === undefined ? s : typeof m === 'object' ? m.value : m;
};
return <TweakSelect label={label} value={value} options={options}
onChange={(s) => onChange(resolve(s))} />;
}
const opts = options.map((o) => (typeof o === 'object' ? o : { value: o, label: o }));
const idx = Math.max(0, opts.findIndex((o) => o.value === value));
const n = opts.length;
const segAt = (clientX) => {
const r = trackRef.current.getBoundingClientRect();
const inner = r.width - 4;
const i = Math.floor(((clientX - r.left - 2) / inner) * n);
return opts[Math.max(0, Math.min(n - 1, i))].value;
};
const onPointerDown = (e) => {
setDragging(true);
const v0 = segAt(e.clientX);
if (v0 !== valueRef.current) onChange(v0);
const move = (ev) => {
if (!trackRef.current) return;
const v = segAt(ev.clientX);
if (v !== valueRef.current) onChange(v);
};
const up = () => {
setDragging(false);
window.removeEventListener('pointermove', move);
window.removeEventListener('pointerup', up);
};
window.addEventListener('pointermove', move);
window.addEventListener('pointerup', up);
};
return (
<TweakRow label={label}>
<div ref={trackRef} role="radiogroup" onPointerDown={onPointerDown}
className={dragging ? 'twk-seg dragging' : 'twk-seg'}>
<div className="twk-seg-thumb"
style={{ left: `calc(2px + ${idx} * (100% - 4px) / ${n})`,
width: `calc((100% - 4px) / ${n})` }} />
{opts.map((o) => (
<button key={o.value} type="button" role="radio" aria-checked={o.value === value}>
{o.label}
</button>
))}
</div>
</TweakRow>
);
}
function TweakSelect({ label, value, options, onChange }) {
return (
<TweakRow label={label}>
<select className="twk-field" value={value} onChange={(e) => onChange(e.target.value)}>
{options.map((o) => {
const v = typeof o === 'object' ? o.value : o;
const l = typeof o === 'object' ? o.label : o;
return <option key={v} value={v}>{l}</option>;
})}
</select>
</TweakRow>
);
}
function TweakText({ label, value, placeholder, onChange }) {
return (
<TweakRow label={label}>
<input className="twk-field" type="text" value={value} placeholder={placeholder}
onChange={(e) => onChange(e.target.value)} />
</TweakRow>
);
}
function TweakNumber({ label, value, min, max, step = 1, unit = '', onChange }) {
const clamp = (n) => {
if (min != null && n < min) return min;
if (max != null && n > max) return max;
return n;
};
const startRef = React.useRef({ x: 0, val: 0 });
const onScrubStart = (e) => {
e.preventDefault();
startRef.current = { x: e.clientX, val: value };
const decimals = (String(step).split('.')[1] || '').length;
const move = (ev) => {
const dx = ev.clientX - startRef.current.x;
const raw = startRef.current.val + dx * step;
const snapped = Math.round(raw / step) * step;
onChange(clamp(Number(snapped.toFixed(decimals))));
};
const up = () => {
window.removeEventListener('pointermove', move);
window.removeEventListener('pointerup', up);
};
window.addEventListener('pointermove', move);
window.addEventListener('pointerup', up);
};
return (
<div className="twk-num">
<span className="twk-num-lbl" onPointerDown={onScrubStart}>{label}</span>
<input type="number" value={value} min={min} max={max} step={step}
onChange={(e) => onChange(clamp(Number(e.target.value)))} />
{unit && <span className="twk-num-unit">{unit}</span>}
</div>
);
}
// Relative-luminance contrast pick — checkmarks drawn over a swatch need to
// read on both #111 and #fafafa without per-option configuration. Hex input
// only (#rgb / #rrggbb); named or rgb()/hsl() colors fall through to "light".
function __twkIsLight(hex) {
const h = String(hex).replace('#', '');
const x = h.length === 3 ? h.replace(/./g, (c) => c + c) : h.padEnd(6, '0');
const n = parseInt(x.slice(0, 6), 16);
if (Number.isNaN(n)) return true;
const r = (n >> 16) & 255, g = (n >> 8) & 255, b = n & 255;
return r * 299 + g * 587 + b * 114 > 148000;
}
const __TwkCheck = ({ light }) => (
<svg viewBox="0 0 14 14" aria-hidden="true">
<path d="M3 7.2 5.8 10 11 4.2" fill="none" strokeWidth="2.2"
strokeLinecap="round" strokeLinejoin="round"
stroke={light ? 'rgba(0,0,0,.78)' : '#fff'} />
</svg>
);
// TweakColor — curated color/palette picker. Each option is either a single
// hex string or an array of 1-5 hex strings; the card adapts — a lone color
// renders solid, a palette renders colors[0] as the hero (left ~2/3) with the
// rest stacked in a sharp column on the right. onChange emits the
// option in the shape it was passed (string stays string, array stays array).
// Without options it falls back to the native color input for back-compat.
function TweakColor({ label, value, options, onChange }) {
if (!options || !options.length) {
return (
<div className="twk-row twk-row-h">
<div className="twk-lbl"><span>{label}</span></div>
<input type="color" className="twk-swatch" value={value}
onChange={(e) => onChange(e.target.value)} />
</div>
);
}
// Native <input type=color> emits lowercase hex per the HTML spec, so
// compare case-insensitively. String() guards JSON.stringify(undefined),
// which returns the primitive undefined (no .toLowerCase).
const key = (o) => String(JSON.stringify(o)).toLowerCase();
const cur = key(value);
return (
<TweakRow label={label}>
<div className="twk-chips" role="radiogroup">
{options.map((o, i) => {
const colors = Array.isArray(o) ? o : [o];
const [hero, ...rest] = colors;
const sup = rest.slice(0, 4);
const on = key(o) === cur;
return (
<button key={i} type="button" className="twk-chip" role="radio"
aria-checked={on} data-on={on ? '1' : '0'}
aria-label={colors.join(', ')} title={colors.join(' · ')}
style={{ background: hero }}
onClick={() => onChange(o)}>
{sup.length > 0 && (
<span>
{sup.map((c, j) => <i key={j} style={{ background: c }} />)}
</span>
)}
{on && <__TwkCheck light={__twkIsLight(hero)} />}
</button>
);
})}
</div>
</TweakRow>
);
}
function TweakButton({ label, onClick, secondary = false }) {
return (
<button type="button" className={secondary ? 'twk-btn secondary' : 'twk-btn'}
onClick={onClick}>{label}</button>
);
}
Object.assign(window, {
useTweaks, TweaksPanel, TweakSection, TweakRow,
TweakSlider, TweakToggle, TweakRadio, TweakSelect,
TweakText, TweakNumber, TweakColor, TweakButton,
});

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

396
uploads/BRAND-GUIDE-v1.2.md Normal file
View File

@@ -0,0 +1,396 @@
# D.intelligence Brand Guide v1.2
> **최종 업데이트**: 2026-03-09
> **기준 문서**: [00_SERVICE-MAP.md](00_SERVICE-MAP.md) v2.0
> **이전 버전**: [Archive/D.intelligence-brand-guide-draft.txt](Archive/D.intelligence-brand-guide-draft.txt) v1.0
> **변경 내역**: 서비스 맵 v2.0 기준 전면 재편, 서비스 아키텍처 통일, 타겟 오디언스 확장, Voice Examples 추가
---
## 1. 문서 목적
이 문서는 D.intelligence의 브랜드 정체성, 메시지 체계, 톤앤매너, 서비스 아키텍처, AI 활용 기준을 통합한 내부 운영 기준서다.
**용도**
- 대외 커뮤니케이션의 일관성 확보
- 제안서, 리포트, 콘텐츠, AI 응답 품질의 표준화
- 서비스 소개·영업·마케팅 자료의 기준
- LLM, Agent, 자동화 시스템의 브랜드 기준 문서
---
## 2. 브랜드 코어
### 2.1 Mission
데이터 기반 의사결정으로 기업의 지속가능한 성장을 실현하는 전문 파트너
### 2.2 Vision
마케팅 과학과 데이터 리터러시의 전도사
### 2.3 Tagline
**Analysis, Treatment & Growth**
### 2.4 Internal Motto
**Think Forward**
### 2.5 Core Values
| Value | 의미 |
|-------|------|
| **Science** | 과학적 방법론, 검증, 데이터 기반 판단 |
| **Practice** | 실행 가능하고 현실적인 해법 |
| **Outcome** | 측정 가능한 성과 중심 |
| **Insights** | 복잡한 문제를 분명한 인사이트로 전환 |
### 2.6 Brand Position
**AI와 데이터 기반 마케팅 혁신의 파트너**
### 2.7 Brand Dimensions (4차원 브랜드 구조)
| 차원 | 정의 | 핵심 표현 |
|------|------|----------|
| **Functional** | 데이터 기반 진단-처방-성장 프레임워크를 통해 측정 가능한 성과를 설계한다 | Analysis, Treatment & Growth |
| **Emotional** | 함께 문제를 풀어가는 동반자로서, 고객과 같은 방향을 바라본다 | Think Forward |
| **Experiential** | 과학적인 진단을 우선하는 마케팅 클리닉 경험 — 1:1 상담, 구체적 처방, 성장 설계 | SMART Marketing Clinic |
| **Social** | 누구나 활용 가능한 보편적 데이터 & AI 역량의 전도사 | Data Literacy for All |
### 2.8 Brand Promise
**"진단의 정확함으로 시작하여, 성장의 구조를 함께 만듭니다."**
#### Heritage Promise — 7가지 약속 (2011, D&A)
D.intelligence의 창업 철학이자 브랜드 가치의 근간이 되는 약속이다.
1. 사람과 사람의 이야기를 이어갑니다
2. 사람의 얼굴을 한 브랜드를 그립니다
3. 진실된 고객 가치만을 이야기합니다
4. 조심스럽게 듣고 담백하게 말합니다
5. 큰 성공보다는 작은 믿음을 약속합니다
6. 새로운 도전과 실패를 두려워하지 않습니다
7. 사람의 온기와 향기를 남깁니다
> 이 7가지 약속은 현재의 Core Values(Science, Practice, Outcome, Insights)와 톤앤매너("조심스럽게 듣고 담백하게")의 원형이며, Brand Character의 인간적 깊이를 부여하는 근간이다.
### 2.9 Brand Character
**지혜로운 상담 마케팅 주치의**
과학적이되 따뜻한, 진단은 냉철하나 처방은 인간적인 전문가.
| 특성 | 표현 | 연결 |
|------|------|------|
| 전문성 | 데이터와 논리에 기반한 진단, 근거 없는 과장을 하지 않는다 | Science, Practice |
| 따뜻함 | 성과 너머의 관계를 소중히 한다 | 약속 #7 "사람의 온기와 향기를 남깁니다" |
| 담백함 | 꾸밈 없는 솔직한 커뮤니케이션 | 약속 #4 "조심스럽게 듣고 담백하게 말합니다" |
| 동반자 | 장기적 파트너십 지향, 함께 문제를 풀어간다 | 약속 #5 "큰 성공보다는 작은 믿음을 약속합니다" |
| 도전 | 혁신에 열린 태도, AI와 데이터의 새로운 가능성을 탐구한다 | 약속 #6 "새로운 도전과 실패를 두려워하지 않습니다" |
---
## 3. 브랜드 내러티브
### 3.1 왜 D.intelligence가 존재하는가
많은 기업이 데이터를 수집하지만, 그 데이터로 올바른 의사결정을 내리지 못한다. 마케팅 예산은 집행되지만 성과의 구조가 보이지 않고, 채널은 늘어나지만 KPI와 측정 체계가 정렬되지 않는다.
D.intelligence는 이 간극을 메운다. 데이터를 단순히 '보는 것'이 아니라 '진단하고, 처방하고, 성장으로 연결하는 것'이 우리의 역할이다.
### 3.2 브랜드 정의
D.intelligence는 디지털 마케팅과 데이터 분석의 언어를 연결하여, 기업이 더 정확하게 측정하고, 더 명확하게 판단하고, 더 지속적으로 성장하도록 돕는 **Marketing Intelligence 파트너**다.
- 단순 대행사가 아니라 **진단-설계-실행-최적화**를 함께 하는 파트너
- 단순 리포터가 아니라 **의사결정을 돕는 분석가이자 전략가**
- 단순 데이터 기술자가 아니라 **성과를 설계하는 비즈니스 분석 파트너**
### 3.3 포지셔닝
**AI와 데이터 기반 마케팅 혁신의 파트너**
대기업 수준의 데이터·AI 역량을 중견기업과 스타트업에 맞춤 실행력으로 전달한다.
### 3.4 핵심 차별점
- 과학적 진단-처방-성장 프레임워크를 마케팅에 적용한 독자적 SMART Marketing Clinic 모델
- 진단으로 끝나지 않고 실행(Treatment)과 성장(Growth)까지 연결
- Brand Visibility Treatment(T6)라는 독자 서비스 영역 보유
- 데이터 분석과 마케팅 전략의 양방향 전문성
---
## 4. 서비스 아키텍처
### 4.1 3-Phase 프레임워크
D.intelligence의 서비스는 고객의 디지털 성장 단계에 맞춘 3-Phase 프레임워크로 구성된다.
| Phase | 명칭 | 목적 | 모듈 |
|-------|------|------|------|
| **Analysis** | 진단 | 현재 상태를 정확하게 진단하고 데이터 근거를 확보 | A1-A6 (6개) |
| **Treatment** | 처방 | 진단 결과를 기반으로 구체적 개선·최적화 설계·실행 | T1-T7 (7개) |
| **Growth** | 성장 | 지속적 성장을 위한 장기 파트너십과 성과 관리 | G1-G4 (4개) |
### 4.2 4대 서비스 카테고리
각 모듈은 아래 4대 서비스 카테고리(태그) 중 하나 이상에 태깅된다.
| 태그 | 카테고리명 | 정의 |
|------|-----------|------|
| `DI` | Data Intelligence | 비즈니스 목표에 맞는 데이터를 정의하고, 수집·검증·분석 체계를 수립 |
| `MD` | Measurement Design | 비즈니스 성과를 측정할 수 있는 지표 체계, 이벤트 구조, 리포팅 체계 설계 |
| `MPO` | Marketing Performance Optimization | 채널·캠페인·콘텐츠·랜딩페이지의 성과를 분석하고 최적화 |
| `BVT` | Brand Visibility Treatment | SEO, 콘텐츠 구조화, 검색 노출 최적화, 디지털 자산 가시성 강화 |
### 4.3 서비스 모듈 일람
#### Analysis (진단)
| 코드 | 서비스명 | 주요 태그 |
|------|---------|-----------|
| A1 | 비즈니스·브랜드 진단 | MPO |
| A2 | 고객·소비자 분석 | MPO |
| A3 | 데이터 분석 — 웹·앱 | DI, MD, BVT |
| A4 | 디지털 마케팅 진단 | MPO, BVT |
| A5 | 퍼포먼스 마케팅 진단 | MPO, MD |
| A6 | 운영·관리 진단 | DI |
#### Treatment (처방)
| 코드 | 서비스명 | 주요 태그 |
|------|---------|-----------|
| T1 | 브랜드 스토리텔링 & 가이드 | BVT |
| T2 | 고객 접점 경험 최적화 | MPO |
| T3 | 디지털 자산 통합관리 | DI, MD |
| T4 | 콘텐츠 마케팅 | MPO |
| T5 | 광고·전환 최적화 | MPO |
| **T6** | **Brand Visibility Treatment** | **BVT** |
| T7 | 운영 시스템·자동화 | DI |
> T6 Brand Visibility Treatment는 D.intelligence의 시그니처 서비스이다. SEO, 콘텐츠 구조화, 검색 노출 최적화, AEO/GEO를 포괄하며 다른 모듈과 가장 높은 연관성을 가진다.
#### Growth (성장)
| 코드 | 서비스명 | 주요 태그 |
|------|---------|-----------|
| G1 | 퍼포먼스 마케팅 | MPO |
| G2 | 콘텐츠 마케팅 대행 | MPO, BVT |
| G3 | 모니터링·이슈관리 | MD, BVT |
| G4 | 연간 계약·운영 | MPO |
### 4.4 부가 서비스
| 서비스 | 포지셔닝 | 서비스 맵 연결 |
|--------|---------|---------------|
| 1Day Clinic | Quick Diagnosis — Analysis Phase 경량 버전 | A3, A4, A5 간이 |
| Courses | Capability Building — Data Literacy 교육 | T4 교육 요소, A6→T3 |
| Magazine D. | Insights Channel — 마케팅 인사이트 매거진 | 콘텐츠 마케팅 |
| Newsletter | Regular Updates — 정기 뉴스레터 | 리드 너처링 |
---
## 5. 타겟 오디언스
### 5.1 Tier 1: 의사결정자 (구매자)
| 페르소나 | 기업 규모 | Pain Point |
|---------|----------|------------|
| CMO / 마케팅 본부장 | 연매출 100-500억 중견기업 | 마케팅 투자 대비 성과 측정이 안 됨, 채널별 ROI 불분명 |
| CSO / 전략기획 임원 | Series A-C 스타트업 | 데이터 기반 전략 수립 역량 부족, 디지털 전환 방향 불확실 |
| 스타트업 대표 / 공동창업자 | — | 한정된 예산으로 최대 성과, 빠른 실행-검증 필요 |
### 5.2 Tier 2: 실무 사용자
마케팅 책임자, 사업주·창업자, eCommerce 책임자, 브랜드 담당자, 디지털 마케팅 담당자, 콘텐츠 마케팅 담당자, 데이터 분석가, Growth Manager, 커뮤니케이션 담당자
> 상세 페르소나별 Touch Point, Landing Page, CTA 설계는 [04_TARGET-TOUCHPOINTS.md](04_TARGET-TOUCHPOINTS.md) 참조
### 5.3 고객이 D.intelligence를 필요로 하는 상황
- 데이터는 쌓이지만 해석이 안 되는 경우
- 마케팅 성과는 집행되지만 구조가 없는 경우
- 채널은 많은데 KPI와 측정 체계가 정렬되지 않은 경우
- SEO, GA4, GTM, BigQuery, 대시보드가 따로 노는 경우
- 실행 조직은 있으나 전략과 기준이 없는 경우
- 검색에 우리 회사가 안 나와서 콘텐츠 효과가 없는 경우
- 광고비는 쓰는데 매출이 안 늘어나는 경우
- 랜딩 페이지 전환율이 낮고 원인을 모르는 경우
---
## 6. 브랜드 메시지 프레임워크
### 6.1 표준 구조
**문제 진단 → 데이터 근거 → 해결 방안 → 예상 성과**
### 6.2 메시지 작성 원칙
- 추상적 표현보다 구체적 지표를 우선한다.
- 방법론 설명보다 실행 가능성을 우선한다.
- '무엇이 문제인가'보다 '어떻게 개선할 것인가'를 더 분명하게 말한다.
- 가능하면 Before / After 혹은 KPI 변화를 함께 제시한다.
### 6.3 카테고리별 메시지
| 카테고리 | 고객 대상 메시지 |
|---------|----------------|
| DI | "흩어진 데이터를 하나의 의사결정 체계로 연결합니다" |
| MD | "무엇을 측정하고 어떻게 평가할지, 기준부터 세워드립니다" |
| MPO | "실행 가능한 최적화로, 데이터가 말하는 성과를 실현합니다" |
| BVT | "검색에서 발견되지 않으면 존재하지 않는 것과 같습니다" |
---
## 7. 톤 & 매너 가이드
### 7.1 기본 톤
Professional, Science-driven, Practice-oriented, Outcome-focused, Calm but confident
### 7.2 문장 스타일
- 논리적이고 단정한 문장
- 과장된 수사 금지
- 전문 용어는 쓰되, 반드시 풀어서 설명
- 장황한 미사여구보다 프레임워크와 수치 중심
### 7.3 Voice Examples
#### 좋은 표현
| 유형 | 예문 |
|------|------|
| 진단형 | "현재 구조상 가장 큰 병목은 전환 추적 이벤트의 부재입니다." |
| 데이터형 | "현 데이터 품질을 전제로 하면, 15-20% 범위의 CAC 절감 가능성이 있습니다." |
| 전략형 | "단기적으로는 GA4 이벤트 재설계, 중기적으로는 대시보드 체계 구축이 타당합니다." |
| 제안형 | "이 경우 핵심 지표는 채널별 전환율과 ROAS로 보아야 합니다." |
| CTA형 | "채널별 CAC 구조를 재설계하여 3개월 내 비효율 매체비 15-20% 절감 가능성을 진단합니다." |
#### 나쁜 표현 (금지)
| 유형 | 예문 | 이유 |
|------|------|------|
| 과장 | "마케팅 효율을 획기적으로 높여드립니다." | 근거 없는 과장 |
| 보장 | "반드시 매출이 올라갑니다." | 성과 보장 표현 |
| 모호 | "요즘은 다 이렇게 합니다." | 근거 없는 일반화 |
| 과시 | "저희만의 독보적인 AI 기술이 있습니다." | 기술 과시 |
| 권위 | "국내 Top 기업들이 사용합니다." | 레퍼런스 의존 권위주의 |
### 7.4 채널별 톤 조정
| 채널 | 톤 특성 | 콘텐츠 포커스 |
|------|---------|-------------|
| 웹사이트 | 신뢰·전문 | 문제 해결 방식 중심, 서비스 → 성과 연결 |
| LinkedIn / 블로그 | 인사이트·실무 | 업계 인사이트 + 적용 방법 중심 |
| 제안서 | 구조·논리 | Executive Summary 우선, 문제→근거→실행안→KPI |
| 세미나 / 웨비나 | 진단·참여 | 참가자가 가져갈 수 있는 프레임워크 제공 |
| 뉴스레터 | 간결·인사이트 | 핵심 수치 + 실무 시사점 |
---
## 8. 문제 해결 프레임워크
### 8.1 Core Framework
1. **Problem Diagnosis** — 실제 문제와 증상을 구분하고, 비즈니스 목표·제약조건·병목을 확인한다.
2. **Data Evidence** — 데이터, 지표, 패턴, 비교 사례를 근거로 문제를 설명한다. 데이터가 불완전할 경우 가정과 한계를 명시한다.
3. **Strategic Treatment** — 실행 가능한 대안을 제시한다. 우선순위, 난이도, 기대효과를 함께 정리한다.
4. **Expected Growth Impact** — 예상되는 KPI 변화와 성과 범위를 제시한다. 조건별 결과 차이를 설명한다.
### 8.2 실무 적용 영역
SEO Audit & Treatment, GA4/GTM/BigQuery 기반 분석 체계 설계, 마케팅 성과 측정 시스템 구축, 디지털 채널 및 자산 진단, 콘텐츠 구조화 및 검색 가시성 개선, 대시보드/리포팅 체계 설계
---
## 9. 콘텐츠 제작 기준
### 9.1 공통 기준
Case Study 중심, Before/After 수치 포함, 실행 절차 포함, 고객사 규모/산업/과업 맥락 명시
### 9.2 유형별 기준
| 유형 | 기준 |
|------|------|
| 제안서·보고서 | Executive Summary 우선, 문제 정의 → 데이터 근거 → 실행안 → KPI |
| 교육 콘텐츠 | 실무 적용 템플릿, 단계별 실행 가이드, 체크리스트 포함 |
| 블로그·매거진 | 진단형 또는 가이드형, 실무 관점 유지, SEO 키워드 반영 |
| 사례 연구 | 산업·규모·과제 맥락 명시, 문제-해결-성과 구조 |
---
## 10. 브랜드 금지 항목
- 과장된 약속
- 보장형 표현 ("반드시", "확실히", "무조건")
- 기술 그 자체를 성과처럼 포장하는 표현
- 복잡한 방법론을 과시하는 설명
- 대기업 레퍼런스만을 앞세운 권위주의적 커뮤니케이션
- 경쟁사 직접 비하
- 근거 없는 낙관론
---
## 11. AI/LLM 활용 브랜드 기준
### 11.1 AI의 역할
분석 보조자, 전략 설계 보조자, SEO/콘텐츠 초안 작성자, 제안서/리포트 구조화 도우미, 데이터 문제 정의 파트너
### 11.2 AI 응답 기본 구조
1. 문제 진단 → 2. 데이터 근거 → 3. 해결 방안 → 4. 예상 성과
### 11.3 AI 필수 원칙
- 추상적 조언 대신 실행 가능한 답변 제공
- 가능하면 KPI, 수치, 구조 포함
- 비즈니스 목표와 연결된 분석 제안
- 데이터 한계와 가정을 명시
- 브랜드 톤(Professional / Science / Practice / Outcome) 유지
### 11.4 금지 응답 패턴
"무조건 좋아질 것입니다", "반드시 성과를 보장합니다", "요즘은 다 이렇게 합니다", "정말 엄청난 인사이트입니다"
---
## 12. 관련 문서
| 문서 | 내용 |
|------|------|
| [00_SERVICE-MAP.md](00_SERVICE-MAP.md) | 서비스 맵 마스터 문서 (v2.0) |
| [01_ALIGNMENT-ANALYSIS.md](01_ALIGNMENT-ANALYSIS.md) | 브랜드 가이드 ↔ 서비스 맵 정합성 분석 |
| [03_STRATEGIC-KEYWORDS.md](03_STRATEGIC-KEYWORDS.md) | 전략 키워드 셋 |
| [04_TARGET-TOUCHPOINTS.md](04_TARGET-TOUCHPOINTS.md) | 타겟 오디언스별 접점 설계 |
| [05_VALUE-PROPOSITIONS.md](05_VALUE-PROPOSITIONS.md) | 모듈별 고객 가치 제안 |
| [06_PRICING-PACKAGES.md](06_PRICING-PACKAGES.md) | 가격 패키지 설계 |
| [07_WEBSITE-ALIGNMENT.md](07_WEBSITE-ALIGNMENT.md) | 홈페이지 구조 통일 방안 |
---
## Changelog
| 버전 | 날짜 | 변경 내용 |
|------|------|-----------|
| v1.0 | 2026-03 | 초안 (브랜드 코어, 톤앤매너, AI 기준) |
| v1.1 | 2026-03-07 | 서비스 맵 v2.0 기준 전면 재편: 3-Phase × 17모듈 아키텍처 통일, 4대 카테고리 정의 정합, 2-Tier 타겟 오디언스 확장, 브랜드 내러티브 추가, Voice Examples 추가, 카테고리별 메시지 추가, 관련 문서 참조 체계 구축 |
| v1.2 | 2026-03-09 | 브랜드 플랫폼 체계 신설: Brand Vision 재정의, Brand Position 업데이트, 4차원 Brand Dimensions 수립, Brand Promise(Heritage Promise 7가지 약속 통합), Brand Character("지혜로운 상담 마케팅 주치의") 정의, 포지셔닝 문구 현행화, 의료 클리닉 은유→마케팅 클리닉 전환 |
---
## 향후 확장 방향
- [ ] Brand Voice Examples 확장 (채널별·유형별 예문 30개+)
- [ ] Service Playbooks 분리 (SEO, GA4/GTM, Proposal, Dashboard)
- [ ] AI Training Kit (Master Prompt 최종본, JSONL 데이터셋, Negative Examples, Agent Role Prompt)
- [ ] Case Study Library 구축 (산업별 문제-해결-성과 구조)
- [ ] Visual Identity Guide (로고, 색상, 타이포그래피, 문서 양식)

444
uploads/BRAND-GUIDE-v1.3.md Normal file
View File

@@ -0,0 +1,444 @@
# D.intelligence Brand Guide v1.3
> **최종 업데이트**: 2026-05-17
> **기준 문서**: [00_SERVICE-MAP.md](../03_Services/00_SERVICE-MAP.md) v2.0
> **단일 진실(Single Source of Truth)**: [knowledge-base/canon/brand-canon.md](../knowledge-base/canon/brand-canon.md) v1.0 APPROVED
> **이전 버전**: [99_Archive/Brand/legacy-guides/BRAND-GUIDE-v1.2-archived-20260517.md](../99_Archive/Brand/legacy-guides/BRAND-GUIDE-v1.2-archived-20260517.md)
> **v1.3 변경 내역**: §2.7 Experiential 재정의 (SMART Marketing Intelligence) / §2.9 Brand Character 'D.intel=마케팅 과학자' 재정립 + OurDigital 분리 / §3.4 SMART Marketing Intelligence / §6.3 MD·BVT 메시지 교체 / §10 외국어 직역 금지 추가 / §11.5 9개 dintel-* Skill 적용 의무 신설
---
## 1. 문서 목적
이 문서는 D.intelligence의 브랜드 정체성, 메시지 체계, 톤앤매너, 서비스 아키텍처, AI 활용 기준을 통합한 내부 운영 기준서다.
**용도**
- 대외 커뮤니케이션의 일관성 확보
- 제안서, 리포트, 콘텐츠, AI 응답 품질의 표준화
- 서비스 소개·영업·마케팅 자료의 기준
- LLM, Agent, 자동화 시스템의 브랜드 기준 문서
---
## 2. 브랜드 코어
### 2.1 Mission
데이터 기반 의사결정으로 기업의 지속가능한 성장을 실현하는 전문 파트너
### 2.2 Vision
마케팅 과학과 데이터 리터러시의 전도사
### 2.3 Tagline
**Analysis, Treatment & Growth**
### 2.4 Internal Motto
**Think Forward**
### 2.5 Core Values
| Value | 의미 |
|-------|------|
| **Science** | 과학적 방법론, 검증, 데이터 기반 판단 |
| **Practice** | 실행 가능하고 현실적인 해법 |
| **Outcome** | 측정 가능한 성과 중심 |
| **Insights** | 복잡한 문제를 분명한 인사이트로 전환 |
### 2.6 Brand Position
**AI와 데이터 기반 마케팅 혁신의 파트너**
### 2.7 Brand Dimensions (4차원 브랜드 구조)
| 차원 | 정의 | 핵심 표현 |
|------|------|----------|
| **Functional** | 데이터 기반 진단-처방-성장 프레임워크를 통해 측정 가능한 성과를 설계한다 | Analysis, Treatment & Growth |
| **Emotional** | 함께 문제를 풀어가는 동반자로서, 고객과 같은 방향을 바라본다 | Think Forward |
| **Experiential** | 과학적인 마케팅 문제 해결 — 성과 중심, 데이터 기반, 지속 성장 | **SMART Marketing Intelligence** |
| **Social** | 누구나 활용 가능한 보편적 데이터 & AI 역량의 전도사 | Data Literacy for All |
### 2.8 Brand Promise
**"진단의 정확함으로 시작하여, 성장의 구조를 함께 만듭니다."**
#### Heritage Promise — 7가지 약속 (2011, D&A)
D.intelligence의 창업 철학이자 브랜드 가치의 근간이 되는 약속이다.
1. 사람과 사람의 이야기를 이어갑니다
2. 사람의 얼굴을 한 브랜드를 그립니다
3. 진실된 고객 가치만을 이야기합니다
4. 조심스럽게 듣고 담백하게 말합니다
5. 큰 성공보다는 작은 믿음을 약속합니다
6. 새로운 도전과 실패를 두려워하지 않습니다
7. 사람의 온기와 향기를 남깁니다
> 이 7가지 약속은 현재의 Core Values(Science, Practice, Outcome, Insights)와 톤앤매너("조심스럽게 듣고 담백하게")의 원형이며, Brand Character의 인간적 깊이를 부여하는 근간이다.
### 2.9 Brand Character
**성과중심의 데이터 기반 마케팅 과학자**
*(Outcome-focused Data-driven Marketing Scientist)*
엄밀한 가설 검증, 측정 가능한 KPI, 재현 가능한 방법론으로 마케팅 성과를 설계하는 분석가형 전문가. 추측과 일반론 대신 데이터·실험·구조로 말한다.
| 특성 | 표현 | Heritage Promise / Core Values 연결 |
|------|------|---------------------------------|
| 과학적 엄정성 | 가설 → 측정 → 검증 → 개선의 순환을 일관되게 적용한다 | Science (Core Value) |
| 성과 지향성 | 측정 가능한 KPI 변화로 결과를 보여준다 | Outcome (Core Value) |
| 실행 가능성 | 추상적 권고가 아닌 즉시 적용 가능한 처방을 제시한다 | Practice (Core Value) |
| 구조적 사고 | 단편적 답변이 아닌 의사결정 프레임워크를 설계한다 | Insights (Core Value) |
| 정직한 한계 표시 | 데이터·가정의 한계를 분명히 명시한다 | 약속 #3 "진실된 고객 가치만을 이야기합니다" |
#### 2.9.1 OurDigital은 별도 브랜드 시스템
> ⚠️ 본 가이드는 **D.intelligence 전용**. OurDigital 브랜드 정체성·캐릭터·톤·자산은 별도 프로젝트에서 독립 관리.
- "지혜로운 상담 마케팅 주치의" 캐릭터는 **OurDigital로 이관** (2026-05-17 결정)
- D.intelligence(엔터프라이즈) 콘텐츠는 "마케팅 과학자" 톤 유지
- OurDigital(SMB·코칭·트레이닝) 콘텐츠는 OurDigital 별도 brand 시스템 참조
- 두 브랜드 cross-reference는 `knowledge-base/canon/fact-sheet.md §1` 법인 구조 참조
---
## 3. 브랜드 내러티브
### 3.1 왜 D.intelligence가 존재하는가
많은 기업이 데이터를 수집하지만, 그 데이터로 올바른 의사결정을 내리지 못한다. 마케팅 예산은 집행되지만 성과의 구조가 보이지 않고, 채널은 늘어나지만 KPI와 측정 체계가 정렬되지 않는다.
D.intelligence는 이 간극을 메운다. 데이터를 단순히 '보는 것'이 아니라 '진단하고, 처방하고, 성장으로 연결하는 것'이 우리의 역할이다.
### 3.2 브랜드 정의
D.intelligence는 디지털 마케팅과 데이터 분석의 언어를 연결하여, 기업이 더 정확하게 측정하고, 더 명확하게 판단하고, 더 지속적으로 성장하도록 돕는 **Marketing Intelligence 파트너**다.
- 단순 대행사가 아니라 **진단-설계-실행-최적화**를 함께 하는 파트너
- 단순 리포터가 아니라 **의사결정을 돕는 분석가이자 전략가**
- 단순 데이터 기술자가 아니라 **성과를 설계하는 비즈니스 분석 파트너**
### 3.3 포지셔닝
**AI와 데이터 기반 마케팅 혁신의 파트너**
대기업 수준의 데이터·AI 역량을 중견기업과 스타트업에 맞춤 실행력으로 전달한다.
### 3.4 핵심 차별점
- 과학적 진단-처방-성장 프레임워크를 마케팅에 적용한 독자적 **SMART Marketing Intelligence** 모델
- 진단으로 끝나지 않고 실행(Treatment)과 성장(Growth)까지 연결
- Brand Visibility Treatment(T6)라는 독자 서비스 영역 보유
- 데이터 분석과 마케팅 전략의 양방향 전문성
---
## 4. 서비스 아키텍처
### 4.1 3-Phase 프레임워크
D.intelligence의 서비스는 고객의 디지털 성장 단계에 맞춘 3-Phase 프레임워크로 구성된다.
| Phase | 명칭 | 목적 | 모듈 |
|-------|------|------|------|
| **Analysis** | 진단 | 현재 상태를 정확하게 진단하고 데이터 근거를 확보 | A1-A6 (6개) |
| **Treatment** | 처방 | 진단 결과를 기반으로 구체적 개선·최적화 설계·실행 | T1-T7 (7개) |
| **Growth** | 성장 | 지속적 성장을 위한 장기 파트너십과 성과 관리 | G1-G4 (4개) |
### 4.2 4대 서비스 카테고리
각 모듈은 아래 4대 서비스 카테고리(태그) 중 하나 이상에 태깅된다.
| 태그 | 카테고리명 | 정의 |
|------|-----------|------|
| `DI` | Data Intelligence | 비즈니스 목표에 맞는 데이터를 정의하고, 수집·검증·분석 체계를 수립 |
| `MD` | Measurement Design | 비즈니스 성과를 측정할 수 있는 지표 체계, 이벤트 구조, 리포팅 체계 설계 |
| `MPO` | Marketing Performance Optimization | 채널·캠페인·콘텐츠·랜딩페이지의 성과를 분석하고 최적화 |
| `BVT` | Brand Visibility Treatment | SEO, 콘텐츠 구조화, 검색 노출 최적화, 디지털 자산 가시성 강화 |
### 4.3 서비스 모듈 일람
#### Analysis (진단)
| 코드 | 서비스명 | 주요 태그 |
|------|---------|-----------|
| A1 | 비즈니스·브랜드 진단 | MPO |
| A2 | 고객·소비자 분석 | MPO |
| A3 | 데이터 분석 — 웹·앱 | DI, MD, BVT |
| A4 | 디지털 마케팅 진단 | MPO, BVT |
| A5 | 퍼포먼스 마케팅 진단 | MPO, MD |
| A6 | 운영·관리 진단 | DI |
#### Treatment (처방)
| 코드 | 서비스명 | 주요 태그 |
|------|---------|-----------|
| T1 | 브랜드 스토리텔링 & 가이드 | BVT |
| T2 | 고객 접점 경험 최적화 | MPO |
| T3 | 디지털 자산 통합관리 | DI, MD |
| T4 | 콘텐츠 마케팅 | MPO |
| T5 | 광고·전환 최적화 | MPO |
| **T6** | **Brand Visibility Treatment** | **BVT** |
| T7 | 운영 시스템·자동화 | DI |
> T6 Brand Visibility Treatment는 D.intelligence의 시그니처 서비스이다. SEO, 콘텐츠 구조화, 검색 노출 최적화, AEO/GEO를 포괄하며 다른 모듈과 가장 높은 연관성을 가진다.
#### Growth (성장)
| 코드 | 서비스명 | 주요 태그 |
|------|---------|-----------|
| G1 | 퍼포먼스 마케팅 | MPO |
| G2 | 콘텐츠 마케팅 대행 | MPO, BVT |
| G3 | 모니터링·이슈관리 | MD, BVT |
| G4 | 연간 계약·운영 | MPO |
### 4.4 부가 서비스
| 서비스 | 포지셔닝 | 서비스 맵 연결 |
|--------|---------|---------------|
| 1Day Clinic | Quick Diagnosis — Analysis Phase 경량 버전 | A3, A4, A5 간이 |
| Courses | Capability Building — Data Literacy 교육 | T4 교육 요소, A6→T3 |
| Magazine D. | Insights Channel — 마케팅 인사이트 매거진 | 콘텐츠 마케팅 |
| Newsletter | Regular Updates — 정기 뉴스레터 | 리드 너처링 |
---
## 5. 타겟 오디언스
### 5.1 Tier 1: 의사결정자 (구매자)
| 페르소나 | 기업 규모 | Pain Point |
|---------|----------|------------|
| CMO / 마케팅 본부장 | 연매출 100-500억 중견기업 | 마케팅 투자 대비 성과 측정이 안 됨, 채널별 ROI 불분명 |
| CSO / 전략기획 임원 | Series A-C 스타트업 | 데이터 기반 전략 수립 역량 부족, 디지털 전환 방향 불확실 |
| 스타트업 대표 / 공동창업자 | — | 한정된 예산으로 최대 성과, 빠른 실행-검증 필요 |
### 5.2 Tier 2: 실무 사용자
마케팅 책임자, 사업주·창업자, eCommerce 책임자, 브랜드 담당자, 디지털 마케팅 담당자, 콘텐츠 마케팅 담당자, 데이터 분석가, Growth Manager, 커뮤니케이션 담당자
> 상세 페르소나별 Touch Point, Landing Page, CTA 설계는 [04_TARGET-TOUCHPOINTS.md](04_TARGET-TOUCHPOINTS.md) 참조
### 5.3 고객이 D.intelligence를 필요로 하는 상황
- 데이터는 쌓이지만 해석이 안 되는 경우
- 마케팅 성과는 집행되지만 구조가 없는 경우
- 채널은 많은데 KPI와 측정 체계가 정렬되지 않은 경우
- SEO, GA4, GTM, BigQuery, 대시보드가 따로 노는 경우
- 실행 조직은 있으나 전략과 기준이 없는 경우
- 검색에 우리 회사가 안 나와서 콘텐츠 효과가 없는 경우
- 광고비는 쓰는데 매출이 안 늘어나는 경우
- 랜딩 페이지 전환율이 낮고 원인을 모르는 경우
---
## 6. 브랜드 메시지 프레임워크
### 6.1 표준 구조
**문제 진단 → 데이터 근거 → 해결 방안 → 예상 성과**
### 6.2 메시지 작성 원칙
- 추상적 표현보다 구체적 지표를 우선한다.
- 방법론 설명보다 실행 가능성을 우선한다.
- '무엇이 문제인가'보다 '어떻게 개선할 것인가'를 더 분명하게 말한다.
- 가능하면 Before / After 혹은 KPI 변화를 함께 제시한다.
### 6.3 카테고리별 메시지
| 카테고리 | 고객 대상 메시지 |
|---------|----------------|
| DI | "흩어진 데이터를 하나의 의사결정 체계로 연결합니다" |
| MD | "무엇을 측정하고, 성과 기준을 어떻게 설정하며, 어떤 데이터 소스를 활용할지 안내합니다." |
| MPO | "실행 가능한 최적화로, 데이터가 말하는 성과를 실현합니다" |
| BVT | "브랜드가 어떻게 드러나고 이해되는지를 최적화합니다." |
---
## 7. 톤 & 매너 가이드
### 7.1 기본 톤
Professional, Science-driven, Practice-oriented, Outcome-focused, Calm but confident
### 7.2 문장 스타일
- 논리적이고 단정한 문장
- 과장된 수사 금지
- 전문 용어는 쓰되, 반드시 풀어서 설명
- 장황한 미사여구보다 프레임워크와 수치 중심
### 7.3 Voice Examples
#### 좋은 표현
| 유형 | 예문 |
|------|------|
| 진단형 | "현재 구조상 가장 큰 병목은 전환 추적 이벤트의 부재입니다." |
| 데이터형 | "현 데이터 품질을 전제로 하면, 15-20% 범위의 CAC 절감 가능성이 있습니다." |
| 전략형 | "단기적으로는 GA4 이벤트 재설계, 중기적으로는 대시보드 체계 구축이 타당합니다." |
| 제안형 | "이 경우 핵심 지표는 채널별 전환율과 ROAS로 보아야 합니다." |
| CTA형 | "채널별 CAC 구조를 재설계하여 3개월 내 비효율 매체비 15-20% 절감 가능성을 진단합니다." |
#### 나쁜 표현 (금지)
| 유형 | 예문 | 이유 |
|------|------|------|
| 과장 | "마케팅 효율을 획기적으로 높여드립니다." | 근거 없는 과장 |
| 보장 | "반드시 매출이 올라갑니다." | 성과 보장 표현 |
| 모호 | "요즘은 다 이렇게 합니다." | 근거 없는 일반화 |
| 과시 | "저희만의 독보적인 AI 기술이 있습니다." | 기술 과시 |
| 권위 | "국내 Top 기업들이 사용합니다." | 레퍼런스 의존 권위주의 |
### 7.4 채널별 톤 조정
| 채널 | 톤 특성 | 콘텐츠 포커스 |
|------|---------|-------------|
| 웹사이트 | 신뢰·전문 | 문제 해결 방식 중심, 서비스 → 성과 연결 |
| LinkedIn / 블로그 | 인사이트·실무 | 업계 인사이트 + 적용 방법 중심 |
| 제안서 | 구조·논리 | Executive Summary 우선, 문제→근거→실행안→KPI |
| 세미나 / 웨비나 | 진단·참여 | 참가자가 가져갈 수 있는 프레임워크 제공 |
| 뉴스레터 | 간결·인사이트 | 핵심 수치 + 실무 시사점 |
---
## 8. 문제 해결 프레임워크
### 8.1 Core Framework
1. **Problem Diagnosis** — 실제 문제와 증상을 구분하고, 비즈니스 목표·제약조건·병목을 확인한다.
2. **Data Evidence** — 데이터, 지표, 패턴, 비교 사례를 근거로 문제를 설명한다. 데이터가 불완전할 경우 가정과 한계를 명시한다.
3. **Strategic Treatment** — 실행 가능한 대안을 제시한다. 우선순위, 난이도, 기대효과를 함께 정리한다.
4. **Expected Growth Impact** — 예상되는 KPI 변화와 성과 범위를 제시한다. 조건별 결과 차이를 설명한다.
### 8.2 실무 적용 영역
SEO Audit & Treatment, GA4/GTM/BigQuery 기반 분석 체계 설계, 마케팅 성과 측정 시스템 구축, 디지털 채널 및 자산 진단, 콘텐츠 구조화 및 검색 가시성 개선, 대시보드/리포팅 체계 설계
---
## 9. 콘텐츠 제작 기준
### 9.1 공통 기준
Case Study 중심, Before/After 수치 포함, 실행 절차 포함, 고객사 규모/산업/과업 맥락 명시
### 9.2 유형별 기준
| 유형 | 기준 |
|------|------|
| 제안서·보고서 | Executive Summary 우선, 문제 정의 → 데이터 근거 → 실행안 → KPI |
| 교육 콘텐츠 | 실무 적용 템플릿, 단계별 실행 가이드, 체크리스트 포함 |
| 블로그·매거진 | 진단형 또는 가이드형, 실무 관점 유지, SEO 키워드 반영 |
| 사례 연구 | 산업·규모·과제 맥락 명시, 문제-해결-성과 구조 |
---
## 10. 브랜드 금지 항목
- 과장된 약속
- 보장형 표현 ("반드시", "확실히", "무조건")
- 기술 그 자체를 성과처럼 포장하는 표현
- 복잡한 방법론을 과시하는 설명
- 대기업 레퍼런스만을 앞세운 권위주의적 커뮤니케이션
- 경쟁사 직접 비하
- 근거 없는 낙관론
- **외국어의 직접적·기계적 번역 표현 사용** (예: audit → ~~감사~~ ✗ → **진단** ✓ / framework → ~~뼈대~~ ✗ → **프레임워크** ✓ / insight → ~~통찰력~~ ✗ → **인사이트** ✓)
> 직역 회피 원칙: 마케팅·데이터 분야 영문 용어는 의미 맥락에 따라 (1) 이미 정착된 외래어 표기를 사용하거나, (2) 의미를 풀어 쓴 한국어로 옮기되, 사전적 1:1 직역은 피한다. 표준 번역 사례는 [knowledge-base/glossary/translation-standards.md](../knowledge-base/glossary/translation-standards.md) 참조.
---
## 11. AI/LLM 활용 브랜드 기준
### 11.1 AI의 역할
분석 보조자, 전략 설계 보조자, SEO/콘텐츠 초안 작성자, 제안서/리포트 구조화 도우미, 데이터 문제 정의 파트너
### 11.2 AI 응답 기본 구조
1. 문제 진단 → 2. 데이터 근거 → 3. 해결 방안 → 4. 예상 성과
### 11.3 AI 필수 원칙
- 추상적 조언 대신 실행 가능한 답변 제공
- 가능하면 KPI, 수치, 구조 포함
- 비즈니스 목표와 연결된 분석 제안
- 데이터 한계와 가정을 명시
- 브랜드 톤(Professional / Science / Practice / Outcome) 유지
### 11.4 금지 응답 패턴
"무조건 좋아질 것입니다", "반드시 성과를 보장합니다", "요즘은 다 이렇게 합니다", "정말 엄청난 인사이트입니다"
### 11.5 D.intelligence Skill/Agent 적용 의무
D.intelligence Agent Corps의 모든 Skill·Sub-agent·Workflow는 본 가이드와 `knowledge-base/canon/`을 **참조 의무 1순위**로 한다.
| Skill / Agent | 본 가이드 적용 영역 | 우선 참조 섹션 |
|--------------|------------------|--------------|
| `dintel-brand-guardian` (#70) | 모든 D.intelligence 콘텐츠 리뷰·검수 | §1~§11 전체, 특히 §10 No-Go List |
| `dintel-brand-editor` (#71) | Magazine D. 아티클·서비스 소개 작성 | §2.9 Character, §7 Tone, §7.3 Voice Examples, §6 Framework |
| `dintel-marketing-mgr` (#75) | LinkedIn·뉴스레터·콘텐츠 캘린더 기획 | §7.4 채널별 톤, §6.3 카테고리별 메시지 |
| `dintel-doc-secretary` | 회의록·리포트·제안서 포맷팅 | §7.4, §9 유형별 기준 |
| `dintel-service-architect` | 서비스 패키지 설계·모듈 추천 | §3 Narrative, §4 서비스 아키텍처 |
| `dintel-quotation-mgr` | 견적서·계약 가격 산출 | §7 정중·정확 톤, `knowledge-base/canon/fact-sheet.md` 법인 정보 |
| `dintel-account-mgr` | 클라이언트 관계 관리·미팅 준비 | §7.4, [Voice Examples 확장](../knowledge-base/canon/brand-canon.md#§64-콘텐츠-유형별-확장-예문) |
| `dintel-backoffice-mgr` | 인보이스·NDA·계약·HR 문서 | §7 정중·정확 톤, fact-sheet §2·§3 |
| `dintel-skill-update` | 본 가이드·canon 변경 시 Skill 간 일관성 propagate | 본 가이드 갱신 트리거 |
**적용 규칙**:
1. 본 가이드 갱신 시 영향받는 Skill 목록 점검 → `dintel-skill-update` 트리거
2. Skill·Sub-agent 신규 작성 시 본 가이드 §1~§11 참조 의무 명시
3. AI 자동 생성물은 본 가이드 통과 시까지 Draft 표시
4. Brand Guardian Skill이 본 가이드 위반 발견 시 즉시 `knowledge-base/gotcha/`에 기록 → 재발 방지
> AI/LLM 활용 시 본 가이드 외에 `knowledge-base/canon/fact-sheet.md`(사실관계), `service-architecture.md`(서비스), `naming-conventions.md`(표기), `gotcha/`(교정 사례) 일괄 참조 권장.
---
## 12. 관련 문서
| 문서 | 내용 |
|------|------|
| ⭐ [knowledge-base/canon/](../knowledge-base/canon/) | **단일 진실(SoT) 공간 — 본 가이드 외 모든 D.intelligence 표준** |
| ⭐ [canon/fact-sheet.md](../knowledge-base/canon/fact-sheet.md) | 회사·법인·인물·연혁 사실관계 |
| ⭐ [canon/service-architecture.md](../knowledge-base/canon/service-architecture.md) | A-T-G 17 모듈 + 4 카테고리 + 부가 서비스 (Courses → OurDigital 이관 결정 포함) |
| ⭐ [canon/naming-conventions.md](../knowledge-base/canon/naming-conventions.md) | 명칭·표기·파일명·도메인·이메일·Git 종합 규칙 |
| ⭐ [canon/open-questions.md](../knowledge-base/canon/open-questions.md) | 잔여 미확정 항목 추적 |
| [gotcha/01_outdated-facts.md](../knowledge-base/gotcha/01_outdated-facts.md) | 반복 교정 사례 10건 |
| [glossary/translation-standards.md](../knowledge-base/glossary/translation-standards.md) | 한·영 번역 표준 |
| [00_SERVICE-MAP.md](../03_Services/00_SERVICE-MAP.md) | 서비스 맵 마스터 문서 (v2.0) — canon/service-architecture.md 참조 |
| [ALIGNMENT-ANALYSIS.md](../01_Strategy/ALIGNMENT-ANALYSIS.md) | 브랜드 가이드 ↔ 서비스 맵 정합성 분석 |
| [STRATEGIC-KEYWORDS.md](../01_Strategy/STRATEGIC-KEYWORDS.md) | 전략 키워드 셋 |
| [TARGET-TOUCHPOINTS.md](../01_Strategy/TARGET-TOUCHPOINTS.md) | 타겟 오디언스별 접점 설계 |
| [VALUE-PROPOSITIONS.md](../01_Strategy/VALUE-PROPOSITIONS.md) | 모듈별 고객 가치 제안 |
| [PRICING-PACKAGES.md](../01_Strategy/PRICING-PACKAGES.md) | 가격 패키지 설계 |
| [WEBSITE-ALIGNMENT.md](../01_Strategy/WEBSITE-ALIGNMENT.md) | 홈페이지 구조 통일 방안 |
---
## Changelog
| 버전 | 날짜 | 변경 내용 |
|------|------|-----------|
| v1.0 | 2026-03 | 초안 (브랜드 코어, 톤앤매너, AI 기준) |
| v1.1 | 2026-03-07 | 서비스 맵 v2.0 기준 전면 재편: 3-Phase × 17모듈 아키텍처 통일, 4대 카테고리 정의 정합, 2-Tier 타겟 오디언스 확장, 브랜드 내러티브 추가, Voice Examples 추가, 카테고리별 메시지 추가, 관련 문서 참조 체계 구축 |
| v1.2 | 2026-03-09 | 브랜드 플랫폼 체계 신설: Brand Vision 재정의, Brand Position 업데이트, 4차원 Brand Dimensions 수립, Brand Promise(Heritage Promise 7가지 약속 통합), Brand Character("지혜로운 상담 마케팅 주치의") 정의, 포지셔닝 문구 현행화, 의료 클리닉 은유→마케팅 클리닉 전환 |
| **v1.3** | **2026-05-17** | **knowledge-base/canon/ 단일 진실 체계 구축 + 6대 변경**: ① §2.7 Experiential 재정의 (SMART Marketing **Intelligence**, Clinic은 OurDigital 자산으로 이관) ② §2.9 Brand Character 'D.intelligence = 성과중심의 데이터 기반 마케팅 과학자'로 재정립, 5개 특성 재설계, §2.9.1 OurDigital 별도 시스템 분리 명시 ③ §3.4 SMART Marketing Intelligence 모델 표기 ④ §6.3 MD·BVT 메시지 교체 ⑤ §10 외국어 직접번역 금지 추가 ⑥ §11.5 D.intelligence Skill/Agent 적용 의무 신설 (9개 dintel-* Skill 매핑 + 4개 적용 규칙) | **임명재 ✓** |
---
## 향후 확장 방향
- [x] **knowledge-base/canon 단일 진실 체계 구축** (2026-05-17 v1.0 APPROVED — fact-sheet/brand-canon/service-architecture/naming-conventions)
- [x] **Brand Voice Examples 확장** — canon/brand-canon.md §6.4 콘텐츠 유형별 5종 + §6.5 한국어 미세 톤 가이드 추가
- [ ] Service Playbooks 분리 (SEO, GA4/GTM, Proposal, Dashboard)
- [ ] AI Training Kit (Master Prompt 최종본, JSONL 데이터셋, Negative Examples, Agent Role Prompt)
- [ ] Case Study Library 구축 (산업별 문제-해결-성과 구조)
- [ ] **Visual Identity Guide** — Design_System 2026 버전 생성 예정 (Claude Design 활용)
- [ ] OurDigital Practice 별도 brand 시스템 (Courses 이관 + 캐릭터 분리에 따른 별도 관리)

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0"?><svg id="_레이어_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 932.68 932.68"><defs></defs><g id="_레이어_1-2"><polygon class="cls-2" points="932.68 493.22 932.68 0 439.46 0 0 439.46 0 932.68 493.22 932.68 932.68 493.22"></polygon><path class="cls-1" d="m173.02,487.14s-3.25,1.37-7.66,1.37c-7.67,0-13.16-3.03-13.16-12.87v-17.41h-5.77v-8.02h5.77v-8.96h9.68v8.96h10.63v8.02h-10.63v16.47c0,4.69,2.18,5.71,5.57,5.71,2.81,0,5.56-1.3,5.56-1.3v8.02Z"></path><path class="cls-1" d="m229.43,480.06h4.33v8.02h-18.28v-8.02h4.26v-13.66c0-5.34-1.37-9.32-7.52-9.32-4.47,0-8.31,3.32-8.31,8.17v14.81h4.19v8.02h-18.2v-8.02h4.33v-36.63h-4.47v-8.02h14.15v19.36s2.68-5.85,11.71-5.85c9.83,0,13.8,6.43,13.8,15.97v15.17Z"></path><path class="cls-1" d="m263.35,480.06h4.05v8.02h-18.13v-8.02h4.4v-21.82h-4.4v-8.02h14.08v29.84Zm-.36-36.06h-11.12v-9.32h11.12v9.32Z"></path><path class="cls-1" d="m323.16,480.06h4.33v8.02h-18.28v-8.02h4.26v-13.66c0-5.34-1.37-9.32-7.52-9.32-4.48,0-8.31,3.32-8.31,8.17v14.81h4.19v8.02h-18.2v-8.02h4.33v-21.82h-4.47v-8.02h14.01v4.55s.64-1.45,2.46-2.96c1.87-1.45,4.84-2.89,9.39-2.89,9.83,0,13.8,6.43,13.8,15.97v15.17Z"></path><path class="cls-1" d="m356.72,480.06h4.05v8.02h-18.13v-8.02h4.4v-36.56h-4.4v-8.02h14.08v44.58Zm27.9,0v8.02h-10.56l-16.32-21.68,14.95-16.18h9.4v8.02h-5.21l-7.52,8.02,10.55,13.8h4.7Z"></path><path class="cls-1" d="m432.47,458.24h-4.77v-8.02h4.77v-1.59c0-9.54,6.22-13.44,13.65-13.44,4.48,0,7.52,1.02,7.52,1.02v8.16s-2.96-1.09-6.57-1.09-4.92,1.74-4.92,5.28v1.66h11.2v8.02h-11.2v21.82h5.56v8.02h-19.57v-8.02h4.33v-21.82Z"></path><path class="cls-1" d="m466.55,469.01c0-11.27,8.31-20.09,21.03-20.09s20.88,8.82,20.88,20.09-8.31,20.01-21.03,20.01-20.88-8.82-20.88-20.01Zm31.94,0c0-6.58-4.33-11.71-11.12-11.71s-10.91,5.13-10.91,11.71,4.33,11.63,11.12,11.63,10.91-5.13,10.91-11.63Z"></path><path class="cls-1" d="m537.84,455.71s.64-1.66,2.17-3.32c1.51-1.59,3.9-3.25,7.52-3.25,4.19,0,5.92,1.38,5.92,1.38v9.1s-2.1-1.94-6.29-1.94c-6.65,0-9.18,5.2-9.18,9.25v13.15h4.77v8.02h-18.78v-8.02h4.33v-21.82h-4.33v-8.02h13.87v5.49Z"></path><path class="cls-1" d="m598.37,465.32l-6.15,22.76h-13.73l-8.23-29.84h-4.34v-8.02h11.78l7.95,30.27,6.36-23.12h12.72l6.36,23.12,7.95-30.27h11.63v8.02h-4.33l-8.23,29.84h-13.59l-6.14-22.76Z"></path><path class="cls-1" d="m681.34,480.06v8.02h-13.59v-3.9s-3.31,4.77-10.69,4.77c-7.88,0-13.3-3.9-13.3-11.56s6.22-12.07,13.87-12.07c6.72,0,9.76,2.89,9.76,2.89v-3.48c0-4.98-2.02-7.44-8.74-7.44-6.36,0-10.84,3.1-10.84,3.1v-8.82s4.92-2.67,12.28-2.67c10.48,0,16.91,4.19,16.91,14.52v16.62h4.34Zm-21.18-7.59c-3.9,0-6.93,1.44-6.93,4.62s2.6,4.62,6.79,4.62c3.9,0,7.45-1.73,7.45-4.62s-3.18-4.62-7.3-4.62Z"></path><path class="cls-1" d="m711.08,455.71s.64-1.66,2.17-3.32c1.51-1.59,3.9-3.25,7.52-3.25,4.19,0,5.92,1.38,5.92,1.38v9.1s-2.1-1.94-6.29-1.94c-6.65,0-9.18,5.2-9.18,9.25v13.15h4.77v8.02h-18.78v-8.02h4.33v-21.82h-4.33v-8.02h13.87v5.49Z"></path><path class="cls-1" d="m770.23,482.8s-2.82,6.15-13.15,6.15c-11.13,0-17.85-7.81-17.85-19.8s8.17-20.02,18.5-20.02c9.61,0,12.36,4.78,12.36,4.78v-10.48h-5.21v-8.02h14.89v44.65h4.47v8.02h-14.01v-5.28Zm-10.19-2.1c5.56,0,10.11-4.11,10.11-11.63s-4.33-12.07-10.19-12.07c-6.79,0-10.77,4.92-10.77,11.78,0,7.59,3.98,11.92,10.84,11.92Z"></path></g></svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

View File

@@ -0,0 +1,10 @@
<?xml version="1.0"?>
<svg id="_레이어_2" data-name=" 레이어 2" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 932.7 932.7">
<defs>
</defs>
<path class="cls-1" d="M487.4,457.3c-6.8,0-10.9,5.1-10.9,11.7s4.3,11.6,11.1,11.6,10.9-5.1,10.9-11.6-4.3-11.7-11.1-11.7Z"></path>
<path class="cls-1" d="M760,457c-6.8,0-10.8,4.9-10.8,11.8s4,11.9,10.8,11.9h0c5.6,0,10.1-4.1,10.1-11.6s-4.3-12.1-10.2-12.1Z"></path>
<path class="cls-1" d="M660.2,472.5h0c-3.9,0-6.9,1.4-6.9,4.6s2.6,4.6,6.8,4.6,7.5-1.7,7.5-4.6-3.2-4.6-7.3-4.6Z"></path>
<path class="cls-1" d="M439.5,0L0,439.5v493.2h493.2l439.5-439.5V0h-493.2ZM251.9,434.7h11.1v9.3h-11.1v-9.3ZM165.4,488.5c-7.7,0-13.2-3-13.2-12.9v-17.4h-5.8v-8h5.8v-9h9.7v9h10.6v8h-10.6v16.5c0,4.7,2.2,5.7,5.6,5.7s5.6-1.3,5.6-1.3v8h0s-3.2,1.4-7.7,1.4ZM233.8,488.1h-18.3v-8h4.3v-13.7c0-5.3-1.4-9.3-7.5-9.3s-8.3,3.3-8.3,8.2v14.8h4.2v8h-18.2v-8h4.3v-36.6h-4.5v-8h14.1v19.4s2.7-5.8,11.7-5.8,13.8,6.4,13.8,16v15.2h0s4.3,0,4.3,0v8ZM267.4,488.1h-18.1v-8h4.4v-21.8h-4.4v-8h14.1v29.8h4.1v8ZM327.5,488.1h-18.3v-8h4.3v-13.7c0-5.3-1.4-9.3-7.5-9.3s-8.3,3.3-8.3,8.2v14.8h4.2v8h-18.2v-8h4.3v-21.8h-4.5v-8h14v4.5s.6-1.5,2.5-3c1.9-1.5,4.8-2.9,9.4-2.9,9.8,0,13.8,6.4,13.8,16v15.2h4.3v8ZM360.8,488.1h-18.1v-8h4.4v-36.6h-4.4v-8h14.1v44.6h4.1v8ZM384.6,488.1h-10.6l-16.3-21.7,15-16.2h9.4v8h-5.2l-7.5,8,10.5,13.8h4.7v8ZM453.6,444.4s-3-1.1-6.6-1.1-4.9,1.7-4.9,5.3v1.7h11.2v8h-11.2v21.8h5.6v8h-19.6v-8h4.3v-21.8h-4.8v-8h4.8v-1.6c0-9.5,6.2-13.4,13.6-13.4s7.5,1,7.5,1v8.2ZM487.4,489c-12.7,0-20.9-8.8-20.9-20s8.3-20.1,21-20.1,20.9,8.8,20.9,20.1-8.3,20-21,20ZM553.5,459.6s-2.1-1.9-6.3-1.9c-6.7,0-9.2,5.2-9.2,9.2v13.2h4.8v8h-18.8v-8h4.3v-21.8h-4.3v-8h13.9v5.5s.6-1.7,2.2-3.3c1.5-1.6,3.9-3.2,7.5-3.2s5.9,1.4,5.9,1.4v9.1ZM630.7,458.2h-4.3l-8.2,29.8h-13.6l-6.1-22.8h0l-6.2,22.8h-13.7l-8.2-29.8h-4.3v-8h11.8l8,30.3,6.4-23.1h12.7l6.4,23.1,8-30.3h11.6v8ZM681.3,480.1v8h-13.6v-3.9s-3.3,4.8-10.7,4.8-13.3-3.9-13.3-11.6,6.2-12.1,13.9-12.1,9.8,2.9,9.8,2.9v-3.5c0-5-2-7.4-8.7-7.4s-10.8,3.1-10.8,3.1v-8.8s4.9-2.7,12.3-2.7c10.5,0,16.9,4.2,16.9,14.5v16.6h4.3ZM726.7,459.6s-2.1-1.9-6.3-1.9c-6.7,0-9.2,5.2-9.2,9.2v13.2h4.8v8h-18.8v-8h4.3v-21.8h-4.3v-8h13.9v5.5s.6-1.7,2.2-3.3c1.5-1.6,3.9-3.2,7.5-3.2s5.9,1.4,5.9,1.4v9.1ZM784.2,488.1h-14v-5.3s-2.8,6.1-13.1,6.1-17.8-7.8-17.8-19.8,8.2-20,18.5-20,12.4,4.8,12.4,4.8v-10.5h-5.2v-8h14.9v44.6h4.5v8Z"></path>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

View File

@@ -0,0 +1,23 @@
<?xml version="1.0"?>
<svg id="_레이어_2" data-name=" 레이어 2" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 943.5 1138">
<defs>
</defs>
<g id="_레이어_1-2" data-name=" 레이어 1-2">
<polygon class="cls-1" points="939 494.1 939 0 445 0 4.8 440.2 4.8 934.3 498.8 934.3 939 494.1"></polygon>
<path class="cls-1" d="M30.8,1080.9h8.9v17.6H0v-17.6h9.6v-47.8H0v-17.5h30.8v65.3ZM30,1002H5.7v-20.4h24.3v20.4Z"></path>
<path class="cls-1" d="M141.2,1080.9h9.5v17.6h-40v-17.6h9.3v-29.9c0-11.7-3-20.4-16.4-20.4s-18.2,7.3-18.2,17.9v32.4h9.2v17.6h-39.8v-17.6h9.5v-47.8h-9.8v-17.5h30.7v10s1.4-3.2,5.4-6.5c4.1-3.2,10.6-6.3,20.6-6.3,21.5,0,30.2,14.1,30.2,35v33.2h0Z"></path>
<path class="cls-1" d="M216.7,1096.4s-7.1,3-16.8,3c-16.8,0-28.8-6.7-28.8-28.2v-38.1h-12.6v-17.5h12.6v-19.6h21.2v19.6h23.2v17.5h-23.2v36.1c0,10.3,4.7,12.5,12.2,12.5s12.2-2.8,12.2-2.8v17.5h0Z"></path>
<path class="cls-1" d="M312.1,1056.8c0,4.4-.3,8.7-.3,8.7h-60.6c2.4,11.4,10.6,16.6,24.4,16.6,19.9,0,30.5-8.4,30.5-8.4v19.8s-11.1,6.8-31,6.8c-30.8,0-46.2-18.3-46.2-43.9s19.3-43.7,43.2-43.7,40,16.4,40,44.1ZM290.7,1050.7c-.9-10.6-7.1-19.9-19.5-19.9s-19.6,8.1-20.6,19.9h40Z"></path>
<path class="cls-1" d="M327.5,999h-9.8v-15.8h31v87.6c0,7.8,1.9,10.4,9.3,10.4s8.1-.6,8.1-.6v17.1s-6.6,1.1-14.9,1.1c-16,0-23.7-6.8-23.7-27.7v-72.1h0Z"></path>
<path class="cls-1" d="M379.2,999h-9.8v-15.8h31v87.6c0,7.8,1.9,10.4,9.3,10.4s8.1-.6,8.1-.6v17.1s-6.6,1.1-14.9,1.1c-16,0-23.7-6.8-23.7-27.7v-72.1h0Z"></path>
<path class="cls-1" d="M459.7,1080.9h8.9v17.6h-39.7v-17.6h9.6v-47.8h-9.6v-17.5h30.8v65.3h0ZM458.9,1002h-24.4v-20.4h24.4v20.4Z"></path>
<path class="cls-1" d="M547.6,1032.7s2.7,5.1,2.7,11.5c0,17.1-15.5,29.7-35.7,29.7h-.5l.2,10.3s6.6-1.8,14.5-1.8c21.3,0,34,9.5,34,26.9s-13.4,28.6-46.7,28.6-35.4-6.9-35.4-6.9v-18.7s15.2,8.1,35.3,8.1,25.9-4.7,25.9-10.6-5.1-10-22.5-10-11.7.6-16.8,1.1c-4.9.6-8.7,1.3-8.7,1.3l2-32.3c-10.6-5.2-17.5-14.7-17.5-26.9,0-18.2,15.8-30.8,35.9-30.8s16.8,3.3,16.8,3.3h29.2v17.7l-12.8-.6h0ZM498.1,1043.1c0,8.7,7.1,14.9,16.5,14.9s16.5-6.2,16.5-14.9-7.1-14.9-16.5-14.9-16.5,6.2-16.5,14.9Z"></path>
<path class="cls-1" d="M653.8,1056.8c0,4.4-.3,8.7-.3,8.7h-60.6c2.4,11.4,10.6,16.6,24.3,16.6,19.9,0,30.5-8.4,30.5-8.4v19.8s-11.1,6.8-31,6.8c-30.8,0-46.2-18.3-46.2-43.9s19.3-43.7,43.2-43.7,40,16.4,40,44.1ZM632.5,1050.7c-1-10.6-7.1-19.9-19.5-19.9s-19.6,8.1-20.6,19.9h40Z"></path>
<path class="cls-1" d="M754,1080.9h9.5v17.6h-40v-17.6h9.3v-29.9c0-11.7-3-20.4-16.5-20.4s-18.2,7.3-18.2,17.9v32.4h9.2v17.6h-39.8v-17.6h9.5v-47.8h-9.8v-17.5h30.7v10s1.4-3.2,5.4-6.5c4.1-3.2,10.6-6.3,20.6-6.3,21.5,0,30.2,14.1,30.2,35v33.2h0Z"></path>
<path class="cls-1" d="M847.4,1094.8s-9.2,5.7-26.4,5.7c-26.4,0-46.5-16-46.5-44s18-43.8,47-43.8,25.9,6.3,25.9,6.3v20.2s-8.2-8.1-25.8-8.1-25.3,9-25.3,25.1,11.4,25.6,25.5,25.6,25.6-7.4,25.6-7.4v20.2h0Z"></path>
<path class="cls-1" d="M943.5,1056.8c0,4.4-.3,8.7-.3,8.7h-60.6c2.4,11.4,10.6,16.6,24.3,16.6,19.9,0,30.5-8.4,30.5-8.4v19.8s-11.1,6.8-31,6.8c-30.8,0-46.2-18.3-46.2-43.9s19.3-43.7,43.2-43.7,40,16.4,40,44.1ZM922.2,1050.7c-.9-10.6-7.1-19.9-19.5-19.9s-19.6,8.1-20.6,19.9h40Z"></path>
<path class="cls-1" d="M710.2,933.4v-27.8h13.6v-102.3h-13.6v-27.8c25.3,0,39.6-.5,74.7-.5,53.4,0,85.8,26.7,85.8,77.9s-30.3,81-88.5,81-46.6-.5-72-.5h0ZM754.8,905.5s16.5.5,29.7.5c36.2,0,53.7-20.8,53.7-52.3s-18.1-50.9-53.7-50.9-29.7.5-29.7.5v102.3h0Z"></path>
<circle class="cls-1" cx="917.9" cy="914.8" r="20.4"></circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
uploads/DMSans-Bold.ttf Normal file

Binary file not shown.

Binary file not shown.

BIN
uploads/DMSans-Italic.ttf Normal file

Binary file not shown.

BIN
uploads/DMSans-Medium.ttf Normal file

Binary file not shown.

Binary file not shown.

BIN
uploads/DMSans-Regular.ttf Normal file

Binary file not shown.

93
uploads/OFL.txt Normal file
View File

@@ -0,0 +1,93 @@
Copyright 2014-2017 Indian Type Foundry (info@indiantypefoundry.com). Copyright 2019 Google LLC.
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.