ksk-design-system 1.35.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/AGENTS.md +190 -0
- package/CLAUDE.md +189 -0
- package/DESIGN.md +190 -0
- package/LICENSE +21 -0
- package/MIGRATION.md +107 -0
- package/PUBLISHING.md +160 -0
- package/README.md +59 -0
- package/RELEASE.md +82 -0
- package/bin/init.js +112 -0
- package/contracts/components.json +1443 -0
- package/contracts/rules.json +447 -0
- package/dist/class-names.js +4 -0
- package/dist/index.js +13157 -0
- package/dist/native/ui.js +4928 -0
- package/dist/native.js +1559 -0
- package/dist/server-variants-Dr_V3bDI.js +55 -0
- package/dist/types/class-names.d.ts +27 -0
- package/dist/types/components/patterns/admin/bulk-actions.d.ts +17 -0
- package/dist/types/components/patterns/admin/chart-controls.d.ts +16 -0
- package/dist/types/components/patterns/admin/data-table.d.ts +165 -0
- package/dist/types/components/patterns/admin/image-uploader.d.ts +14 -0
- package/dist/types/components/patterns/admin/kebab-menu.d.ts +17 -0
- package/dist/types/components/patterns/admin/notification-list.d.ts +16 -0
- package/dist/types/components/patterns/admin/search-panel.d.ts +9 -0
- package/dist/types/components/patterns/admin/status-tabs.d.ts +13 -0
- package/dist/types/components/patterns/app-header.d.ts +76 -0
- package/dist/types/components/patterns/banner-carousel.d.ts +25 -0
- package/dist/types/components/patterns/banner.d.ts +13 -0
- package/dist/types/components/patterns/bottom-sheet-form.d.ts +17 -0
- package/dist/types/components/patterns/category-nav.d.ts +43 -0
- package/dist/types/components/patterns/category-scroll.d.ts +53 -0
- package/dist/types/components/patterns/chip-selector.d.ts +20 -0
- package/dist/types/components/patterns/chip.d.ts +42 -0
- package/dist/types/components/patterns/coach-mark-overlay.d.ts +66 -0
- package/dist/types/components/patterns/commerce/bottom-tab-bar.d.ts +27 -0
- package/dist/types/components/patterns/commerce/filter-bar.d.ts +39 -0
- package/dist/types/components/patterns/commerce/image-carousel.d.ts +14 -0
- package/dist/types/components/patterns/commerce/order-summary.d.ts +26 -0
- package/dist/types/components/patterns/commerce/price-display.d.ts +20 -0
- package/dist/types/components/patterns/commerce/product-card.d.ts +50 -0
- package/dist/types/components/patterns/commerce/product-carousel.d.ts +15 -0
- package/dist/types/components/patterns/commerce/quantity-selector.d.ts +21 -0
- package/dist/types/components/patterns/commerce/rating-display.d.ts +15 -0
- package/dist/types/components/patterns/commerce/review-card.d.ts +22 -0
- package/dist/types/components/patterns/commerce/review-summary.d.ts +12 -0
- package/dist/types/components/patterns/confirm-dialog.d.ts +32 -0
- package/dist/types/components/patterns/cookie-consent.d.ts +62 -0
- package/dist/types/components/patterns/empty-state.d.ts +15 -0
- package/dist/types/components/patterns/error-state.d.ts +10 -0
- package/dist/types/components/patterns/file-upload.d.ts +31 -0
- package/dist/types/components/patterns/filter-chip.d.ts +26 -0
- package/dist/types/components/patterns/footer.d.ts +24 -0
- package/dist/types/components/patterns/form-field.d.ts +30 -0
- package/dist/types/components/patterns/form.d.ts +13 -0
- package/dist/types/components/patterns/list-item.d.ts +23 -0
- package/dist/types/components/patterns/list-skeletons.d.ts +43 -0
- package/dist/types/components/patterns/menu-drawer.d.ts +27 -0
- package/dist/types/components/patterns/notification-badge.d.ts +15 -0
- package/dist/types/components/patterns/progress-steps.d.ts +7 -0
- package/dist/types/components/patterns/review-overlay.d.ts +25 -0
- package/dist/types/components/patterns/search-bar.d.ts +6 -0
- package/dist/types/components/patterns/section-header.d.ts +8 -0
- package/dist/types/components/patterns/share-buttons.d.ts +13 -0
- package/dist/types/components/patterns/shells/admin-shell.d.ts +8 -0
- package/dist/types/components/patterns/shells/app-shell.d.ts +7 -0
- package/dist/types/components/patterns/shells/marketing-shell.d.ts +7 -0
- package/dist/types/components/patterns/simple-pagination.d.ts +69 -0
- package/dist/types/components/patterns/stat-card.d.ts +43 -0
- package/dist/types/components/patterns/sticky-action-bar.d.ts +27 -0
- package/dist/types/components/patterns/swipe-row.d.ts +17 -0
- package/dist/types/components/patterns/tag-input.d.ts +20 -0
- package/dist/types/components/patterns/tag.d.ts +7 -0
- package/dist/types/components/ui/accordion.d.ts +7 -0
- package/dist/types/components/ui/alert-dialog.d.ts +47 -0
- package/dist/types/components/ui/alert.d.ts +45 -0
- package/dist/types/components/ui/auto-grow-textarea.d.ts +40 -0
- package/dist/types/components/ui/avatar.d.ts +6 -0
- package/dist/types/components/ui/badge.d.ts +18 -0
- package/dist/types/components/ui/breadcrumb.d.ts +16 -0
- package/dist/types/components/ui/button.d.ts +29 -0
- package/dist/types/components/ui/calendar.d.ts +5 -0
- package/dist/types/components/ui/card.d.ts +28 -0
- package/dist/types/components/ui/checkbox-card.d.ts +29 -0
- package/dist/types/components/ui/checkbox-field.d.ts +24 -0
- package/dist/types/components/ui/checkbox-group.d.ts +33 -0
- package/dist/types/components/ui/checkbox.d.ts +44 -0
- package/dist/types/components/ui/coach-mark.d.ts +27 -0
- package/dist/types/components/ui/collapsible.d.ts +24 -0
- package/dist/types/components/ui/combobox.d.ts +19 -0
- package/dist/types/components/ui/countdown-timer.d.ts +39 -0
- package/dist/types/components/ui/date-picker.d.ts +53 -0
- package/dist/types/components/ui/dialog.d.ts +54 -0
- package/dist/types/components/ui/dropdown-filter.d.ts +35 -0
- package/dist/types/components/ui/dropdown-menu.d.ts +42 -0
- package/dist/types/components/ui/error-boundary.d.ts +66 -0
- package/dist/types/components/ui/form.d.ts +61 -0
- package/dist/types/components/ui/hover-card.d.ts +24 -0
- package/dist/types/components/ui/image-gallery.d.ts +28 -0
- package/dist/types/components/ui/input.d.ts +17 -0
- package/dist/types/components/ui/label.d.ts +4 -0
- package/dist/types/components/ui/multi-select.d.ts +21 -0
- package/dist/types/components/ui/navigation-bar.d.ts +58 -0
- package/dist/types/components/ui/number-input.d.ts +20 -0
- package/dist/types/components/ui/pagination.d.ts +26 -0
- package/dist/types/components/ui/pill-toggle.d.ts +16 -0
- package/dist/types/components/ui/popover.d.ts +7 -0
- package/dist/types/components/ui/progress-ring.d.ts +31 -0
- package/dist/types/components/ui/progress.d.ts +34 -0
- package/dist/types/components/ui/radio-group.d.ts +22 -0
- package/dist/types/components/ui/responsive-dialog.d.ts +31 -0
- package/dist/types/components/ui/scroll-area.d.ts +5 -0
- package/dist/types/components/ui/select.d.ts +22 -0
- package/dist/types/components/ui/separator.d.ts +4 -0
- package/dist/types/components/ui/sheet.d.ts +139 -0
- package/dist/types/components/ui/skeleton.d.ts +31 -0
- package/dist/types/components/ui/slider.d.ts +14 -0
- package/dist/types/components/ui/social-icon-data.d.ts +10 -0
- package/dist/types/components/ui/social-icon.d.ts +38 -0
- package/dist/types/components/ui/social-login-button.d.ts +10 -0
- package/dist/types/components/ui/spinner.d.ts +22 -0
- package/dist/types/components/ui/star-rating.d.ts +12 -0
- package/dist/types/components/ui/sub-nav.d.ts +17 -0
- package/dist/types/components/ui/switch.d.ts +4 -0
- package/dist/types/components/ui/sync-status-badge.d.ts +17 -0
- package/dist/types/components/ui/tabs.d.ts +15 -0
- package/dist/types/components/ui/textarea.d.ts +8 -0
- package/dist/types/components/ui/time-picker.d.ts +14 -0
- package/dist/types/components/ui/toast.d.ts +49 -0
- package/dist/types/components/ui/tooltip.d.ts +7 -0
- package/dist/types/index.d.ts +174 -0
- package/dist/types/lib/server-variants/button-variants.d.ts +20 -0
- package/dist/types/lib/utils.d.ts +2 -0
- package/dist/types/native/components/Accordion.d.ts +12 -0
- package/dist/types/native/components/Alert.d.ts +9 -0
- package/dist/types/native/components/AlertDialog.d.ts +11 -0
- package/dist/types/native/components/AppHeader.d.ts +10 -0
- package/dist/types/native/components/AppShell.d.ts +13 -0
- package/dist/types/native/components/AutoGrowTextarea.d.ts +8 -0
- package/dist/types/native/components/Avatar.d.ts +8 -0
- package/dist/types/native/components/Badge.d.ts +8 -0
- package/dist/types/native/components/Banner.d.ts +10 -0
- package/dist/types/native/components/BannerCarousel.d.ts +8 -0
- package/dist/types/native/components/BottomSheetForm.d.ts +10 -0
- package/dist/types/native/components/BottomTabBar.d.ts +8 -0
- package/dist/types/native/components/Breadcrumb.d.ts +12 -0
- package/dist/types/native/components/Button.d.ts +9 -0
- package/dist/types/native/components/Calendar.d.ts +8 -0
- package/dist/types/native/components/Card.d.ts +11 -0
- package/dist/types/native/components/CategoryNav.d.ts +13 -0
- package/dist/types/native/components/CategoryScroll.d.ts +12 -0
- package/dist/types/native/components/Checkbox.d.ts +7 -0
- package/dist/types/native/components/CheckboxCard.d.ts +8 -0
- package/dist/types/native/components/CheckboxField.d.ts +8 -0
- package/dist/types/native/components/CheckboxGroup.d.ts +12 -0
- package/dist/types/native/components/Chip.d.ts +17 -0
- package/dist/types/native/components/ChipSelector.d.ts +13 -0
- package/dist/types/native/components/CoachMark.d.ts +12 -0
- package/dist/types/native/components/CoachMarkOverlay.d.ts +19 -0
- package/dist/types/native/components/Collapsible.d.ts +7 -0
- package/dist/types/native/components/Combobox.d.ts +14 -0
- package/dist/types/native/components/ConfirmDialog.d.ts +7 -0
- package/dist/types/native/components/CountdownTimer.d.ts +7 -0
- package/dist/types/native/components/DatePicker.d.ts +10 -0
- package/dist/types/native/components/Dialog.d.ts +12 -0
- package/dist/types/native/components/DropdownFilter.d.ts +12 -0
- package/dist/types/native/components/DropdownMenu.d.ts +19 -0
- package/dist/types/native/components/EmptyState.d.ts +8 -0
- package/dist/types/native/components/ErrorState.d.ts +8 -0
- package/dist/types/native/components/FileUpload.d.ts +12 -0
- package/dist/types/native/components/FilterBar.d.ts +13 -0
- package/dist/types/native/components/FilterChip.d.ts +7 -0
- package/dist/types/native/components/Footer.d.ts +9 -0
- package/dist/types/native/components/FormField.d.ts +9 -0
- package/dist/types/native/components/GlassView.d.ts +25 -0
- package/dist/types/native/components/ImageCarousel.d.ts +8 -0
- package/dist/types/native/components/ImageGallery.d.ts +7 -0
- package/dist/types/native/components/Input.d.ts +9 -0
- package/dist/types/native/components/Label.d.ts +7 -0
- package/dist/types/native/components/ListItem.d.ts +11 -0
- package/dist/types/native/components/ListSkeletons.d.ts +6 -0
- package/dist/types/native/components/MarketingShell.d.ts +9 -0
- package/dist/types/native/components/MenuDrawer.d.ts +21 -0
- package/dist/types/native/components/MultiSelect.d.ts +13 -0
- package/dist/types/native/components/NavigationBar.d.ts +18 -0
- package/dist/types/native/components/NotificationBadge.d.ts +9 -0
- package/dist/types/native/components/NumberInput.d.ts +9 -0
- package/dist/types/native/components/OrderSummary.d.ts +10 -0
- package/dist/types/native/components/Pagination.d.ts +7 -0
- package/dist/types/native/components/PillToggle.d.ts +12 -0
- package/dist/types/native/components/Popover.d.ts +14 -0
- package/dist/types/native/components/PriceDisplay.d.ts +8 -0
- package/dist/types/native/components/ProductCard.d.ts +14 -0
- package/dist/types/native/components/ProductCarousel.d.ts +11 -0
- package/dist/types/native/components/Progress.d.ts +7 -0
- package/dist/types/native/components/ProgressRing.d.ts +12 -0
- package/dist/types/native/components/ProgressSteps.d.ts +9 -0
- package/dist/types/native/components/QuantitySelector.d.ts +6 -0
- package/dist/types/native/components/RadioGroup.d.ts +13 -0
- package/dist/types/native/components/RatingDisplay.d.ts +7 -0
- package/dist/types/native/components/ResponsiveDialog.d.ts +7 -0
- package/dist/types/native/components/ReviewCard.d.ts +11 -0
- package/dist/types/native/components/ReviewOverlay.d.ts +7 -0
- package/dist/types/native/components/ReviewSummary.d.ts +7 -0
- package/dist/types/native/components/ScrollArea.d.ts +9 -0
- package/dist/types/native/components/SearchBar.d.ts +9 -0
- package/dist/types/native/components/SectionHeader.d.ts +10 -0
- package/dist/types/native/components/Select.d.ts +14 -0
- package/dist/types/native/components/Separator.d.ts +5 -0
- package/dist/types/native/components/ShareButtons.d.ts +11 -0
- package/dist/types/native/components/Sheet.d.ts +20 -0
- package/dist/types/native/components/SimplePagination.d.ts +7 -0
- package/dist/types/native/components/Skeleton.d.ts +11 -0
- package/dist/types/native/components/Slider.d.ts +9 -0
- package/dist/types/native/components/SocialIcon.d.ts +12 -0
- package/dist/types/native/components/SocialLoginButton.d.ts +8 -0
- package/dist/types/native/components/Spinner.d.ts +6 -0
- package/dist/types/native/components/Stack.d.ts +13 -0
- package/dist/types/native/components/StarRating.d.ts +9 -0
- package/dist/types/native/components/StatCard.d.ts +7 -0
- package/dist/types/native/components/StickyActionBar.d.ts +6 -0
- package/dist/types/native/components/SubNav.d.ts +12 -0
- package/dist/types/native/components/SwipeRow.d.ts +14 -0
- package/dist/types/native/components/Switch.d.ts +4 -0
- package/dist/types/native/components/SyncStatusBadge.d.ts +6 -0
- package/dist/types/native/components/Tabs.d.ts +23 -0
- package/dist/types/native/components/Tag.d.ts +10 -0
- package/dist/types/native/components/TagInput.d.ts +7 -0
- package/dist/types/native/components/Text.d.ts +10 -0
- package/dist/types/native/components/Textarea.d.ts +7 -0
- package/dist/types/native/components/TimePicker.d.ts +12 -0
- package/dist/types/native/components/Toast.d.ts +18 -0
- package/dist/types/native/components/index.d.ts +99 -0
- package/dist/types/native/components/social-icon-data.d.ts +5 -0
- package/dist/types/native/index.d.ts +4 -0
- package/dist/types/native/theme/ThemeProvider.d.ts +21 -0
- package/dist/types/native/typography.d.ts +8 -0
- package/dist/types/tokens/native/index.d.ts +13 -0
- package/dist/types/tokens/native/primitives.d.ts +116 -0
- package/dist/types/tokens/native/scales.d.ts +270 -0
- package/dist/types/tokens/native/themes.d.ts +1147 -0
- package/eslint/deprecated.js +104 -0
- package/eslint/no-colorless-border.js +217 -0
- package/package.json +215 -0
- package/scripts/codemod/README.md +51 -0
- package/scripts/codemod/template.mjs +164 -0
- package/src/components/COMPONENT_LOOKUP.md +190 -0
- package/src/preset.css +168 -0
- package/src/styles/categorical.css +161 -0
- package/src/styles/glass.css +365 -0
- package/src/styles/primitive.css +161 -0
- package/src/styles/semantic.css +247 -0
- package/src/styles/typography.css +140 -0
- package/src/themes/README.md +44 -0
- package/src/themes/blue.css +21 -0
- package/src/themes/default.css +12 -0
- package/src/themes/green.css +22 -0
- package/src/themes/orange.css +21 -0
- package/src/themes/violet.css +22 -0
- package/templates/AGENTS.md +77 -0
- package/templates/CLAUDE.md +77 -0
- package/tokens.json +607 -0
package/MIGRATION.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Migration Guide — `ksk-design-system`
|
|
2
|
+
|
|
3
|
+
メジャーバージョン間の移行ガイド。
|
|
4
|
+
patch / minor は原則破壊変更なし、自動アップグレード可(例外: **v1.34.0 で npm パッケージ名を変更**。import の置換が必要。下記参照)。
|
|
5
|
+
|
|
6
|
+
## v2.0 (未リリース)
|
|
7
|
+
|
|
8
|
+
まだメジャー破壊変更の予定はなし。
|
|
9
|
+
|
|
10
|
+
破壊変更を入れる際にはここに以下を書く:
|
|
11
|
+
1. 削除した識別子 / prop の一覧(rename テーブル)
|
|
12
|
+
2. before / after コード例
|
|
13
|
+
3. 自動移行コマンド: `npx ksk-design-system codemod v1-to-v2 ./src`
|
|
14
|
+
4. 手動対応が必要な項目(codemod では拾えないケース)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## v1 系内の minor 変更(参考)
|
|
19
|
+
|
|
20
|
+
### v1.34.0 — パッケージ名変更(要対応)+ RN/Expo 対応
|
|
21
|
+
|
|
22
|
+
**npm パッケージ名を `@ksk/design-system` → `ksk-design-system` に変更**(npm スコープ除去・OSS 公開準備)。機能面の破壊はないが、**import の一括置換が必要**:
|
|
23
|
+
|
|
24
|
+
- TS/JS: `from "@ksk/design-system"` → `from "ksk-design-system"`
|
|
25
|
+
- CSS: `@import "@ksk/design-system/preset"` → `@import "ksk-design-system/preset"`(`/themes/*` も同様)
|
|
26
|
+
- 依存名: package.json の `@ksk/design-system` → `ksk-design-system`(vendoring の tgz 差し替え時)
|
|
27
|
+
|
|
28
|
+
消費リポでの一括置換例:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
git grep -lz '@ksk/design-system' -- src \
|
|
32
|
+
| xargs -0 sed -i '' 's#@ksk/design-system#ksk-design-system#g'
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
あわせて追加(いずれも破壊変更なし):
|
|
36
|
+
|
|
37
|
+
- **RN/Expo 対応**: `ksk-design-system/native`(解決済みトークン)と `ksk-design-system/native/ui`(RN コンポーネント)を新設
|
|
38
|
+
- **CheckboxField** コンポーネント追加
|
|
39
|
+
- 角丸トークンに `md`(6px) / `xl`(12px) を許可セットへ追加
|
|
40
|
+
|
|
41
|
+
### v1.16.0 (予定)
|
|
42
|
+
|
|
43
|
+
新機能追加のみ・破壊変更なし:
|
|
44
|
+
|
|
45
|
+
- **Button** に `inverse` / `ghost-inverse` バリアント追加
|
|
46
|
+
- **Button** に `hero` サイズ追加
|
|
47
|
+
- **Checkbox** に `label` / `description` / `count` props 追加(polymorphic 化)
|
|
48
|
+
- **Alert** に prop ベース API 追加(`title` / `description` / `icon` / `action`)
|
|
49
|
+
- **Chip** に `soldOut` / `count` / `href` 状態追加
|
|
50
|
+
- **Storybook** で autodocs グローバル化、guidelines.mdx 追加
|
|
51
|
+
- **scripts/check-deps.sh** で ui → patterns 階層の逆依存を CI でブロック
|
|
52
|
+
- **Vitest** 最小導入 + backwards-compat スイート
|
|
53
|
+
- 全コンポーネントに `data-slot` / `data-variant` / `data-size` を徹底
|
|
54
|
+
- **preset.css**: Tailwind v4 の `currentColor` 既定対策として、border-color / outline-color のベースレイヤ保険を追加。`@import "ksk-design-system/preset"` するだけで有効。破壊変更なし — 明示色を持つ枠線は不変で、色未指定の枠線のフォールバックのみ `--border` / `--ring` に固定される(消費側で枠線が黒ずむ不具合を防止)
|
|
55
|
+
|
|
56
|
+
何もしなくても既存コードはそのまま動く。
|
|
57
|
+
|
|
58
|
+
### v1.15.x
|
|
59
|
+
|
|
60
|
+
過去の minor / patch 履歴は GitHub Releases を参照。
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 移行作業の進め方
|
|
65
|
+
|
|
66
|
+
### Step 1. Codemod を dry-run
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npx ksk-design-system codemod vX-to-vY ./src --dry
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
書き換え対象ファイル一覧が表示される。
|
|
73
|
+
|
|
74
|
+
### Step 2. 実際に適用
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npx ksk-design-system codemod vX-to-vY ./src
|
|
78
|
+
git diff
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
`git diff` で意図通りか確認。
|
|
82
|
+
|
|
83
|
+
### Step 3. ESLint で残骸チェック
|
|
84
|
+
|
|
85
|
+
`eslint.config.js` に:
|
|
86
|
+
|
|
87
|
+
```js
|
|
88
|
+
import kskDeprecated from "ksk-design-system/eslint/deprecated"
|
|
89
|
+
|
|
90
|
+
export default [
|
|
91
|
+
{
|
|
92
|
+
plugins: { "ksk-deprecated": kskDeprecated },
|
|
93
|
+
rules: { "ksk-deprecated/no-deprecated": "error" },
|
|
94
|
+
},
|
|
95
|
+
]
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
これで codemod が拾えなかった旧 API の使用を検出できる。
|
|
99
|
+
|
|
100
|
+
### Step 4. 動作確認
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npm run test
|
|
104
|
+
npm run build
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
それから本番デプロイへ。
|
package/PUBLISHING.md
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Publishing — `ksk-design-system`
|
|
2
|
+
|
|
3
|
+
`ksk-design-system` のリリース・配布手順。
|
|
4
|
+
|
|
5
|
+
> **配布方式**: このパッケージは npm レジストリには公開しない。
|
|
6
|
+
> `npm pack` で生成した tgz を各消費リポジトリの `vendor/` に置き、
|
|
7
|
+
> `package.json` から `file:vendor/ksk-design-system-X.Y.Z.tgz` で参照する **vendoring 方式**。
|
|
8
|
+
> 消費リポ: belle-todo / trip_todo / ninshin-todo / yokoku-app / pawly(いずれも `~/LocalDev/` 直下)。
|
|
9
|
+
|
|
10
|
+
## 前提
|
|
11
|
+
|
|
12
|
+
- main ブランチが clean (`git status` で何もない)、リモートと一致
|
|
13
|
+
- 消費リポが `~/LocalDev/<name>` に clone 済みで、`gh` CLI が使えること(PR 自動作成に使用)
|
|
14
|
+
|
|
15
|
+
## 最短手順(推奨)
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
bash scripts/release.sh minor # patch / minor / major / x.y.z
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
これだけ。中で以下を全部やる:
|
|
22
|
+
|
|
23
|
+
1. `git diff --quiet` & main ブランチチェック(曜日チェック)
|
|
24
|
+
2. `npm run check`
|
|
25
|
+
3. `npm version <level>`(tag 切り)
|
|
26
|
+
4. `npm pack`(新名 tgz 生成)
|
|
27
|
+
5. `git push origin main --tags`
|
|
28
|
+
6. `bash scripts/bump-consumers.sh <version>`(5 リポへ PR 自動作成)
|
|
29
|
+
|
|
30
|
+
> v1.35.0 で旧名 `@ksk/design-system` 互換 tgz の生成は廃止。
|
|
31
|
+
> 消費5リポ + todo-shared が新名 `ksk-design-system` に移行済。
|
|
32
|
+
> 旧名復活が必要になった場合は git history で v1.35.0 期の release.sh を参照。
|
|
33
|
+
|
|
34
|
+
個別に手作業したい場合は以下の手動フローを参照。
|
|
35
|
+
|
|
36
|
+
## リリースフロー(手動)
|
|
37
|
+
|
|
38
|
+
### 1. ローカルで動作確認
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm run check # tsc + lint + deps + drift + lookup
|
|
42
|
+
npm test # vitest スイート
|
|
43
|
+
npm run storybook # 目視確認(特に新機能のストーリー)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
すべて green であること。失敗があれば修正してコミット。
|
|
47
|
+
|
|
48
|
+
### 2. バージョン更新
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# patch (bug fix) 例: 1.15.2 → 1.15.3
|
|
52
|
+
npm version patch
|
|
53
|
+
|
|
54
|
+
# minor (feature add, 互換あり) 例: 1.15.2 → 1.16.0
|
|
55
|
+
npm version minor
|
|
56
|
+
|
|
57
|
+
# major (破壊変更) 例: 1.15.2 → 2.0.0
|
|
58
|
+
npm version major
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
`npm version` が自動で `package.json` を更新し、`v1.16.0` タグを切る。
|
|
62
|
+
`dist/` の再ビルド・コミットはこの version bump のタイミングでのみ行う。
|
|
63
|
+
|
|
64
|
+
### 3. tgz 生成
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npm pack
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`prepack` フックで `npm run build:lib` が自動実行され、リポ直下に
|
|
71
|
+
`ksk-design-system-X.Y.Z.tgz` が生成される。
|
|
72
|
+
|
|
73
|
+
中身を確認したい場合:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npm pack --dry-run | tail -50
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
公開ファイル一覧を確認。`package.json#files` で許可した中身だけが入っているはず:
|
|
80
|
+
- `dist/`
|
|
81
|
+
- `bin/`
|
|
82
|
+
- `templates/`
|
|
83
|
+
- `contracts/`
|
|
84
|
+
- `eslint/`
|
|
85
|
+
- `scripts/codemod/`
|
|
86
|
+
- `src/preset.css` / `src/styles/` / `src/themes/`
|
|
87
|
+
- `tokens.json`
|
|
88
|
+
- `AGENTS.md` / `CLAUDE.md` / `MIGRATION.md` / `PUBLISHING.md` / `RELEASE.md`
|
|
89
|
+
- `src/components/COMPONENT_LOOKUP.md`
|
|
90
|
+
|
|
91
|
+
### 4. push
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
git push origin main --tags
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 5. 消費リポへ配布
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# 全リポ一括
|
|
101
|
+
bash scripts/bump-consumers.sh 1.16.0
|
|
102
|
+
|
|
103
|
+
# 特定リポのみ
|
|
104
|
+
bash scripts/bump-consumers.sh 1.16.0 belle-todo pawly
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
各消費リポで `chore/bump-ds-<version>` ブランチを切り、tgz の `vendor/` 配置・
|
|
108
|
+
`package.json` の参照書換・`npm install`・commit・push・PR 作成まで自動で行う。
|
|
109
|
+
失敗したリポはスキップされ最後にまとめて報告されるので、個別にリトライする。
|
|
110
|
+
|
|
111
|
+
過去版の tgz は `vendor/` に残す運用(ロールバックを git revert だけで済ませるため)。
|
|
112
|
+
|
|
113
|
+
### 6. PR マージ
|
|
114
|
+
|
|
115
|
+
各消費リポの PR で CI が green なことを確認してマージ。
|
|
116
|
+
破壊変更を含む場合は、全リポ一括でなく 1〜2 リポで先に動作確認してから残りを配布する。
|
|
117
|
+
|
|
118
|
+
## 緊急ホットフィックス
|
|
119
|
+
|
|
120
|
+
本番障害時の応急対応:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# main から直接でも OK(hotfix ブランチを切る暇がない時)
|
|
124
|
+
# 修正コミット
|
|
125
|
+
git commit -m "fix: 重大なバグの説明"
|
|
126
|
+
|
|
127
|
+
npm version patch
|
|
128
|
+
npm pack
|
|
129
|
+
git push origin main --tags
|
|
130
|
+
bash scripts/bump-consumers.sh <version> <影響リポ...>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
修正コミットの背景・影響範囲を `RELEASE.md` の「ホットフィックス履歴」セクションに必ず追記。
|
|
134
|
+
|
|
135
|
+
## バージョニング規約
|
|
136
|
+
|
|
137
|
+
`ksk-design-system` は [Semantic Versioning](https://semver.org/lang/ja/) に従う:
|
|
138
|
+
|
|
139
|
+
| 種類 | 内容 | 例 |
|
|
140
|
+
|---|---|---|
|
|
141
|
+
| patch | バグ修正・内部最適化 | 1.15.2 → 1.15.3 |
|
|
142
|
+
| minor | 新コンポーネント追加・新 prop 追加(既存壊さない) | 1.15.x → 1.16.0 |
|
|
143
|
+
| major | 既存 prop 削除・コンポーネント rename・default 値変更 | 1.x → 2.0.0 |
|
|
144
|
+
|
|
145
|
+
破壊変更時は `scripts/codemod/` に migration script を必ず添える。
|
|
146
|
+
`MIGRATION.md` に rename テーブル / before-after を文書化。
|
|
147
|
+
|
|
148
|
+
## 注意
|
|
149
|
+
|
|
150
|
+
- 配布前に必ず `npm pack --dry-run` で中身確認
|
|
151
|
+
- `package.json#exports` を変更したら必ず利用側プロジェクトでの import を試す
|
|
152
|
+
- 金曜午後のリリースは厳禁(週末に障害対応できない)
|
|
153
|
+
- メジャーリリースは月初の月曜が望ましい(フィードバック収集期間が取れる)
|
|
154
|
+
|
|
155
|
+
## npm 公開について
|
|
156
|
+
|
|
157
|
+
過去にタグ push で npm publish する GitHub Actions(`publish.yml`)が存在したが、
|
|
158
|
+
実際の配布が vendoring 方式であり NPM_TOKEN も未設定で失敗し続けていたため削除した。
|
|
159
|
+
将来 npm レジストリ公開に切り替える場合は、NPM_TOKEN の Secrets 登録と
|
|
160
|
+
workflow の再作成をセットで行うこと。
|
package/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# KSK Design System
|
|
2
|
+
|
|
3
|
+
複数クライアント案件を **1つのデザインシステム** で高速に回すために設計された、React 製のマルチテーマ対応 UI ライブラリ。BtoB / SaaS の信頼感と EC / BtoC の購買体験、2つのドメインの設計思想を統合しています。
|
|
4
|
+
|
|
5
|
+
**🔗 ライブ Storybook → https://ksk-design-system.vercel.app**
|
|
6
|
+
|
|
7
|
+
110 コンポーネントを実際に操作・確認できます。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## ✨ 特徴
|
|
12
|
+
|
|
13
|
+
- **マルチテーマ** — Brand 色の 10 行を差し替えるだけで、全コンポーネントの見た目が自動で切り替わる(Primitive → Semantic → Bridge の 3 層トークン構造)
|
|
14
|
+
- **アクセシブル** — shadcn/ui(Radix UI ベース)+ `@storybook/addon-a11y` で a11y を担保
|
|
15
|
+
- **Tailwind CSS v4 ネイティブ** — `@theme` ベースのトークン設計
|
|
16
|
+
- **型安全** — React 19 + TypeScript、CVA によるバリアント管理
|
|
17
|
+
- **110 コンポーネント** — 汎用 UI 55 / EC 系 11 / 管理画面系 8 / レイアウトシェル 3 / 汎用パターン 33
|
|
18
|
+
|
|
19
|
+
## 🎨 テーマ
|
|
20
|
+
|
|
21
|
+
Brand 色を差し替えるだけで業種に合わせた配色に切り替わります。
|
|
22
|
+
|
|
23
|
+
| テーマ | Brand-500 | 想定業種 |
|
|
24
|
+
|--------|-----------|---------|
|
|
25
|
+
| Default (Blue) | `#3B82F6` | 汎用・SaaS・BtoB |
|
|
26
|
+
| Orange | `#F97316` | EC・フード・エンタメ |
|
|
27
|
+
| Green | `#16A34A` | ヘルスケア・サステナ・金融 |
|
|
28
|
+
| Violet | `#7C3AED` | プレミアム・クリエイティブ・教育 |
|
|
29
|
+
|
|
30
|
+
## 🧱 技術スタック
|
|
31
|
+
|
|
32
|
+
React 19 + TypeScript / Vite / **Tailwind CSS v4** / shadcn/ui(Radix UI)/ CVA / iconsax-reactjs / Storybook
|
|
33
|
+
|
|
34
|
+
**Peer dependencies**: `react` 18 or 19, `react-dom`, `tailwindcss` ^4, `radix-ui`, `@radix-ui/react-slot`, `iconsax-reactjs`
|
|
35
|
+
|
|
36
|
+
## 🚀 使い方
|
|
37
|
+
|
|
38
|
+
```css
|
|
39
|
+
/* プロジェクトの CSS */
|
|
40
|
+
@import "ksk-design-system/preset";
|
|
41
|
+
@import "./themes/my-client.css"; /* Brand 色を差し替えたテーマ */
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
import { Button, Card, Input, FormField } from "ksk-design-system"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
新規クライアント案件では、テーマファイルで `--Primitive-Brand-500` などブランドカラーの 10 行を定義するだけで、全コンポーネントがそのブランドカラーで動作します。
|
|
49
|
+
|
|
50
|
+
> **インストールについて**: 現在は npm 未公開です。まずは上のライブ Storybook でコンポーネントと挙動をご確認ください。npm パッケージとしての配布を準備中です。
|
|
51
|
+
|
|
52
|
+
## 📖 ドキュメント
|
|
53
|
+
|
|
54
|
+
- **ライブ Storybook**: https://ksk-design-system.vercel.app — 全コンポーネントのバリアント・テーマ切り替えを操作可能
|
|
55
|
+
- 設計思想・トークン体系の詳細は `CLAUDE.md` / `DESIGN.md` を参照
|
|
56
|
+
|
|
57
|
+
## 📄 ライセンス
|
|
58
|
+
|
|
59
|
+
[MIT](./LICENSE) © 奥野圭祐 (Keisuke Okuno)
|
package/RELEASE.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Release Cadence — `ksk-design-system`
|
|
2
|
+
|
|
3
|
+
`ksk-design-system` のリリーススケジュール・運用ルール。
|
|
4
|
+
|
|
5
|
+
## 通常リリースサイクル
|
|
6
|
+
|
|
7
|
+
| 種類 | 頻度 | 曜日 |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| patch | 必要時 | 月〜木(金曜禁止) |
|
|
10
|
+
| minor | 隔週 | 火曜 or 水曜 |
|
|
11
|
+
| major | 四半期 | 月初の月曜 |
|
|
12
|
+
|
|
13
|
+
**金曜午後・休前日のリリースは禁止**。週末に障害対応できる体制でない時間帯は patch も避ける。
|
|
14
|
+
|
|
15
|
+
## メジャーリリースの段取り
|
|
16
|
+
|
|
17
|
+
メジャー (`vX → vX+1`) は破壊変更を含むため、最低 4 週間前から計画する:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
T-4w 破壊変更内容の確定 → MIGRATION.md 草案作成
|
|
21
|
+
T-3w scripts/codemod/vX-to-vY.mjs を実装、利用側で dry-run 検証
|
|
22
|
+
T-2w RC 版の tgz を 1〜2 の消費リポへ先行配布、動作確認
|
|
23
|
+
T-1w feedback 反映、ESLint 旧 API ルールを "error" に昇格
|
|
24
|
+
T-0 全消費リポへ配布 (bump-consumers.sh)、リリースノート公開、社内告知
|
|
25
|
+
T+1w 次の patch で旧 API を完全削除
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## ホットフィックス手順
|
|
29
|
+
|
|
30
|
+
本番障害が発生したら:
|
|
31
|
+
|
|
32
|
+
1. main で直接修正(or hotfix ブランチ)
|
|
33
|
+
2. `npm version patch`
|
|
34
|
+
3. `npm pack` → `bash scripts/bump-consumers.sh <version> <影響リポ...>`
|
|
35
|
+
4. 影響範囲・原因・修正内容を「ホットフィックス履歴」に記録
|
|
36
|
+
5. ポストモーテムを Issue / wiki に書く
|
|
37
|
+
|
|
38
|
+
## ホットフィックス履歴
|
|
39
|
+
|
|
40
|
+
| 日付 | バージョン | 内容 | 影響 |
|
|
41
|
+
|---|---|---|---|
|
|
42
|
+
| 2026-05-30 | v1.21.2 | Sheet (`side="bottom"` / `swipeToClose` / `bottom-glass`) が仮想キーボード表示時にシート上端を画面外へ出さないよう `visualViewport` 監視で修正(PR #12) | モバイルの入力付きボトムシートでタイトル/ドラッグハンドルが隠れる不具合を解消 |
|
|
43
|
+
| 2026-06-13 | v1.31.1 | `.glass-specular > *` が**絶対配置の子要素**の `position`/`z-index` を踏み潰す問題を `:not(.absolute):not(.fixed):not(.sticky)` 除外で修正 | glass 面に重ねた絶対配置オーバーレイ(閉じる × 等)が consumer 側の `absolute`/`z-*` を奪われ角からはみ出す不具合を解消 |
|
|
44
|
+
|
|
45
|
+
新しいホットフィックスがあれば追記する。
|
|
46
|
+
|
|
47
|
+
## リリースノート書き方
|
|
48
|
+
|
|
49
|
+
GitHub Releases にコピペできるテンプレ:
|
|
50
|
+
|
|
51
|
+
```md
|
|
52
|
+
## v1.16.0 (2026-MM-DD)
|
|
53
|
+
|
|
54
|
+
### Features
|
|
55
|
+
- Button: `inverse` / `ghost-inverse` バリアント追加(暗背景上の CTA 用)
|
|
56
|
+
- Button: `hero` サイズ追加(hero / final-CTA 専用ピル型)
|
|
57
|
+
- Checkbox: `label` / `description` / `count` props でポリモーフィック化
|
|
58
|
+
|
|
59
|
+
### Fixes
|
|
60
|
+
- ...
|
|
61
|
+
|
|
62
|
+
### Docs
|
|
63
|
+
- ...
|
|
64
|
+
|
|
65
|
+
### Migration
|
|
66
|
+
- 破壊変更なし。vendor tgz の差し替え PR(bump-consumers.sh が自動作成)をマージするだけで OK。
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
破壊変更がある場合は必ず:
|
|
70
|
+
|
|
71
|
+
```md
|
|
72
|
+
### Breaking Changes
|
|
73
|
+
- `OldComponent` を削除。`NewComponent` を使ってください。
|
|
74
|
+
自動移行: `npx ksk-design-system codemod v1-to-v2 ./src`
|
|
75
|
+
- 詳細: [MIGRATION.md](./MIGRATION.md)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## 関連
|
|
79
|
+
|
|
80
|
+
- [PUBLISHING.md](./PUBLISHING.md) — 実際の手順
|
|
81
|
+
- [MIGRATION.md](./MIGRATION.md) — メジャー毎の移行ガイド
|
|
82
|
+
- [scripts/codemod/README.md](./scripts/codemod/README.md) — codemod 雛形と使い方
|
package/bin/init.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// ksk-design-system init
|
|
4
|
+
// Consumer プロジェクトに AI (Claude / Codex) 向けルールファイルを設置する。
|
|
5
|
+
// AI エージェントは node_modules 配下のファイルを自動で読まないため、
|
|
6
|
+
// プロジェクトルートに AGENTS.md / CLAUDE.md(node_modules 内の DS ルールを
|
|
7
|
+
// 参照する薄いポインタ)を置く必要がある。
|
|
8
|
+
//
|
|
9
|
+
// Usage:
|
|
10
|
+
// npx ksk-ds init # AGENTS.md + CLAUDE.md を設置
|
|
11
|
+
// npx ksk-ds init --force # 既存ファイルを上書き
|
|
12
|
+
// npx ksk-ds postinstall # npm postinstall から呼ばれる silent モード
|
|
13
|
+
|
|
14
|
+
import { copyFileSync, existsSync } from "node:fs"
|
|
15
|
+
import { dirname, join, resolve } from "node:path"
|
|
16
|
+
import { fileURLToPath } from "node:url"
|
|
17
|
+
|
|
18
|
+
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
19
|
+
const pkgRoot = resolve(__dirname, "..")
|
|
20
|
+
|
|
21
|
+
const args = process.argv.slice(2)
|
|
22
|
+
const cmd = args[0] || "init"
|
|
23
|
+
const force = args.includes("--force")
|
|
24
|
+
|
|
25
|
+
if (cmd === "help" || cmd === "--help" || cmd === "-h") {
|
|
26
|
+
console.log(`ksk-design-system CLI
|
|
27
|
+
|
|
28
|
+
使い方:
|
|
29
|
+
npx ksk-ds init AI ルールファイルを設置
|
|
30
|
+
npx ksk-ds init --force 既存ファイルを上書き
|
|
31
|
+
`)
|
|
32
|
+
process.exit(0)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (cmd !== "init" && cmd !== "postinstall") {
|
|
36
|
+
console.error(`未知のコマンド: ${cmd}`)
|
|
37
|
+
console.error(`npx ksk-ds help を参照してください`)
|
|
38
|
+
process.exit(1)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ─── postinstall モードのガード ─────────────────────────────
|
|
42
|
+
// INIT_CWD は npm install が実行されたディレクトリ(consumer のルート)。
|
|
43
|
+
// 未設定、または pkgRoot と同じ場合は DS 自身のインストールコンテキストなのでスキップ。
|
|
44
|
+
const isPostinstall = cmd === "postinstall"
|
|
45
|
+
const consumerRoot = process.env.INIT_CWD || process.cwd()
|
|
46
|
+
|
|
47
|
+
if (isPostinstall) {
|
|
48
|
+
// DS 自身を開発している場合(INIT_CWD が pkgRoot)はスキップ
|
|
49
|
+
if (!process.env.INIT_CWD || resolve(consumerRoot) === pkgRoot) {
|
|
50
|
+
process.exit(0)
|
|
51
|
+
}
|
|
52
|
+
// consumer のルートに package.json が無ければスキップ(安全のため)
|
|
53
|
+
if (!existsSync(join(consumerRoot, "package.json"))) {
|
|
54
|
+
process.exit(0)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const files = [
|
|
59
|
+
{ src: "templates/AGENTS.md", dest: "AGENTS.md", label: "Codex 用" },
|
|
60
|
+
{ src: "templates/CLAUDE.md", dest: "CLAUDE.md", label: "Claude Code 用" },
|
|
61
|
+
]
|
|
62
|
+
|
|
63
|
+
if (!isPostinstall) {
|
|
64
|
+
console.log("ksk-design-system init")
|
|
65
|
+
console.log("AI (Claude / Codex) 向けルールファイルを設置します。\n")
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
let created = 0
|
|
69
|
+
let skipped = 0
|
|
70
|
+
|
|
71
|
+
for (const { src, dest, label } of files) {
|
|
72
|
+
const srcPath = join(pkgRoot, src)
|
|
73
|
+
const destPath = join(consumerRoot, dest)
|
|
74
|
+
|
|
75
|
+
if (!existsSync(srcPath)) {
|
|
76
|
+
if (!isPostinstall) {
|
|
77
|
+
console.error(` ✗ テンプレートが見つかりません: ${srcPath}`)
|
|
78
|
+
}
|
|
79
|
+
process.exit(isPostinstall ? 0 : 1)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (existsSync(destPath) && !force) {
|
|
83
|
+
if (!isPostinstall) {
|
|
84
|
+
console.log(` ⏭ ${dest} は既に存在するためスキップ(--force で上書き)`)
|
|
85
|
+
}
|
|
86
|
+
skipped++
|
|
87
|
+
continue
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
copyFileSync(srcPath, destPath)
|
|
91
|
+
if (isPostinstall) {
|
|
92
|
+
console.log(`[ksk-design-system] ${dest} をプロジェクトルートに設置しました`)
|
|
93
|
+
} else {
|
|
94
|
+
console.log(` ✓ ${dest} を設置しました(${label})`)
|
|
95
|
+
}
|
|
96
|
+
created++
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (isPostinstall) {
|
|
100
|
+
process.exit(0)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
console.log(`\n完了: ${created} 作成 / ${skipped} スキップ`)
|
|
104
|
+
|
|
105
|
+
if (created > 0) {
|
|
106
|
+
console.log(`
|
|
107
|
+
次のステップ:
|
|
108
|
+
1. AI (Claude Code / Codex) を再起動してルールを読み込ませる
|
|
109
|
+
2. UI を作る前に必ず node_modules/ksk-design-system/{AGENTS.md,CLAUDE.md,contracts/*,tokens.json} を AI に読ませる
|
|
110
|
+
3. スクラッチコード(ハードコードカラー・余白・角丸等)を書かない運用を徹底する
|
|
111
|
+
`)
|
|
112
|
+
}
|