@squadbase/vantage-template 0.1.1-dev1.57af5cd → 0.1.1-dev1.680772d
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 +11 -1
- package/base-template/.squadbase/skills/vantage-add-feature/SKILL.md +9 -7
- package/base-template/.squadbase/skills/vantage-app/SKILL.md +10 -6
- package/base-template/.squadbase/skills/vantage-design/SKILL.md +36 -24
- package/base-template/.squadbase/skills/vantage-design/references/extract.md +16 -14
- package/base-template/.squadbase/skills/vantage-design/references/format.md +6 -5
- package/base-template/.squadbase/skills/vantage-design/references/presets.md +60 -110
- package/base-template/.squadbase/skills/vantage-pitfalls/SKILL.md +45 -1
- package/base-template/.squadbase/skills/vantage-slide/SKILL.md +299 -0
- package/base-template/.squadbase/skills/vantage-slide/references/morph.md +102 -0
- package/base-template/.squadbase/skills/vantage-slide/references/steps.md +57 -0
- package/base-template/.squadbase/skills/vantage-slide/references/tokens.md +87 -0
- package/base-template/.squadbase/skills/vantage-slide/references/transitions.md +196 -0
- package/base-template/AGENTS.md +113 -4
- package/base-template/DESIGN.md +7 -6
- package/base-template/agents/api.md +29 -0
- package/base-template/agents/csv.md +2 -1
- package/base-template/agents/doc.md +49 -3
- package/base-template/agents/page.md +54 -9
- package/base-template/agents/slide.md +61 -3
- package/base-template/agents/xlsx.md +2 -1
- package/base-template/bun.lock +78 -68
- package/base-template/bunfig.toml +5 -0
- package/base-template/package.json +6 -6
- package/base-template/src/_layout.tsx +9 -9
- package/base-template/src/components/build-recovery.tsx +37 -1
- package/base-template/src/components/user-card.tsx +10 -10
- package/base-template/src/index.tsx +7 -3
- package/base-template/src/styles.css +108 -12
- package/dist/index.js +956 -0
- package/package.json +20 -17
- package/ui-templates/CLAUDE.md +2 -0
- package/ui-templates/kpi-chart-simple/pages/index.tsx +48 -48
- package/ui-templates/kpi-chart-simple-ja/pages/index.tsx +48 -48
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@squadbase/vantage-template",
|
|
3
|
-
"version": "0.1.1-dev1.
|
|
3
|
+
"version": "0.1.1-dev1.680772d",
|
|
4
4
|
"description": "CLI tool for initializing and customizing Squadbase Vantage projects.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"squadbase",
|
|
@@ -36,29 +36,32 @@
|
|
|
36
36
|
"access": "public",
|
|
37
37
|
"registry": "https://registry.npmjs.org"
|
|
38
38
|
},
|
|
39
|
-
"scripts": {
|
|
40
|
-
"sync-base": "rsync -a --delete --exclude='node_modules' --exclude='dist' --exclude='.vantage' --exclude='*.tsbuildinfo' --exclude='*.log' template/ base-template/ && mv base-template/.gitignore base-template/_gitignore",
|
|
41
|
-
"build": "npm run sync-base && tsup",
|
|
42
|
-
"type-check": "tsc",
|
|
43
|
-
"agents": "node scripts/build-agents.cjs",
|
|
44
|
-
"agents:check": "node scripts/build-agents.cjs --check",
|
|
45
|
-
"template:install": "bun install --cwd template --frozen-lockfile",
|
|
46
|
-
"template:build": "npm --prefix template run build",
|
|
47
|
-
"prepublishOnly": "npm run agents:check && npm run build",
|
|
48
|
-
"release": "npm publish --@squadbase:registry=https://registry.npmjs.org",
|
|
49
|
-
"dev": "node scripts/dev.mjs",
|
|
50
|
-
"screenshot": "node scripts/screenshot.mjs"
|
|
51
|
-
},
|
|
52
39
|
"devDependencies": {
|
|
53
40
|
"@types/node": "^22.15.0",
|
|
54
41
|
"playwright": "^1.49.0",
|
|
55
42
|
"tsup": "^8.4.0",
|
|
56
|
-
"typescript": "~5.7.0"
|
|
43
|
+
"typescript": "~5.7.0",
|
|
44
|
+
"vitest": "^5.0.5",
|
|
45
|
+
"@squadbase/squadkit": "0.0.0"
|
|
57
46
|
},
|
|
58
47
|
"optionalDependencies": {
|
|
59
48
|
"@ai-sdk/anthropic": "^2.0.0",
|
|
60
49
|
"@ai-sdk/google": "^2.0.0",
|
|
61
|
-
"@ai-sdk/openai": "
|
|
50
|
+
"@ai-sdk/openai": "2.0.122",
|
|
62
51
|
"ai": "^5.0.52"
|
|
52
|
+
},
|
|
53
|
+
"gitHead": "680772d94c2c8c329ca5b5eaa0d76966c44ecc45",
|
|
54
|
+
"scripts": {
|
|
55
|
+
"sync-base": "rsync -a --delete --exclude='node_modules' --exclude='dist' --exclude='.vantage' --exclude='*.tsbuildinfo' --exclude='*.log' template/ base-template/ && mv base-template/.gitignore base-template/_gitignore",
|
|
56
|
+
"build": "pnpm run sync-base && tsup",
|
|
57
|
+
"type-check": "tsc",
|
|
58
|
+
"test": "vitest run",
|
|
59
|
+
"agents": "node scripts/build-agents.cjs",
|
|
60
|
+
"agents:check": "node scripts/build-agents.cjs --check",
|
|
61
|
+
"template:install": "bun install --cwd template --frozen-lockfile",
|
|
62
|
+
"template:build": "bun run --cwd template build",
|
|
63
|
+
"release": "pnpm publish --@squadbase:registry=https://registry.npmjs.org",
|
|
64
|
+
"dev": "node scripts/dev.mjs",
|
|
65
|
+
"screenshot": "node scripts/screenshot.mjs"
|
|
63
66
|
}
|
|
64
|
-
}
|
|
67
|
+
}
|
package/ui-templates/CLAUDE.md
CHANGED
|
@@ -96,6 +96,8 @@ server/api/<endpoint>.ts # ★ サンプルデータ + GET ハ
|
|
|
96
96
|
| --- | --- |
|
|
97
97
|
| `PageShell*` / `DashboardCard*` / `EChart` / `EChartsOption` / `DataTable*` / `ColumnDef` / `DateRangePicker` / `FilterBar*` / `FunnelSteps` / `MetricValue` / `TrendIndicator` / `StatusBadge` / `SegmentedControl` / `MultiSelect` / `SearchableSelect` / `SectionHeader` / `AppShell` / `Placeholder` / `Sparkline` | `@squadbase/vantage/components` |
|
|
98
98
|
| `Button` / `Input` / `Badge` / `Tabs*` / `ToggleGroup*` / `Table*` / `Select*` / `Dialog*` / `cn` ほか shadcn プリミティブ | `@squadbase/vantage/ui` |
|
|
99
|
+
|
|
100
|
+
型付きチャート(`LineChart` / `AreaChart` / `BarChart` / `DonutChart` / `BarList` / `CategoryBar` / `ProgressCircle` / `Tracker`、`@squadbase/vantage/components`)と `Avatar` / `Pagination` / `RadioGroup` / `AlertDialog` / `Drawer` / `Toaster` / `Field` / `Combobox` / `HoverCard` / `Kbd`(`@squadbase/vantage/ui`)は 0.6.3 で入った。雛形の依存が `^0.5.3` の間は使わない(上の EChart の書き方のまま)。
|
|
99
101
|
| `definePage` | `@squadbase/vantage` |
|
|
100
102
|
| `Link` / `Outlet` / `useParams` / `useSearch` / `useNavigate` / `useRoutes` / `useCurrentRoute` / `useSearchParam` / `useSearchState` | `@squadbase/vantage/router` |
|
|
101
103
|
| `useApiQuery` / `useApiMutation` / `useQuery` / `useMutation` / `apiFetch` | `@squadbase/vantage/query` |
|
|
@@ -104,54 +104,6 @@ const RANGE_OPTIONS: SegmentOption[] = [
|
|
|
104
104
|
{ label: "90 days", value: "90d" },
|
|
105
105
|
]
|
|
106
106
|
|
|
107
|
-
function DashboardBody({ data }: { data: KpiSummary }) {
|
|
108
|
-
return (
|
|
109
|
-
<>
|
|
110
|
-
<div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
|
|
111
|
-
{data.kpis.map((kpi) => {
|
|
112
|
-
const { label, icon: Icon, format } = KPI_META[kpi.id]
|
|
113
|
-
return (
|
|
114
|
-
<DashboardCard key={kpi.id}>
|
|
115
|
-
<DashboardCardHeader>
|
|
116
|
-
<DashboardCardTitle className="text-muted-foreground">
|
|
117
|
-
{label}
|
|
118
|
-
</DashboardCardTitle>
|
|
119
|
-
<DashboardCardAction>
|
|
120
|
-
<Icon className="size-4 text-muted-foreground" />
|
|
121
|
-
</DashboardCardAction>
|
|
122
|
-
</DashboardCardHeader>
|
|
123
|
-
<DashboardCardContent>
|
|
124
|
-
<Placeholder className="text-2xl font-bold">
|
|
125
|
-
{format(kpi.value)}
|
|
126
|
-
</Placeholder>
|
|
127
|
-
<div className="mt-2">
|
|
128
|
-
<Placeholder className="text-sm font-medium">
|
|
129
|
-
{kpi.change >= 0 ? `+${kpi.change}%` : `${kpi.change}%`}
|
|
130
|
-
</Placeholder>
|
|
131
|
-
</div>
|
|
132
|
-
<Sparkline
|
|
133
|
-
data={kpi.sparklineData.map((v) => ({ value: v }))}
|
|
134
|
-
height={32}
|
|
135
|
-
area
|
|
136
|
-
className="mt-3"
|
|
137
|
-
/>
|
|
138
|
-
</DashboardCardContent>
|
|
139
|
-
</DashboardCard>
|
|
140
|
-
)
|
|
141
|
-
})}
|
|
142
|
-
</div>
|
|
143
|
-
|
|
144
|
-
<DashboardCardPreset title="Trend" description="Values over the selected period">
|
|
145
|
-
<EChart option={trendOption(data.trend)} height="320px" />
|
|
146
|
-
</DashboardCardPreset>
|
|
147
|
-
|
|
148
|
-
<DashboardCardPreset title="Top items" description="Ranked by value">
|
|
149
|
-
<TopItemsTable data={data.topItems} />
|
|
150
|
-
</DashboardCardPreset>
|
|
151
|
-
</>
|
|
152
|
-
)
|
|
153
|
-
}
|
|
154
|
-
|
|
155
107
|
export default function HomePage() {
|
|
156
108
|
// Filter state belongs in the URL rather than `useState`: it survives a
|
|
157
109
|
// reload, and a pasted link reproduces exactly what you were looking at.
|
|
@@ -198,3 +150,51 @@ export default function HomePage() {
|
|
|
198
150
|
</PageShell>
|
|
199
151
|
)
|
|
200
152
|
}
|
|
153
|
+
|
|
154
|
+
function DashboardBody({ data }: { data: KpiSummary }) {
|
|
155
|
+
return (
|
|
156
|
+
<>
|
|
157
|
+
<div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
|
|
158
|
+
{data.kpis.map((kpi) => {
|
|
159
|
+
const { label, icon: Icon, format } = KPI_META[kpi.id]
|
|
160
|
+
return (
|
|
161
|
+
<DashboardCard key={kpi.id} data-sq-ref={kpi.id}>
|
|
162
|
+
<DashboardCardHeader>
|
|
163
|
+
<DashboardCardTitle className="text-muted-foreground">
|
|
164
|
+
{label}
|
|
165
|
+
</DashboardCardTitle>
|
|
166
|
+
<DashboardCardAction>
|
|
167
|
+
<Icon className="size-4 text-muted-foreground" />
|
|
168
|
+
</DashboardCardAction>
|
|
169
|
+
</DashboardCardHeader>
|
|
170
|
+
<DashboardCardContent>
|
|
171
|
+
<Placeholder className="text-2xl font-bold">
|
|
172
|
+
{format(kpi.value)}
|
|
173
|
+
</Placeholder>
|
|
174
|
+
<div className="mt-2">
|
|
175
|
+
<Placeholder className="text-sm font-medium">
|
|
176
|
+
{kpi.change >= 0 ? `+${kpi.change}%` : `${kpi.change}%`}
|
|
177
|
+
</Placeholder>
|
|
178
|
+
</div>
|
|
179
|
+
<Sparkline
|
|
180
|
+
data={kpi.sparklineData.map((v) => ({ value: v }))}
|
|
181
|
+
height={32}
|
|
182
|
+
area
|
|
183
|
+
className="mt-3"
|
|
184
|
+
/>
|
|
185
|
+
</DashboardCardContent>
|
|
186
|
+
</DashboardCard>
|
|
187
|
+
)
|
|
188
|
+
})}
|
|
189
|
+
</div>
|
|
190
|
+
|
|
191
|
+
<DashboardCardPreset data-sq-ref="trend" title="Trend" description="Values over the selected period">
|
|
192
|
+
<EChart option={trendOption(data.trend)} height="320px" />
|
|
193
|
+
</DashboardCardPreset>
|
|
194
|
+
|
|
195
|
+
<DashboardCardPreset data-sq-ref="top-items" title="Top items" description="Ranked by value">
|
|
196
|
+
<TopItemsTable data={data.topItems} />
|
|
197
|
+
</DashboardCardPreset>
|
|
198
|
+
</>
|
|
199
|
+
)
|
|
200
|
+
}
|
|
@@ -104,54 +104,6 @@ const RANGE_OPTIONS: SegmentOption[] = [
|
|
|
104
104
|
{ label: "90日", value: "90d" },
|
|
105
105
|
]
|
|
106
106
|
|
|
107
|
-
function DashboardBody({ data }: { data: KpiSummary }) {
|
|
108
|
-
return (
|
|
109
|
-
<>
|
|
110
|
-
<div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
|
|
111
|
-
{data.kpis.map((kpi) => {
|
|
112
|
-
const { label, icon: Icon, format } = KPI_META[kpi.id]
|
|
113
|
-
return (
|
|
114
|
-
<DashboardCard key={kpi.id}>
|
|
115
|
-
<DashboardCardHeader>
|
|
116
|
-
<DashboardCardTitle className="text-muted-foreground">
|
|
117
|
-
{label}
|
|
118
|
-
</DashboardCardTitle>
|
|
119
|
-
<DashboardCardAction>
|
|
120
|
-
<Icon className="size-4 text-muted-foreground" />
|
|
121
|
-
</DashboardCardAction>
|
|
122
|
-
</DashboardCardHeader>
|
|
123
|
-
<DashboardCardContent>
|
|
124
|
-
<Placeholder className="text-2xl font-bold">
|
|
125
|
-
{format(kpi.value)}
|
|
126
|
-
</Placeholder>
|
|
127
|
-
<div className="mt-2">
|
|
128
|
-
<Placeholder className="text-sm font-medium">
|
|
129
|
-
{kpi.change >= 0 ? `+${kpi.change}%` : `${kpi.change}%`}
|
|
130
|
-
</Placeholder>
|
|
131
|
-
</div>
|
|
132
|
-
<Sparkline
|
|
133
|
-
data={kpi.sparklineData.map((v) => ({ value: v }))}
|
|
134
|
-
height={32}
|
|
135
|
-
area
|
|
136
|
-
className="mt-3"
|
|
137
|
-
/>
|
|
138
|
-
</DashboardCardContent>
|
|
139
|
-
</DashboardCard>
|
|
140
|
-
)
|
|
141
|
-
})}
|
|
142
|
-
</div>
|
|
143
|
-
|
|
144
|
-
<DashboardCardPreset title="トレンド" description="選択期間の値">
|
|
145
|
-
<EChart option={trendOption(data.trend)} height="320px" />
|
|
146
|
-
</DashboardCardPreset>
|
|
147
|
-
|
|
148
|
-
<DashboardCardPreset title="上位項目" description="値で並べ替え">
|
|
149
|
-
<TopItemsTable data={data.topItems} />
|
|
150
|
-
</DashboardCardPreset>
|
|
151
|
-
</>
|
|
152
|
-
)
|
|
153
|
-
}
|
|
154
|
-
|
|
155
107
|
export default function HomePage() {
|
|
156
108
|
// 絞り込み状態は useState ではなく URL に置く。リロードで消えず、URL を
|
|
157
109
|
// そのまま共有すれば相手も同じ画面を見られる。
|
|
@@ -198,3 +150,51 @@ export default function HomePage() {
|
|
|
198
150
|
</PageShell>
|
|
199
151
|
)
|
|
200
152
|
}
|
|
153
|
+
|
|
154
|
+
function DashboardBody({ data }: { data: KpiSummary }) {
|
|
155
|
+
return (
|
|
156
|
+
<>
|
|
157
|
+
<div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
|
|
158
|
+
{data.kpis.map((kpi) => {
|
|
159
|
+
const { label, icon: Icon, format } = KPI_META[kpi.id]
|
|
160
|
+
return (
|
|
161
|
+
<DashboardCard key={kpi.id} data-sq-ref={kpi.id}>
|
|
162
|
+
<DashboardCardHeader>
|
|
163
|
+
<DashboardCardTitle className="text-muted-foreground">
|
|
164
|
+
{label}
|
|
165
|
+
</DashboardCardTitle>
|
|
166
|
+
<DashboardCardAction>
|
|
167
|
+
<Icon className="size-4 text-muted-foreground" />
|
|
168
|
+
</DashboardCardAction>
|
|
169
|
+
</DashboardCardHeader>
|
|
170
|
+
<DashboardCardContent>
|
|
171
|
+
<Placeholder className="text-2xl font-bold">
|
|
172
|
+
{format(kpi.value)}
|
|
173
|
+
</Placeholder>
|
|
174
|
+
<div className="mt-2">
|
|
175
|
+
<Placeholder className="text-sm font-medium">
|
|
176
|
+
{kpi.change >= 0 ? `+${kpi.change}%` : `${kpi.change}%`}
|
|
177
|
+
</Placeholder>
|
|
178
|
+
</div>
|
|
179
|
+
<Sparkline
|
|
180
|
+
data={kpi.sparklineData.map((v) => ({ value: v }))}
|
|
181
|
+
height={32}
|
|
182
|
+
area
|
|
183
|
+
className="mt-3"
|
|
184
|
+
/>
|
|
185
|
+
</DashboardCardContent>
|
|
186
|
+
</DashboardCard>
|
|
187
|
+
)
|
|
188
|
+
})}
|
|
189
|
+
</div>
|
|
190
|
+
|
|
191
|
+
<DashboardCardPreset data-sq-ref="trend" title="トレンド" description="選択期間の値">
|
|
192
|
+
<EChart option={trendOption(data.trend)} height="320px" />
|
|
193
|
+
</DashboardCardPreset>
|
|
194
|
+
|
|
195
|
+
<DashboardCardPreset data-sq-ref="top-items" title="上位項目" description="値で並べ替え">
|
|
196
|
+
<TopItemsTable data={data.topItems} />
|
|
197
|
+
</DashboardCardPreset>
|
|
198
|
+
</>
|
|
199
|
+
)
|
|
200
|
+
}
|