mokkun 0.1.4 → 0.1.6

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.
@@ -25,6 +25,8 @@ export interface FileLoadSuccess {
25
25
  schema: MokkunSchema;
26
26
  fileName: string;
27
27
  source: 'file' | 'url' | 'drop';
28
+ /** 読み込んだ YAML の原文(コメント・順序を保持) */
29
+ content: string;
28
30
  }
29
31
  /**
30
32
  * ファイル読み込み失敗結果
@@ -0,0 +1,24 @@
1
+ /**
2
+ * YAML キー正規化
3
+ *
4
+ * YAML の正規形は camelCase。内部表現は snake_case のまま維持するため、
5
+ * パーサーの入口で camelCase キーを内部の snake_case キーへ変換する。
6
+ * snake_case の YAML(teamkit generate-ui の出力など)は変換せずそのまま通す(後方互換)。
7
+ */
8
+ /**
9
+ * 内部で使用する snake_case キーの完全な集合(ソート済み、113 個)。
10
+ * schema.json のプロパティ名 / src/types/schema.ts のプロパティ名 /
11
+ * yaml-parser.ts が読むキーの和集合。key-normalizer.test.ts で schema.json と突き合わせる。
12
+ *
13
+ * 注意: 内部で元から camelCase のプロパティ(dropdownItems, maxColumns, weekStartsOn, loaderType,
14
+ * showProgress, initialProgress, ariaLabel, defaultValue)は snake_case 版と衝突するため、パーサーは snake 形で読む。
15
+ * definition_list の group/item の maxColumns はレンダラーが camelCase で読むが、静的 renderField では無視される。
16
+ */
17
+ export declare const KNOWN_KEYS: readonly string[];
18
+ /** snake_case を camelCase に変換(use_24_hour → use24Hour) */
19
+ export declare function toCamel(snake: string): string;
20
+ /** camelCase を snake_case に変換(use24Hour → use_24_hour) */
21
+ export declare function toSnake(camel: string): string;
22
+ /** camelCase キー → 内部 snake_case キー */
23
+ export declare const CAMEL_TO_SNAKE: Record<string, string>;
24
+ export declare function normalizeKeysDeep(value: unknown, parentKey?: string, verbatimSelf?: boolean, isNamedEntry?: boolean): unknown;
@@ -117,6 +117,8 @@ export interface AppHeaderConfig {
117
117
  logoAlt?: string;
118
118
  /** ロゴのリンク先 */
119
119
  logoHref?: string;
120
+ /** システム名(既定ロゴのテキスト。logo 指定時は無視) */
121
+ systemName?: string;
120
122
  /** アプリ名 */
121
123
  appName: string;
122
124
  /** テナント一覧 */
@@ -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
+ }
@@ -83,9 +83,6 @@ export declare function renderGoogleMapEmbedFieldHtml(field: GoogleMapEmbedField
83
83
  * image_uploader → 画像アップローダーコンポーネント
84
84
  */
85
85
  export declare function renderImageUploaderField(field: ImageUploaderField): string;
86
- /**
87
- * repeater → 静的なリピーターフィールド表示
88
- */
89
86
  export declare function renderRepeaterFieldStatic(field: RepeaterField): string;
90
87
  /**
91
88
  * フィールドタイプに応じてレンダリング
@@ -176,4 +176,10 @@ export declare class Tabs {
176
176
  */
177
177
  refreshTabContent(tabId: string): Promise<void>;
178
178
  static renderField(field: InputField): string;
179
+ private static renderDummy;
179
180
  }
181
+ /**
182
+ * 静的出力(Tabs.renderField)のタブ切替を有効化する。クリックと矢印キーに対応。
183
+ * @returns クリーンアップ関数
184
+ */
185
+ export declare function attachTabsBehavior(container: HTMLElement): () => void;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Screen Layout — 画面レイアウトは shell 固定
3
+ */
4
+ export { shellLayout } from './shell';
5
+ export type { ScreenLayout, LayoutHelpers, RenderedSection } from './types';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Layout "shell" — アプリシェル型(管理画面)
3
+ * app_header / app_navi を全幅で最上部に置き、本文は 12 カラムグリッドのカード群にする。
4
+ */
5
+ import type { ScreenLayout } from './types';
6
+ import './shell.css';
7
+ export declare const shellLayout: ScreenLayout;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Screen Layout — 画面全体の骨格(ヘッダ・セクション・アクションの配置)。layout は shell のみ
3
+ */
4
+ import type { ScreenDefinition, InputField, Action } from '../../types/schema';
5
+ /** セクション1つ分の描画済み部品 */
6
+ export interface RenderedSection {
7
+ id: string;
8
+ title: string;
9
+ icon?: string;
10
+ fieldsHtml: string;
11
+ publishToggleHtml: string;
12
+ }
13
+ /** レイアウト実装が利用できるヘルパー群 */
14
+ export interface LayoutHelpers {
15
+ /** 画面タイトル+説明文 */
16
+ renderScreenHeader(screen: ScreenDefinition): string;
17
+ /** app_header / app_navi のマウント先コンテナ */
18
+ renderAppLayoutContainers(screen: ScreenDefinition): string;
19
+ /** 任意のフィールド配列を描画 */
20
+ renderFields(fields: InputField[]): string;
21
+ /** 任意のアクション配列を描画 */
22
+ renderActions(actions: Action[]): string;
23
+ /** sections を部品に分解したもの(sections が無い画面では空配列) */
24
+ renderSections(screen: ScreenDefinition): RenderedSection[];
25
+ /** セクションIDを生成 */
26
+ generateSectionId(sectionName: string, index: number): string;
27
+ escapeHtml(text: string): string;
28
+ }
29
+ export interface ScreenLayout {
30
+ /** レイアウトID */
31
+ id: string;
32
+ /** 画面全体のHTMLを返す(`.screen` 要素を含むこと) */
33
+ render(screen: ScreenDefinition, helpers: LayoutHelpers): string;
34
+ }
@@ -3,7 +3,6 @@
3
3
  * 画面全体のレンダリングを担当
