mokkun 0.1.5 → 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.
Files changed (85) hide show
  1. package/README.md +18 -6
  2. package/bin/cli.mjs +6 -6
  3. package/bin/viewer.html +2 -2
  4. package/dist/mokkun.css +1 -1
  5. package/dist/mokkun.esm.js +4898 -2913
  6. package/dist/mokkun.esm.js.map +1 -1
  7. package/dist/mokkun.js +359 -322
  8. package/dist/mokkun.js.map +1 -1
  9. package/dist/types/lib.d.ts +80 -0
  10. package/dist/types/loader/file-loader.d.ts +114 -0
  11. package/dist/types/loader/index.d.ts +4 -0
  12. package/dist/types/parser/index.d.ts +4 -0
  13. package/dist/types/parser/key-normalizer.d.ts +24 -0
  14. package/dist/types/parser/yaml-parser.d.ts +58 -0
  15. package/dist/types/renderer/action-handler.d.ts +76 -0
  16. package/dist/types/renderer/components/accordion-panel.d.ts +144 -0
  17. package/dist/types/renderer/components/action-buttons.d.ts +183 -0
  18. package/dist/types/renderer/components/alert-banner.d.ts +43 -0
  19. package/dist/types/renderer/components/app-header.d.ts +277 -0
  20. package/dist/types/renderer/components/app-navi.d.ts +167 -0
  21. package/dist/types/renderer/components/badge.d.ts +134 -0
  22. package/dist/types/renderer/components/browser.d.ts +134 -0
  23. package/dist/types/renderer/components/calendar.d.ts +198 -0
  24. package/dist/types/renderer/components/checkbox.d.ts +132 -0
  25. package/dist/types/renderer/components/chip.d.ts +120 -0
  26. package/dist/types/renderer/components/combobox.d.ts +217 -0
  27. package/dist/types/renderer/components/data-table.d.ts +186 -0
  28. package/dist/types/renderer/components/date-range-picker.d.ts +203 -0
  29. package/dist/types/renderer/components/definition-list.d.ts +165 -0
  30. package/dist/types/renderer/components/delete-confirm-dialog.d.ts +151 -0
  31. package/dist/types/renderer/components/dialog/action-dialog.d.ts +61 -0
  32. package/dist/types/renderer/components/dialog/base-dialog.d.ts +125 -0
  33. package/dist/types/renderer/components/dialog/dialog-types.d.ts +96 -0
  34. package/dist/types/renderer/components/disclosure.d.ts +118 -0
  35. package/dist/types/renderer/components/dropdown.d.ts +220 -0
  36. package/dist/types/renderer/components/duration-input.d.ts +154 -0
  37. package/dist/types/renderer/components/duration-picker.d.ts +108 -0
  38. package/dist/types/renderer/components/field-renderer.d.ts +22 -0
  39. package/dist/types/renderer/components/float-area.d.ts +196 -0
  40. package/dist/types/renderer/components/form-fields.d.ts +94 -0
  41. package/dist/types/renderer/components/form-section.d.ts +118 -0
  42. package/dist/types/renderer/components/google-map-embed.d.ts +88 -0
  43. package/dist/types/renderer/components/heading.d.ts +119 -0
  44. package/dist/types/renderer/components/image-uploader.d.ts +271 -0
  45. package/dist/types/renderer/components/index.d.ts +48 -0
  46. package/dist/types/renderer/components/information-panel.d.ts +139 -0
  47. package/dist/types/renderer/components/input.d.ts +222 -0
  48. package/dist/types/renderer/components/layout.d.ts +71 -0
  49. package/dist/types/renderer/components/line-clamp.d.ts +170 -0
  50. package/dist/types/renderer/components/loader.d.ts +104 -0
  51. package/dist/types/renderer/components/notification-bar.d.ts +251 -0
  52. package/dist/types/renderer/components/pagination.d.ts +167 -0
  53. package/dist/types/renderer/components/photo-manager-renderer.d.ts +9 -0
  54. package/dist/types/renderer/components/radio-button-panel.d.ts +152 -0
  55. package/dist/types/renderer/components/radio.d.ts +117 -0
  56. package/dist/types/renderer/components/repeater.d.ts +116 -0
  57. package/dist/types/renderer/components/response-message.d.ts +180 -0
  58. package/dist/types/renderer/components/search-input.d.ts +198 -0
  59. package/dist/types/renderer/components/section-nav.d.ts +151 -0
  60. package/dist/types/renderer/components/segmented-control.d.ts +143 -0
  61. package/dist/types/renderer/components/select.d.ts +98 -0
  62. package/dist/types/renderer/components/status-label.d.ts +146 -0
  63. package/dist/types/renderer/components/stepper.d.ts +123 -0
  64. package/dist/types/renderer/components/tabs.d.ts +185 -0
  65. package/dist/types/renderer/components/textarea.d.ts +173 -0
  66. package/dist/types/renderer/components/timeline.d.ts +146 -0
  67. package/dist/types/renderer/components/toggle.d.ts +109 -0
  68. package/dist/types/renderer/components/tooltip.d.ts +158 -0
  69. package/dist/types/renderer/components/wizard.d.ts +118 -0
  70. package/dist/types/renderer/layouts/index.d.ts +5 -0
  71. package/dist/types/renderer/layouts/shell.d.ts +7 -0
  72. package/dist/types/renderer/layouts/types.d.ts +34 -0
  73. package/dist/types/renderer/screen-renderer.d.ts +53 -0
  74. package/dist/types/renderer/utils/dom.d.ts +29 -0
  75. package/dist/types/renderer/utils/dummy-data.d.ts +13 -0
  76. package/dist/types/renderer/utils/field-helpers.d.ts +90 -0
  77. package/dist/types/renderer/utils/icons.d.ts +13 -0
  78. package/dist/types/renderer/utils/index.d.ts +6 -0
  79. package/dist/types/theme/index.d.ts +6 -0
  80. package/dist/types/theme/theme-manager.d.ts +102 -0
  81. package/dist/types/types/field-renderable.d.ts +40 -0
  82. package/dist/types/types/index.d.ts +6 -0
  83. package/dist/types/types/schema.d.ts +1701 -0
  84. package/dist/types/types/theme.d.ts +111 -0
  85. package/package.json +3 -1
