mokkun 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -6
- package/bin/cli.mjs +6 -6
- package/bin/viewer.html +78 -3
- package/dist/example.html +225 -0
- package/dist/mokkun.css +1 -1
- package/dist/mokkun.esm.js +14476 -9626
- package/dist/mokkun.esm.js.map +1 -1
- package/dist/mokkun.js +761 -363
- package/dist/mokkun.js.map +1 -1
- package/dist/types/lib.d.ts +109 -0
- package/dist/types/loader/file-loader.d.ts +118 -0
- package/dist/types/loader/index.d.ts +4 -0
- package/dist/types/parser/index.d.ts +5 -0
- package/dist/types/parser/key-normalizer.d.ts +24 -0
- package/dist/types/parser/v2/compile-expand.d.ts +23 -0
- package/dist/types/parser/v2/compile-field.d.ts +28 -0
- package/dist/types/parser/v2/compile-section.d.ts +6 -0
- package/dist/types/parser/v2/compile-v2.d.ts +14 -0
- package/dist/types/parser/v2/compile-warnings.d.ts +17 -0
- package/dist/types/parser/v2/file-spec.d.ts +24 -0
- package/dist/types/parser/v2/index.d.ts +5 -0
- package/dist/types/parser/v2/iso-date.d.ts +10 -0
- package/dist/types/parser/v2/parse-v2.d.ts +24 -0
- package/dist/types/parser/v2/validate-action.d.ts +11 -0
- package/dist/types/parser/v2/validate-app.d.ts +9 -0
- package/dist/types/parser/v2/validate-context.d.ts +41 -0
- package/dist/types/parser/v2/validate-field.d.ts +17 -0
- package/dist/types/parser/v2/validate-keys.d.ts +29 -0
- package/dist/types/parser/v2/validate-list.d.ts +5 -0
- package/dist/types/parser/v2/validate-v2.d.ts +6 -0
- package/dist/types/parser/v2/validate-view.d.ts +6 -0
- package/dist/types/parser/yaml-parser.d.ts +68 -0
- package/dist/types/renderer/action-handler.d.ts +76 -0
- package/dist/types/renderer/components/accordion-panel.d.ts +144 -0
- package/dist/types/renderer/components/action-buttons.d.ts +183 -0
- package/dist/types/renderer/components/alert-banner.d.ts +43 -0
- package/dist/types/renderer/components/app-header.d.ts +277 -0
- package/dist/types/renderer/components/app-navi.d.ts +167 -0
- package/dist/types/renderer/components/badge.d.ts +134 -0
- package/dist/types/renderer/components/browser.d.ts +134 -0
- package/dist/types/renderer/components/calendar.d.ts +198 -0
- package/dist/types/renderer/components/checkbox.d.ts +132 -0
- package/dist/types/renderer/components/chip.d.ts +120 -0
- package/dist/types/renderer/components/combobox.d.ts +217 -0
- package/dist/types/renderer/components/data-table.d.ts +186 -0
- package/dist/types/renderer/components/date-range-picker.d.ts +203 -0
- package/dist/types/renderer/components/definition-list.d.ts +165 -0
- package/dist/types/renderer/components/delete-confirm-dialog.d.ts +151 -0
- package/dist/types/renderer/components/dialog/action-dialog.d.ts +61 -0
- package/dist/types/renderer/components/dialog/base-dialog.d.ts +125 -0
- package/dist/types/renderer/components/dialog/dialog-types.d.ts +96 -0
- package/dist/types/renderer/components/disclosure.d.ts +118 -0
- package/dist/types/renderer/components/dropdown.d.ts +220 -0
- package/dist/types/renderer/components/duration-input.d.ts +154 -0
- package/dist/types/renderer/components/duration-picker.d.ts +108 -0
- package/dist/types/renderer/components/field-renderer.d.ts +22 -0
- package/dist/types/renderer/components/float-area.d.ts +196 -0
- package/dist/types/renderer/components/form-fields.d.ts +94 -0
- package/dist/types/renderer/components/form-section.d.ts +118 -0
- package/dist/types/renderer/components/google-map-embed.d.ts +88 -0
- package/dist/types/renderer/components/heading.d.ts +119 -0
- package/dist/types/renderer/components/image-uploader.d.ts +271 -0
- package/dist/types/renderer/components/index.d.ts +48 -0
- package/dist/types/renderer/components/information-panel.d.ts +139 -0
- package/dist/types/renderer/components/input.d.ts +222 -0
- package/dist/types/renderer/components/layout.d.ts +71 -0
- package/dist/types/renderer/components/line-clamp.d.ts +170 -0
- package/dist/types/renderer/components/loader.d.ts +104 -0
- package/dist/types/renderer/components/notification-bar.d.ts +251 -0
- package/dist/types/renderer/components/pagination.d.ts +167 -0
- package/dist/types/renderer/components/photo-manager-renderer.d.ts +9 -0
- package/dist/types/renderer/components/radio-button-panel.d.ts +152 -0
- package/dist/types/renderer/components/radio.d.ts +117 -0
- package/dist/types/renderer/components/repeater.d.ts +116 -0
- package/dist/types/renderer/components/response-message.d.ts +180 -0
- package/dist/types/renderer/components/search-input.d.ts +198 -0
- package/dist/types/renderer/components/section-nav.d.ts +151 -0
- package/dist/types/renderer/components/segmented-control.d.ts +143 -0
- package/dist/types/renderer/components/select.d.ts +98 -0
- package/dist/types/renderer/components/status-label.d.ts +146 -0
- package/dist/types/renderer/components/stepper.d.ts +123 -0
- package/dist/types/renderer/components/tabs.d.ts +185 -0
- package/dist/types/renderer/components/textarea.d.ts +173 -0
- package/dist/types/renderer/components/timeline.d.ts +146 -0
- package/dist/types/renderer/components/toggle.d.ts +109 -0
- package/dist/types/renderer/components/tooltip.d.ts +158 -0
- package/dist/types/renderer/components/wizard.d.ts +118 -0
- package/dist/types/renderer/layouts/index.d.ts +5 -0
- package/dist/types/renderer/layouts/shell.d.ts +7 -0
- package/dist/types/renderer/layouts/types.d.ts +34 -0
- package/dist/types/renderer/screen-renderer.d.ts +57 -0
- package/dist/types/renderer/utils/dom.d.ts +29 -0
- package/dist/types/renderer/utils/dummy-data.d.ts +13 -0
- package/dist/types/renderer/utils/field-helpers.d.ts +90 -0
- package/dist/types/renderer/utils/icons.d.ts +13 -0
- package/dist/types/renderer/utils/index.d.ts +6 -0
- package/dist/types/renderer-v2/actions.d.ts +30 -0
- package/dist/types/renderer-v2/app-shell.d.ts +15 -0
- package/dist/types/renderer-v2/condition.d.ts +19 -0
- package/dist/types/renderer-v2/context.d.ts +37 -0
- package/dist/types/renderer-v2/fields/choice.d.ts +12 -0
- package/dist/types/renderer-v2/fields/control-label.d.ts +57 -0
- package/dist/types/renderer-v2/fields/date.d.ts +6 -0
- package/dist/types/renderer-v2/fields/display.d.ts +22 -0
- package/dist/types/renderer-v2/fields/file-support.d.ts +15 -0
- package/dist/types/renderer-v2/fields/file.d.ts +9 -0
- package/dist/types/renderer-v2/fields/index.d.ts +20 -0
- package/dist/types/renderer-v2/fields/select.d.ts +17 -0
- package/dist/types/renderer-v2/fields/text.d.ts +26 -0
- package/dist/types/renderer-v2/fields/textarea.d.ts +5 -0
- package/dist/types/renderer-v2/fields/toggle.d.ts +6 -0
- package/dist/types/renderer-v2/icons.d.ts +35 -0
- package/dist/types/renderer-v2/index.d.ts +45 -0
- package/dist/types/renderer-v2/list-cells.d.ts +6 -0
- package/dist/types/renderer-v2/list-data.d.ts +53 -0
- package/dist/types/renderer-v2/mount-parts.d.ts +19 -0
- package/dist/types/renderer-v2/mount-repeat.d.ts +8 -0
- package/dist/types/renderer-v2/mount-section.d.ts +10 -0
- package/dist/types/renderer-v2/mount-visibility.d.ts +13 -0
- package/dist/types/renderer-v2/mount.d.ts +9 -0
- package/dist/types/renderer-v2/role.d.ts +15 -0
- package/dist/types/renderer-v2/section-fields.d.ts +11 -0
- package/dist/types/renderer-v2/section-list.d.ts +8 -0
- package/dist/types/renderer-v2/section-readonly.d.ts +8 -0
- package/dist/types/renderer-v2/section.d.ts +15 -0
- package/dist/types/renderer-v2/styles.d.ts +13 -0
- package/dist/types/renderer-v2/util.d.ts +28 -0
- package/dist/types/renderer-v2/view-state.d.ts +25 -0
- package/dist/types/renderer-v2/view.d.ts +8 -0
- package/dist/types/theme/index.d.ts +6 -0
- package/dist/types/theme/theme-manager.d.ts +102 -0
- package/dist/types/types/field-renderable.d.ts +40 -0
- package/dist/types/types/index.d.ts +7 -0
- package/dist/types/types/schema-v2.d.ts +270 -0
- package/dist/types/types/schema.d.ts +1712 -0
- package/dist/types/types/theme.d.ts +111 -0
- package/package.json +3 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Dialog Component
|
|
3
|
+
* ユーザーアクション確認用ダイアログ
|
|
4
|
+
*
|
|
5
|
+
* 機能:
|
|
6
|
+
* - 確認/キャンセルボタン
|
|
7
|
+
* - デンジャーモード(危険なアクションの強調)
|
|
8
|
+
* - アイコン表示
|
|
9
|
+
* - サブアクションエリア
|
|
10
|
+
*/
|
|
11
|
+
import { BaseDialog } from './base-dialog';
|
|
12
|
+
import type { ActionDialogConfig, ActionDialogCallbacks } from './dialog-types';
|
|
13
|
+
/**
|
|
14
|
+
* アクションダイアログコンポーネント
|
|
15
|
+
* ユーザーに確認・キャンセルの選択を求めるダイアログ
|
|
16
|
+
*/
|
|
17
|
+
export declare class ActionDialog extends BaseDialog {
|
|
18
|
+
protected config: Required<Omit<ActionDialogConfig, 'customIcon' | 'message' | 'subActionContent'>> & Pick<ActionDialogConfig, 'customIcon' | 'message' | 'subActionContent'>;
|
|
19
|
+
protected callbacks: ActionDialogCallbacks;
|
|
20
|
+
constructor(config: ActionDialogConfig, callbacks?: ActionDialogCallbacks);
|
|
21
|
+
/**
|
|
22
|
+
* ダイアログのクラス名を取得
|
|
23
|
+
*/
|
|
24
|
+
protected getDialogClassName(): string;
|
|
25
|
+
/**
|
|
26
|
+
* ARIA role を取得(アクション確認なので alertdialog)
|
|
27
|
+
*/
|
|
28
|
+
protected getAriaRole(): string;
|
|
29
|
+
/**
|
|
30
|
+
* ダイアログのコンテンツをレンダリング
|
|
31
|
+
*/
|
|
32
|
+
protected renderContent(): HTMLElement;
|
|
33
|
+
/**
|
|
34
|
+
* ヘッダーをレンダリング
|
|
35
|
+
*/
|
|
36
|
+
private renderHeader;
|
|
37
|
+
/**
|
|
38
|
+
* アイコンをレンダリング
|
|
39
|
+
*/
|
|
40
|
+
private renderIcon;
|
|
41
|
+
/**
|
|
42
|
+
* アイコンのSVGを取得
|
|
43
|
+
*/
|
|
44
|
+
private getIconSVG;
|
|
45
|
+
/**
|
|
46
|
+
* ボディをレンダリング
|
|
47
|
+
*/
|
|
48
|
+
private renderBody;
|
|
49
|
+
/**
|
|
50
|
+
* フッターをレンダリング
|
|
51
|
+
*/
|
|
52
|
+
private renderFooter;
|
|
53
|
+
/**
|
|
54
|
+
* 確認ボタンクリック時
|
|
55
|
+
*/
|
|
56
|
+
private handleConfirm;
|
|
57
|
+
/**
|
|
58
|
+
* キャンセルボタンクリック時
|
|
59
|
+
*/
|
|
60
|
+
private handleCancel;
|
|
61
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Dialog Component
|
|
3
|
+
* すべてのダイアログバリアントの基盤となるクラス
|
|
4
|
+
*
|
|
5
|
+
* 機能:
|
|
6
|
+
* - オーバーレイ管理
|
|
7
|
+
* - フォーカストラップ
|
|
8
|
+
* - キーボードイベント処理(Escape, Tab)
|
|
9
|
+
* - ARIA属性管理
|
|
10
|
+
* - open/closeライフサイクル
|
|
11
|
+
* - bodyスクロール防止
|
|
12
|
+
* - フォーカス復元
|
|
13
|
+
*/
|
|
14
|
+
import type { BaseDialogConfig, BaseDialogCallbacks, BaseDialogState } from './dialog-types';
|
|
15
|
+
/**
|
|
16
|
+
* ベースダイアログコンポーネント
|
|
17
|
+
* すべてのダイアログタイプの共通ロジックを提供
|
|
18
|
+
*/
|
|
19
|
+
export declare class BaseDialog {
|
|
20
|
+
protected config: BaseDialogConfig;
|
|
21
|
+
protected callbacks: BaseDialogCallbacks;
|
|
22
|
+
protected state: BaseDialogState;
|
|
23
|
+
protected dialogElement: HTMLElement | null;
|
|
24
|
+
protected overlayElement: HTMLElement | null;
|
|
25
|
+
protected readonly dialogId: string;
|
|
26
|
+
private boundKeydownHandler;
|
|
27
|
+
constructor(config?: BaseDialogConfig, callbacks?: BaseDialogCallbacks);
|
|
28
|
+
/**
|
|
29
|
+
* ダイアログを開く
|
|
30
|
+
*/
|
|
31
|
+
open(): void;
|
|
32
|
+
/**
|
|
33
|
+
* ダイアログを閉じる
|
|
34
|
+
*/
|
|
35
|
+
close(): void;
|
|
36
|
+
/**
|
|
37
|
+
* 設定を更新
|
|
38
|
+
*/
|
|
39
|
+
updateConfig(config: Partial<BaseDialogConfig>): void;
|
|
40
|
+
/**
|
|
41
|
+
* 現在の状態を取得
|
|
42
|
+
*/
|
|
43
|
+
getState(): BaseDialogState;
|
|
44
|
+
/**
|
|
45
|
+
* ダイアログ要素を取得(テスト用)
|
|
46
|
+
*/
|
|
47
|
+
getDialogElement(): HTMLElement | null;
|
|
48
|
+
/**
|
|
49
|
+
* オーバーレイ要素を取得(テスト用)
|
|
50
|
+
*/
|
|
51
|
+
getOverlayElement(): HTMLElement | null;
|
|
52
|
+
/**
|
|
53
|
+
* ダイアログをレンダリング
|
|
54
|
+
* 継承クラスでオーバーライドして独自のコンテンツを追加
|
|
55
|
+
*/
|
|
56
|
+
protected render(): void;
|
|
57
|
+
/**
|
|
58
|
+
* ダイアログのコンテンツをレンダリング
|
|
59
|
+
* 継承クラスで必ずオーバーライドすること
|
|
60
|
+
*/
|
|
61
|
+
protected renderContent(): HTMLElement | null;
|
|
62
|
+
/**
|
|
63
|
+
* ダイアログのクラス名を取得
|
|
64
|
+
* 継承クラスでオーバーライドしてタイプ固有のクラスを追加
|
|
65
|
+
*/
|
|
66
|
+
protected getDialogClassName(): string;
|
|
67
|
+
/**
|
|
68
|
+
* ダイアログのARIA role を取得
|
|
69
|
+
* 継承クラスでオーバーライド可能(例: ActionDialog → alertdialog)
|
|
70
|
+
*/
|
|
71
|
+
protected getAriaRole(): string;
|
|
72
|
+
/**
|
|
73
|
+
* 初期フォーカス要素を取得
|
|
74
|
+
* 継承クラスでオーバーライドして特定の要素を返すことができる
|
|
75
|
+
*/
|
|
76
|
+
protected getFirstFocusElement(): HTMLElement | null;
|
|
77
|
+
/**
|
|
78
|
+
* オーバーレイを作成
|
|
79
|
+
*/
|
|
80
|
+
private createOverlay;
|
|
81
|
+
/**
|
|
82
|
+
* ダイアログコンテナを作成
|
|
83
|
+
*/
|
|
84
|
+
private createDialogContainer;
|
|
85
|
+
/**
|
|
86
|
+
* イベントリスナーを設定
|
|
87
|
+
*/
|
|
88
|
+
private setupEventListeners;
|
|
89
|
+
/**
|
|
90
|
+
* イベントリスナーを削除
|
|
91
|
+
*/
|
|
92
|
+
private removeEventListeners;
|
|
93
|
+
/**
|
|
94
|
+
* キーボードイベントハンドラ
|
|
95
|
+
*/
|
|
96
|
+
private handleKeydown;
|
|
97
|
+
/**
|
|
98
|
+
* Escapeキー処理
|
|
99
|
+
*/
|
|
100
|
+
private handleEscapeKey;
|
|
101
|
+
/**
|
|
102
|
+
* オーバーレイクリック処理
|
|
103
|
+
*/
|
|
104
|
+
private handleOverlayClick;
|
|
105
|
+
/**
|
|
106
|
+
* Tab キーの処理(フォーカストラップ)
|
|
107
|
+
*/
|
|
108
|
+
private handleTabKey;
|
|
109
|
+
/**
|
|
110
|
+
* フォーカス可能な要素を取得
|
|
111
|
+
*/
|
|
112
|
+
private getFocusableElements;
|
|
113
|
+
/**
|
|
114
|
+
* フォーカスをダイアログ内に設定
|
|
115
|
+
*/
|
|
116
|
+
private trapFocus;
|
|
117
|
+
/**
|
|
118
|
+
* ダイアログ要素を破棄
|
|
119
|
+
*/
|
|
120
|
+
private destroy;
|
|
121
|
+
/**
|
|
122
|
+
* HTML特殊文字をエスケープ
|
|
123
|
+
*/
|
|
124
|
+
protected escapeHtml(text: string): string;
|
|
125
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dialog Types
|
|
3
|
+
* ダイアログシステムの共通型定義
|
|
4
|
+
*/
|
|
5
|
+
export type DialogSize = 'XS' | 'S' | 'M' | 'L' | 'XL' | 'XXL' | 'FULL';
|
|
6
|
+
export interface BaseDialogConfig {
|
|
7
|
+
isOpen?: boolean;
|
|
8
|
+
size?: DialogSize;
|
|
9
|
+
ariaLabel?: string;
|
|
10
|
+
ariaLabelledby?: string;
|
|
11
|
+
ariaDescribedby?: string;
|
|
12
|
+
firstFocusTarget?: 'first' | 'confirm' | 'cancel';
|
|
13
|
+
onClickOverlay?: () => void | boolean;
|
|
14
|
+
onPressEscape?: () => void | boolean;
|
|
15
|
+
closeOnOverlayClick?: boolean;
|
|
16
|
+
closeOnEscape?: boolean;
|
|
17
|
+
contentPadding?: 'normal' | 'compact' | 'none';
|
|
18
|
+
className?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface BaseDialogCallbacks {
|
|
21
|
+
onOpen?: () => void;
|
|
22
|
+
onClose?: () => void;
|
|
23
|
+
onAfterClose?: () => void;
|
|
24
|
+
}
|
|
25
|
+
export interface BaseDialogState {
|
|
26
|
+
isOpen: boolean;
|
|
27
|
+
previouslyFocusedElement: Element | null;
|
|
28
|
+
}
|
|
29
|
+
export type DialogIcon = 'warning' | 'error' | 'info' | 'success' | 'custom';
|
|
30
|
+
export interface ActionDialogConfig extends BaseDialogConfig {
|
|
31
|
+
title: string;
|
|
32
|
+
message?: string;
|
|
33
|
+
icon?: DialogIcon;
|
|
34
|
+
customIcon?: string;
|
|
35
|
+
confirmLabel?: string;
|
|
36
|
+
cancelLabel?: string;
|
|
37
|
+
confirmDisabled?: boolean;
|
|
38
|
+
danger?: boolean;
|
|
39
|
+
showSubActionArea?: boolean;
|
|
40
|
+
subActionContent?: HTMLElement | string;
|
|
41
|
+
}
|
|
42
|
+
export interface ActionDialogCallbacks extends BaseDialogCallbacks {
|
|
43
|
+
onConfirm?: () => void | Promise<void>;
|
|
44
|
+
onCancel?: () => void;
|
|
45
|
+
}
|
|
46
|
+
export interface MessageDialogConfig extends BaseDialogConfig {
|
|
47
|
+
title: string;
|
|
48
|
+
message: string;
|
|
49
|
+
icon?: Exclude<DialogIcon, 'custom'> | 'custom';
|
|
50
|
+
customIcon?: string;
|
|
51
|
+
closeLabel?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface MessageDialogCallbacks extends BaseDialogCallbacks {
|
|
54
|
+
onAcknowledge?: () => void;
|
|
55
|
+
}
|
|
56
|
+
export interface ModelessDialogPosition {
|
|
57
|
+
top: number;
|
|
58
|
+
left: number;
|
|
59
|
+
}
|
|
60
|
+
export interface ModelessDialogConfig extends Omit<BaseDialogConfig, 'closeOnOverlayClick'> {
|
|
61
|
+
title: string;
|
|
62
|
+
position?: 'auto' | ModelessDialogPosition;
|
|
63
|
+
draggable?: boolean;
|
|
64
|
+
width?: number | string;
|
|
65
|
+
height?: number | string;
|
|
66
|
+
}
|
|
67
|
+
export interface ModelessDialogCallbacks extends BaseDialogCallbacks {
|
|
68
|
+
onMove?: (position: ModelessDialogPosition) => void;
|
|
69
|
+
}
|
|
70
|
+
export interface FormDialogConfig extends BaseDialogConfig {
|
|
71
|
+
title: string;
|
|
72
|
+
submitLabel?: string;
|
|
73
|
+
cancelLabel?: string;
|
|
74
|
+
preventCloseOnSubmit?: boolean;
|
|
75
|
+
warnOnUnsavedChanges?: boolean;
|
|
76
|
+
}
|
|
77
|
+
export interface FormDialogCallbacks extends BaseDialogCallbacks {
|
|
78
|
+
onSubmit?: (formData: FormData) => void | Promise<void>;
|
|
79
|
+
onCancel?: () => void;
|
|
80
|
+
onFormChange?: (isDirty: boolean) => void;
|
|
81
|
+
}
|
|
82
|
+
export interface DependencyInfo {
|
|
83
|
+
type: string;
|
|
84
|
+
label: string;
|
|
85
|
+
count: number;
|
|
86
|
+
}
|
|
87
|
+
export interface DeleteConfirmDialogConfig extends ActionDialogConfig {
|
|
88
|
+
targetName: string;
|
|
89
|
+
targetType?: string;
|
|
90
|
+
dependencies?: DependencyInfo[];
|
|
91
|
+
warningMessage?: string;
|
|
92
|
+
}
|
|
93
|
+
export interface DeleteConfirmDialogCallbacks extends ActionDialogCallbacks {
|
|
94
|
+
}
|
|
95
|
+
export interface DeleteConfirmDialogState extends BaseDialogState {
|
|
96
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Disclosure Component
|
|
3
|
+
* 開閉コンテンツコンポーネント
|
|
4
|
+
*
|
|
5
|
+
*
|
|
6
|
+
* https://smarthr.design/products/components/disclosure/
|
|
7
|
+
*
|
|
8
|
+
* 機能:
|
|
9
|
+
* - 開閉トリガー(クリック)
|
|
10
|
+
* - スムーズなアニメーション
|
|
11
|
+
* - アイコン回転
|
|
12
|
+
* - デフォルト展開状態
|
|
13
|
+
* - キーボード操作対応
|
|
14
|
+
* - アクセシビリティ対応(ARIA属性)
|
|
15
|
+
*
|
|
16
|
+
* 用途:
|
|
17
|
+
* - 「もっと見る」機能
|
|
18
|
+
* - 補足情報の表示切り替え
|
|
19
|
+
* - AccordionPanelより軽量な単独使用
|
|
20
|
+
*/
|
|
21
|
+
import type { InputField } from '../../types/schema';
|
|
22
|
+
/**
|
|
23
|
+
* Disclosureの状態
|
|
24
|
+
*/
|
|
25
|
+
export interface DisclosureState {
|
|
26
|
+
/** 展開中かどうか */
|
|
27
|
+
isOpen: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Disclosureのコールバック
|
|
31
|
+
*/
|
|
32
|
+
export interface DisclosureCallbacks {
|
|
33
|
+
/** 展開時 */
|
|
34
|
+
onOpen?: () => void;
|
|
35
|
+
/** 折りたたみ時 */
|
|
36
|
+
onClose?: () => void;
|
|
37
|
+
/** 開閉状態変更時 */
|
|
38
|
+
onChange?: (isOpen: boolean) => void;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Disclosureの設定
|
|
42
|
+
*/
|
|
43
|
+
export interface DisclosureConfig {
|
|
44
|
+
/** トリガーのラベル(閉じているとき) */
|
|
45
|
+
triggerLabel: string;
|
|
46
|
+
/** トリガーのラベル(開いているとき、オプション) */
|
|
47
|
+
triggerLabelOpen?: string;
|
|
48
|
+
/** コンテンツ(HTML文字列またはHTMLElement) */
|
|
49
|
+
content: string | HTMLElement;
|
|
50
|
+
/** デフォルトで展開(デフォルト: false) */
|
|
51
|
+
defaultOpen?: boolean;
|
|
52
|
+
/** ID属性 */
|
|
53
|
+
id?: string;
|
|
54
|
+
/** カスタムCSSクラス */
|
|
55
|
+
className?: string;
|
|
56
|
+
/** 閉じた状態でもDOMに存在させるか(デフォルト: false) */
|
|
57
|
+
visuallyHidden?: boolean;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Disclosureコンポーネント
|
|
61
|
+
*/
|
|
62
|
+
export declare class Disclosure {
|
|
63
|
+
private config;
|
|
64
|
+
private state;
|
|
65
|
+
private callbacks;
|
|
66
|
+
private container;
|
|
67
|
+
private instanceId;
|
|
68
|
+
private triggerElement;
|
|
69
|
+
private contentWrapper;
|
|
70
|
+
private contentElement;
|
|
71
|
+
constructor(container: HTMLElement, config: DisclosureConfig, callbacks?: DisclosureCallbacks);
|
|
72
|
+
/**
|
|
73
|
+
* Disclosureをレンダリング
|
|
74
|
+
*/
|
|
75
|
+
render(): void;
|
|
76
|
+
/**
|
|
77
|
+
* 展開する
|
|
78
|
+
*/
|
|
79
|
+
open(): void;
|
|
80
|
+
/**
|
|
81
|
+
* 折りたたむ
|
|
82
|
+
*/
|
|
83
|
+
close(): void;
|
|
84
|
+
/**
|
|
85
|
+
* 開閉を切り替え
|
|
86
|
+
*/
|
|
87
|
+
toggle(): void;
|
|
88
|
+
/**
|
|
89
|
+
* 展開状態を確認
|
|
90
|
+
*/
|
|
91
|
+
isOpen(): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* 現在の状態を取得
|
|
94
|
+
*/
|
|
95
|
+
getState(): DisclosureState;
|
|
96
|
+
/**
|
|
97
|
+
* コンテンツを更新
|
|
98
|
+
*/
|
|
99
|
+
setContent(content: string | HTMLElement): void;
|
|
100
|
+
/**
|
|
101
|
+
* トリガーラベルを更新
|
|
102
|
+
*/
|
|
103
|
+
setTriggerLabel(label: string, labelOpen?: string): void;
|
|
104
|
+
/**
|
|
105
|
+
* コンポーネントを破棄
|
|
106
|
+
*/
|
|
107
|
+
destroy(): void;
|
|
108
|
+
private renderTrigger;
|
|
109
|
+
private renderIcon;
|
|
110
|
+
private renderContent;
|
|
111
|
+
private updateUI;
|
|
112
|
+
private getCurrentLabel;
|
|
113
|
+
static renderField(field: InputField): string;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Disclosureを作成
|
|
117
|
+
*/
|
|
118
|
+
export declare function createDisclosure(container: HTMLElement, config: DisclosureConfig, callbacks?: DisclosureCallbacks): Disclosure;
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dropdown Component
|
|
3
|
+
* ドロップダウンコンポーネント
|
|
4
|
+
*
|
|
5
|
+
* 3つのバリアント:
|
|
6
|
+
* - MenuButton: アクションメニュー
|
|
7
|
+
* - FilterDropdown: フィルター操作
|
|
8
|
+
* - SortDropdown: 並び替え操作
|
|
9
|
+
*/
|
|
10
|
+
import type { InputField } from '../../types/schema';
|
|
11
|
+
/**
|
|
12
|
+
* ドロップダウンメニュー項目の基本型
|
|
13
|
+
*/
|
|
14
|
+
interface BaseMenuItem {
|
|
15
|
+
/** 項目ID */
|
|
16
|
+
id: string;
|
|
17
|
+
/** 項目ラベル */
|
|
18
|
+
label: string;
|
|
19
|
+
/** アイコン(オプション) */
|
|
20
|
+
icon?: string;
|
|
21
|
+
/** 無効化 */
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* アクションメニュー項目
|
|
26
|
+
*/
|
|
27
|
+
export interface ActionMenuItem extends BaseMenuItem {
|
|
28
|
+
type: 'action';
|
|
29
|
+
/** クリック時のハンドラー */
|
|
30
|
+
onAction?: (id: string) => void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 区切り線
|
|
34
|
+
*/
|
|
35
|
+
export interface DividerMenuItem {
|
|
36
|
+
type: 'divider';
|
|
37
|
+
/** 一意なID(必須) */
|
|
38
|
+
id: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* フィルター項目
|
|
42
|
+
*/
|
|
43
|
+
export interface FilterMenuItem extends BaseMenuItem {
|
|
44
|
+
type: 'filter';
|
|
45
|
+
/** フィルター値 */
|
|
46
|
+
value: string;
|
|
47
|
+
/** 選択状態 */
|
|
48
|
+
selected?: boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* ソート項目
|
|
52
|
+
*/
|
|
53
|
+
export interface SortMenuItem extends BaseMenuItem {
|
|
54
|
+
type: 'sort';
|
|
55
|
+
/** ソートフィールド */
|
|
56
|
+
field: string;
|
|
57
|
+
/** ソート方向 */
|
|
58
|
+
direction?: 'asc' | 'desc';
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 全てのメニュー項目のユニオン型
|
|
62
|
+
*/
|
|
63
|
+
export type MenuItem = ActionMenuItem | DividerMenuItem | FilterMenuItem | SortMenuItem;
|
|
64
|
+
/**
|
|
65
|
+
* ドロップダウンのバリアント
|
|
66
|
+
*/
|
|
67
|
+
export type DropdownVariant = 'menu' | 'filter' | 'sort';
|
|
68
|
+
/**
|
|
69
|
+
* ドロップダウンの配置
|
|
70
|
+
*/
|
|
71
|
+
export type DropdownPlacement = 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end';
|
|
72
|
+
/**
|
|
73
|
+
* ドロップダウンの状態
|
|
74
|
+
*/
|
|
75
|
+
export interface DropdownState {
|
|
76
|
+
/** 開閉状態 */
|
|
77
|
+
isOpen: boolean;
|
|
78
|
+
/** メニュー項目 */
|
|
79
|
+
items: MenuItem[];
|
|
80
|
+
/** 選択されたフィルター(FilterDropdown用) */
|
|
81
|
+
selectedFilters?: string[];
|
|
82
|
+
/** 現在のソート(SortDropdown用) */
|
|
83
|
+
currentSort?: {
|
|
84
|
+
field: string;
|
|
85
|
+
direction: 'asc' | 'desc';
|
|
86
|
+
};
|
|
87
|
+
/** フォーカスされている項目のインデックス */
|
|
88
|
+
focusedIndex: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* ドロップダウンのコールバック
|
|
92
|
+
*/
|
|
93
|
+
export interface DropdownCallbacks {
|
|
94
|
+
/** 開閉状態変更時 */
|
|
95
|
+
onOpenChange?: (isOpen: boolean) => void;
|
|
96
|
+
/** メニュー項目選択時 */
|
|
97
|
+
onSelect?: (item: MenuItem) => void;
|
|
98
|
+
/** フィルター適用時(FilterDropdown用) */
|
|
99
|
+
onApply?: (selectedFilters: string[]) => void;
|
|
100
|
+
/** フィルタークリア時(FilterDropdown用) */
|
|
101
|
+
onReset?: () => void;
|
|
102
|
+
/** ソート変更時(SortDropdown用) */
|
|
103
|
+
onSortChange?: (field: string, direction: 'asc' | 'desc') => void;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* ドロップダウンの設定
|
|
107
|
+
*/
|
|
108
|
+
export interface DropdownConfig {
|
|
109
|
+
/** バリアント */
|
|
110
|
+
variant?: DropdownVariant;
|
|
111
|
+
/** トリガーボタンのラベル */
|
|
112
|
+
triggerLabel: string;
|
|
113
|
+
/** トリガーボタンのアイコン */
|
|
114
|
+
triggerIcon?: string;
|
|
115
|
+
/** メニュー項目 */
|
|
116
|
+
items: MenuItem[];
|
|
117
|
+
/** 配置 */
|
|
118
|
+
placement?: DropdownPlacement;
|
|
119
|
+
/** トリガーサイズ */
|
|
120
|
+
triggerSize?: 's' | 'default';
|
|
121
|
+
/** アイコンのみのトリガー */
|
|
122
|
+
onlyIconTrigger?: boolean;
|
|
123
|
+
/** 初期開閉状態 */
|
|
124
|
+
defaultOpen?: boolean;
|
|
125
|
+
/** フィルター状態(FilterDropdown用) */
|
|
126
|
+
isFiltered?: boolean;
|
|
127
|
+
/** モーダル表示(モバイル用、将来実装) */
|
|
128
|
+
useModal?: boolean;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* ドロップダウンコンポーネント
|
|
132
|
+
*/
|
|
133
|
+
export declare class Dropdown {
|
|
134
|
+
private config;
|
|
135
|
+
private state;
|
|
136
|
+
private callbacks;
|
|
137
|
+
private container;
|
|
138
|
+
private instanceId;
|
|
139
|
+
private triggerElement;
|
|
140
|
+
private contentElement;
|
|
141
|
+
private clickOutsideHandler;
|
|
142
|
+
private keyboardHandler;
|
|
143
|
+
constructor(container: HTMLElement, config: DropdownConfig, callbacks?: DropdownCallbacks);
|
|
144
|
+
/**
|
|
145
|
+
* ドロップダウンをレンダリング
|
|
146
|
+
*/
|
|
147
|
+
render(): void;
|
|
148
|
+
/**
|
|
149
|
+
* 開閉状態を切り替え
|
|
150
|
+
*/
|
|
151
|
+
toggle(): void;
|
|
152
|
+
/**
|
|
153
|
+
* 開く
|
|
154
|
+
*/
|
|
155
|
+
open(): void;
|
|
156
|
+
/**
|
|
157
|
+
* 閉じる
|
|
158
|
+
*/
|
|
159
|
+
close(): void;
|
|
160
|
+
/**
|
|
161
|
+
* 開閉状態を設定
|
|
162
|
+
*/
|
|
163
|
+
setOpen(isOpen: boolean): void;
|
|
164
|
+
/**
|
|
165
|
+
* 状態を取得
|
|
166
|
+
*/
|
|
167
|
+
getState(): DropdownState;
|
|
168
|
+
/**
|
|
169
|
+
* メニュー項目を更新
|
|
170
|
+
*/
|
|
171
|
+
setItems(items: MenuItem[]): void;
|
|
172
|
+
/**
|
|
173
|
+
* コンポーネントを破棄
|
|
174
|
+
*/
|
|
175
|
+
destroy(): void;
|
|
176
|
+
private createInitialState;
|
|
177
|
+
private renderTrigger;
|
|
178
|
+
private renderContent;
|
|
179
|
+
private renderMenuContent;
|
|
180
|
+
private renderFilterContent;
|
|
181
|
+
private renderMenuItem;
|
|
182
|
+
private renderFilterItem;
|
|
183
|
+
private renderDivider;
|
|
184
|
+
private handleItemClick;
|
|
185
|
+
private handleFilterChange;
|
|
186
|
+
private handleFilterApply;
|
|
187
|
+
private handleFilterReset;
|
|
188
|
+
private handleClickOutside;
|
|
189
|
+
private handleKeyboard;
|
|
190
|
+
/**
|
|
191
|
+
* 初回オープン時のフォーカス設定(再レンダリングなし)
|
|
192
|
+
*/
|
|
193
|
+
private initializeFocus;
|
|
194
|
+
private focusFirstItem;
|
|
195
|
+
private focusLastItem;
|
|
196
|
+
private focusNextItem;
|
|
197
|
+
private focusPreviousItem;
|
|
198
|
+
private setFocusedIndex;
|
|
199
|
+
private selectFocusedItem;
|
|
200
|
+
private attachEventListeners;
|
|
201
|
+
private detachEventListeners;
|
|
202
|
+
static renderField(field: InputField): string;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* ドロップダウンを作成(ファクトリー関数)
|
|
206
|
+
*/
|
|
207
|
+
export declare function createDropdown(container: HTMLElement, config: DropdownConfig, callbacks?: DropdownCallbacks): Dropdown;
|
|
208
|
+
/**
|
|
209
|
+
* メニューボタンを作成
|
|
210
|
+
*/
|
|
211
|
+
export declare function createMenuButton(container: HTMLElement, config: Omit<DropdownConfig, 'variant'>, callbacks?: DropdownCallbacks): Dropdown;
|
|
212
|
+
/**
|
|
213
|
+
* フィルタードロップダウンを作成
|
|
214
|
+
*/
|
|
215
|
+
export declare function createFilterDropdown(container: HTMLElement, config: Omit<DropdownConfig, 'variant'>, callbacks?: DropdownCallbacks): Dropdown;
|
|
216
|
+
/**
|
|
217
|
+
* ソートドロップダウンを作成
|
|
218
|
+
*/
|
|
219
|
+
export declare function createSortDropdown(container: HTMLElement, config: Omit<DropdownConfig, 'variant'>, callbacks?: DropdownCallbacks): Dropdown;
|
|
220
|
+
export {};
|