@squadbase/vantage-template 0.1.1-dev1.ba90f54 → 0.1.1-dev1.bb2f95a
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/README.md +12 -2
- package/base-template/.squadbase/skills/vantage-add-feature/SKILL.md +5 -0
- package/base-template/.squadbase/skills/vantage-design/SKILL.md +54 -54
- package/base-template/.squadbase/skills/vantage-design/references/extract.md +26 -27
- package/base-template/.squadbase/skills/vantage-design/references/format.md +12 -172
- package/base-template/.squadbase/skills/vantage-design/references/presets.md +50 -110
- package/base-template/.squadbase/skills/vantage-pitfalls/SKILL.md +5 -0
- package/base-template/.squadbase/skills/vantage-slide/SKILL.md +54 -36
- package/base-template/AGENTS.md +48 -19
- package/base-template/agents/api.md +7 -0
- package/base-template/agents/doc.md +48 -0
- package/base-template/agents/page.md +59 -2
- package/base-template/agents/slide.md +77 -3
- package/base-template/bun.lock +25 -25
- package/base-template/package.json +2 -2
- package/base-template/src/_layout.tsx +7 -0
- package/base-template/src/components/user-card.tsx +1 -1
- package/base-template/src/index.tsx +1 -1
- package/base-template/src/styles.css +105 -20
- package/dist/index.js +956 -0
- package/package.json +6 -3
- package/base-template/DESIGN.md +0 -108
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
(ダッシュボード)を書くときに読んでください。前提となる不変条件・ディレクトリ構造は
|
|
5
5
|
`AGENTS.md` を先に読んでいる想定です。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
書き始める前に `AGENTS.md` の「見た目の規約」(と、あればプロジェクトルートの `DESIGN.md`)に従う。
|
|
8
8
|
|
|
9
9
|
## 最小アプリ(2 ファイル)
|
|
10
10
|
|
|
@@ -71,6 +71,7 @@ URL になる。各ページは**デフォルトエクスポートの React コ
|
|
|
71
71
|
| `_404.tsx` | Not Found ページ |
|
|
72
72
|
| `_error.tsx` | ルートが throw したときのエラーページ |
|
|
73
73
|
| `monthly-report.slide.tsx` | `/monthly-report`(スライドデッキ。詳しくは `agents/slide.md`) |
|
|
74
|
+
| `june-summary.doc.tsx` | `/june-summary`(ドキュメント。詳しくは `agents/doc.md`) |
|
|
74
75
|
| `sales-export.csv` | `/sales-export`(詳しくは `agents/csv.md`) |
|
|
75
76
|
| `data/june.xlsx` | `/data/june`(詳しくは `agents/xlsx.md`) |
|
|
76
77
|
|
|
@@ -89,6 +90,26 @@ export default function MonthlyAnalysis() {
|
|
|
89
90
|
}
|
|
90
91
|
```
|
|
91
92
|
|
|
93
|
+
### ページファイルの規約(`.tsx` / `.slide.tsx` / `.doc.tsx` 共通)
|
|
94
|
+
|
|
95
|
+
**MUST**
|
|
96
|
+
|
|
97
|
+
- ページルートの配下に置く。`components/` などの走査対象外のディレクトリに置いたファイルはページに
|
|
98
|
+
ならず、エラーも出ない。`_` 始まりの名前は予約名(`_layout` / `_404` / `_error`)にだけ使う
|
|
99
|
+
(それ以外の `_` 始まりはページにならない。予約名にサフィックスを付けると `INVALID_PAGE_VARIANT`)
|
|
100
|
+
- URL はサフィックスと拡張子を除いたパスで決まる。同じ URL になる別ファイル(`june.tsx` /
|
|
101
|
+
`june.slide.tsx` / `june.doc.tsx` / `june.csv`)を並べない(`ROUTE_CONFLICT`)。テンプレートの
|
|
102
|
+
未編集の `index.tsx` だけは例外で、`index.slide.tsx` / `index.doc.tsx` が `/` を取れる
|
|
103
|
+
- default export は React の関数コンポーネント(無いと `MISSING_DEFAULT_EXPORT`。関数かどうかは
|
|
104
|
+
検査されない)
|
|
105
|
+
- `definePage({ ... })` にはオブジェクトリテラルを直接渡し、`title` / `description` / `navLabel` は
|
|
106
|
+
文字列リテラルで書く。ビルド時に静的抽出されるので、変数・関数呼び出し・spread・shorthand・
|
|
107
|
+
`${}` を含むテンプレート文字列は**エラーにならず黙ってメタなし**になる
|
|
108
|
+
|
|
109
|
+
**SHOULD**
|
|
110
|
+
|
|
111
|
+
- `definePage` に `title` と `navLabel` を書く(ナビの表示名とブラウザのタブ名になる)
|
|
112
|
+
|
|
92
113
|
### ナビはルート一覧から組む
|
|
93
114
|
|
|
94
115
|
`useRoutes()` がページルート一覧(スキャン順)を返すので、リンク配列を手で持たない。
|
|
@@ -109,7 +130,7 @@ routes.map((r) => (
|
|
|
109
130
|
```
|
|
110
131
|
|
|
111
132
|
`RouteInfo`: `path`(`/sales/:id`)・`to`(`/sales/$id`)・`params`・`dynamic`・`index`・`label`・
|
|
112
|
-
`title`・`description`・`navLabel`・`kind`(`"module"` | `"file"`)・`variant`(`"slide"`)。
|
|
133
|
+
`title`・`description`・`navLabel`・`kind`(`"module"` | `"file"`)・`variant`(`"slide"` | `"doc"`)。
|
|
113
134
|
後ろの 2 つで、ナビをダッシュボード / スライド / データに分けたりアイコンを変えたりできます。
|
|
114
135
|
|
|
115
136
|
### フィルタ状態は URL に置く
|
|
@@ -126,6 +147,42 @@ const [segments, setSegments] = useSearchState<string[]>("segments", []) // JSON
|
|
|
126
147
|
デフォルト値(または `null`)を書くとキーは URL から消える。履歴は既定で `replace`
|
|
127
148
|
(`{ replace: false }` で push)。
|
|
128
149
|
|
|
150
|
+
### 絞り込みの欄は、読み込み中も失敗したときも出し続ける
|
|
151
|
+
|
|
152
|
+
ページの先頭で `if (q.isError) return <ErrorState …/>` と書くと、取得に失敗したときに
|
|
153
|
+
期間などの絞り込みの欄まで消える。利用者は条件を直せず、初期値に戻すしかなくなる。
|
|
154
|
+
絞り込みの欄はページに置いたままにし、取得と `Loading` / `ErrorState` はデータを描く
|
|
155
|
+
子コンポーネントに入れる:
|
|
156
|
+
|
|
157
|
+
```tsx
|
|
158
|
+
export default function Traffic() {
|
|
159
|
+
const [from, setFrom] = useSearchParam("from", DEFAULT_FROM)
|
|
160
|
+
const [to, setTo] = useSearchParam("to", DEFAULT_TO)
|
|
161
|
+
return (
|
|
162
|
+
<>
|
|
163
|
+
{/* 失敗しても消えない。ここから条件を直せる */}
|
|
164
|
+
<PeriodFilter from={from} to={to} onChange={…} />
|
|
165
|
+
<TrafficBody from={from} to={to} />
|
|
166
|
+
</>
|
|
167
|
+
)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function TrafficBody({ from, to }: { from: string; to: string }) {
|
|
171
|
+
const q = useApiQuery<Row[]>("/api/traffic", { search: { from, to } })
|
|
172
|
+
if (q.isPending) return <Loading />
|
|
173
|
+
if (q.isError) return <ErrorState message={q.error.message} />
|
|
174
|
+
return <BarChart data={q.data} index="channel" categories={["sessions"]} />
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
- **期間は `DateRangePicker`(`@squadbase/vantage/components`)で選ばせる。** カレンダーで
|
|
179
|
+
範囲を選ぶので開始と終了が逆にならず、選べる日を `minDate` / `maxDate` で絞れる。
|
|
180
|
+
`<input type="date">` を 2 つ並べて自前で組まない。
|
|
181
|
+
- 値をそのまま打ち込める欄を置くなら、開始が終了より後・選べる範囲の外といった誤りは、
|
|
182
|
+
API へ送る前に欄のそばで理由を出す。誤りがあるあいだはデータの子コンポーネントを描かない
|
|
183
|
+
(送れば失敗するだけで、`ErrorState` には直し方が出ない)。
|
|
184
|
+
- サーバー側の検証で弾くときも、`HttpError(400, …)` の文で何がどう誤りかを言う(→ `agents/api.md`)。
|
|
185
|
+
|
|
129
186
|
### 動的パラメータの「3 つの綴り」を同期させる
|
|
130
187
|
|
|
131
188
|
崩すと静かにマッチしなくなる不変条件:
|
|
@@ -4,7 +4,13 @@
|
|
|
4
4
|
スライドデッキを書くときに読んでください。不変条件・ディレクトリ構造は `AGENTS.md` を
|
|
5
5
|
先に読んでいる想定です。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
書き始める前に `AGENTS.md` の「見た目の規約」(と、あればプロジェクトルートの `DESIGN.md`)に従う。
|
|
8
|
+
スライド固有の規則:
|
|
9
|
+
|
|
10
|
+
- 1 枚に 1 メッセージ。見出しに結論を書く。
|
|
11
|
+
- 色は `--slide-bg` / `--slide-fg` / `--slide-accent` / `--slide-muted` を使う(既定では
|
|
12
|
+
`--background` / `--foreground` / `--primary` / `--muted-foreground` に連動)。
|
|
13
|
+
- 強調色は 1 枚につき 1 か所まで。
|
|
8
14
|
|
|
9
15
|
## スライドは `.slide.tsx` で書く
|
|
10
16
|
|
|
@@ -19,6 +25,7 @@
|
|
|
19
25
|
- 新規プロジェクトでまだ `/` が空いている場合のみ、`index.slide.tsx` を使ってよい。
|
|
20
26
|
|
|
21
27
|
```tsx
|
|
28
|
+
import { definePage } from "@squadbase/vantage"
|
|
22
29
|
import { Slide, SlideDeck } from "@squadbase/vantage/slide"
|
|
23
30
|
|
|
24
31
|
export const page = definePage({ title: "6月度レビュー", navLabel: "6月度" })
|
|
@@ -34,8 +41,10 @@ export default function Deck() {
|
|
|
34
41
|
|
|
35
42
|
**`<Slide>` は `<SlideDeck>` の直接の子に書く。** `SlideDeck` は直下の `<Slide>` 要素だけを数えるので、
|
|
36
43
|
`<Slide>` を自作コンポーネント(`<Slide1 />` など)や Fragment で包むと 1 枚も数えられず「1 / 0」に
|
|
37
|
-
なります(`{items.map((x) => <Slide key={x.id}>…</Slide>)}`
|
|
38
|
-
|
|
44
|
+
なります(`{items.map((x) => <Slide key={x.id}>…</Slide>)}` のような配列はファイル形式としては可。
|
|
45
|
+
1 枚の中で視覚要素を `map` で量産しない方針は `vantage-slide` skill の「繰り返す要素は `map` ではなく
|
|
46
|
+
コンポーネント」)。共通の部品は `<Slide>` の**中**に置くコンポーネントとして切り出します
|
|
47
|
+
(`<Slide><CoverPage /></Slide>`)。
|
|
39
48
|
|
|
40
49
|
1920×1080 の固定キャンバスに絶対 px で書き、画面サイズに合わせて縮小されます。キー / クリックで
|
|
41
50
|
送れ、左のスライド一覧(サムネイル列)は `L` で開閉、`F` で全画面、ツールバーから pptx を
|
|
@@ -51,3 +60,68 @@ pptx が壊れる条件、説明と図表のデータ時点の揃え方)。
|
|
|
51
60
|
`.slide` を付けられるのはルートになるページモジュールだけで、`_layout.slide.tsx` などは
|
|
52
61
|
`INVALID_PAGE_VARIANT` エラーになります。`june.slide.tsx` と `june.tsx` は同じ URL に解決するので
|
|
53
62
|
`ROUTE_CONFLICT` です。
|
|
63
|
+
|
|
64
|
+
## まず block を探す
|
|
65
|
+
|
|
66
|
+
1 枚分の中身は、手で組む前に `@squadbase/vantage/slide` の block から探します(`<Slide>` の**中**に
|
|
67
|
+
置く。ルートは 100% で、`<Slide>` 自体は持たない)。props は `vantage docs <name>`(例:
|
|
68
|
+
`vantage docs slide-kpi-hero`)で引く。
|
|
69
|
+
|
|
70
|
+
| block | 用途 |
|
|
71
|
+
| --- | --- |
|
|
72
|
+
| `SlideCover` | 表紙(タイトル・サブタイトル・期間) |
|
|
73
|
+
| `SlideExecSummary` | 結論を先に述べるエグゼクティブサマリー |
|
|
74
|
+
| `SlideKpiHero` | 主要な KPI 1 つを大きく見せる |
|
|
75
|
+
| `SlideKpiGrid` | 複数の KPI を並べる |
|
|
76
|
+
| `SlideChartInsight` | チャート 1 つと、そこから読み取れること |
|
|
77
|
+
| `SlideScorecardTable` | 指標と目標・達成度を表にしたスコアカード |
|
|
78
|
+
| `SlideNextActions` | 次のアクション(担当・期限つき) |
|
|
79
|
+
| `SlideSection` | 章の扉(`items` を渡すと番号付きのアジェンダ。`current` の章を強調) |
|
|
80
|
+
| `SlideComparison` | A vs B・前後の 2〜3 列比較(各列に見出し・主要数値・箇条) |
|
|
81
|
+
| `SlideChartFull` | チャートを全幅に置き、注記を 1 行添える |
|
|
82
|
+
|
|
83
|
+
**手書きの 1 枚には部品を使う。** block が合わない 1 枚でも、見出し・出典行・列割りは自前で組まず、
|
|
84
|
+
次の部品を使う(どれも `@squadbase/vantage/slide`。1 枚にはならないので `<Slide>` の中に並べる)。
|
|
85
|
+
|
|
86
|
+
| 部品 | 用途 |
|
|
87
|
+
| --- | --- |
|
|
88
|
+
| `SlideHeading` | 見出し(`title`、任意で `eyebrow`)。1 枚の先頭に置く |
|
|
89
|
+
| `SlideSourceLine` | 足元の出典・時点(`source` `asOf`)。`page={{ current, total }}` を渡すとページ番号も出す |
|
|
90
|
+
| `SlideColumns` / `SlideColumn` | 12 列の割り付け(`<SlideColumn span={8}>` と `span={4}` など)。`align` は `start` / `center` / `stretch` |
|
|
91
|
+
| `DeltaText` | 増減の文字(「▲ +3.2%」)。`value` `format` `betterWhen` `comparisonLabel` |
|
|
92
|
+
|
|
93
|
+
`SlideSection` は `Steps` を持たない。順に見せたいときは呼び出し側で `<Steps>` で包む。
|
|
94
|
+
|
|
95
|
+
```tsx
|
|
96
|
+
import { Slide, SlideDeck, SlideCover, SlideExecSummary } from "@squadbase/vantage/slide"
|
|
97
|
+
// <SlideDeck><Slide><SlideCover … /></Slide><Slide><SlideExecSummary … /></Slide></SlideDeck>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**props の渡し方は block 間で共通。** 数値は `value: number | null` と `format`(整形は block がする。表示を上書きするときだけ `display`。`null` は「—」)。前期比などは `delta: { value, format? }` と `comparisonLabel`(例 `"前年同期比"`)、良し悪しは指標ごとの `betterWhen`(`"up"` が既定、コストなど下がるほど良いものは `"down"`。向きは block が符号から出す)。目標は `target: number`。出典は `source`(文字列)、時点は `asOf` に**日付だけ**(例 `"2026-09-30"`。「時点」は block が付けるので書かない)。時系列は、単一系列なら `{ x, y }[]`(kpi-hero の `trend`。scorecard に `trend` は無い)、複数系列なら `{ categories, series }`(chart-insight の `chart`)。
|
|
101
|
+
|
|
102
|
+
block が合わない**1 枚だけ**を手で書く(デッキ全体を手書きに切り替えない)。import 元は
|
|
103
|
+
`@squadbase/vantage/slide` のままで、block のための新しい import 元はありません。
|
|
104
|
+
|
|
105
|
+
## ファイル形式の規約
|
|
106
|
+
|
|
107
|
+
置き場所・URL・default export・`definePage` の書き方は全ページ共通(`agents/page.md` の
|
|
108
|
+
「ページファイルの規約」)。ここではスライド固有のものだけを挙げます。**中身の値(キャンバス・
|
|
109
|
+
セーフエリア・グリッド・文字サイズ・余白)は `vantage-slide` skill を参照。**
|
|
110
|
+
|
|
111
|
+
**MUST**(破ると黙って壊れるものが多い。`vantage check` が拾うのは名前の誤りだけ)
|
|
112
|
+
|
|
113
|
+
- ファイル名は `<name>.slide.tsx`(`.jsx` も可)。サフィックスは小文字で 1 つだけ。`.slide.ts` は
|
|
114
|
+
`INVALID_PAGE_VARIANT`、`.SLIDE.tsx`・二重サフィックス・`.slide.test.tsx` は黙って通常ページになる
|
|
115
|
+
- default export は `<SlideDeck>` をルートに返す。フレームワークは包まない
|
|
116
|
+
- `<Slide>` は `<SlideDeck>` の直接の子(配列は可。Fragment・自作コンポーネントで包まない)
|
|
117
|
+
- `<Step>` は `<Steps>` の直接の子(包むと常に表示される)
|
|
118
|
+
- スライドの部品は `@squadbase/vantage/slide` から import する
|
|
119
|
+
|
|
120
|
+
**SHOULD**
|
|
121
|
+
|
|
122
|
+
- 1 ファイル = 1 デッキ。ヘルパーコンポーネント・定数も同じ `.slide.tsx` に書く
|
|
123
|
+
- 各 `<Slide>` のルート要素は `width: "100%"; height: "100%"` でキャンバスを埋める
|
|
124
|
+
- canvas に描くチャート(`EChart`)は `data-waitfor="canvas"` で包む(無いと pptx でそのスライドが白紙になりうる)
|
|
125
|
+
- pptx に出る中身をアプリの Context(router / query / テーマ)に依存させない
|
|
126
|
+
- `MorphElement` の `id` はページ内で一意にし、入れ子にしない。遷移先の `<Slide>` で `transition.morph` を有効にする
|
|
127
|
+
- pptx 用などの依存を追加しない(html-to-image / fflate は自動で入る)
|
package/base-template/bun.lock
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
"name": "vibe-app",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"@squadbase/react": "^0.1.0",
|
|
9
|
-
"@squadbase/vantage": "0.6.2-dev1.
|
|
10
|
-
"@squadbase/vantage-sdk": "0.1.1-dev1.
|
|
9
|
+
"@squadbase/vantage": "0.6.2-dev1.51e401a",
|
|
10
|
+
"@squadbase/vantage-sdk": "0.1.1-dev1.2bfcfab",
|
|
11
11
|
"date-fns": "^4.1.0",
|
|
12
12
|
"lucide-react": "^0.468.0",
|
|
13
13
|
"react": "^19.3.1",
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
|
|
115
115
|
"@mermaid-js/parser": ["@mermaid-js/parser@1.2.1", "", { "dependencies": { "@chevrotain/types": "~11.1.2" } }, "sha512-n12NohV3mrUyUL2o93IgG/ifeW9FTyeJn3zDxkhwa8MJ9Fxg3HQMlA3RiGmD/3UnJvheztkjjQAjA2T4LmUcpw=="],
|
|
116
116
|
|
|
117
|
-
"@oxc-project/types": ["@oxc-project/types@0.
|
|
117
|
+
"@oxc-project/types": ["@oxc-project/types@0.156.0", "", {}, "sha512-1Duyg48TdJNdyhEB8Xn1L36bT9Pv6GUtlKjHxOys8xkaF/rQq3XJE+bAurSK/AgIz5mGFsb77cn9Pb20+WCScw=="],
|
|
118
118
|
|
|
119
119
|
"@radix-ui/primitive": ["@radix-ui/primitive@1.1.7", "", {}, "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q=="],
|
|
120
120
|
|
|
@@ -148,35 +148,35 @@
|
|
|
148
148
|
|
|
149
149
|
"@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-rDiah9wvtqihWtWz02XreeRKIxt2EJF8y5D9rtY9l5A2zxePAtcPiOMpDugNRw5bFHz+1/8viVoc7ZVKiJknCw=="],
|
|
150
150
|
|
|
151
|
-
"@rolldown/binding-android-arm-eabi": ["@rolldown/binding-android-arm-eabi@1.2.
|
|
151
|
+
"@rolldown/binding-android-arm-eabi": ["@rolldown/binding-android-arm-eabi@1.2.16", "", { "os": "android", "cpu": "arm" }, "sha512-ia3DwAs0OsMGS7+IConptSiyk9pEXkOx/AbJ2n/lAGxH3QkWQus1t8d7gnAT38FCU2sQu8lUbeR6AiZFv4JxaA=="],
|
|
152
152
|
|
|
153
|
-
"@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.
|
|
153
|
+
"@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.16", "", { "os": "android", "cpu": "arm64" }, "sha512-kx5wBiMB6E7TEvpl2B9gjLU004BkvEm2Dr941BFjx/SontPwSzNuQUIoVKxHHoSjpFIfHMmcguyLOtyn0hObRg=="],
|
|
154
154
|
|
|
155
|
-
"@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.
|
|
155
|
+
"@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.16", "", { "os": "darwin", "cpu": "arm64" }, "sha512-qslZrXnKJU4cUpjoAmtAo/KQM9e2IRMlmpig6Zpwj+8KWxW8v+nkAf9216Bsek9lOC1jvg2yCjygCFo2f83msQ=="],
|
|
156
156
|
|
|
157
|
-
"@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.
|
|
157
|
+
"@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.16", "", { "os": "darwin", "cpu": "x64" }, "sha512-FdF+y48ND13eAyM2mQn+85kvAqNlvRWROy2rhgA463X/0Gv4vGtazZtfaF1mRBLscYvtOlh4QnLjOWiFzX69OQ=="],
|
|
158
158
|
|
|
159
|
-
"@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.
|
|
159
|
+
"@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.16", "", { "os": "freebsd", "cpu": "x64" }, "sha512-ddjqFM5e95AgLbUPtKIS7V1KTVlA0RUgCVr5mn+/IEhsdy3pr+Vuj/HZ7nlMN2FyxIwUktOH1LEPIQXO1v9y1Q=="],
|
|
160
160
|
|
|
161
|
-
"@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.
|
|
161
|
+
"@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.16", "", { "os": "linux", "cpu": "arm" }, "sha512-tHdKWbFkFBI687iim3LIyIvyL7j66VvQYkDPss5Stn/qyE2tWkR1YD0dXmXPFKKqT/o5ZEJVsaRsWS2meQwGOA=="],
|
|
162
162
|
|
|
163
|
-
"@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.
|
|
163
|
+
"@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.16", "", { "os": "linux", "cpu": "arm64" }, "sha512-FJiLGAblPBMlBEdbOqw6kW6QcXDWAf/oJu7gYs9ZJZwmg+K+/zjFLxPTIY9izJUzxzc24FHvmseyA0IvJSl17w=="],
|
|
164
164
|
|
|
165
|
-
"@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.
|
|
165
|
+
"@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.16", "", { "os": "linux", "cpu": "arm64" }, "sha512-hrJpblMsrQ58U9veWpbXzkhV5zStunds6HWLprqq1qauvgBr1E6P+24kLj6lSLI9vjRn/RYpjprhkHQPKGWpNg=="],
|
|
166
166
|
|
|
167
|
-
"@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.
|
|
167
|
+
"@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.16", "", { "os": "linux", "cpu": "ppc64" }, "sha512-qJd/dC6j6CwLG9/s/RP2nb1RZ0GIgj7Ioj7x/SYa3RzjVrlzrmH0fhIOpfvqQDeIsdP0loi+kHaMhJzY1PBIaA=="],
|
|
168
168
|
|
|
169
|
-
"@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.
|
|
169
|
+
"@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.16", "", { "os": "linux", "cpu": "s390x" }, "sha512-Vx7Xg5uUJuNcujJjI70OICaH0EYj80BtOLZTSN7uOYg8QOLlyKnaG0IW7Fn/J0IpJsaKzmDKMhOQv1JBM9m9vg=="],
|
|
170
170
|
|
|
171
|
-
"@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.
|
|
171
|
+
"@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.16", "", { "os": "linux", "cpu": "x64" }, "sha512-TNKhgE3uJTsTzatUSSYt0Kgo+Oa2uSlSjz4r1aEIea7HX6ULBym4fAlYUhG1i6pjNf2njfCUAfKwr6C3E9Xg1w=="],
|
|
172
172
|
|
|
173
|
-
"@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.
|
|
173
|
+
"@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.16", "", { "os": "linux", "cpu": "x64" }, "sha512-7chXdpjXZ8qG0+mIxECN3cT9kvhZ3/oZhMX6Pp876P7CDrIy8nJswva6Mq357JR7eYXfuskwZxMeV1SzoZdHrA=="],
|
|
174
174
|
|
|
175
|
-
"@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.
|
|
175
|
+
"@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.16", "", { "os": "none", "cpu": "arm64" }, "sha512-Kwjt+7uNTJK5/MDkGWGVO2KQPnj8yAV75dMpfwyHZrJSXWHrniOB0aUEWlVYf3H1hOqFLIStLdM5QXq6bnKmOQ=="],
|
|
176
176
|
|
|
177
|
-
"@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.
|
|
177
|
+
"@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.16", "", { "os": "win32", "cpu": "arm64" }, "sha512-/LH6WfjDRXXJz/p5xl4TmU+jpcnwcxbKEQBW/GZE0JHfN0lGIyTtsUEGaQ/q/GikkGJ2yLKe6pwm7AnEWO8pdw=="],
|
|
178
178
|
|
|
179
|
-
"@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.
|
|
179
|
+
"@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.16", "", { "os": "win32", "cpu": "x64" }, "sha512-1lv1KvX0Z871zfk7vw+dnXMMnHNyDwMzWG8Kv3HxDXMOhzCX4SHc7HK319fInP0i+0p9D8brkfzL7pJOaGl+tw=="],
|
|
180
180
|
|
|
181
181
|
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="],
|
|
182
182
|
|
|
@@ -196,9 +196,9 @@
|
|
|
196
196
|
|
|
197
197
|
"@squadbase/react": ["@squadbase/react@0.1.0", "", { "dependencies": { "zod": "^4.3.6" }, "peerDependencies": { "@types/react": "17.x || 18.x || 19.x", "react": "17.x || 18.x || 19.x" }, "optionalPeers": ["@types/react"] }, "sha512-k+Dpyj7eH+Yjydw54iEluCjYDae086d12hWgBjNMpw4wLbQGz3CrJ6Yipodg8n1cKUt7zvwddlcTHd79bgKsXg=="],
|
|
198
198
|
|
|
199
|
-
"@squadbase/vantage": ["@squadbase/vantage@0.6.2-dev1.
|
|
199
|
+
"@squadbase/vantage": ["@squadbase/vantage@0.6.2-dev1.51e401a", "", { "dependencies": { "@base-ui/react": "^1.6.0", "@hono/node-server": "^2.1.5", "@streamdown/code": "^1.1.1", "@tailwindcss/vite": "^4.3.3", "@tanstack/react-query": "^5.101.2", "@tanstack/react-router": "^1.170.17", "@tanstack/react-table": "^8.21.3", "@vitejs/plugin-react": "^6.1.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", "date-fns": "^4.1.0", "echarts": "^6.0.0", "esbuild": "0.28.1", "fflate": "^0.8.3", "hono": "^4.13.13", "html-to-image": "^1.11.13", "lucide-react": "^0.468.0", "papaparse": "^5.7.0", "picocolors": "^1.1.1", "react-day-picker": "^10.0.1", "read-excel-file": "^9.3.10", "shiki": "3.23.0", "streamdown": "^2.5.0", "tailwind-merge": "3.6.0", "tailwindcss": "^4.3.3", "tw-animate-css": "^1.0.0", "vite": "^8.3.4" }, "peerDependencies": { "react": ">=18.2.0", "react-dom": ">=18.2.0", "typescript": ">=5.0.0" }, "optionalPeers": ["typescript"], "bin": { "vantage": "dist/cli.js" } }, "sha512-0SpIf7pmaJ8GvFGfAMDV+EXwxc67IdExqu12Ag3KEuOcYRTRWKyXDx/M53Z3iOfMcFt++2UI++hCQoIN1JkoHw=="],
|
|
200
200
|
|
|
201
|
-
"@squadbase/vantage-sdk": ["@squadbase/vantage-sdk@0.1.1-dev1.
|
|
201
|
+
"@squadbase/vantage-sdk": ["@squadbase/vantage-sdk@0.1.1-dev1.2bfcfab", "", {}, "sha512-FO8AFtS+qhnVaMDEDh8z7J9AFfDhkyytzQUUDV5ZJvI9rKtbaDR/Tq9IX9m3R2USml61u66oIuLG2CNg0KiwMw=="],
|
|
202
202
|
|
|
203
203
|
"@streamdown/code": ["@streamdown/code@1.1.1", "", { "dependencies": { "shiki": "^3.19.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0" } }, "sha512-i7HTNuDgZWb+VdrNVOam9gQhIc5MSSDXKWXgbUrn/4vSRaSMM+Rtl10MQj4wLWPNpF7p80waJsAqFP8HZfb0Jg=="],
|
|
204
204
|
|
|
@@ -512,7 +512,7 @@
|
|
|
512
512
|
|
|
513
513
|
"hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="],
|
|
514
514
|
|
|
515
|
-
"hono": ["hono@4.13.
|
|
515
|
+
"hono": ["hono@4.13.14", "", {}, "sha512-yhRLQ21U6qa9Hsu2N7Qcbh8tE+WKEcoErjIo56LeSGiGXGp9sA7UpE86Ui9uexb61KakiGwuHMn2QdV7w6i6kQ=="],
|
|
516
516
|
|
|
517
517
|
"html-to-image": ["html-to-image@1.11.13", "", {}, "sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg=="],
|
|
518
518
|
|
|
@@ -700,7 +700,7 @@
|
|
|
700
700
|
|
|
701
701
|
"points-on-path": ["points-on-path@0.2.1", "", { "dependencies": { "path-data-parser": "0.1.0", "points-on-curve": "0.2.0" } }, "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g=="],
|
|
702
702
|
|
|
703
|
-
"postcss": ["postcss@8.5.
|
|
703
|
+
"postcss": ["postcss@8.5.32", "", { "dependencies": { "nanoid": "^3.3.20", "picocolors": "^1.1.1", "source-map-js": "^1.2.2" } }, "sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g=="],
|
|
704
704
|
|
|
705
705
|
"property-information": ["property-information@7.2.0", "", {}, "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg=="],
|
|
706
706
|
|
|
@@ -716,7 +716,7 @@
|
|
|
716
716
|
|
|
717
717
|
"react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],
|
|
718
718
|
|
|
719
|
-
"read-excel-file": ["read-excel-file@9.3.
|
|
719
|
+
"read-excel-file": ["read-excel-file@9.3.14", "", { "dependencies": { "fflate": "^0.8.3", "saxen": "^11.1.0", "unzipper-esm": "^0.13.3", "worker-f": "^0.1.12" } }, "sha512-rfEpNMthm/REIpSCLnGTrQD5aW+U9rrhFuGYF+XRO8Soz+7b+rAOW1z2vJbNiEINbFPbjRW16vz0KnX41Si9qw=="],
|
|
720
720
|
|
|
721
721
|
"regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="],
|
|
722
722
|
|
|
@@ -744,7 +744,7 @@
|
|
|
744
744
|
|
|
745
745
|
"robust-predicates": ["robust-predicates@3.0.3", "", {}, "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA=="],
|
|
746
746
|
|
|
747
|
-
"rolldown": ["rolldown@1.2.
|
|
747
|
+
"rolldown": ["rolldown@1.2.16", "", { "dependencies": { "@oxc-project/types": "=0.156.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.16", "@rolldown/binding-android-arm64": "1.2.16", "@rolldown/binding-darwin-arm64": "1.2.16", "@rolldown/binding-darwin-x64": "1.2.16", "@rolldown/binding-freebsd-x64": "1.2.16", "@rolldown/binding-linux-arm-gnueabihf": "1.2.16", "@rolldown/binding-linux-arm64-gnu": "1.2.16", "@rolldown/binding-linux-arm64-musl": "1.2.16", "@rolldown/binding-linux-ppc64-gnu": "1.2.16", "@rolldown/binding-linux-s390x-gnu": "1.2.16", "@rolldown/binding-linux-x64-gnu": "1.2.16", "@rolldown/binding-linux-x64-musl": "1.2.16", "@rolldown/binding-openharmony-arm64": "1.2.16", "@rolldown/binding-win32-arm64-msvc": "1.2.16", "@rolldown/binding-win32-x64-msvc": "1.2.16" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-bWvlMpFKiTfDKfnK7FC2MPgPeWCf/Kpwsq49ApdW+FQaBZb6O6dZ4MAPbPUjp7hYQrw/RobqCzn64BRrQecGHw=="],
|
|
748
748
|
|
|
749
749
|
"roughjs": ["roughjs@4.6.6", "", { "dependencies": { "hachure-fill": "^0.5.2", "path-data-parser": "^0.1.0", "points-on-curve": "^0.2.0", "points-on-path": "^0.2.1" } }, "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ=="],
|
|
750
750
|
|
|
@@ -834,7 +834,7 @@
|
|
|
834
834
|
|
|
835
835
|
"web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
|
|
836
836
|
|
|
837
|
-
"worker-f": ["worker-f@0.1.
|
|
837
|
+
"worker-f": ["worker-f@0.1.21", "", {}, "sha512-pMi7wCz3uZVxRvRSphyaIYoN7rm9bV0usifTib7u01kKU+hOo+/hFwhajYnpOCHyr0Xp3/2ulc4F+Jm2a3YIfg=="],
|
|
838
838
|
|
|
839
839
|
"zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="],
|
|
840
840
|
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@squadbase/react": "^0.1.0",
|
|
15
|
-
"@squadbase/vantage": "0.6.2-dev1.
|
|
16
|
-
"@squadbase/vantage-sdk": "0.1.1-dev1.
|
|
15
|
+
"@squadbase/vantage": "0.6.2-dev1.51e401a",
|
|
16
|
+
"@squadbase/vantage-sdk": "0.1.1-dev1.2bfcfab",
|
|
17
17
|
"date-fns": "^4.1.0",
|
|
18
18
|
"lucide-react": "^0.468.0",
|
|
19
19
|
"react": "^19.3.1",
|
|
@@ -7,6 +7,13 @@ import type { NavGroup } from "@squadbase/vantage/components"
|
|
|
7
7
|
import { BuildRecovery } from "./components/build-recovery"
|
|
8
8
|
import { UserCard } from "./components/user-card"
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* The app's display language, written to `<html lang>` (a BCP 47 literal, e.g.
|
|
12
|
+
* "ja"). Set it to the language of the app's content: it also switches the slide
|
|
13
|
+
* toolbar messages and enables Japanese phrase-aware line breaking in slides.
|
|
14
|
+
*/
|
|
15
|
+
export const lang = "en"
|
|
16
|
+
|
|
10
17
|
/**
|
|
11
18
|
* The nav *is* the route list — adding a page file puts it in the nav, with no
|
|
12
19
|
* second list to keep in sync. Dynamic routes (`sales/[id].tsx`) have no single
|
|
@@ -57,7 +57,7 @@ function DetailRow({ label, children }: { label: string; children: React.ReactNo
|
|
|
57
57
|
|
|
58
58
|
function UserInfo({ user }: { user: User }) {
|
|
59
59
|
const fullName = `${user.firstName} ${user.lastName}`
|
|
60
|
-
const rolesHref =
|
|
60
|
+
const rolesHref = document.documentElement.lang.startsWith("ja")
|
|
61
61
|
? "https://www.squadbase.dev/ja/docs/access-control#プロジェクトロール"
|
|
62
62
|
: "https://www.squadbase.dev/docs/access-control#project-roles"
|
|
63
63
|
|
|
@@ -68,7 +68,7 @@ const CHARTS = [
|
|
|
68
68
|
export default function HomePage() {
|
|
69
69
|
// `data-vantage-sample` marks this page as the untouched template sample (the coding
|
|
70
70
|
// agent looks for it). Remove it together with the sample content.
|
|
71
|
-
const sampleNote =
|
|
71
|
+
const sampleNote = document.documentElement.lang.startsWith("ja")
|
|
72
72
|
? "サンプルデータです。お手元のデータに置き換えて始めましょう。"
|
|
73
73
|
: "Sample data — replace with your own to get started."
|
|
74
74
|
|
|
@@ -17,32 +17,117 @@
|
|
|
17
17
|
/* --radius: 0.625rem; */
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
/* Page typeface.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
/* Page typeface. `--font-sans` (Vantage theme.css, overridable by the theme range
|
|
21
|
+
below or here) already lists Latin system faces and then Japanese ones, so kana
|
|
22
|
+
and kanji do not fall back to a thin locale default. Change the typeface by
|
|
23
|
+
overriding `--font-sans`; keep the Japanese families if you put a webfont in
|
|
24
|
+
front. */
|
|
25
25
|
body {
|
|
26
|
-
font-family:
|
|
27
|
-
-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Hiragino Sans",
|
|
28
|
-
"Hiragino Kaku Gothic ProN", "Noto Sans JP", Meiryo, ui-sans-serif, system-ui, sans-serif;
|
|
26
|
+
font-family: var(--font-sans);
|
|
29
27
|
}
|
|
30
28
|
|
|
31
|
-
/*
|
|
29
|
+
/* squadkit-theme — regenerated by `theme`; edits here are lost */
|
|
30
|
+
/* theme: neutral */
|
|
32
31
|
:root {
|
|
33
|
-
--
|
|
34
|
-
--
|
|
35
|
-
--
|
|
36
|
-
--
|
|
37
|
-
--
|
|
32
|
+
--radius: 0.5rem;
|
|
33
|
+
--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Hiragino Sans", "Hiragino Kaku Gothic ProN", "Noto Sans JP", Meiryo, ui-sans-serif, system-ui, sans-serif;
|
|
34
|
+
--background: oklch(0.975 0.004 255);
|
|
35
|
+
--card: oklch(1 0 0);
|
|
36
|
+
--popover: oklch(1 0 0);
|
|
37
|
+
--secondary: oklch(0.965 0.005 255);
|
|
38
|
+
--muted: oklch(0.965 0.005 255);
|
|
39
|
+
--accent: oklch(0.955 0.01 255);
|
|
40
|
+
--sidebar: oklch(0.985 0.003 255);
|
|
41
|
+
--sidebar-accent: oklch(0.955 0.01 255);
|
|
42
|
+
--border: oklch(0.93 0.006 255);
|
|
43
|
+
--input: oklch(0.9 0.01 255);
|
|
44
|
+
--sidebar-border: oklch(0.915 0.008 255);
|
|
45
|
+
--foreground: oklch(0.21 0.02 260);
|
|
46
|
+
--card-foreground: oklch(0.21 0.02 260);
|
|
47
|
+
--popover-foreground: oklch(0.21 0.02 260);
|
|
48
|
+
--secondary-foreground: oklch(0.25 0.02 260);
|
|
49
|
+
--muted-foreground: oklch(0.5 0.02 258);
|
|
50
|
+
--accent-foreground: oklch(0.25 0.02 260);
|
|
51
|
+
--sidebar-foreground: oklch(0.21 0.02 260);
|
|
52
|
+
--sidebar-accent-foreground: oklch(0.25 0.02 260);
|
|
53
|
+
--primary: oklch(0.55 0.2 262);
|
|
54
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
55
|
+
--ring: oklch(0.7 0.12 262);
|
|
56
|
+
--sidebar-primary: oklch(0.55 0.2 262);
|
|
57
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
58
|
+
--sidebar-ring: oklch(0.7 0.12 262);
|
|
59
|
+
--chart-1: oklch(0.55 0.2 262);
|
|
60
|
+
--chart-2: oklch(0.62 0.17 118);
|
|
61
|
+
--chart-3: oklch(0.5 0.19 352);
|
|
62
|
+
--chart-4: oklch(0.62 0.1 195);
|
|
63
|
+
--chart-5: oklch(0.44 0.18 300);
|
|
64
|
+
--positive: oklch(0.52 0.14 150);
|
|
65
|
+
--positive-subtle: oklch(0.96 0.04 150);
|
|
66
|
+
--positive-fill: oklch(0.62 0.15 150);
|
|
67
|
+
--negative: oklch(0.53 0.19 25);
|
|
68
|
+
--negative-subtle: oklch(0.96 0.03 25);
|
|
69
|
+
--negative-fill: oklch(0.62 0.17 25);
|
|
70
|
+
--warning: oklch(0.53 0.12 70);
|
|
71
|
+
--warning-subtle: oklch(0.96 0.05 85);
|
|
72
|
+
--warning-fill: oklch(0.79 0.16 82);
|
|
73
|
+
--info: oklch(0.52 0.16 255);
|
|
74
|
+
--info-subtle: oklch(0.96 0.03 250);
|
|
75
|
+
--info-fill: oklch(0.62 0.15 250);
|
|
76
|
+
--neutral: oklch(0.52 0 0);
|
|
77
|
+
--neutral-subtle: oklch(0.96 0 0);
|
|
78
|
+
--neutral-fill: oklch(0.62 0 0);
|
|
79
|
+
--destructive: oklch(0.53 0.21 27.325);
|
|
80
|
+
--destructive-foreground: oklch(0.985 0 0);
|
|
38
81
|
}
|
|
39
82
|
|
|
40
83
|
.dark,
|
|
41
84
|
[data-theme="dark"] {
|
|
42
|
-
--
|
|
43
|
-
--
|
|
44
|
-
--
|
|
45
|
-
--
|
|
46
|
-
--
|
|
85
|
+
--background: oklch(0.16 0.012 262);
|
|
86
|
+
--card: oklch(0.215 0.015 262);
|
|
87
|
+
--popover: oklch(0.235 0.016 262);
|
|
88
|
+
--secondary: oklch(0.27 0.016 262);
|
|
89
|
+
--muted: oklch(0.27 0.016 262);
|
|
90
|
+
--accent: oklch(0.3 0.02 262);
|
|
91
|
+
--sidebar: oklch(0.2 0.014 262);
|
|
92
|
+
--sidebar-accent: oklch(0.3 0.02 262);
|
|
93
|
+
--border: oklch(1 0 0 / 10%);
|
|
94
|
+
--input: oklch(1 0 0 / 15%);
|
|
95
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
|
96
|
+
--foreground: oklch(0.96 0.005 255);
|
|
97
|
+
--card-foreground: oklch(0.96 0.005 255);
|
|
98
|
+
--popover-foreground: oklch(0.96 0.005 255);
|
|
99
|
+
--secondary-foreground: oklch(0.96 0.005 255);
|
|
100
|
+
--muted-foreground: oklch(0.72 0.02 258);
|
|
101
|
+
--accent-foreground: oklch(0.96 0.005 255);
|
|
102
|
+
--sidebar-foreground: oklch(0.96 0.005 255);
|
|
103
|
+
--sidebar-accent-foreground: oklch(0.96 0.005 255);
|
|
104
|
+
--primary: oklch(0.68 0.19 262);
|
|
105
|
+
--primary-foreground: oklch(0.145 0.02 262);
|
|
106
|
+
--ring: oklch(0.6 0.15 262);
|
|
107
|
+
--sidebar-primary: oklch(0.68 0.19 262);
|
|
108
|
+
--sidebar-primary-foreground: oklch(0.145 0.02 262);
|
|
109
|
+
--sidebar-ring: oklch(0.6 0.15 262);
|
|
110
|
+
--chart-1: oklch(0.56 0.19 262);
|
|
111
|
+
--chart-2: oklch(0.75 0.17 118);
|
|
112
|
+
--chart-3: oklch(0.64 0.19 352);
|
|
113
|
+
--chart-4: oklch(0.78 0.105 195);
|
|
114
|
+
--chart-5: oklch(0.71 0.17 300);
|
|
115
|
+
--positive: oklch(0.76 0.15 150);
|
|
116
|
+
--positive-subtle: oklch(0.27 0.05 150);
|
|
117
|
+
--positive-fill: oklch(0.56 0.13 150);
|
|
118
|
+
--negative: oklch(0.74 0.15 22);
|
|
119
|
+
--negative-subtle: oklch(0.27 0.06 25);
|
|
120
|
+
--negative-fill: oklch(0.56 0.15 22);
|
|
121
|
+
--warning: oklch(0.8 0.14 80);
|
|
122
|
+
--warning-subtle: oklch(0.27 0.05 75);
|
|
123
|
+
--warning-fill: oklch(0.73 0.145 78);
|
|
124
|
+
--info: oklch(0.75 0.12 250);
|
|
125
|
+
--info-subtle: oklch(0.27 0.06 255);
|
|
126
|
+
--info-fill: oklch(0.56 0.13 250);
|
|
127
|
+
--neutral: oklch(0.85 0 0);
|
|
128
|
+
--neutral-subtle: oklch(0.27 0 0);
|
|
129
|
+
--neutral-fill: oklch(0.56 0 0);
|
|
130
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
131
|
+
--destructive-foreground: oklch(0.145 0.02 262);
|
|
47
132
|
}
|
|
48
|
-
/*
|
|
133
|
+
/* squadkit-theme:end */
|