@godxjp/ui 0.2.0 → 2.2.0
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/BRAND.md +286 -0
- package/CHANGELOG.md +94 -0
- package/README.md +189 -33
- package/dist/components/primitives.d.ts +266 -0
- package/dist/components/primitives.js +252 -0
- package/dist/components/primitives.js.map +1 -0
- package/dist/components/screens.d.ts +51 -0
- package/dist/components/screens.js +806 -0
- package/dist/components/screens.js.map +1 -0
- package/dist/components/shell.d.ts +112 -0
- package/dist/components/shell.js +768 -0
- package/dist/components/shell.js.map +1 -0
- package/dist/data.d.ts +35 -0
- package/dist/data.js +93 -0
- package/dist/data.js.map +1 -0
- package/dist/hooks.d.ts +25 -0
- package/dist/hooks.js +144 -0
- package/dist/hooks.js.map +1 -0
- package/dist/i18n.d.ts +9 -0
- package/dist/i18n.js +409 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +14 -2730
- package/dist/index.js +725 -5683
- package/dist/index.js.map +1 -1
- package/package.json +75 -117
- package/src/tokens/tokens-ext.css +401 -0
- package/src/tokens/tokens.css +765 -0
- package/src/styles/theme.css +0 -678
package/src/styles/theme.css
DELETED
|
@@ -1,678 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Omnify UI design system tokens — inlined from
|
|
3
|
-
* src/components/ui/internal/theme.css because Tailwind v4 + turbopack's
|
|
4
|
-
* PostCSS resolver can't follow relative `@import` from src/app/ in dev
|
|
5
|
-
* mode (production build resolves fine, but dev breaks). Inlining is the
|
|
6
|
-
* portable fix that works in every tool.
|
|
7
|
-
*
|
|
8
|
-
* Source of truth for ALL Tailwind class tokens used by `src/components/ui/*`
|
|
9
|
-
* (h-element-*, bg-input-background, semantic success/warning/info/error,
|
|
10
|
-
* gray/blue palettes, sidebar/header layout sizes, etc.). Originally copied
|
|
11
|
-
* from ~/dev/omnify/omnify-ui/packages/ui/src/styles/theme.css.
|
|
12
|
-
*
|
|
13
|
-
* Touching this block will visually shift the whole app — coordinate before
|
|
14
|
-
* editing.
|
|
15
|
-
*/
|
|
16
|
-
@custom-variant dark (&:is(.dark *));
|
|
17
|
-
|
|
18
|
-
:root {
|
|
19
|
-
/* ===================================
|
|
20
|
-
* TYPOGRAPHY TOKENS
|
|
21
|
-
*
|
|
22
|
-
* Phase B + Phase C bugfix:
|
|
23
|
-
* - `--font-size` is the ROOT rem unit. MUST stay at 16 px (browser default)
|
|
24
|
-
* so every rem-based token (spacing, density, type scale) lands on the
|
|
25
|
-
* 4 px integer grid that the foundation doc requires. The earlier Phase B
|
|
26
|
-
* revision set this to 14 px, which scaled the entire system down 12.5%
|
|
27
|
-
* and pushed every rem token off-grid (spacing-4 became 14 px instead of
|
|
28
|
-
* 16, density-element became 28 px instead of 32, text-base resolved to
|
|
29
|
-
* 12.25 px instead of 14). Restored to 16.
|
|
30
|
-
* - JP enterprise body density (14 px) is now applied explicitly on `body`
|
|
31
|
-
* in @layer base via `font-size: var(--text-base)`. Headings, labels,
|
|
32
|
-
* inputs, and components that read --text-* tokens stay correct.
|
|
33
|
-
* - Line-height 1.7 body — JMDC convergent across SmartHR/freee/Ameba.
|
|
34
|
-
* The 間 (ma) principle: kanji are info-dense and need vertical breathing.
|
|
35
|
-
* - 3 weights only per 簡素 (kanso) — normal/medium/bold.
|
|
36
|
-
* - Font stack starts with Hiragino Sans (Ameba Spindle convergent).
|
|
37
|
-
* =================================== */
|
|
38
|
-
--font-size: 16px; /* Root rem = 16 px (browser default, 4 px grid) */
|
|
39
|
-
--font-weight-normal: 400;
|
|
40
|
-
--font-weight-medium: 500; /* Heading default per freee vibes */
|
|
41
|
-
--font-weight-semibold: 600; /* Kept for backward compat — prefer 700 */
|
|
42
|
-
--font-weight-bold: 700; /* Emphasis only */
|
|
43
|
-
|
|
44
|
-
/* Japanese-first font stack — Ameba Spindle convergent ordering.
|
|
45
|
-
OS-installed Japanese fonts first, web fallbacks last. */
|
|
46
|
-
--font-sans-jp:
|
|
47
|
-
"Hiragino Sans", "ヒラギノ角ゴシック", "Hiragino Kaku Gothic ProN",
|
|
48
|
-
"Yu Gothic Medium", "游ゴシック Medium", YuGothic,
|
|
49
|
-
"Noto Sans JP", Meiryo, メイリオ,
|
|
50
|
-
-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
|
|
51
|
-
system-ui, sans-serif;
|
|
52
|
-
|
|
53
|
-
/* Font sizes — line-heights now ABSOLUTE (px) not unitless multipliers
|
|
54
|
-
so CJK glyphs never clip on diacritics or kanji descenders. */
|
|
55
|
-
--text-2xs: 0.6875rem; /* 11 px — fine print */
|
|
56
|
-
--text-xs: 0.75rem; /* 12 px — caption / label */
|
|
57
|
-
--text-sm: 0.8125rem; /* 13 px — dense table cells (was 14 — moved up) */
|
|
58
|
-
--text-base: 0.875rem; /* 14 px — DEFAULT body (was 16 — JP dense override) */
|
|
59
|
-
--text-md: 1rem; /* 16 px — content-heavy body (NEW) */
|
|
60
|
-
--text-lg: 1.125rem; /* 18 px — subheading */
|
|
61
|
-
--text-xl: 1.25rem; /* 20 px — h3 */
|
|
62
|
-
--text-2xl: 1.5rem; /* 24 px — h2 (SmartHR XL, Ameba headline-4) */
|
|
63
|
-
--text-3xl: 1.875rem; /* 30 px — kept for backward compat */
|
|
64
|
-
--text-4xl: 2rem; /* 32 px — h1 cap (SmartHR XXL); was 2.25/36 */
|
|
65
|
-
|
|
66
|
-
/* Line heights — JMDC convergent: 1.7 body, 1.25 headings, 1.5 dense */
|
|
67
|
-
--leading-none: 1;
|
|
68
|
-
--leading-tight: 1.25; /* Headings */
|
|
69
|
-
--leading-normal: 1.5; /* Dense / single-line UI */
|
|
70
|
-
--leading-body: 1.7; /* JP body default (NEW; 間 principle) */
|
|
71
|
-
--leading-relaxed: 1.625;
|
|
72
|
-
--leading-loose: 2; /* Long-form reading */
|
|
73
|
-
|
|
74
|
-
/* ===================================
|
|
75
|
-
* COLOR TOKENS
|
|
76
|
-
*
|
|
77
|
-
* Phase B values applied (design-foundations-japanese.md):
|
|
78
|
-
* - All colors in OKLCH for perceptual uniformity (Tailwind v4 native).
|
|
79
|
-
* - Primary chroma ≤ 0.18 per 渋み (shibumi — restrained elegance).
|
|
80
|
-
* - Off-black text in warm hue 60 (SmartHR TEXT_BLACK #23221e ≈ neutral-12).
|
|
81
|
-
* - Destructive = 茜 (akane) NOT pure red — cited cultural rule:
|
|
82
|
-
* 「新しめのデザインを採用しているサービスほど赤は避けるか、控えめに」
|
|
83
|
-
* =================================== */
|
|
84
|
-
--background: oklch(99% 0.002 60); /* warm off-white */
|
|
85
|
-
--foreground: oklch(20% 0.006 60); /* off-black, warm — SmartHR TEXT_BLACK */
|
|
86
|
-
--card: oklch(99% 0.002 60);
|
|
87
|
-
--card-foreground: oklch(20% 0.006 60);
|
|
88
|
-
--popover: oklch(99% 0.002 60);
|
|
89
|
-
--popover-foreground: oklch(20% 0.006 60);
|
|
90
|
-
|
|
91
|
-
/* Primary — SmartHR MAIN #0077c7 in OKLCH (chroma ≤ 0.15, 渋み) */
|
|
92
|
-
--primary: oklch(56% 0.15 240);
|
|
93
|
-
--primary-foreground: oklch(99% 0.002 60);
|
|
94
|
-
|
|
95
|
-
--secondary: oklch(96% 0.004 60); /* subtle bg, neutral-3 */
|
|
96
|
-
--secondary-foreground: oklch(20% 0.006 60);
|
|
97
|
-
--muted: oklch(96% 0.004 60);
|
|
98
|
-
--muted-foreground: oklch(48% 0.008 60); /* SmartHR TEXT_GREY #706d65 */
|
|
99
|
-
--accent: oklch(93% 0.005 60); /* hover bg */
|
|
100
|
-
--accent-foreground: oklch(20% 0.006 60);
|
|
101
|
-
|
|
102
|
-
/* Destructive — 茜 #b7282e (cited: zenn/Manalink — "赤は控えめに") */
|
|
103
|
-
--destructive: oklch(52% 0.18 25);
|
|
104
|
-
--destructive-foreground: oklch(99% 0.002 60);
|
|
105
|
-
|
|
106
|
-
--border: oklch(86% 0.006 60); /* SmartHR BORDER #d6d3d0 */
|
|
107
|
-
--input: oklch(86% 0.006 60);
|
|
108
|
-
--input-background: oklch(99% 0.002 60); /* was transparent — SmartHR uses solid */
|
|
109
|
-
--switch-background: oklch(80% 0.007 60);
|
|
110
|
-
--ring: oklch(56% 0.15 240); /* matches primary */
|
|
111
|
-
|
|
112
|
-
/* Chart colors */
|
|
113
|
-
--chart-1: oklch(0.646 0.222 41.116);
|
|
114
|
-
--chart-2: oklch(0.6 0.118 184.704);
|
|
115
|
-
--chart-3: oklch(0.398 0.07 227.392);
|
|
116
|
-
--chart-4: oklch(0.828 0.189 84.429);
|
|
117
|
-
--chart-5: oklch(0.769 0.188 70.08);
|
|
118
|
-
|
|
119
|
-
/* Sidebar colors */
|
|
120
|
-
--sidebar: oklch(0.985 0 0);
|
|
121
|
-
--sidebar-foreground: oklch(0.145 0 0);
|
|
122
|
-
--sidebar-primary: #030213;
|
|
123
|
-
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
124
|
-
--sidebar-accent: oklch(0.97 0 0);
|
|
125
|
-
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
126
|
-
--sidebar-border: oklch(0.922 0 0);
|
|
127
|
-
--sidebar-ring: oklch(0.708 0 0);
|
|
128
|
-
|
|
129
|
-
/* Semantic colors — 和色 (traditional Japanese) hue centers in OKLCH.
|
|
130
|
-
Cited rationale in plans/design-foundations-japanese.md. */
|
|
131
|
-
--success: oklch(72% 0.13 155); /* 若竹 #68be8d */
|
|
132
|
-
--success-foreground: oklch(99% 0.002 60);
|
|
133
|
-
--warning: oklch(80% 0.17 85); /* 山吹 #f8b500 */
|
|
134
|
-
--warning-foreground: oklch(20% 0.006 60); /* warm off-black on yellow */
|
|
135
|
-
--info: oklch(55% 0.12 265); /* 群青 #4c6cb3 */
|
|
136
|
-
--info-foreground: oklch(99% 0.002 60);
|
|
137
|
-
--error: oklch(52% 0.18 25); /* 茜 #b7282e — same hue as destructive */
|
|
138
|
-
--error-foreground: oklch(99% 0.002 60);
|
|
139
|
-
|
|
140
|
-
/* Attention — non-critical alert per freee/Manalink pattern: 朱 (shu) #eb6101.
|
|
141
|
-
Use this when red would be too aggressive (required-field reminders, etc). */
|
|
142
|
-
--attention: oklch(66% 0.19 45);
|
|
143
|
-
--attention-foreground: oklch(99% 0.002 60);
|
|
144
|
-
|
|
145
|
-
/* ===================================
|
|
146
|
-
* 和色 (traditional Japanese accent palette)
|
|
147
|
-
* For chart colors, tag colors, decorative accents.
|
|
148
|
-
* NEVER use these as semantic role colors — those are above.
|
|
149
|
-
* Source: colordic.org/w + irocore.com (Japanese traditional color references)
|
|
150
|
-
* =================================== */
|
|
151
|
-
--color-wa-ai: #165e83; /* 藍 — info dark */
|
|
152
|
-
--color-wa-gunjo: #4c6cb3; /* 群青 — info */
|
|
153
|
-
--color-wa-ruri: #1e50a2; /* 瑠璃 — primary saturated */
|
|
154
|
-
--color-wa-kon: #223a70; /* 紺 — text emphasis */
|
|
155
|
-
--color-wa-wakatake: #68be8d; /* 若竹 — success */
|
|
156
|
-
--color-wa-moegi: #006e54; /* 萌葱 — success dark */
|
|
157
|
-
--color-wa-yamabuki: #f8b500; /* 山吹 — warning */
|
|
158
|
-
--color-wa-shu: #eb6101; /* 朱 — attention */
|
|
159
|
-
--color-wa-akane: #b7282e; /* 茜 — danger */
|
|
160
|
-
--color-wa-enji: #b94047; /* 臙脂 — destructive confirmed */
|
|
161
|
-
--color-wa-sakura: #fef4f4; /* 桜 — soft info background */
|
|
162
|
-
--color-wa-sumi: #595857; /* 墨 — text primary warm */
|
|
163
|
-
--color-wa-nezu: #949495; /* 鼠 — text muted */
|
|
164
|
-
|
|
165
|
-
/* Gray scale palette */
|
|
166
|
-
--gray-50: #f9fafb;
|
|
167
|
-
--gray-100: #f3f4f6;
|
|
168
|
-
--gray-200: #e5e7eb;
|
|
169
|
-
--gray-300: #d1d5db;
|
|
170
|
-
--gray-400: #9ca3af;
|
|
171
|
-
--gray-500: #6b7280;
|
|
172
|
-
--gray-600: #4b5563;
|
|
173
|
-
--gray-700: #374151;
|
|
174
|
-
--gray-800: #1f2937;
|
|
175
|
-
--gray-900: #111827;
|
|
176
|
-
|
|
177
|
-
/* Blue palette (for active states) */
|
|
178
|
-
--blue-50: #eff6ff;
|
|
179
|
-
--blue-100: #dbeafe;
|
|
180
|
-
--blue-500: #3b82f6;
|
|
181
|
-
--blue-600: #2563eb;
|
|
182
|
-
--blue-700: #1d4ed8;
|
|
183
|
-
|
|
184
|
-
/* ===================================
|
|
185
|
-
* SPACING TOKENS
|
|
186
|
-
* =================================== */
|
|
187
|
-
--spacing-0: 0;
|
|
188
|
-
--spacing-1: 0.25rem; /* 4px */
|
|
189
|
-
--spacing-2: 0.5rem; /* 8px */
|
|
190
|
-
--spacing-3: 0.75rem; /* 12px */
|
|
191
|
-
--spacing-4: 1rem; /* 16px */
|
|
192
|
-
--spacing-5: 1.25rem; /* 20px */
|
|
193
|
-
--spacing-6: 1.5rem; /* 24px */
|
|
194
|
-
--spacing-8: 2rem; /* 32px */
|
|
195
|
-
--spacing-10: 2.5rem; /* 40px */
|
|
196
|
-
--spacing-12: 3rem; /* 48px */
|
|
197
|
-
--spacing-16: 4rem; /* 64px */
|
|
198
|
-
--spacing-20: 5rem; /* 80px */
|
|
199
|
-
--spacing-24: 6rem; /* 96px */
|
|
200
|
-
|
|
201
|
-
/* ===================================
|
|
202
|
-
* DENSITY TOKENS — Change these to adjust UI density globally
|
|
203
|
-
* =================================== */
|
|
204
|
-
|
|
205
|
-
/* Headings (used in @layer base) */
|
|
206
|
-
--heading-h1: var(--text-xl); /* was --text-2xl */
|
|
207
|
-
--heading-h2: var(--text-lg); /* was --text-xl */
|
|
208
|
-
--heading-h3: var(--text-base); /* was --text-lg */
|
|
209
|
-
--heading-h4: var(--text-sm); /* was --text-base */
|
|
210
|
-
|
|
211
|
-
/* Page layout */
|
|
212
|
-
--density-page: 1rem; /* 16px — page content padding */
|
|
213
|
-
--density-section: 1rem; /* 16px — gap between sections */
|
|
214
|
-
--density-page-title: 1.25rem; /* 20px — page title font-size */
|
|
215
|
-
|
|
216
|
-
/* Standard element height (btn, input, select, tabs) */
|
|
217
|
-
--density-element-xs: 1.5rem; /* 24px — extra small */
|
|
218
|
-
--density-element-sm: 1.75rem; /* 28px — small */
|
|
219
|
-
--density-element: 2rem; /* 32px — default */
|
|
220
|
-
--density-element-lg: 2.25rem; /* 36px — large */
|
|
221
|
-
--density-element-xl: 2.75rem; /* 44px — extra large (login forms) */
|
|
222
|
-
|
|
223
|
-
/* Card padding */
|
|
224
|
-
--density-card: 1rem; /* 16px — was 1.5rem/24px */
|
|
225
|
-
|
|
226
|
-
/* Dialog */
|
|
227
|
-
--density-dialog: 1.25rem; /* 20px — was 1.5rem/24px */
|
|
228
|
-
|
|
229
|
-
/* Table */
|
|
230
|
-
--density-table-head: 2rem; /* 32px — was 2.5rem/40px */
|
|
231
|
-
|
|
232
|
-
/* Single-component tokens (used via var() directly) */
|
|
233
|
-
--density-popover: 0.75rem; /* 12px */
|
|
234
|
-
--density-sheet: 0.75rem; /* 12px */
|
|
235
|
-
--density-accordion: 0.625rem; /* 10px */
|
|
236
|
-
--density-menu-item-py: 0.25rem; /* 4px */
|
|
237
|
-
|
|
238
|
-
/* Touch target floor — Digital Agency hard rule (44 CSS px), enforces
|
|
239
|
-
WCAG 2.1 SC 2.5.5. Interactive elements smaller than this MUST have
|
|
240
|
-
a transparent ::before pseudo-element padding to reach 44×44. */
|
|
241
|
-
--touch-target-min: 44px;
|
|
242
|
-
|
|
243
|
-
/* ===================================
|
|
244
|
-
* ASPECT RATIOS — Decorative only (NOT for type/spacing — see plan).
|
|
245
|
-
* Reject golden ratio 1.618 as a scale ratio; use it ONLY for media.
|
|
246
|
-
* =================================== */
|
|
247
|
-
--aspect-square: 1 / 1; /* gallery tile */
|
|
248
|
-
--aspect-photo: 4 / 3; /* photo card */
|
|
249
|
-
--aspect-photo-3-2: 3 / 2; /* DSLR */
|
|
250
|
-
--aspect-video: 16 / 9; /* hero banner */
|
|
251
|
-
--aspect-cinematic: 21 / 9; /* cinematic banner */
|
|
252
|
-
--aspect-silver: 1.4142; /* 白銀比 (hakuginhi) — A4, manga, Horyuji temple */
|
|
253
|
-
--aspect-golden: 1.618; /* 黄金比 — Western art convention */
|
|
254
|
-
|
|
255
|
-
/* ===================================
|
|
256
|
-
* LAYOUT TOKENS
|
|
257
|
-
* =================================== */
|
|
258
|
-
--header-height: 3rem; /* 48px — was 4rem/64px */
|
|
259
|
-
--sidebar-width: 16rem; /* 256px */
|
|
260
|
-
--sidebar-collapsed-width: 4rem; /* 64px */
|
|
261
|
-
--sidebar-transition: 300ms;
|
|
262
|
-
--content-sidebar-width: 20rem; /* 320px - for PageContainer sidebar */
|
|
263
|
-
--container-max-width: 1280px;
|
|
264
|
-
|
|
265
|
-
/* ===================================
|
|
266
|
-
* BORDER & RADIUS TOKENS
|
|
267
|
-
* =================================== */
|
|
268
|
-
--radius: 0.375rem; /* 6px */
|
|
269
|
-
--radius-sm: calc(var(--radius) - 4px);
|
|
270
|
-
--radius-md: calc(var(--radius) - 2px);
|
|
271
|
-
--radius-lg: var(--radius);
|
|
272
|
-
--radius-xl: calc(var(--radius) + 4px);
|
|
273
|
-
--radius-full: 9999px;
|
|
274
|
-
|
|
275
|
-
/* Border widths */
|
|
276
|
-
--border-width: 1px;
|
|
277
|
-
--border-width-2: 2px;
|
|
278
|
-
--border-width-4: 4px;
|
|
279
|
-
|
|
280
|
-
/* ===================================
|
|
281
|
-
* SHADOW TOKENS
|
|
282
|
-
* =================================== */
|
|
283
|
-
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
|
|
284
|
-
--shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
|
|
285
|
-
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
|
|
286
|
-
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
|
287
|
-
--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
|
|
288
|
-
--shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
|
|
289
|
-
--shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);
|
|
290
|
-
|
|
291
|
-
/* ===================================
|
|
292
|
-
* Z-INDEX TOKENS
|
|
293
|
-
* =================================== */
|
|
294
|
-
--z-0: 0;
|
|
295
|
-
--z-10: 10;
|
|
296
|
-
--z-20: 20;
|
|
297
|
-
--z-30: 30;
|
|
298
|
-
--z-40: 40;
|
|
299
|
-
--z-50: 50;
|
|
300
|
-
--z-dropdown: 1000;
|
|
301
|
-
--z-sticky: 1020;
|
|
302
|
-
--z-fixed: 1030;
|
|
303
|
-
--z-modal-backdrop: 1040;
|
|
304
|
-
--z-modal: 1050;
|
|
305
|
-
--z-popover: 1060;
|
|
306
|
-
--z-tooltip: 1070;
|
|
307
|
-
|
|
308
|
-
/* ===================================
|
|
309
|
-
* TRANSITION & ANIMATION TOKENS
|
|
310
|
-
* =================================== */
|
|
311
|
-
--transition-fast: 150ms;
|
|
312
|
-
--transition-base: 200ms;
|
|
313
|
-
--transition-slow: 300ms;
|
|
314
|
-
--transition-slower: 500ms;
|
|
315
|
-
|
|
316
|
-
--ease-in: cubic-bezier(0.4, 0, 1, 1);
|
|
317
|
-
--ease-out: cubic-bezier(0, 0, 0.2, 1);
|
|
318
|
-
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
|
|
319
|
-
|
|
320
|
-
/* ===================================
|
|
321
|
-
* OPACITY TOKENS
|
|
322
|
-
* =================================== */
|
|
323
|
-
--opacity-0: 0;
|
|
324
|
-
--opacity-5: 0.05;
|
|
325
|
-
--opacity-10: 0.1;
|
|
326
|
-
--opacity-20: 0.2;
|
|
327
|
-
--opacity-30: 0.3;
|
|
328
|
-
--opacity-40: 0.4;
|
|
329
|
-
--opacity-50: 0.5;
|
|
330
|
-
--opacity-60: 0.6;
|
|
331
|
-
--opacity-70: 0.7;
|
|
332
|
-
--opacity-80: 0.8;
|
|
333
|
-
--opacity-90: 0.9;
|
|
334
|
-
--opacity-100: 1;
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
/* ============================================================================
|
|
338
|
-
* TENANT THEMES — Phase C extension
|
|
339
|
-
*
|
|
340
|
-
* Per-tenant brand overrides applied via `data-tenant="<slug>"` attribute on
|
|
341
|
-
* <html>, <body>, or any subtree. Framework defaults stay neutral (SmartHR
|
|
342
|
-
* MAIN blue) so the canonical Omnify UI library is brand-agnostic — tenants
|
|
343
|
-
* opt in by setting the attribute.
|
|
344
|
-
*
|
|
345
|
-
* To add a new tenant: copy a block, replace the slug + the OKLCH values.
|
|
346
|
-
* Every brand color must satisfy 渋み (chroma ≤ 0.18 for primaries) per the
|
|
347
|
-
* design foundation; verify with `python -c "..."` from the convergent doc.
|
|
348
|
-
* ============================================================================ */
|
|
349
|
-
|
|
350
|
-
/* Betoya / ベト屋 — Vietnamese restaurant brand
|
|
351
|
-
* Source: https://betoya.jp Elementor global colors
|
|
352
|
-
* --e-global-color-primary = #009444 → oklch(58% 0.159 150) Vietnam green
|
|
353
|
-
* --e-global-color-secondary= #FFC20E → oklch(85% 0.172 85) golden yellow
|
|
354
|
-
* --e-global-color-text = #171614 → oklch(20% 0.004 85) warm off-black
|
|
355
|
-
* Brand identity: Vietnam flag green + star yellow — culturally appropriate
|
|
356
|
-
* for a Vietnamese restaurant in Tokyo (Jimbocho, Kanda branches).
|
|
357
|
-
*/
|
|
358
|
-
[data-tenant="betoya"] {
|
|
359
|
-
/* Semantic primary → Vietnam green (chroma 0.159 ≤ 渋み limit 0.18 ✓) */
|
|
360
|
-
--primary: oklch(58% 0.159 150);
|
|
361
|
-
--primary-foreground: oklch(99% 0.002 60);
|
|
362
|
-
--ring: oklch(58% 0.159 150);
|
|
363
|
-
|
|
364
|
-
/* Foreground/text shifts to warm off-black (#171614 from brand) */
|
|
365
|
-
--foreground: oklch(20% 0.004 85);
|
|
366
|
-
--card-foreground: oklch(20% 0.004 85);
|
|
367
|
-
--popover-foreground: oklch(20% 0.004 85);
|
|
368
|
-
|
|
369
|
-
/* Brand-specific tokens — accessible directly via bg-brand-* / text-brand-* */
|
|
370
|
-
--color-brand-betoya-primary: #009444; /* Vietnam green */
|
|
371
|
-
--color-brand-betoya-secondary: #FFC20E; /* golden yellow */
|
|
372
|
-
--color-brand-betoya-accent: #00B856; /* brighter green */
|
|
373
|
-
--color-brand-betoya-attention: #F95C39; /* orange-red highlight (chroma 0.199, used sparingly) */
|
|
374
|
-
--color-brand-betoya-text: #171614; /* warm off-black */
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
/* ============================================================================
|
|
378
|
-
* DENSITY MODES — Phase C
|
|
379
|
-
*
|
|
380
|
-
* Three runtime-switchable density modes attached to <html> or <body> via
|
|
381
|
-
* `data-density="<mode>"`. Default (no attribute) keeps the historical 32 px
|
|
382
|
-
* control + 16 px card padding scale that the codebase ships with today.
|
|
383
|
-
*
|
|
384
|
-
* Compact: kintone-style data-dense list views, mobile master-detail
|
|
385
|
-
* Comfortable: public marketing surfaces, accessibility-first comply with
|
|
386
|
-
* the Digital Agency 44 px touch target without per-element
|
|
387
|
-
* padding hacks.
|
|
388
|
-
*
|
|
389
|
-
* Source: design-foundations-japanese.md §"Density modes"
|
|
390
|
-
* ============================================================================ */
|
|
391
|
-
|
|
392
|
-
/* Compact — kintone / dense table style */
|
|
393
|
-
[data-density="compact"] {
|
|
394
|
-
/* Control heights shift down one step */
|
|
395
|
-
--density-element-xs: 1.25rem; /* 20px */
|
|
396
|
-
--density-element-sm: 1.5rem; /* 24px */
|
|
397
|
-
--density-element: 1.75rem; /* 28px — was 32 */
|
|
398
|
-
--density-element-lg: 2rem; /* 32px — was 36 */
|
|
399
|
-
--density-element-xl: 2.25rem; /* 36px — was 44 */
|
|
400
|
-
|
|
401
|
-
/* Card / dialog padding tightens */
|
|
402
|
-
--density-card: 0.75rem; /* 12px — was 16 */
|
|
403
|
-
--density-dialog: 1rem; /* 16px — was 20 */
|
|
404
|
-
|
|
405
|
-
/* Page chrome tightens */
|
|
406
|
-
--density-page: 0.75rem; /* 12px — was 16 */
|
|
407
|
-
--density-section: 0.75rem; /* 12px — was 16 */
|
|
408
|
-
--header-height: 2.5rem; /* 40px — was 48 */
|
|
409
|
-
--density-table-head: 1.75rem; /* 28px — was 32 */
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
/* Comfortable — public-facing, Digital Agency 44 px touch target */
|
|
413
|
-
[data-density="comfortable"] {
|
|
414
|
-
/* Control heights shift up one step */
|
|
415
|
-
--density-element-xs: 2rem; /* 32px */
|
|
416
|
-
--density-element-sm: 2.25rem; /* 36px */
|
|
417
|
-
--density-element: 2.75rem; /* 44px — was 32, hits Digital Agency floor */
|
|
418
|
-
--density-element-lg: 3rem; /* 48px */
|
|
419
|
-
--density-element-xl: 3.5rem; /* 56px — login forms */
|
|
420
|
-
|
|
421
|
-
/* Card / dialog padding loosens */
|
|
422
|
-
--density-card: 1.5rem; /* 24px — was 16 */
|
|
423
|
-
--density-dialog: 2rem; /* 32px — was 20 */
|
|
424
|
-
|
|
425
|
-
/* Page chrome loosens */
|
|
426
|
-
--density-page: 1.5rem; /* 24px — was 16 */
|
|
427
|
-
--density-section: 1.5rem; /* 24px — was 16 */
|
|
428
|
-
--header-height: 3.5rem; /* 56px — was 48 */
|
|
429
|
-
--density-table-head: 2.5rem; /* 40px — was 32 */
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
.dark {
|
|
433
|
-
--background: oklch(0.145 0 0);
|
|
434
|
-
--foreground: oklch(0.985 0 0);
|
|
435
|
-
--card: oklch(0.145 0 0);
|
|
436
|
-
--card-foreground: oklch(0.985 0 0);
|
|
437
|
-
--popover: oklch(0.145 0 0);
|
|
438
|
-
--popover-foreground: oklch(0.985 0 0);
|
|
439
|
-
--primary: oklch(0.985 0 0);
|
|
440
|
-
--primary-foreground: oklch(0.205 0 0);
|
|
441
|
-
--secondary: oklch(0.269 0 0);
|
|
442
|
-
--secondary-foreground: oklch(0.985 0 0);
|
|
443
|
-
--muted: oklch(0.269 0 0);
|
|
444
|
-
--muted-foreground: oklch(0.708 0 0);
|
|
445
|
-
--accent: oklch(0.269 0 0);
|
|
446
|
-
--accent-foreground: oklch(0.985 0 0);
|
|
447
|
-
--destructive: oklch(0.396 0.141 25.723);
|
|
448
|
-
--destructive-foreground: oklch(0.637 0.237 25.331);
|
|
449
|
-
--border: oklch(0.269 0 0);
|
|
450
|
-
--input: oklch(0.269 0 0);
|
|
451
|
-
--ring: oklch(0.439 0 0);
|
|
452
|
-
|
|
453
|
-
--chart-1: oklch(0.488 0.243 264.376);
|
|
454
|
-
--chart-2: oklch(0.696 0.17 162.48);
|
|
455
|
-
--chart-3: oklch(0.769 0.188 70.08);
|
|
456
|
-
--chart-4: oklch(0.627 0.265 303.9);
|
|
457
|
-
--chart-5: oklch(0.645 0.246 16.439);
|
|
458
|
-
|
|
459
|
-
--sidebar: oklch(0.205 0 0);
|
|
460
|
-
--sidebar-foreground: oklch(0.985 0 0);
|
|
461
|
-
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
462
|
-
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
463
|
-
--sidebar-accent: oklch(0.269 0 0);
|
|
464
|
-
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
465
|
-
--sidebar-border: oklch(0.269 0 0);
|
|
466
|
-
--sidebar-ring: oklch(0.439 0 0);
|
|
467
|
-
|
|
468
|
-
/* Semantic colors (dark mode) */
|
|
469
|
-
--success: #34d399;
|
|
470
|
-
--success-foreground: #022c22;
|
|
471
|
-
--warning: #fbbf24;
|
|
472
|
-
--warning-foreground: #422006;
|
|
473
|
-
--info: #60a5fa;
|
|
474
|
-
--info-foreground: #172554;
|
|
475
|
-
--error: #f87171;
|
|
476
|
-
--error-foreground: #450a0a;
|
|
477
|
-
|
|
478
|
-
/* Dark mode gray scale */
|
|
479
|
-
--gray-50: #1f2937;
|
|
480
|
-
--gray-100: #374151;
|
|
481
|
-
--gray-200: #4b5563;
|
|
482
|
-
--gray-300: #6b7280;
|
|
483
|
-
--gray-400: #9ca3af;
|
|
484
|
-
--gray-500: #d1d5db;
|
|
485
|
-
--gray-600: #e5e7eb;
|
|
486
|
-
--gray-700: #f3f4f6;
|
|
487
|
-
--gray-800: #f9fafb;
|
|
488
|
-
--gray-900: #ffffff;
|
|
489
|
-
|
|
490
|
-
/* Dark mode blue palette */
|
|
491
|
-
--blue-50: #1e3a8a;
|
|
492
|
-
--blue-100: #1d4ed8;
|
|
493
|
-
--blue-500: #3b82f6;
|
|
494
|
-
--blue-600: #60a5fa;
|
|
495
|
-
--blue-700: #93c5fd;
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
/* ===================================
|
|
499
|
-
* TAILWIND V4 THEME MAPPING
|
|
500
|
-
* Map CSS variables to Tailwind classes
|
|
501
|
-
* =================================== */
|
|
502
|
-
@theme inline {
|
|
503
|
-
/* Colors */
|
|
504
|
-
--color-background: var(--background);
|
|
505
|
-
--color-foreground: var(--foreground);
|
|
506
|
-
--color-card: var(--card);
|
|
507
|
-
--color-card-foreground: var(--card-foreground);
|
|
508
|
-
--color-popover: var(--popover);
|
|
509
|
-
--color-popover-foreground: var(--popover-foreground);
|
|
510
|
-
--color-primary: var(--primary);
|
|
511
|
-
--color-primary-foreground: var(--primary-foreground);
|
|
512
|
-
--color-secondary: var(--secondary);
|
|
513
|
-
--color-secondary-foreground: var(--secondary-foreground);
|
|
514
|
-
--color-muted: var(--muted);
|
|
515
|
-
--color-muted-foreground: var(--muted-foreground);
|
|
516
|
-
--color-accent: var(--accent);
|
|
517
|
-
--color-accent-foreground: var(--accent-foreground);
|
|
518
|
-
--color-destructive: var(--destructive);
|
|
519
|
-
--color-destructive-foreground: var(--destructive-foreground);
|
|
520
|
-
--color-border: var(--border);
|
|
521
|
-
--color-input: var(--input);
|
|
522
|
-
--color-input-background: var(--input-background);
|
|
523
|
-
--color-switch-background: var(--switch-background);
|
|
524
|
-
--color-ring: var(--ring);
|
|
525
|
-
--color-chart-1: var(--chart-1);
|
|
526
|
-
--color-chart-2: var(--chart-2);
|
|
527
|
-
--color-chart-3: var(--chart-3);
|
|
528
|
-
--color-chart-4: var(--chart-4);
|
|
529
|
-
--color-chart-5: var(--chart-5);
|
|
530
|
-
|
|
531
|
-
/* Sidebar colors */
|
|
532
|
-
--color-sidebar: var(--sidebar);
|
|
533
|
-
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
534
|
-
--color-sidebar-primary: var(--sidebar-primary);
|
|
535
|
-
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
536
|
-
--color-sidebar-accent: var(--sidebar-accent);
|
|
537
|
-
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
538
|
-
--color-sidebar-border: var(--sidebar-border);
|
|
539
|
-
--color-sidebar-ring: var(--sidebar-ring);
|
|
540
|
-
|
|
541
|
-
/* Semantic colors */
|
|
542
|
-
--color-success: var(--success);
|
|
543
|
-
--color-success-foreground: var(--success-foreground);
|
|
544
|
-
--color-warning: var(--warning);
|
|
545
|
-
--color-warning-foreground: var(--warning-foreground);
|
|
546
|
-
--color-info: var(--info);
|
|
547
|
-
--color-info-foreground: var(--info-foreground);
|
|
548
|
-
--color-error: var(--error);
|
|
549
|
-
--color-error-foreground: var(--error-foreground);
|
|
550
|
-
|
|
551
|
-
/* Gray palette - making available as Tailwind classes */
|
|
552
|
-
--color-gray-50: var(--gray-50);
|
|
553
|
-
--color-gray-100: var(--gray-100);
|
|
554
|
-
--color-gray-200: var(--gray-200);
|
|
555
|
-
--color-gray-300: var(--gray-300);
|
|
556
|
-
--color-gray-400: var(--gray-400);
|
|
557
|
-
--color-gray-500: var(--gray-500);
|
|
558
|
-
--color-gray-600: var(--gray-600);
|
|
559
|
-
--color-gray-700: var(--gray-700);
|
|
560
|
-
--color-gray-800: var(--gray-800);
|
|
561
|
-
--color-gray-900: var(--gray-900);
|
|
562
|
-
|
|
563
|
-
/* Blue palette */
|
|
564
|
-
--color-blue-50: var(--blue-50);
|
|
565
|
-
--color-blue-100: var(--blue-100);
|
|
566
|
-
--color-blue-500: var(--blue-500);
|
|
567
|
-
--color-blue-600: var(--blue-600);
|
|
568
|
-
--color-blue-700: var(--blue-700);
|
|
569
|
-
|
|
570
|
-
/* Density spacing — creates p-page, h-element, gap-section, etc. */
|
|
571
|
-
--spacing-page: var(--density-page);
|
|
572
|
-
--spacing-section: var(--density-section);
|
|
573
|
-
--spacing-element-xs: var(--density-element-xs);
|
|
574
|
-
--spacing-element-sm: var(--density-element-sm);
|
|
575
|
-
--spacing-element: var(--density-element);
|
|
576
|
-
--spacing-element-lg: var(--density-element-lg);
|
|
577
|
-
--spacing-element-xl: var(--density-element-xl);
|
|
578
|
-
--spacing-card: var(--density-card);
|
|
579
|
-
--spacing-dialog: var(--density-dialog);
|
|
580
|
-
--spacing-header: var(--header-height);
|
|
581
|
-
--spacing-table-head: var(--density-table-head);
|
|
582
|
-
|
|
583
|
-
/* Density font sizes — creates text-page-title */
|
|
584
|
-
--font-size-page-title: var(--density-page-title);
|
|
585
|
-
|
|
586
|
-
/* Border radius */
|
|
587
|
-
--radius-sm: calc(var(--radius) - 4px);
|
|
588
|
-
--radius-md: calc(var(--radius) - 2px);
|
|
589
|
-
--radius-lg: var(--radius);
|
|
590
|
-
--radius-xl: calc(var(--radius) + 4px);
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
/* ===================================
|
|
594
|
-
* BASE STYLES
|
|
595
|
-
* Default typography and element styles
|
|
596
|
-
* =================================== */
|
|
597
|
-
@layer base {
|
|
598
|
-
* {
|
|
599
|
-
@apply border-border outline-ring/50;
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
body {
|
|
603
|
-
@apply bg-background text-foreground;
|
|
604
|
-
/* Japanese-first font stack — Ameba Spindle convergent ordering. */
|
|
605
|
-
font-family: var(--font-sans-jp);
|
|
606
|
-
/* JP enterprise body density: 14 px / 1.7 line-height. Applied here on
|
|
607
|
-
<body> instead of via the rem unit so the root rem stays at 16 px and
|
|
608
|
-
all rem-based spacing/density tokens stay aligned to the 4 px grid.
|
|
609
|
-
See the typography token block at the top of this file for the bugfix
|
|
610
|
-
history. */
|
|
611
|
-
font-size: var(--text-base);
|
|
612
|
-
line-height: var(--leading-body);
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
/**
|
|
616
|
-
* Default typography styles for HTML elements (h1-h4, p, label, button, input).
|
|
617
|
-
* These are in @layer base, so Tailwind utility classes (like text-sm, text-lg) automatically override them.
|
|
618
|
-
*
|
|
619
|
-
* Phase B: line-height-tight (1.25) on headings per JMDC convention; body
|
|
620
|
-
* inherits leading-body (1.7) from <body>. Headings keep medium weight (500)
|
|
621
|
-
* per freee vibes — 700 reserved for explicit emphasis.
|
|
622
|
-
*/
|
|
623
|
-
|
|
624
|
-
html {
|
|
625
|
-
font-size: var(--font-size);
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
h1 {
|
|
629
|
-
font-size: var(--heading-h1);
|
|
630
|
-
font-weight: var(--font-weight-medium);
|
|
631
|
-
line-height: var(--leading-tight);
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
h2 {
|
|
635
|
-
font-size: var(--heading-h2);
|
|
636
|
-
font-weight: var(--font-weight-medium);
|
|
637
|
-
line-height: var(--leading-tight);
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
h3 {
|
|
641
|
-
font-size: var(--heading-h3);
|
|
642
|
-
font-weight: var(--font-weight-medium);
|
|
643
|
-
line-height: var(--leading-tight);
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
h4 {
|
|
647
|
-
font-size: var(--heading-h4);
|
|
648
|
-
font-weight: var(--font-weight-medium);
|
|
649
|
-
line-height: var(--leading-tight);
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
label {
|
|
653
|
-
font-size: var(--text-base);
|
|
654
|
-
font-weight: var(--font-weight-medium);
|
|
655
|
-
line-height: var(--leading-normal);
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
button {
|
|
659
|
-
font-size: var(--text-base);
|
|
660
|
-
font-weight: var(--font-weight-medium);
|
|
661
|
-
line-height: var(--leading-normal);
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
input {
|
|
665
|
-
font-size: var(--text-base);
|
|
666
|
-
font-weight: var(--font-weight-normal);
|
|
667
|
-
line-height: var(--leading-normal);
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
/*
|
|
671
|
-
* Font tokens — wired to next/font/google in src/app/layout.tsx which sets
|
|
672
|
-
* `--font-sans` on <html>. Tailwind v4 needs this @theme mapping so that
|
|
673
|
-
* `font-sans` utility resolves to the loaded variable font.
|
|
674
|
-
*/
|
|
675
|
-
@theme inline {
|
|
676
|
-
--font-sans: var(--font-sans);
|
|
677
|
-
--font-heading: var(--font-sans);
|
|
678
|
-
}
|