@jogak/ui 0.1.0-alpha.5 → 0.1.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +84 -8
- package/package.json +3 -3
- package/src/app/main.tsx +6 -0
- package/src/styles/jogak.css +20 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,25 @@ All notable changes to Jogak packages are documented here. The repository follow
|
|
|
5
5
|
|
|
6
6
|
Version numbers apply to all packages in the workspace (synchronized release).
|
|
7
7
|
|
|
8
|
+
## [0.1.0-alpha.6] — 2026-05-09
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **`main.tsx` 에 `import 'virtual:jogak/global-css'` 추가** — `@jogak/core`의
|
|
13
|
+
`JogakPluginOptions.globalCss` opt-in 옵션이 켜진 환경에서 사용자 globalCss가
|
|
14
|
+
jogak SPA에 적용됨. opt-in이 꺼진 default 환경에서는 빈 모듈이라 SPA 번들 영향 zero.
|
|
15
|
+
- **`jogak.css` chrome 보호 rule** — `[data-jogak-shell] :where(button, input, select, textarea):not([data-jogak-content] *)`
|
|
16
|
+
rule이 form element의 사용자 reset 침범을 차단. `:where()` specificity 0 +
|
|
17
|
+
`revert-layer`로 알파.5 baseline 영향 zero.
|
|
18
|
+
- **README "사용자 globalCss 적용 (alpha.6)" 섹션** — 사용법 / 자동 감지 후보
|
|
19
|
+
8종 우선순위 / 격리 보장 3항목 / scope 가이드 / `[data-jogak-shell]` /
|
|
20
|
+
`[data-jogak-content]` selector hint / 알려진 한계 4항목.
|
|
21
|
+
|
|
22
|
+
### Notes
|
|
23
|
+
|
|
24
|
+
- 알파.4부터 hook으로 도입됐던 `data-jogak-shell` / `data-jogak-content` 속성이
|
|
25
|
+
본 릴리즈에서 처음으로 의미를 갖게 됨 (chrome 보호 rule + scope 가이드 hook).
|
|
26
|
+
|
|
8
27
|
## [0.1.0-alpha.5] — 2026-05-09
|
|
9
28
|
|
|
10
29
|
### Changed
|
package/README.md
CHANGED
|
@@ -66,16 +66,92 @@ See the [main README](https://github.com/devclib/jogak#readme) for the full host
|
|
|
66
66
|
|
|
67
67
|
| 단계 | 상태 | 내용 |
|
|
68
68
|
|------|------|------|
|
|
69
|
-
| alpha.4 | ✅
|
|
70
|
-
| alpha.5 |
|
|
71
|
-
| alpha.6 |
|
|
72
|
-
| alpha.7+ |
|
|
69
|
+
| alpha.4 | ✅ 완료 | jogak UI 빌드 파이프라인에 Tailwind v4 + `jogak:` prefix 도입 (인프라) |
|
|
70
|
+
| alpha.5 | ✅ 완료 | jogak UI 컴포넌트를 Tailwind class로 마이그레이션 (4 PR) |
|
|
71
|
+
| **alpha.6** | ✅ **본 릴리즈** | **사용자 `globalCss` 옵션 (`JogakPluginOptions.globalCss`)** |
|
|
72
|
+
| alpha.7+ | 예정 | preview Shadow DOM / iframe 격리 옵션 (`previewIsolation`) |
|
|
73
73
|
|
|
74
|
-
###
|
|
74
|
+
### 사용자 globalCss 적용 (alpha.6)
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
`runHost`는 vite root를 `@jogak/ui` 패키지로 두고 사용자 `vite.config.ts` / `main.tsx`를 무시하므로(`configFile: false`), 사용자 `index.css`(Tailwind/shadcn 디자인 토큰)가 jogak SPA에 자동 적용되지 않습니다. `globalCss` 옵션은 이를 opt-in으로 해결합니다.
|
|
77
|
+
|
|
78
|
+
#### 사용법
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
// vite.config.ts — 자동 감지 (shadcn/ui Vite 시나리오)
|
|
82
|
+
import { defineConfig } from 'vite'
|
|
83
|
+
import react from '@vitejs/plugin-react'
|
|
84
|
+
import { jogak } from '@jogak/core/vite'
|
|
85
|
+
|
|
86
|
+
export default defineConfig({
|
|
87
|
+
plugins: [react(), jogak({ globalCss: true })],
|
|
88
|
+
})
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
`globalCss: true`는 다음 후보를 우선순위 순으로 자동 감지해 **첫 발견 1개**만 import합니다:
|
|
92
|
+
|
|
93
|
+
1. `src/index.css` (shadcn/ui Vite)
|
|
94
|
+
2. `src/main.css`
|
|
95
|
+
3. `src/styles.css`
|
|
96
|
+
4. `src/styles/globals.css` (Next.js shadcn)
|
|
97
|
+
5. `src/styles/index.css`
|
|
98
|
+
6. `src/app/globals.css` (Next.js App Router shadcn)
|
|
99
|
+
7. `src/global.css`
|
|
100
|
+
8. `src/app.css`
|
|
101
|
+
|
|
102
|
+
명시 경로(상대/절대) 또는 배열도 사용 가능합니다:
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
// 명시 경로 1개
|
|
106
|
+
jogak({ globalCss: './src/index.css' })
|
|
107
|
+
|
|
108
|
+
// 다중 import (디자인 토큰 + reset 분리)
|
|
109
|
+
jogak({ globalCss: ['./src/tokens.css', './src/reset.css'] })
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
#### 격리 보장
|
|
113
|
+
|
|
114
|
+
- **Tailwind utility class**: jogak UI는 `prefix=jogak`로 빌드되어 사용자 utility와 충돌 zero (예: 사용자 `bg-primary` ≠ jogak `jogak:bg-...`).
|
|
115
|
+
- **CSS variable**: jogak은 `--jogak-*` prefix로 namespace 격리 → 사용자 `:root { --primary }` 같은 디자인 토큰은 영향 없음.
|
|
116
|
+
- **Form element 보호**: `[data-jogak-shell]` 안의 button/input/select/textarea는 사용자 reset의 `border` / `background` / `color` 침범을 받지 않도록 `:where()` 보호 rule 적용. specificity 0이라 사용자가 명시적으로 `[data-jogak-shell] button { ... }`를 작성하면 정상 override됩니다.
|
|
117
|
+
|
|
118
|
+
#### scope 가이드 — 알려진 영향 영역
|
|
119
|
+
|
|
120
|
+
사용자 css의 다음 패턴은 jogak chrome에도 영향을 줄 수 있습니다 (전역 import이므로):
|
|
121
|
+
|
|
122
|
+
- `body { ... }` — jogak SPA의 body에도 적용
|
|
123
|
+
- `* { ... }` 또는 `*, *::before { ... }` — 모든 요소
|
|
124
|
+
- 글로벌 reset (`button { all: unset }`, `* { border: 1px solid var(--border) }` 등)
|
|
125
|
+
|
|
126
|
+
이를 사용자 콘텐츠 영역(preview)으로만 한정하려면 셀렉터를 `[data-jogak-content] *` scope로 작성하세요:
|
|
127
|
+
|
|
128
|
+
```css
|
|
129
|
+
/* 권장: preview 영역으로만 한정 */
|
|
130
|
+
[data-jogak-content] *,
|
|
131
|
+
[data-jogak-content] *::before,
|
|
132
|
+
[data-jogak-content] *::after {
|
|
133
|
+
box-sizing: border-box;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
[data-jogak-content] button {
|
|
137
|
+
/* 사용자 디자인 시스템 button reset */
|
|
138
|
+
all: unset;
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
또는 jogak chrome과 preview 모두에 일관된 사용자 디자인 시스템을 적용하려는 의도라면 그대로 두면 됩니다 — jogak chrome도 사용자 토큰/타이포를 함께 체험하게 됩니다.
|
|
143
|
+
|
|
144
|
+
##### selector hint
|
|
145
|
+
|
|
146
|
+
- `[data-jogak-shell]` — `JogakApp` 최상위 wrapper (chrome + preview 모두 포함)
|
|
147
|
+
- `[data-jogak-content]` — Preview의 사용자 콘텐츠 영역 (사용자 컴포넌트가 렌더되는 div)
|
|
148
|
+
|
|
149
|
+
#### 알려진 한계
|
|
150
|
+
|
|
151
|
+
- 본 옵션은 **opt-in**입니다 (default `false`). 알파.5까지의 동작은 동일합니다.
|
|
152
|
+
- `globalCss: true` 자동 감지는 dev 시작 시점에 한 번만 수행됩니다. 후보 css 파일이 dev 시작 후에 새로 추가되면 dev 서버를 재시작해야 합니다. 명시 경로(`globalCss: './src/index.css'`)는 파일이 나중에 생성되어도 정상 hot reload됩니다.
|
|
153
|
+
- preview 영역만 사용자 css로 한정하려면 알파.7+의 `previewIsolation: 'shadow'` 옵션을 기다려 주세요.
|
|
154
|
+
- CSS module(`.module.css`)을 자동 감지 후보에서 직접 import하지 않습니다 — 명시 경로로 넘기면 Vite가 module 처리합니다.
|
|
79
155
|
|
|
80
156
|
- Repository: https://github.com/devclib/jogak
|
|
81
157
|
- Issues: https://github.com/devclib/jogak/issues
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jogak/ui",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.6",
|
|
4
4
|
"description": "Showcase viewer UI for Jogak — Sidebar / Preview / Controls / Actions and the JogakApp shell.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jogak",
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
"prism-react-renderer": "^2.4.1",
|
|
65
65
|
"tailwindcss": "^4.0.0",
|
|
66
66
|
"@tailwindcss/vite": "^4.0.0",
|
|
67
|
-
"@jogak/core": "0.1.0-alpha.
|
|
68
|
-
"@jogak/react": "0.1.0-alpha.
|
|
67
|
+
"@jogak/core": "0.1.0-alpha.6",
|
|
68
|
+
"@jogak/react": "0.1.0-alpha.6"
|
|
69
69
|
},
|
|
70
70
|
"devDependencies": {
|
|
71
71
|
"@types/node": "^20.14.0",
|
package/src/app/main.tsx
CHANGED
|
@@ -3,6 +3,12 @@ import { createRoot } from 'react-dom/client'
|
|
|
3
3
|
import 'virtual:jogak'
|
|
4
4
|
import { _jogakCodeTheme } from 'virtual:jogak'
|
|
5
5
|
import '../styles/jogak.css'
|
|
6
|
+
// 알파.6: 사용자 globalCss opt-in.
|
|
7
|
+
// JogakPluginOptions.globalCss=false (default) → 빈 모듈 (no-op, SPA 번들 영향 zero).
|
|
8
|
+
// true / string / string[] → plugin이 사용자 css를 import한다.
|
|
9
|
+
// jogak.css 뒤에 둬서 사용자가 jogak chrome 기본값을 명시적으로 override 가능 —
|
|
10
|
+
// 단, jogak utility는 prefix=jogak로 격리되어 사용자 utility와 충돌하지 않는다.
|
|
11
|
+
import 'virtual:jogak/global-css'
|
|
6
12
|
import { JogakApp } from './App.js'
|
|
7
13
|
|
|
8
14
|
const rootEl = document.getElementById('root')
|
package/src/styles/jogak.css
CHANGED
|
@@ -82,6 +82,26 @@
|
|
|
82
82
|
* 회귀 자체 차단 + 알파.6 사용자 globalCss 충돌 가능성 zero.
|
|
83
83
|
*/
|
|
84
84
|
}
|
|
85
|
+
|
|
86
|
+
/*
|
|
87
|
+
* 알파.6 wrapper 보호 rule (api-contracts §8 옵션 C).
|
|
88
|
+
*
|
|
89
|
+
* 사용자 globalCss(예: shadcn `@layer base { * { @apply border-border ... } }`)가
|
|
90
|
+
* jogak chrome의 form element를 침범하는 것을 차단한다. `:where(...)` specificity 0
|
|
91
|
+
* 으로 사용자가 명시적으로 `[data-jogak-shell] button { ... }`를 작성하면 자연스럽게
|
|
92
|
+
* 이긴다.
|
|
93
|
+
*
|
|
94
|
+
* 적용 범위: chrome의 모든 form element. preview(`[data-jogak-content]`) 안의
|
|
95
|
+
* 사용자 컴포넌트는 영향 받지 않음 — `:not([data-jogak-content] *)`로 제외.
|
|
96
|
+
*
|
|
97
|
+
* 알파.5 baseline 영향: zero. chrome 컴포넌트는 본 rule이 차단하는 사용자 reset이
|
|
98
|
+
* 없을 때 동일 시각 (revert-layer는 해당 layer가 없으면 no-op).
|
|
99
|
+
*/
|
|
100
|
+
[data-jogak-shell] :where(button, input, select, textarea):not([data-jogak-content] *) {
|
|
101
|
+
border-color: revert-layer;
|
|
102
|
+
background-color: revert-layer;
|
|
103
|
+
color: revert-layer;
|
|
104
|
+
}
|
|
85
105
|
}
|
|
86
106
|
|
|
87
107
|
@layer components {
|