@@ -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
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Screen Renderer
3
+ * 画面全体のレンダリングを担当
4
+ */
5
+ import type { ScreenDefinition } from '../types/schema';
6
+ import { AppHeader } from './components/app-header';
7
+ import { AppNavi } from './components/app-navi';
8
+ /**
9
+ * ウィザード画面をレンダリング
10
+ */
11
+ export declare function renderWizardScreen(screen: ScreenDefinition, currentStepIndex?: number): string;
12
+ /**
13
+ * 通常画面をレンダリング(shell レイアウト固定)
14
+ */
15
+ export declare function renderScreen(screen: ScreenDefinition): string;
16
+ /**
17
+ * 画面コントローラーインターフェース
18
+ */
19
+ export interface ScreenController {
20
+ /** AppHeaderインスタンス(存在する場合) */
21
+ appHeader?: AppHeader;
22
+ /** AppNaviインスタンス(存在する場合) */
23
+ appNavi?: AppNavi;
24
+ /** 全コンポーネントを破棄 */
25
+ destroy: () => void;
26
+ }
27
+ /**
28
+ * 画面をDOMにマウント
29
+ */
30
+ export declare function mountScreen(container: HTMLElement, screen: ScreenDefinition): ScreenController;
31
+ /**
32
+ * AppHeader / AppNavi のみをマウントする(renderScreen の文字列出力を使う呼び出し側用)
33
+ */
34
+ export interface AppChromeController {
35
+ appHeader?: AppHeader;
36
+ appNavi?: AppNavi;
37
+ destroy: () => void;
38
+ }
39
+ export declare function mountAppChrome(container: HTMLElement, screen: ScreenDefinition): AppChromeController;
40
+ /**
41
+ * ウィザード画面をDOMにマウント(ステップ管理付き)
42
+ */
43
+ export declare function mountWizardScreen(container: HTMLElement, screen: ScreenDefinition, initialStep?: number): WizardController;
44
+ /**
45
+ * ウィザードコントローラーインターフェース
46
+ */
47
+ export interface WizardController {
48
+ getCurrentStep: () => number;
49
+ destroy: () => void;
50
+ goToStep: (step: number) => void;
51
+ nextStep: () => void;
52
+ prevStep: () => void;
53
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * DOM Utilities
3
+ * DOM操作のユーティリティ関数
4
+ */
5
+ /**
6
+ * 要素を作成する
7
+ */
8
+ export declare function createElement<K extends keyof HTMLElementTagNameMap>(tag: K, options?: {
9
+ className?: string;
10
+ attributes?: Record<string, string>;
11
+ textContent?: string;
12
+ children?: (HTMLElement | string)[];
13
+ }): HTMLElementTagNameMap[K];
14
+ /**
15
+ * 要素をクリアする
16
+ */
17
+ export declare function clearElement(element: HTMLElement): void;
18
+ /**
19
+ * 一意なIDを生成する
20
+ */
21
+ export declare function generateId(prefix?: string): string;
22
+ /**
23
+ * HTMLテキストをエスケープする
24
+ */
25
+ export declare function escapeHtml(text: string): string;
26
+ /**
27
+ * タブIDを検証・サニタイズする
28
+ */
29
+ export declare function sanitizeTabId(id: string): string;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Dummy Data Generator
3
+ * リピーター用のダミーデータ自動生成
4
+ */
5
+ import type { InputField } from '../../types';
6
+ /**
7
+ * フィールドタイプに応じたダミーデータを生成
8
+ */
9
+ export declare function generateDummyData(field: InputField, index?: number): unknown;
10
+ /**
11
+ * リピーターアイテム用のダミーデータセットを生成
12
+ */
13
+ export declare function generateRepeaterItemDummyData(itemFields: InputField[], itemIndex: number): Record<string, unknown>;
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Field Helper Utilities
3
+ * フォームフィールドレンダリング用の共有ヘルパー関数
4
+ */
5
+ import type { InputField, SelectOption } from '../../types/schema';
6
+ /**
7
+ * HTML特殊文字をエスケープ
8
+ *
9
+ * @param text - エスケープする文字列
10
+ * @returns エスケープされた文字列
11
+ */
12
+ export declare function escapeHtml(text: string): string;
13
+ /**
14
+ * SSR対応のHTMLエスケープ
15
+ * document が利用できない環境でも動作する
16
+ *
17
+ * @param text - エスケープする文字列
18
+ * @returns エスケープされた文字列
19
+ */
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>;
31
+ /**
32
+ * フィールドのラッパーHTML生成
33
+ *
34
+ * @param field - 入力フィールド定義
35
+ * @param content - フィールドのコンテンツHTML
36
+ * @returns ラッパー付きのHTML文字列
37
+ */
38
+ export declare function createFieldWrapper(field: InputField, content: string): string;
39
+ /**
40
+ * 共通属性を生成
41
+ *
42
+ * @param field - 入力フィールド定義
43
+ * @returns 属性文字列
44
+ */
45
+ export declare function getCommonAttributes(field: InputField): string;
46
+ /**
47
+ * 選択肢の配列を取得(文字列参照は未対応)
48
+ *
49
+ * @param options - 選択肢配列または参照文字列
50
+ * @returns 選択肢の配列
51
+ */
52
+ export declare function getOptions(options: SelectOption[] | string): SelectOption[];
53
+ /**
54
+ * ファイルサイズをフォーマット
55
+ *
56
+ * @param bytes - バイト数
57
+ * @returns フォーマットされたサイズ文字列
58
+ */
59
+ export declare function formatFileSize(bytes: number): string;
60
+ /**
61
+ * MIMEタイプから表示名を取得
62
+ *
63
+ * @param mimeType - MIMEタイプ文字列
64
+ * @returns 表示用のフォーマット名
65
+ */
66
+ export declare function formatMimeType(mimeType: string): string;
67
+ /**
68
+ * レベルに基づくデフォルトサイズを取得
69
+ *
70
+ * @param level - 見出しレベル (1-6)
71
+ * @returns サイズバリアント
72
+ */
73
+ export declare function getDefaultSizeForLevel(level: 1 | 2 | 3 | 4 | 5 | 6): 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
74
+ /**
75
+ * 単位ラベルのマッピング
76
+ */
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;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Utility Functions Export
3
+ */
4
+ export { createElement, clearElement, generateId } from './dom';
5
+ export { generateDummyData, generateRepeaterItemDummyData } from './dummy-data';
6
+ export { escapeHtml, escapeHtmlSafe, createFieldWrapper, getCommonAttributes, getOptions, formatFileSize, formatMimeType, getDefaultSizeForLevel, unitLabels, } from './field-helpers';
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Theme module exports
3
+ */
4
+ export { ThemeManager, themeManager, initializeTheme, applyTheme, getAvailableThemes, getCurrentTheme, onThemeChange, } from './theme-manager';
5
+ export type { ThemeDefinition, ThemeConfig, ThemeCSSVariables, ThemeChangeEventDetail, BuiltInThemeId, } from '../types/theme';
6
+ export { THEME_STORAGE_KEY, THEME_DATA_ATTRIBUTE, THEME_CHANGE_EVENT, } from '../types/theme';
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Mokkun Theme Manager
3
+ * テーマの読み込み、切り替え、保存を管理
4
+ */
5
+ import type { ThemeDefinition, ThemeChangeEventDetail } from '../types/theme';
6
+ /**
7
+ * Theme Manager class
8
+ */
9
+ export declare class ThemeManager {
10
+ private themes;
11
+ private currentThemeId;
12
+ private config;
13
+ private customStyleElement;
14
+ constructor();
15
+ /**
16
+ * Initialize the theme manager
17
+ * Loads saved preference or applies default theme
18
+ */
19
+ initialize(): void;
20
+ /**
21
+ * Load theme configuration from YAML string
22
+ */
23
+ loadConfig(yamlContent: string): void;
24
+ /**
25
+ * Get all available themes
26
+ */
27
+ getAvailableThemes(): ThemeDefinition[];
28
+ /**
29
+ * Get current theme ID
30
+ */
31
+ getCurrentTheme(): string | null;
32
+ /**
33
+ * Get theme by ID
34
+ */
35
+ getTheme(id: string): ThemeDefinition | undefined;
36
+ /**
37
+ * Check if a theme exists
38
+ */
39
+ hasTheme(id: string): boolean;
40
+ /**
41
+ * Apply a theme by ID
42
+ */
43
+ applyTheme(themeId: string): boolean;
44
+ /**
45
+ * Apply custom CSS variables
46
+ */
47
+ private applyCustomVariables;
48
+ /**
49
+ * Remove custom CSS variables style element
50
+ */
51
+ private removeCustomVariables;
52
+ /**
53
+ * Register a custom theme
54
+ */
55
+ registerTheme(theme: ThemeDefinition): void;
56
+ /**
57
+ * Unregister a theme (only custom themes can be removed)
58
+ */
59
+ unregisterTheme(themeId: string): boolean;
60
+ /**
61
+ * Save theme preference to localStorage
62
+ */
63
+ private saveTheme;
64
+ /**
65
+ * Get saved theme from localStorage
66
+ */
67
+ getSavedTheme(): string | null;
68
+ /**
69
+ * Clear saved theme preference
70
+ */
71
+ clearSavedTheme(): void;
72
+ /**
73
+ * Dispatch theme change event
74
+ */
75
+ private dispatchThemeChangeEvent;
76
+ /**
77
+ * Subscribe to theme changes
78
+ */
79
+ onThemeChange(callback: (detail: ThemeChangeEventDetail) => void): () => void;
80
+ /**
81
+ * Get default theme ID
82
+ */
83
+ getDefaultTheme(): string;
84
+ /**
85
+ * Check if system prefers dark mode
86
+ */
87
+ prefersColorScheme(): 'light' | 'dark';
88
+ /**
89
+ * Apply system preference
90
+ */
91
+ applySystemPreference(): void;
92
+ /**
93
+ * Watch for system preference changes
94
+ */
95
+ watchSystemPreference(autoApply?: boolean): () => void;
96
+ }
97
+ export declare const themeManager: ThemeManager;
98
+ export declare const initializeTheme: () => void;
99
+ export declare const applyTheme: (id: string) => boolean;
100
+ export declare const getAvailableThemes: () => ThemeDefinition[];
101
+ export declare const getCurrentTheme: () => string | null;
102
+ export declare const onThemeChange: (callback: (detail: ThemeChangeEventDetail) => void) => () => void;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Field Renderable Interface
3
+ * 静的renderFieldメソッドを持つコンポーネントの共通インターフェース
4
+ */
5
+ import type { InputField } from './schema';
6
+ /**
7
+ * 静的renderFieldメソッドを持つコンポーネントのインターフェース
8
+ *
9
+ * このインターフェースは、フォームフィールドをHTMLとしてレンダリングする
10
+ * 静的メソッドを持つコンポーネントクラスに実装されます。
11
+ *
12
+ * @template T - 対応するInputFieldの型(例: TextField, SelectField)
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * export class Input implements FieldRenderable<TextField> {
17
+ * static renderField(field: TextField): string {
18
+ * // HTML生成ロジック
19
+ * return '<input type="text" ... />'
20
+ * }
21
+ * }
22
+ * ```
23
+ */
24
+ export interface FieldRenderable<T extends InputField = InputField> {
25
+ /**
26
+ * フィールド定義からHTMLを生成する静的メソッド
27
+ *
28
+ * @param field - フィールド定義オブジェクト
29
+ * @returns 生成されたHTML文字列
30
+ */
31
+ renderField(field: T): string;
32
+ }
33
+ /**
34
+ * FieldRenderableを実装するクラスの型
35
+ * staticメソッドを持つクラスの型チェックに使用
36
+ */
37
+ export interface FieldRenderableClass<T extends InputField = InputField> {
38
+ new (...args: unknown[]): unknown;
39
+ renderField(field: T): string;
40
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Type exports
3
+ */
4
+ export * from './schema';
5
+ export * from './theme';
6
+ export * from './field-renderable';