@skspwork/config-doc 2.0.4 → 2.0.5
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/package.json +2 -2
- package/packages/web/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/packages/web/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/packages/web/.next/standalone/.next/server/app/_not-found.rsc +2 -2
- package/packages/web/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/packages/web/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/packages/web/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/packages/web/.next/standalone/.next/server/app/api/config/save/route.js +1 -1
- package/packages/web/.next/standalone/.next/server/app/api/config/save/route.js.nft.json +1 -1
- package/packages/web/.next/standalone/.next/server/app/api/export/route.js +3 -3
- package/packages/web/.next/standalone/.next/server/app/api/export/route.js.nft.json +1 -1
- package/packages/web/.next/standalone/.next/server/app/index.html +1 -1
- package/packages/web/.next/standalone/.next/server/app/index.rsc +3 -3
- package/packages/web/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/packages/web/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/packages/web/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/packages/web/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/packages/web/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/packages/web/.next/standalone/.next/server/chunks/[root-of-the-server]__40e87302._.js +3 -0
- package/packages/web/.next/standalone/.next/server/chunks/[root-of-the-server]__93da9fce._.js +1 -1
- package/packages/web/.next/standalone/.next/server/chunks/[root-of-the-server]__c9655ac8._.js +3 -0
- package/packages/web/.next/standalone/.next/server/chunks/[root-of-the-server]__e19366f6._.js +1 -1
- package/packages/web/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_d09de205.js +345 -27
- package/packages/web/.next/standalone/.next/server/chunks/ssr/app_page_tsx_55b2e5ee._.js +1 -1
- package/packages/web/.next/standalone/.next/server/pages/404.html +1 -1
- package/packages/web/.next/standalone/.next/static/chunks/02de70e4c30afe2f.js +1 -0
- package/packages/web/.next/standalone/.next/static/chunks/862e384b52cfebf3.css +3 -0
- package/packages/web/.next/standalone/app/api/config/metadata/route.ts +5 -3
- package/packages/web/.next/standalone/playwright-report/index.html +1 -1
- package/packages/web/.next/static/chunks/02de70e4c30afe2f.js +1 -0
- package/packages/web/.next/static/chunks/862e384b52cfebf3.css +3 -0
- package/packages/web/.next/standalone/.next/server/chunks/[root-of-the-server]__1a68b1f3._.js +0 -3
- package/packages/web/.next/standalone/.next/server/chunks/[root-of-the-server]__2c94dfea._.js +0 -3
- package/packages/web/.next/standalone/.next/static/chunks/9726c2cde77e0916.js +0 -1
- package/packages/web/.next/standalone/.next/static/chunks/cd878566fda12635.css +0 -3
- package/packages/web/.next/standalone/app/api/config/load/route.ts +0 -57
- package/packages/web/.next/standalone/app/api/config/save/route.ts +0 -73
- package/packages/web/.next/standalone/app/api/export/route.ts +0 -75
- package/packages/web/.next/standalone/app/api/export/settings/route.ts +0 -144
- package/packages/web/.next/standalone/app/api/files/browse/route.ts +0 -46
- package/packages/web/.next/standalone/app/api/project/route.ts +0 -41
- package/packages/web/.next/standalone/app/globals.css +0 -26
- package/packages/web/.next/standalone/app/icon.svg +0 -41
- package/packages/web/.next/standalone/app/layout.tsx +0 -34
- package/packages/web/.next/standalone/app/page.tsx +0 -135
- package/packages/web/.next/standalone/components/ConfigFileTabs.tsx +0 -188
- package/packages/web/.next/standalone/components/ConfigTree.tsx +0 -176
- package/packages/web/.next/standalone/components/EditableList.tsx +0 -337
- package/packages/web/.next/standalone/components/ExportDialog.tsx +0 -234
- package/packages/web/.next/standalone/components/FieldsEditor.tsx +0 -92
- package/packages/web/.next/standalone/components/FileBrowser.tsx +0 -290
- package/packages/web/.next/standalone/components/Header.tsx +0 -37
- package/packages/web/.next/standalone/components/PropertyEditor.tsx +0 -102
- package/packages/web/.next/standalone/components/TagEditor.tsx +0 -86
- package/packages/web/.next/standalone/components/Toast.tsx +0 -91
- package/packages/web/.next/standalone/eslint.config.mjs +0 -18
- package/packages/web/.next/standalone/hooks/useConfigManager.ts +0 -653
- package/packages/web/.next/standalone/lib/configManagerUtils.ts +0 -84
- package/packages/web/.next/standalone/lib/configParser.ts +0 -155
- package/packages/web/.next/standalone/lib/fileSystem.ts +0 -186
- package/packages/web/.next/standalone/lib/getRootPath.ts +0 -45
- package/packages/web/.next/standalone/lib/htmlGenerator.ts +0 -865
- package/packages/web/.next/standalone/lib/jsonUtils.ts +0 -26
- package/packages/web/.next/standalone/lib/markdownGenerator.ts +0 -110
- package/packages/web/.next/standalone/lib/markdownTableGenerator.ts +0 -103
- package/packages/web/.next/standalone/lib/storage.ts +0 -104
- package/packages/web/.next/standalone/lib/utils.ts +0 -89
- package/packages/web/.next/standalone/next.config.ts +0 -10
- package/packages/web/.next/standalone/package-lock.json +0 -8216
- package/packages/web/.next/standalone/playwright.config.ts +0 -27
- package/packages/web/.next/standalone/postcss.config.mjs +0 -7
- package/packages/web/.next/standalone/test-results/.last-run.json +0 -4
- package/packages/web/.next/standalone/tsconfig.json +0 -34
- package/packages/web/.next/standalone/tsconfig.tsbuildinfo +0 -1
- package/packages/web/.next/standalone/types/index.ts +0 -74
- package/packages/web/.next/standalone/vitest.config.ts +0 -14
- package/packages/web/.next/static/chunks/9726c2cde77e0916.js +0 -1
- package/packages/web/.next/static/chunks/cd878566fda12635.css +0 -3
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { SaveIcon, FileTextIcon } from 'lucide-react';
|
|
4
|
-
import { PropertyDoc } from '@/types';
|
|
5
|
-
import { TagEditor } from '@/components/TagEditor';
|
|
6
|
-
import { FieldsEditor } from '@/components/FieldsEditor';
|
|
7
|
-
|
|
8
|
-
interface PropertyEditorProps {
|
|
9
|
-
selectedPath: string;
|
|
10
|
-
editingDoc: PropertyDoc | null;
|
|
11
|
-
hasUnsavedChanges: boolean;
|
|
12
|
-
availableTags: string[];
|
|
13
|
-
projectFields: Record<string, string>;
|
|
14
|
-
onEditingDocChange: (doc: PropertyDoc) => void;
|
|
15
|
-
onAvailableTagsChange: (tags: string[]) => void;
|
|
16
|
-
onProjectFieldsChange: (fields: Record<string, string>) => void;
|
|
17
|
-
onSave: () => void;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function PropertyEditor({
|
|
21
|
-
selectedPath,
|
|
22
|
-
editingDoc,
|
|
23
|
-
hasUnsavedChanges,
|
|
24
|
-
availableTags,
|
|
25
|
-
projectFields,
|
|
26
|
-
onEditingDocChange,
|
|
27
|
-
onAvailableTagsChange,
|
|
28
|
-
onProjectFieldsChange,
|
|
29
|
-
onSave
|
|
30
|
-
}: PropertyEditorProps) {
|
|
31
|
-
return (
|
|
32
|
-
<div className="bg-white/90 backdrop-blur-sm rounded-2xl shadow-xl border border-gray-100 p-6 flex flex-col max-h-[calc(100vh-190px)] hover:shadow-2xl transition-shadow duration-300">
|
|
33
|
-
<div className="flex items-center gap-2 mb-4">
|
|
34
|
-
<div className="w-8 h-8 bg-gradient-to-br from-indigo-500 to-indigo-600 rounded-lg flex items-center justify-center">
|
|
35
|
-
<SaveIcon className="w-5 h-5 text-white" />
|
|
36
|
-
</div>
|
|
37
|
-
<h2 className="text-xl font-bold text-gray-800">プロパティ詳細</h2>
|
|
38
|
-
</div>
|
|
39
|
-
|
|
40
|
-
{selectedPath && editingDoc ? (
|
|
41
|
-
<div className="flex flex-col flex-1 min-h-0">
|
|
42
|
-
{/* パス(上部固定) */}
|
|
43
|
-
<div className="flex-shrink-0 pb-4 border-b border-gray-200">
|
|
44
|
-
<label className="block text-sm font-semibold text-gray-700 mb-2">
|
|
45
|
-
パス
|
|
46
|
-
</label>
|
|
47
|
-
<div className="text-sm text-gray-700 bg-gradient-to-r from-blue-50 to-indigo-50 p-3 rounded-lg font-mono border border-blue-200 shadow-sm">
|
|
48
|
-
{selectedPath}
|
|
49
|
-
</div>
|
|
50
|
-
</div>
|
|
51
|
-
|
|
52
|
-
{/* スクロール可能なフォーム部分 */}
|
|
53
|
-
<div className="flex-1 overflow-y-auto py-4 space-y-6 min-h-0">
|
|
54
|
-
{/* タグ */}
|
|
55
|
-
<TagEditor
|
|
56
|
-
selectedTags={editingDoc.tags || []}
|
|
57
|
-
availableTags={availableTags}
|
|
58
|
-
onSelectedTagsChange={(tags) => {
|
|
59
|
-
onEditingDocChange({ ...editingDoc, tags });
|
|
60
|
-
}}
|
|
61
|
-
onAvailableTagsChange={onAvailableTagsChange}
|
|
62
|
-
/>
|
|
63
|
-
|
|
64
|
-
{/* フィールド */}
|
|
65
|
-
<FieldsEditor
|
|
66
|
-
fields={editingDoc.fields || {}}
|
|
67
|
-
projectFields={projectFields}
|
|
68
|
-
onFieldsChange={(fields) => {
|
|
69
|
-
onEditingDocChange({ ...editingDoc, fields });
|
|
70
|
-
}}
|
|
71
|
-
onUpdateProjectFields={onProjectFieldsChange}
|
|
72
|
-
/>
|
|
73
|
-
</div>
|
|
74
|
-
|
|
75
|
-
{/* 保存ボタン(下部固定) */}
|
|
76
|
-
<div className="flex-shrink-0 pt-4 border-t border-gray-200">
|
|
77
|
-
<button
|
|
78
|
-
onClick={onSave}
|
|
79
|
-
disabled={!hasUnsavedChanges}
|
|
80
|
-
className={`w-full flex items-center justify-center gap-2 px-4 py-3 rounded-lg shadow-md transition-all duration-200 transform ${
|
|
81
|
-
hasUnsavedChanges
|
|
82
|
-
? 'bg-gradient-to-r from-green-500 to-emerald-600 text-white hover:from-green-600 hover:to-emerald-700 hover:shadow-lg cursor-pointer'
|
|
83
|
-
: 'bg-gray-300 text-gray-500 cursor-not-allowed'
|
|
84
|
-
}`}
|
|
85
|
-
>
|
|
86
|
-
<SaveIcon className="w-5 h-5" />
|
|
87
|
-
<span className="font-medium">保存</span>
|
|
88
|
-
</button>
|
|
89
|
-
</div>
|
|
90
|
-
</div>
|
|
91
|
-
) : (
|
|
92
|
-
<div className="flex flex-col items-center justify-center flex-1">
|
|
93
|
-
<div className="w-20 h-20 bg-gradient-to-br from-gray-100 to-gray-200 rounded-full flex items-center justify-center mb-4">
|
|
94
|
-
<FileTextIcon className="w-10 h-10 text-gray-400" />
|
|
95
|
-
</div>
|
|
96
|
-
<p className="text-sm text-gray-600 font-medium">プロパティを選択してください</p>
|
|
97
|
-
<p className="text-xs text-gray-500 mt-1">左側のツリーから項目を選択</p>
|
|
98
|
-
</div>
|
|
99
|
-
)}
|
|
100
|
-
</div>
|
|
101
|
-
);
|
|
102
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { CheckIcon } from 'lucide-react';
|
|
4
|
-
import { EditableListWrapper } from './EditableList';
|
|
5
|
-
|
|
6
|
-
interface TagEditorProps {
|
|
7
|
-
selectedTags: string[];
|
|
8
|
-
availableTags: string[];
|
|
9
|
-
onSelectedTagsChange: (tags: string[]) => void;
|
|
10
|
-
onAvailableTagsChange: (tags: string[]) => void;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function TagEditor({
|
|
14
|
-
selectedTags,
|
|
15
|
-
availableTags,
|
|
16
|
-
onSelectedTagsChange,
|
|
17
|
-
onAvailableTagsChange
|
|
18
|
-
}: TagEditorProps) {
|
|
19
|
-
const handleToggleTag = (tag: string) => {
|
|
20
|
-
if (selectedTags.includes(tag)) {
|
|
21
|
-
onSelectedTagsChange(selectedTags.filter(t => t !== tag));
|
|
22
|
-
} else {
|
|
23
|
-
onSelectedTagsChange([...selectedTags, tag]);
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
// 名前変更時に選択中のタグも更新
|
|
28
|
-
const handleRename = (renamedMap: Record<string, string>) => {
|
|
29
|
-
const updatedSelectedTags = selectedTags.map(tag => renamedMap[tag] || tag);
|
|
30
|
-
if (JSON.stringify(updatedSelectedTags) !== JSON.stringify(selectedTags)) {
|
|
31
|
-
onSelectedTagsChange(updatedSelectedTags);
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
// 削除されたタグを選択から除外
|
|
36
|
-
const handleTagsChange = (newTags: string[]) => {
|
|
37
|
-
const updatedSelectedTags = selectedTags.filter(tag => newTags.includes(tag));
|
|
38
|
-
if (updatedSelectedTags.length !== selectedTags.length) {
|
|
39
|
-
onSelectedTagsChange(updatedSelectedTags);
|
|
40
|
-
}
|
|
41
|
-
onAvailableTagsChange(newTags);
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
return (
|
|
45
|
-
<EditableListWrapper
|
|
46
|
-
label="タグ"
|
|
47
|
-
items={availableTags}
|
|
48
|
-
onItemsChange={handleTagsChange}
|
|
49
|
-
editButtonTitle="タグを編集"
|
|
50
|
-
editModeDescription="タグの追加・削除・名前変更"
|
|
51
|
-
inputPlaceholder="タグ名"
|
|
52
|
-
newItemPlaceholder="新しいタグ名を入力"
|
|
53
|
-
deleteButtonTitle="タグを削除"
|
|
54
|
-
addButtonTitle="タグを追加"
|
|
55
|
-
duplicateErrorMessage="同じ名前のタグがあります"
|
|
56
|
-
onRename={handleRename}
|
|
57
|
-
>
|
|
58
|
-
{/* 通常モード(タグの選択) */}
|
|
59
|
-
<div className="flex flex-wrap gap-2">
|
|
60
|
-
{availableTags.length === 0 ? (
|
|
61
|
-
<div className="text-sm text-gray-500">
|
|
62
|
-
タグがありません。鉛筆アイコンをクリックして追加してください。
|
|
63
|
-
</div>
|
|
64
|
-
) : (
|
|
65
|
-
availableTags.map((tag) => {
|
|
66
|
-
const isSelected = selectedTags.includes(tag);
|
|
67
|
-
return (
|
|
68
|
-
<button
|
|
69
|
-
key={tag}
|
|
70
|
-
onClick={() => handleToggleTag(tag)}
|
|
71
|
-
className={`flex items-center gap-2 px-3 py-1.5 rounded-lg text-sm font-medium border-2 transition-all duration-200 ${
|
|
72
|
-
isSelected
|
|
73
|
-
? 'bg-blue-500 text-white border-blue-600 shadow-md'
|
|
74
|
-
: 'bg-white text-gray-700 border-gray-200 hover:border-blue-300 hover:bg-blue-50'
|
|
75
|
-
}`}
|
|
76
|
-
>
|
|
77
|
-
{isSelected && <CheckIcon className="w-3 h-3" />}
|
|
78
|
-
<span>{tag}</span>
|
|
79
|
-
</button>
|
|
80
|
-
);
|
|
81
|
-
})
|
|
82
|
-
)}
|
|
83
|
-
</div>
|
|
84
|
-
</EditableListWrapper>
|
|
85
|
-
);
|
|
86
|
-
}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useEffect, useState } from 'react';
|
|
4
|
-
import { CheckCircleIcon, XCircleIcon, AlertCircleIcon, XIcon } from 'lucide-react';
|
|
5
|
-
|
|
6
|
-
export type ToastType = 'success' | 'error' | 'warning';
|
|
7
|
-
|
|
8
|
-
interface ToastProps {
|
|
9
|
-
message: string;
|
|
10
|
-
type: ToastType;
|
|
11
|
-
duration?: number;
|
|
12
|
-
onClose: () => void;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function Toast({ message, type, duration = 3000, onClose }: ToastProps) {
|
|
16
|
-
const [isVisible, setIsVisible] = useState(false);
|
|
17
|
-
|
|
18
|
-
useEffect(() => {
|
|
19
|
-
// マウント時にフェードイン
|
|
20
|
-
setTimeout(() => setIsVisible(true), 10);
|
|
21
|
-
|
|
22
|
-
// duration後にフェードアウト
|
|
23
|
-
const timer = setTimeout(() => {
|
|
24
|
-
setIsVisible(false);
|
|
25
|
-
setTimeout(onClose, 300); // フェードアウトアニメーション完了後にクローズ
|
|
26
|
-
}, duration);
|
|
27
|
-
|
|
28
|
-
return () => clearTimeout(timer);
|
|
29
|
-
}, [duration, onClose]);
|
|
30
|
-
|
|
31
|
-
const icons = {
|
|
32
|
-
success: <CheckCircleIcon className="w-5 h-5 text-green-500" />,
|
|
33
|
-
error: <XCircleIcon className="w-5 h-5 text-red-500" />,
|
|
34
|
-
warning: <AlertCircleIcon className="w-5 h-5 text-yellow-500" />
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
const bgColors = {
|
|
38
|
-
success: 'bg-green-50 border-green-200',
|
|
39
|
-
error: 'bg-red-50 border-red-200',
|
|
40
|
-
warning: 'bg-yellow-50 border-yellow-200'
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
return (
|
|
44
|
-
<div
|
|
45
|
-
className={`fixed bottom-4 left-4 z-50 transition-all duration-300 ${
|
|
46
|
-
isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-2'
|
|
47
|
-
}`}
|
|
48
|
-
>
|
|
49
|
-
<div
|
|
50
|
-
className={`flex items-center gap-3 px-4 py-3 rounded-lg shadow-lg border ${bgColors[type]} min-w-[300px] max-w-[500px]`}
|
|
51
|
-
>
|
|
52
|
-
{icons[type]}
|
|
53
|
-
<span className="flex-1 text-sm text-gray-800">{message}</span>
|
|
54
|
-
<button
|
|
55
|
-
onClick={() => {
|
|
56
|
-
setIsVisible(false);
|
|
57
|
-
setTimeout(onClose, 300);
|
|
58
|
-
}}
|
|
59
|
-
className="text-gray-400 hover:text-gray-600 transition-colors"
|
|
60
|
-
>
|
|
61
|
-
<XIcon className="w-4 h-4" />
|
|
62
|
-
</button>
|
|
63
|
-
</div>
|
|
64
|
-
</div>
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
interface ToastContainerProps {
|
|
69
|
-
toasts: Array<{ id: string; message: string; type: ToastType }>;
|
|
70
|
-
onRemove: (id: string) => void;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export function ToastContainer({ toasts, onRemove }: ToastContainerProps) {
|
|
74
|
-
return (
|
|
75
|
-
<>
|
|
76
|
-
{toasts.map((toast, index) => (
|
|
77
|
-
<div
|
|
78
|
-
key={toast.id}
|
|
79
|
-
style={{ bottom: `${16 + index * 80}px` }}
|
|
80
|
-
className="fixed left-4 z-50"
|
|
81
|
-
>
|
|
82
|
-
<Toast
|
|
83
|
-
message={toast.message}
|
|
84
|
-
type={toast.type}
|
|
85
|
-
onClose={() => onRemove(toast.id)}
|
|
86
|
-
/>
|
|
87
|
-
</div>
|
|
88
|
-
))}
|
|
89
|
-
</>
|
|
90
|
-
);
|
|
91
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { defineConfig, globalIgnores } from "eslint/config";
|
|
2
|
-
import nextVitals from "eslint-config-next/core-web-vitals";
|
|
3
|
-
import nextTs from "eslint-config-next/typescript";
|
|
4
|
-
|
|
5
|
-
const eslintConfig = defineConfig([
|
|
6
|
-
...nextVitals,
|
|
7
|
-
...nextTs,
|
|
8
|
-
// Override default ignores of eslint-config-next.
|
|
9
|
-
globalIgnores([
|
|
10
|
-
// Default ignores of eslint-config-next:
|
|
11
|
-
".next/**",
|
|
12
|
-
"out/**",
|
|
13
|
-
"build/**",
|
|
14
|
-
"next-env.d.ts",
|
|
15
|
-
]),
|
|
16
|
-
]);
|
|
17
|
-
|
|
18
|
-
export default eslintConfig;
|