ksk-design-system 2.6.2 → 2.6.4
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/contracts/component-docs-guidance.json +73 -0
- package/contracts/components.json +31 -4
- package/contracts/consumer-requests.json +15 -0
- package/contracts/native-device-verification.json +29 -0
- package/contracts/product-theme-overrides.json +9 -1
- package/contracts/token-hex-cache.json +1 -1
- package/dist/index.js +2536 -2482
- package/dist/native/ui.js +2028 -1867
- package/dist/{prompt-coordinator-DR5uqIaR.js → semantic-icons-CP9aRQ9C.js} +35 -1
- package/dist/types/components/patterns/filter-pill.d.ts +2 -0
- package/dist/types/components/patterns/settings-section.d.ts +1 -0
- package/dist/types/components/ui/semantic-icon.d.ts +16 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/lib/semantic-icons.d.ts +34 -0
- package/dist/types/native/components/ListItem.d.ts +11 -1
- package/dist/types/native/components/Radio.d.ts +13 -0
- package/dist/types/native/components/SemanticIcon.d.ts +12 -0
- package/dist/types/native/components/Sheet.d.ts +2 -0
- package/dist/types/native/components/index.d.ts +3 -1
- package/dist/types/native/sheet-viewport-layout.d.ts +9 -0
- package/package.json +9 -3
- package/src/components/COMPONENT_LOOKUP.md +3 -2
- package/src/native/COMPONENT_LOOKUP.md +4 -1
- package/src/styles/glass.css +6 -24
- package/src/styles/product-theme.css +8 -0
- package/src/styles/source-safelist.css +6 -0
|
@@ -158,4 +158,38 @@ function b({ id: t, priority: n = 0, when: r, children: i }) {
|
|
|
158
158
|
});
|
|
159
159
|
}
|
|
160
160
|
//#endregion
|
|
161
|
-
|
|
161
|
+
//#region src/lib/semantic-icons.ts
|
|
162
|
+
var x = {
|
|
163
|
+
selected: {
|
|
164
|
+
label: "選択済み",
|
|
165
|
+
glyph: "tick",
|
|
166
|
+
use: "選択対象が外枠を持つタイルや項目"
|
|
167
|
+
},
|
|
168
|
+
selectedSquare: {
|
|
169
|
+
label: "選択済み(四角)",
|
|
170
|
+
glyph: "TickSquare",
|
|
171
|
+
use: "独立した選択状態の表示"
|
|
172
|
+
},
|
|
173
|
+
success: {
|
|
174
|
+
label: "完了",
|
|
175
|
+
glyph: "TickCircle",
|
|
176
|
+
use: "処理の完了・成功"
|
|
177
|
+
},
|
|
178
|
+
close: {
|
|
179
|
+
label: "閉じる",
|
|
180
|
+
glyph: "Add rotated 45°",
|
|
181
|
+
use: "閉じる・選択解除(操作名はボタンへ指定)"
|
|
182
|
+
},
|
|
183
|
+
info: {
|
|
184
|
+
label: "情報",
|
|
185
|
+
glyph: "InfoCircleIcon",
|
|
186
|
+
use: "補足情報。警告とは区別する"
|
|
187
|
+
},
|
|
188
|
+
warning: {
|
|
189
|
+
label: "警告",
|
|
190
|
+
glyph: "Danger",
|
|
191
|
+
use: "注意が必要な状態。説明文を併記する"
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
//#endregion
|
|
195
|
+
export { m as a, v as c, _ as i, n as l, i as n, h as o, b as r, y as s, x as t, r as u };
|
|
@@ -75,9 +75,11 @@ interface FilterPillProps {
|
|
|
75
75
|
* タップ領域は sm でも 32px 高 + 44px 幅相当の padding を確保する。
|
|
76
76
|
*
|
|
77
77
|
* @example
|
|
78
|
+
* ```tsx
|
|
78
79
|
* <FilterPill label="エリア" value={area ?? undefined} onClear={() => setArea(null)}>
|
|
79
80
|
* <CheckboxGroup ... />
|
|
80
81
|
* </FilterPill>
|
|
82
|
+
* ```
|
|
81
83
|
*/
|
|
82
84
|
declare function FilterPill({ label, value, onClear, clearLabel, children, open, onOpenChange, defaultOpen, panelLabel, align, contentClassName, icon, size, disabled, className, }: FilterPillProps): React.JSX.Element;
|
|
83
85
|
export { FilterPill };
|
|
@@ -9,6 +9,7 @@ interface SettingsSectionProps extends Omit<React.ComponentProps<"section">, "ti
|
|
|
9
9
|
interface SettingsListRowProps extends Omit<React.ComponentProps<"div">, "title" | "onClick"> {
|
|
10
10
|
title: React.ReactNode;
|
|
11
11
|
description?: React.ReactNode;
|
|
12
|
+
/** 行頭のアイコンやアバター。寸法は渡した要素を保ち、装飾用の余白を追加しない。 */
|
|
12
13
|
leading?: React.ReactNode;
|
|
13
14
|
rightSlot?: React.ReactNode;
|
|
14
15
|
interactive?: boolean;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type SemanticIconName } from "../../lib/semantic-icons";
|
|
3
|
+
export { SEMANTIC_ICONS, type SemanticIconName } from "../../lib/semantic-icons";
|
|
4
|
+
export interface SemanticIconProps extends React.ComponentProps<"svg"> {
|
|
5
|
+
name: SemanticIconName;
|
|
6
|
+
color?: string;
|
|
7
|
+
style?: React.CSSProperties;
|
|
8
|
+
/** Cross-platform alias for aria-label; aria-label wins when both are supplied. */
|
|
9
|
+
accessibilityLabel?: string;
|
|
10
|
+
size?: number | string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 意味から選ぶ装飾アイコン。選択状態や操作名は親のコントロールで伝える。
|
|
14
|
+
* 単独の情報画像として使う場合は aria-label を指定する。
|
|
15
|
+
*/
|
|
16
|
+
export declare function SemanticIcon({ name, size, className, accessibilityLabel, color, style, ...props }: SemanticIconProps): React.JSX.Element;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -279,3 +279,5 @@ export { weddingCategories, projectCategories, getCategoricalColor, getCategoric
|
|
|
279
279
|
export type { CategoryPresetItem } from "./lib/category-presets";
|
|
280
280
|
export { CATEGORICAL_SURFACE_CLASS, CATEGORICAL_DOT_CLASS, categoricalSurfaceClass, categoricalVar, } from "./lib/categorical";
|
|
281
281
|
export type { CategoricalIndex } from "./lib/categorical";
|
|
282
|
+
export { SemanticIcon, SEMANTIC_ICONS } from "./components/ui/semantic-icon";
|
|
283
|
+
export type { SemanticIconProps, SemanticIconName } from "./components/ui/semantic-icon";
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Meaning first: Check is a checkbook; InfoCircle in iconsax is an exclamation mark. */
|
|
2
|
+
export declare const SEMANTIC_ICONS: {
|
|
3
|
+
readonly selected: {
|
|
4
|
+
readonly label: "選択済み";
|
|
5
|
+
readonly glyph: "tick";
|
|
6
|
+
readonly use: "選択対象が外枠を持つタイルや項目";
|
|
7
|
+
};
|
|
8
|
+
readonly selectedSquare: {
|
|
9
|
+
readonly label: "選択済み(四角)";
|
|
10
|
+
readonly glyph: "TickSquare";
|
|
11
|
+
readonly use: "独立した選択状態の表示";
|
|
12
|
+
};
|
|
13
|
+
readonly success: {
|
|
14
|
+
readonly label: "完了";
|
|
15
|
+
readonly glyph: "TickCircle";
|
|
16
|
+
readonly use: "処理の完了・成功";
|
|
17
|
+
};
|
|
18
|
+
readonly close: {
|
|
19
|
+
readonly label: "閉じる";
|
|
20
|
+
readonly glyph: "Add rotated 45°";
|
|
21
|
+
readonly use: "閉じる・選択解除(操作名はボタンへ指定)";
|
|
22
|
+
};
|
|
23
|
+
readonly info: {
|
|
24
|
+
readonly label: "情報";
|
|
25
|
+
readonly glyph: "InfoCircleIcon";
|
|
26
|
+
readonly use: "補足情報。警告とは区別する";
|
|
27
|
+
};
|
|
28
|
+
readonly warning: {
|
|
29
|
+
readonly label: "警告";
|
|
30
|
+
readonly glyph: "Danger";
|
|
31
|
+
readonly use: "注意が必要な状態。説明文を併記する";
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
export type SemanticIconName = keyof typeof SEMANTIC_ICONS;
|
|
@@ -25,10 +25,20 @@ export type ListItemAlign = "start" | "center";
|
|
|
25
25
|
* 確認すること。
|
|
26
26
|
*/
|
|
27
27
|
export type ListItemDensity = "comfortable" | "compact";
|
|
28
|
+
export type ListItemTone = "default" | "accent" | "caution";
|
|
29
|
+
export type ListItemDivider = "none" | "inset" | "full";
|
|
28
30
|
export interface ListItemProps extends AccessibilityProps {
|
|
29
31
|
leading?: React.ReactNode;
|
|
32
|
+
/** 文字列にはDSタイポを適用。ReactNodeはレイアウト互換のためそのまま描画する。 */
|
|
30
33
|
title: React.ReactNode;
|
|
34
|
+
/** 文字列にはDSタイポを適用。ReactNodeのスタイルは呼び出し側が管理する。 */
|
|
31
35
|
description?: React.ReactNode;
|
|
36
|
+
/** 文字列の見出しの色。ReactNodeには適用しない。 */
|
|
37
|
+
titleTone?: ListItemTone;
|
|
38
|
+
/** 文字列の説明の色。ReactNodeには適用しない。 */
|
|
39
|
+
descriptionTone?: ListItemTone;
|
|
40
|
+
/** 下端の区切り線。insetは左右の行余白に追随(leadingの幅は含まない)。既定none。 */
|
|
41
|
+
divider?: ListItemDivider;
|
|
32
42
|
trailing?: React.ReactNode;
|
|
33
43
|
/**
|
|
34
44
|
* title / description と同じ列に置く下段スロットではなく、
|
|
@@ -42,4 +52,4 @@ export interface ListItemProps extends AccessibilityProps {
|
|
|
42
52
|
align?: ListItemAlign;
|
|
43
53
|
density?: ListItemDensity;
|
|
44
54
|
}
|
|
45
|
-
export declare function ListItem({ leading, title, description, trailing, footerSlot, showChevron, onPress, disabled, align, density, accessibilityLabel, accessibilityHint, accessibilityRole, accessibilityState, ...accessibilityProps }: ListItemProps): React.JSX.Element;
|
|
55
|
+
export declare function ListItem({ leading, title, titleTone, descriptionTone, divider, description, trailing, footerSlot, showChevron, onPress, disabled, align, density, accessibilityLabel, accessibilityHint, accessibilityRole, accessibilityState, ...accessibilityProps }: ListItemProps): React.JSX.Element;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { type AccessibilityProps } from "react-native";
|
|
3
|
+
export interface RadioProps extends AccessibilityProps {
|
|
4
|
+
selected?: boolean;
|
|
5
|
+
/** ラジオは再押下で解除しない。親で単一選択の値を管理する。 */
|
|
6
|
+
onChange?: (selected: boolean) => void;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
/** 丸印の直径。操作領域は最低44ptを確保する。 */
|
|
9
|
+
size?: number;
|
|
10
|
+
/** 親の radio に意味と操作を委ねる装飾。読み上げ・フォーカス・押下を持たない。 */
|
|
11
|
+
decorative?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function Radio({ selected, onChange, disabled, size, decorative, accessibilityRole, accessibilityState, ...accessibilityProps }: RadioProps): React.JSX.Element;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type StyleProp, type ViewStyle } from "react-native";
|
|
2
|
+
import type { SemanticIconName } from "../../lib/semantic-icons";
|
|
3
|
+
export { SEMANTIC_ICONS, type SemanticIconName } from "../../lib/semantic-icons";
|
|
4
|
+
export interface SemanticIconProps {
|
|
5
|
+
name: SemanticIconName;
|
|
6
|
+
size?: number;
|
|
7
|
+
color?: string;
|
|
8
|
+
accessibilityLabel?: string;
|
|
9
|
+
style?: StyleProp<ViewStyle>;
|
|
10
|
+
}
|
|
11
|
+
/** Meaning-compatible native glyphs. View geometry keeps SVG an optional dependency. */
|
|
12
|
+
export declare function SemanticIcon({ name, size, color, accessibilityLabel, style }: SemanticIconProps): import("react").JSX.Element;
|
|
@@ -20,6 +20,8 @@ export interface SheetProps {
|
|
|
20
20
|
* シート下端に固定で表示する要素(例:「つづける」ボタン)。
|
|
21
21
|
* children の ScrollView と分離されるためコンテンツのスクロールに
|
|
22
22
|
* 追従しない。snap mode(bottom + snapPoints)でのみ有効。
|
|
23
|
+
* ソフトキーボード表示中はその上に固定し、本文を一時拡張する。
|
|
24
|
+
* キーボード回避は Sheet が所有するため footer に追加 inset は不要。
|
|
23
25
|
*/
|
|
24
26
|
footer?: React.ReactNode;
|
|
25
27
|
/**
|
|
@@ -35,6 +35,7 @@ export { Checkbox, type CheckboxProps } from "./Checkbox";
|
|
|
35
35
|
export { CheckboxField, type CheckboxFieldProps } from "./CheckboxField";
|
|
36
36
|
export { CheckboxCard, type CheckboxCardProps } from "./CheckboxCard";
|
|
37
37
|
export { CheckboxGroup, type CheckboxGroupProps, type CheckboxGroupOption } from "./CheckboxGroup";
|
|
38
|
+
export { Radio, type RadioProps } from "./Radio";
|
|
38
39
|
export { RadioGroup, type RadioGroupProps, type RadioOption } from "./RadioGroup";
|
|
39
40
|
export { Slider, type SliderProps } from "./Slider";
|
|
40
41
|
export { NumberInput, type NumberInputProps } from "./NumberInput";
|
|
@@ -87,7 +88,7 @@ export { StatusActionBadge, SyncStatusButton, type StatusActionBadgeProps, type
|
|
|
87
88
|
export { Banner, type BannerProps } from "./Banner";
|
|
88
89
|
export { BannerCarousel, type BannerCarouselProps } from "./BannerCarousel";
|
|
89
90
|
export { SearchBar, type SearchBarProps } from "./SearchBar";
|
|
90
|
-
export { ListItem, type ListItemProps, type ListItemAlign, type ListItemDensity, } from "./ListItem";
|
|
91
|
+
export { ListItem, type ListItemProps, type ListItemAlign, type ListItemTone, type ListItemDivider, type ListItemDensity, } from "./ListItem";
|
|
91
92
|
export { SettingsListRow, SettingsSection, type SettingsListRowProps, type SettingsSectionProps, type SettingsSectionVariant, } from "./SettingsSection";
|
|
92
93
|
export { EmptyState, type EmptyStateProps } from "./EmptyState";
|
|
93
94
|
export { ErrorState, type ErrorStateProps } from "./ErrorState";
|
|
@@ -132,3 +133,4 @@ export { ReviewCard, type ReviewCardProps } from "./ReviewCard";
|
|
|
132
133
|
export { ReviewSummary, type ReviewSummaryProps } from "./ReviewSummary";
|
|
133
134
|
export { AppShell, type AppShellProps } from "./AppShell";
|
|
134
135
|
export { MarketingShell, type MarketingShellProps } from "./MarketingShell";
|
|
136
|
+
export { SemanticIcon, SEMANTIC_ICONS, type SemanticIconProps, type SemanticIconName } from "./SemanticIcon";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Receives the actual Modal working area after iOS keyboard avoidance or
|
|
3
|
+
* Android adjustResize. Never subtract keyboard height again here.
|
|
4
|
+
*/
|
|
5
|
+
export declare function resolveSheetViewportLayout(fullHeight: number, panelHeight: number, measuredHeight: number | null, keyboardOpen: boolean): {
|
|
6
|
+
availableHeight: number;
|
|
7
|
+
panelHeight: number;
|
|
8
|
+
expandToViewport: boolean;
|
|
9
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ksk-design-system",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "KSK Design System — フリーランス向けマルチテーマ対応デザインシステム",
|
|
6
6
|
"license": "MIT",
|
|
@@ -204,11 +204,16 @@
|
|
|
204
204
|
"test:watch": "vitest",
|
|
205
205
|
"test:interaction": "vitest run --config vitest.storybook.config.ts",
|
|
206
206
|
"test:a11y": "vitest run --config vitest.a11y.config.ts",
|
|
207
|
-
"check": "tsc -p tsconfig.app.json --noEmit && tsc -p tsconfig.type-tests.json --noEmit && bash scripts/lint-scratch.sh && bash scripts/check-deps.sh && node scripts/check-published-deps.mjs && node scripts/check-radix-floor.mjs && node scripts/check-css-setup.mjs && bash scripts/check-drift.sh && node scripts/check-screen-contracts.mjs && node scripts/check-docs-drift.mjs && node scripts/check-agents-docs-sync.mjs && node scripts/check-contrast.mjs && node scripts/check-design-md.mjs && node scripts/check-tailwind-v4.mjs && node scripts/check-prefix-order.mjs && node scripts/check-flex-shrink.mjs && node scripts/check-deprecations.mjs && node scripts/check-rules-contract.mjs && node scripts/sync-version.mjs --check && node scripts/generate-migration-doc.mjs --check && bash scripts/check-responsive.sh && node scripts/generate-component-lookup.mjs --check && node scripts/generate-platform-tokens.mjs --check && node scripts/generate-token-hex-cache.mjs --check && node scripts/generate-source-safelist.mjs --check && tsc -p tsconfig.native.json --noEmit && node scripts/check-native-parity.mjs && node scripts/generate-native-component-lookup.mjs --check",
|
|
207
|
+
"check": "tsc -p tsconfig.app.json --noEmit && tsc -p tsconfig.type-tests.json --noEmit && bash scripts/lint-scratch.sh && bash scripts/check-deps.sh && node scripts/check-published-deps.mjs && node scripts/check-radix-floor.mjs && node scripts/check-css-setup.mjs && bash scripts/check-drift.sh && node scripts/check-screen-contracts.mjs && node scripts/check-docs-drift.mjs && node scripts/check-agents-docs-sync.mjs && node scripts/check-contrast.mjs && node scripts/check-design-md.mjs && node scripts/check-tailwind-v4.mjs && node scripts/check-prefix-order.mjs && node scripts/check-flex-shrink.mjs && node scripts/check-deprecations.mjs && node scripts/check-rules-contract.mjs && node scripts/sync-version.mjs --check && node scripts/generate-migration-doc.mjs --check && bash scripts/check-responsive.sh && node scripts/generate-component-lookup.mjs --check && node scripts/generate-platform-tokens.mjs --check && node scripts/generate-token-hex-cache.mjs --check && node scripts/generate-source-safelist.mjs --check && tsc -p tsconfig.native.json --noEmit && node scripts/check-native-parity.mjs && node scripts/generate-native-component-lookup.mjs --check && npm run check:native-support",
|
|
208
208
|
"check:agent": "npm run lint && npm run check && npm test && npm run lint:story-reuse",
|
|
209
209
|
"version": "node scripts/sync-version.mjs",
|
|
210
210
|
"mcp:build": "cd mcp-server && npm install && npm run build",
|
|
211
|
-
"mcp:start": "node mcp-server/dist/index.js"
|
|
211
|
+
"mcp:start": "node mcp-server/dist/index.js",
|
|
212
|
+
"test:docs": "node scripts/check-storybook-docs.mjs",
|
|
213
|
+
"test:visual": "node scripts/check-visual.mjs",
|
|
214
|
+
"test:visual:guards": "node --test test/visual/*.test.mjs",
|
|
215
|
+
"generate:native-support": "node scripts/generate-native-support.mjs",
|
|
216
|
+
"check:native-support": "node scripts/generate-native-support.mjs --check"
|
|
212
217
|
},
|
|
213
218
|
"dependencies": {
|
|
214
219
|
"@radix-ui/react-slot": "^1.3.0",
|
|
@@ -279,6 +284,7 @@
|
|
|
279
284
|
"iconsax-reactjs": "^0.0.8",
|
|
280
285
|
"jsdom": "^25.0.1",
|
|
281
286
|
"playwright": "^1.62.0",
|
|
287
|
+
"pngjs": "^7.0.0",
|
|
282
288
|
"radix-ui": "^1.6.1",
|
|
283
289
|
"react": "^19.2.0",
|
|
284
290
|
"react-dom": "^19.2.0",
|
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
| SectionNav | `@/components/ui/section-nav` | — | Vertical, Horizontal, StickyGuide |
|
|
62
62
|
| Section | `@/components/ui/section` | **spacing**: `sm`, `md`, `lg`, `xl`<br>**background**: `none`, `subtle`, `accent-subtle` | FullBleedBandWithContainedContent |
|
|
63
63
|
| Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue | `@/components/ui/select` | **size**: `sm`, `default`, `lg` | WithPlaceholder, WithGroups, WithDisabledItem, DisabledSelect, OpensAndSelectsOption, SelectsWithKeyboard |
|
|
64
|
+
| SEMANTIC_ICONS, SemanticIcon | `@/components/ui/semantic-icon` | — | — |
|
|
64
65
|
| Separator | `@/components/ui/separator` | — | Horizontal, Vertical |
|
|
65
66
|
| Sheet, SheetTrigger, SheetClose, SheetContent, SheetHeader, SheetFooter, SheetTitle, SheetDescription, SheetDragIndicator | `@/components/ui/sheet` | **side**: `top`, `bottom`, `left`, `right`, `float`, `float-glass`, `bottom-glass` | BottomSheet, FloatSheet, TopSheet, FloatSheetTallContent, RightSheet, A11yOptions, TitleAutoFocusAppearance, Float Glass (Liquid Glass), Bottom Glass (Liquid Glass), BottomSheet — swipeToClose, Float — 仮想キーボード追従, BottomSheet — swipeToClose (full height / scrollable), BottomSheet — Snap 0.4/0.9, BottomSheet — Snap (push-up layout), BottomSheet — nested (#158), OpensAndIsImmediatelyInteractive, ChildDescriptionIsLinked, ChildDescriptionIsLinkedWithSwipeToClose, NoDescriptionLeavesNoDescribedBy, ChildDescriptionIsLinkedWithSnapPoints, ChildDescriptionIsLinkedWithSwipeSideDrawer, DescriptionPropIsLinked, ExplicitDescribedByWins |
|
|
66
67
|
| Skeleton, SkeletonText | `@/components/ui/skeleton` | — | CardSkeleton, TextSkeleton, SkeletonText (5 lines) |
|
|
@@ -145,7 +146,7 @@
|
|
|
145
146
|
| PhotoHero | `@/components/patterns/photo-hero` | — | BottomAligned, CenterAligned, NoOverlay |
|
|
146
147
|
| PresenceIndicator | `@/components/patterns/presence-indicator` | — | Default, WithBadge, Offline, NameOnly, 狭幅で非表示にする例(className) |
|
|
147
148
|
| ProgressSteps | `@/components/patterns/progress-steps` | — | Step2Active, FirstStep, ThirdStep, AllComplete, ThreeSteps |
|
|
148
|
-
| AUTO_PROMPT_SUPPRESSION_EVENT, AutoPrompt, PromptCoordinatorProvider | `@/components/patterns/prompt-coordinator` | — | Default |
|
|
149
|
+
| AUTO_PROMPT_SUPPRESSION_EVENT, AutoPrompt, PromptCoordinatorProvider | `@/components/patterns/prompt-coordinator` | — | Default, 予約した案内を順番に表示する |
|
|
149
150
|
| Prose | `@/components/patterns/prose` | — | PrivacyPolicy, SingleSection |
|
|
150
151
|
| ActionTile, QuickActionGrid | `@/components/patterns/quick-action-grid` | — | EmojiOnly, IconAndLabel, WithMeta, IndicatorOverride, SelectedWithoutDescription, NarrowWithLongMeta, SingleSelection, MultipleSelection, LaunchersWithoutSelectionMode |
|
|
151
152
|
| ResponsiveOverlayFrame, ResponsiveOverlayFooter | `@/components/patterns/responsive-overlay-frame` | — | Short form (mobile-form), Long keyboard-aware form (mobile-page), mobile-full preset, breakpoint=lg, breakpoint=product-theme, snapPoints は dialog に変換されない, float サイド(カード型), float-glass サイド(ガラス素材), plain preset(素の bottom シート) |
|
|
@@ -153,7 +154,7 @@
|
|
|
153
154
|
| Screen | `@/components/patterns/screen` | — | ScrollableWithFooter, WithHeader, FixedPhotoHero |
|
|
154
155
|
| SearchBar | `@/components/patterns/search-bar` | — | Default, WithValue, Disabled, WithOnSearch, AsForm |
|
|
155
156
|
| SectionHeader | `@/components/patterns/section-header` | — | WithAction, WithoutAction, TitleOnly, WithGhostButton |
|
|
156
|
-
| SettingsSection, SettingsListRow | `@/components/patterns/settings-section` | — | Group, Card, Danger |
|
|
157
|
+
| SettingsSection, SettingsListRow | `@/components/patterns/settings-section` | — | Group, Card, Danger, CompactSpacing |
|
|
157
158
|
| ShareButtons | `@/components/patterns/share-buttons` | — | Circle, Inline, SelectiveProviders, JapanDefault, ExtendedProviders, With onShare tracking |
|
|
158
159
|
| SideDrawerFrame | `@/components/patterns/side-drawer-frame` | — | RightDrawer, LeftDrawer, RightDrawer — swipeToClose, LeftDrawer — swipeToClose, Glass |
|
|
159
160
|
| SimplePagination | `@/components/patterns/simple-pagination` | — | アイテム数指定 (items), ページ数指定 (pages), compact (モバイル省略表示), 境界での disabled, 0 件 |
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
React Native / Expo consumer は、新規 UI を作る前にこの一覧で既存コンポーネントを確認してください。すべて `ksk-design-system/native/ui` から import します。
|
|
6
6
|
|
|
7
|
-
- Public native component exports:
|
|
7
|
+
- Public native component exports: 154
|
|
8
8
|
- Import: `import { Button, Screen } from "ksk-design-system/native/ui"`
|
|
9
9
|
|
|
10
10
|
| Component | Source | Section |
|
|
@@ -50,6 +50,7 @@ React Native / Expo consumer は、新規 UI を作る前にこの一覧で既
|
|
|
50
50
|
| `Input` | `src/native/components/Input.tsx` | Phase 2: Basic Form |
|
|
51
51
|
| `Label` | `src/native/components/Label.tsx` | Phase 2: Basic Form |
|
|
52
52
|
| `NumberInput` | `src/native/components/NumberInput.tsx` | Phase 2: Basic Form |
|
|
53
|
+
| `Radio` | `src/native/components/Radio.tsx` | Phase 2: Basic Form |
|
|
53
54
|
| `RadioGroup` | `src/native/components/RadioGroup.tsx` | Phase 2: Basic Form |
|
|
54
55
|
| `Slider` | `src/native/components/Slider.tsx` | Phase 2: Basic Form |
|
|
55
56
|
| `Switch` | `src/native/components/Switch.tsx` | Phase 2: Basic Form |
|
|
@@ -160,3 +161,5 @@ React Native / Expo consumer は、新規 UI を作る前にこの一覧で既
|
|
|
160
161
|
| `ReviewSummary` | `src/native/components/ReviewSummary.tsx` | Phase 7: Commerce |
|
|
161
162
|
| `AppShell` | `src/native/components/AppShell.tsx` | Phase 8: Shells |
|
|
162
163
|
| `MarketingShell` | `src/native/components/MarketingShell.tsx` | Phase 8: Shells |
|
|
164
|
+
| `SEMANTIC_ICONS` | `src/native/components/SemanticIcon.tsx` | Phase 8: Shells |
|
|
165
|
+
| `SemanticIcon` | `src/native/components/SemanticIcon.tsx` | Phase 8: Shells |
|
package/src/styles/glass.css
CHANGED
|
@@ -484,16 +484,12 @@
|
|
|
484
484
|
-webkit-mask-composite: xor;
|
|
485
485
|
mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
|
|
486
486
|
mask-composite: exclude;
|
|
487
|
-
/* ⚠️ backdrop-filter
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
backdrop-filter
|
|
493
|
-
backdrop-filter のサンプリング域をクリップしないため、blur(4px) がシート
|
|
494
|
-
全面に乗り前景テキストを潰す。conic リム(背景)自体は WebKit でも mask で
|
|
495
|
-
正しく 1px に切り取られるので、非 Chromium では「リムだけ・blur なし」に
|
|
496
|
-
安全劣化させる(作者の当初意図どおり)。 */
|
|
487
|
+
/* ⚠️ 前景より上の装飾には、ブラウザーを問わず backdrop-filter を追加しない。
|
|
488
|
+
この ::after は z-index:2 でコンテンツ(z1)より上にあるため、ぼかす対象に
|
|
489
|
+
シート本文も含まれる。mask(exclude) で適用域が縁だけに制限される前提は
|
|
490
|
+
描画環境に依存し、文字やボタン全体をぼかす原因になる。
|
|
491
|
+
縁の光は conic リムとマスクだけで描き、背景のぼかし・屈折は本文より下の
|
|
492
|
+
素材クラス(.glass 等)の backdrop-filter に任せる。 */
|
|
497
493
|
pointer-events: none;
|
|
498
494
|
z-index: 2;
|
|
499
495
|
}
|
|
@@ -605,20 +601,6 @@
|
|
|
605
601
|
* 屈折を足すとかえって主張が強くなり「薄さ」の意図を壊すため対象外。
|
|
606
602
|
*/
|
|
607
603
|
@supports (-webkit-app-region: none) {
|
|
608
|
-
/* .glass-specular リムの progressive blur は Chromium 限定。
|
|
609
|
-
WebKit では mask が backdrop-filter の適用域をクリップせずシート全面が
|
|
610
|
-
ぼやけて前景テキストを潰すため(上の ::after のコメント参照)、この
|
|
611
|
-
増光ブラーはここでのみ供給し、非対応環境は conic リムのみに劣化させる。 */
|
|
612
|
-
.glass-specular::after {
|
|
613
|
-
-webkit-backdrop-filter: blur(4px) saturate(1.8) brightness(1.35);
|
|
614
|
-
backdrop-filter: blur(4px) saturate(1.8) brightness(1.35);
|
|
615
|
-
}
|
|
616
|
-
.dark .glass-specular::after,
|
|
617
|
-
[data-glass-backdrop="dark"] .glass-specular::after {
|
|
618
|
-
-webkit-backdrop-filter: blur(4px) saturate(1.6) brightness(1.25);
|
|
619
|
-
backdrop-filter: blur(4px) saturate(1.6) brightness(1.25);
|
|
620
|
-
}
|
|
621
|
-
|
|
622
604
|
.glass {
|
|
623
605
|
-webkit-backdrop-filter: var(--glass-blur) var(--glass-refract);
|
|
624
606
|
backdrop-filter: var(--glass-blur) var(--glass-refract);
|
|
@@ -61,6 +61,14 @@
|
|
|
61
61
|
@import "./shadow.css";
|
|
62
62
|
|
|
63
63
|
:root {
|
|
64
|
+
/* Settings rows: independent of button dimensions; 44px floor in the component. */
|
|
65
|
+
--Settings-Row-Min-Height: 3.5rem;
|
|
66
|
+
--Settings-Row-Gap: 0.75rem;
|
|
67
|
+
--Settings-Row-Padding-X: 1rem;
|
|
68
|
+
--Settings-Row-Padding-Y: 0.75rem;
|
|
69
|
+
/* Pointer-only chip removal. Coarse pointers retain a 44px target. */
|
|
70
|
+
--Chip-Remove-Width: 2rem;
|
|
71
|
+
|
|
64
72
|
/* ─── Control: Button 系の内寸 ───
|
|
65
73
|
5段スケール。Button の size バリアント xs / sm / default(=Md) / lg / xl と
|
|
66
74
|
1対1で対応する。既定値は h-6/h-8/h-10/h-12/h-14・px-2/px-3/px-4/px-6/px-8。 */
|
|
@@ -73,7 +73,9 @@
|
|
|
73
73
|
@source inline("[--ksk-fab-bottom-offset:5rem]");
|
|
74
74
|
@source inline("[--ksk-fab-bottom-offset:6rem]");
|
|
75
75
|
@source inline("[-webkit-tap-highlight-color:transparent]");
|
|
76
|
+
@source inline("[@media(any-pointer:coarse)]:min-w-11");
|
|
76
77
|
@source inline("[@media(hover:hover)]:transition-colors");
|
|
78
|
+
@source inline("[@media(hover:hover)_and_(pointer:fine)]:w-[max(2rem,var(--Chip-Remove-Width))]");
|
|
77
79
|
@source inline("[scrollbar-width:none]");
|
|
78
80
|
@source inline("absolute");
|
|
79
81
|
@source inline("active:bg-[var(--Active-Destructive-Button)]");
|
|
@@ -429,6 +431,7 @@
|
|
|
429
431
|
@source inline("gap-[var(--Nav-Item-Gap)]");
|
|
430
432
|
@source inline("gap-[var(--Nav-Pill-Gap)]");
|
|
431
433
|
@source inline("gap-[var(--Product-Card-Gap)]");
|
|
434
|
+
@source inline("gap-[var(--Settings-Row-Gap)]");
|
|
432
435
|
@source inline("gap-x-2");
|
|
433
436
|
@source inline("gap-x-4");
|
|
434
437
|
@source inline("gap-y-1");
|
|
@@ -668,6 +671,7 @@
|
|
|
668
671
|
@source inline("min-h-[80px]");
|
|
669
672
|
@source inline("min-h-[inherit]");
|
|
670
673
|
@source inline("min-h-[max(2.75rem,var(--Nav-Item-Min-Height))]");
|
|
674
|
+
@source inline("min-h-[max(2.75rem,var(--Settings-Row-Min-Height))]");
|
|
671
675
|
@source inline("min-h-[var(--Control-Height-Xl)]");
|
|
672
676
|
@source inline("min-h-[var(--Field-Min-Height)]");
|
|
673
677
|
@source inline("min-h-[var(--Nav-Pill-Min-Height)]");
|
|
@@ -826,6 +830,7 @@
|
|
|
826
830
|
@source inline("px-[var(--Field-Padding-X-Md)]");
|
|
827
831
|
@source inline("px-[var(--Field-Padding-X-Sm)]");
|
|
828
832
|
@source inline("px-[var(--Nav-Pill-Padding-X)]");
|
|
833
|
+
@source inline("px-[var(--Settings-Row-Padding-X)]");
|
|
829
834
|
@source inline("py-0.5");
|
|
830
835
|
@source inline("py-1");
|
|
831
836
|
@source inline("py-1.5");
|
|
@@ -844,6 +849,7 @@
|
|
|
844
849
|
@source inline("py-[var(--Field-Padding-Y)]");
|
|
845
850
|
@source inline("py-[var(--Nav-Pill-Padding-Y)]");
|
|
846
851
|
@source inline("py-[var(--Product-Page-Padding-Y)]");
|
|
852
|
+
@source inline("py-[var(--Settings-Row-Padding-Y)]");
|
|
847
853
|
@source inline("py-[var(--Space-Section-2xl)]");
|
|
848
854
|
@source inline("py-[var(--Space-Section-md)]");
|
|
849
855
|
@source inline("py-[var(--Space-Section-xl)]");
|