4
4
  */
5
5
  import type { ScreenDefinition } from '../types/schema';
6
- import { type SectionDefinition } from './components/section-nav';
7
6
  import { AppHeader } from './components/app-header';
8
7
  import { AppNavi } from './components/app-navi';
9
8
  /**
@@ -11,7 +10,7 @@ import { AppNavi } from './components/app-navi';
11
10
  */
12
11
  export declare function renderWizardScreen(screen: ScreenDefinition, currentStepIndex?: number): string;
13
12
  /**
14
- * 通常画面をレンダリング
13
+ * 通常画面をレンダリング(shell レイアウト固定)
15
14
  */
16
15
  export declare function renderScreen(screen: ScreenDefinition): string;
17
16
  /**
@@ -22,8 +21,6 @@ export interface ScreenController {
22
21
  appHeader?: AppHeader;
23
22
  /** AppNaviインスタンス(存在する場合) */
24
23
  appNavi?: AppNavi;
25
- /** SectionNavコントローラー(存在する場合) */
26
- sectionNav?: SectionNavController;
27
24
  /** 全コンポーネントを破棄 */
28
25
  destroy: () => void;
29
26
  }
@@ -32,17 +29,14 @@ export interface ScreenController {
32
29
  */
33
30
  export declare function mountScreen(container: HTMLElement, screen: ScreenDefinition): ScreenController;
34
31
  /**
35
- * セクションナビゲーションを初期化
32
+ * AppHeader / AppNavi のみをマウントする(renderScreen の文字列出力を使う呼び出し側用)
36
33
  */
37
- export declare function initializeSectionNav(container: HTMLElement, screen: ScreenDefinition): SectionNavController | null;
38
- /**
39
- * セクションナビコントローラーインターフェース
40
- */
41
- export interface SectionNavController {
42
- getActiveSection: () => SectionDefinition | undefined;
43
- scrollToSection: (sectionId: string) => void;
34
+ export interface AppChromeController {
35
+ appHeader?: AppHeader;
36
+ appNavi?: AppNavi;
44
37
  destroy: () => void;
45
38
  }
39
+ export declare function mountAppChrome(container: HTMLElement, screen: ScreenDefinition): AppChromeController;
46
40
  /**
47
41
  * ウィザード画面をDOMにマウント(ステップ管理付き)
48
42
  */
@@ -52,6 +46,7 @@ export declare function mountWizardScreen(container: HTMLElement, screen: Screen
52
46
  */
53
47
  export interface WizardController {
54
48
  getCurrentStep: () => number;
49
+ destroy: () => void;
55
50
  goToStep: (step: number) => void;
56
51
  nextStep: () => void;
57
52
  prevStep: () => void;
@@ -11,17 +11,3 @@ export declare function generateDummyData(field: InputField, index?: number): un
11
11
  * リピーターアイテム用のダミーデータセットを生成
12
12
  */
13
13
  export declare function generateRepeaterItemDummyData(itemFields: InputField[], itemIndex: number): Record<string, unknown>;
14
- /**
15
- * DataTable用のダミー行データを生成
16
- */
17
- export declare function generateDataTableDummyRow(columns: Array<{
18
- id: string;
19
- label: string;
20
- }>, rowIndex: number): Record<string, unknown>;
21
- /**
22
- * DataTable用のダミーデータセットを生成
23
- */
24
- export declare function generateDataTableDummyData(columns: Array<{
25
- id: string;
26
- label: string;
27
- }>, rowCount?: number): Array<Record<string, unknown>>;
@@ -18,6 +18,16 @@ export declare function escapeHtml(text: string): string;
18
18
  * @returns エスケープされた文字列
19
19
  */
20
20
  export declare function escapeHtmlSafe(text: string): string;
21
+ /**
22
+ * radio/checkbox グループの方向を決める。direction 指定があれば優先。
23
+ * 未指定なら 選択肢4個以下かつ全ラベル8文字以下(説明文なし)で horizontal。
24
+ */
25
+ export declare function resolveGroupDirection(direction: 'horizontal' | 'vertical' | undefined, options: Array<{
26
+ label: string;
27
+ description?: string;
28
+ }>): 'horizontal' | 'vertical';
29
+ /** 入力欄ではないが見出しとしてラベルだけ残すタイプ(description は出さない) */
30
+ export declare const HEADING_LABEL_TYPES: Set<string>;
21
31
  /**
22
32
  * フィールドのラッパーHTML生成
23
33
  *
@@ -65,3 +75,16 @@ export declare function getDefaultSizeForLevel(level: 1 | 2 | 3 | 4 | 5 | 6): 'x
65
75
  * 単位ラベルのマッピング
66
76
  */
67
77
  export declare const unitLabels: Record<string, string>;
78
+ /**
79
+ * ユーザー指定の class 値を検証して返す(英数字・_・-・空白のみ許可)
80
+ * 不正な値は undefined を返し、呼び出し側は無視する。
81
+ */
82
+ export declare function safeClassName(value: unknown): string | undefined;
83
+ /**
84
+ * 数値属性を生成する。有限な数値でない場合は空文字(属性なし)を返す。
85
+ */
86
+ export declare function numAttr(name: string, value: unknown): string;
87
+ /**
88
+ * 識別子(クラス名の一部や data 属性値)として使えるトークンだけを通す
89
+ */
90
+ export declare function safeToken(value: unknown, fallback: string): string;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * アイコン名 → 絵文字/Unicode記号 のマップ
3
+ * YAML の `icon: "refresh"` のような名前指定を、文字列のまま表示せずに記号へ変換する。
4
+ */
5
+ /**
6
+ * アイコン名を記号に変換する。未知の名前は空文字(文字列そのものは表示しない)。
7
+ * 既に絵文字などの非ASCII文字列が直接指定されている場合はそのまま返す。
8
+ */
9
+ export declare function resolveIcon(name: string | undefined | null): string;
10
+ /**
11
+ * アイコン用の <span> HTML を生成(未知の名前は空文字)
12
+ */
13
+ export declare function renderIconHtml(name: string | undefined | null, className: string): string;
@@ -241,6 +241,8 @@ export interface AppHeaderConfigSchema {
241
241
  logoAlt?: string;
242
242
  /** ロゴのリンク先 */
243
243
  logoHref?: string;
244
+ /** システム名(既定ロゴのテキスト。logo 指定時は無視) */
245
+ systemName?: string;
244
246
  /** アプリ名 */
245
247
  appName: string;
246
248
  /** テナント一覧 */
@@ -1287,12 +1289,26 @@ export interface SegmentedControlField extends BaseInputField {
1287
1289
  */
1288
1290
  export interface TabsField extends BaseInputField {
1289
1291
  type: 'tabs';
1290
- /** タブアイテム */
1291
- tabs?: Array<{
1292
- id: string;
1293
- label: string;
1294
- content?: string;
1295
- }>;
1292
+ /** タブアイテム(items と tabs は同義。items を優先) */
1293
+ items?: TabsFieldItem[];
1294
+ tabs?: TabsFieldItem[];
1295
+ /** 初期アクティブタブID */
1296
+ default?: string;
1297
+ active?: string;
1298
+ /** タブの配置 */
1299
+ position?: 'top' | 'bottom' | 'left' | 'right';
1300
+ /** タブのスタイル */
1301
+ variant?: 'default' | 'pills' | 'underline' | 'bordered' | 'segmented';
1302
+ }
1303
+ export interface TabsFieldItem {
1304
+ id?: string;
1305
+ label?: string;
1306
+ icon?: string;
1307
+ badge?: string | number;
1308
+ disabled?: boolean;
1309
+ /** プレーンテキスト(エスケープして表示) */
1310
+ content?: string;
1311
+ fields?: InputField[];
1296
1312
  }
1297
1313
  /**
1298
1314
  * ラインクランプフィールド
@@ -64,7 +64,7 @@ export interface ThemeDefinition {
64
64
  /**
65
65
  * Built-in theme IDs
66
66
  */
67
- export type BuiltInThemeId = 'light' | 'dark' | 'lofi';
67
+ export type BuiltInThemeId = 'light' | 'dark';
68
68
  /**
69
69
  * Theme configuration from YAML
70
70
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mokkun",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "YAML-based presentation and form builder",
5
5
  "type": "module",
6
6
  "bin": {
@@ -51,6 +51,8 @@
51
51
  "license": "MIT",
52
52
  "devDependencies": {
53
53
  "@types/js-yaml": "^4.0.9",
54
+ "ajv": "^8.20.0",
55
+ "ajv-formats": "^3.0.1",
54
56
  "jsdom": "^27.4.0",
55
57
  "typescript": "^5.7.3",
56
58
  "vite": "^6.0.7",