@djangocfg/widget-data 0.1.1

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 (157) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -0
  3. package/package.json +122 -0
  4. package/src/DataGrid/README.md +48 -0
  5. package/src/DataGrid/context/DataGridContext.tsx +442 -0
  6. package/src/DataGrid/context/index.ts +4 -0
  7. package/src/DataGrid/index.ts +34 -0
  8. package/src/DataGrid/lazy.tsx +23 -0
  9. package/src/DataGrid/parts/DataGrid.tsx +125 -0
  10. package/src/DataGrid/parts/DataGridCell.tsx +30 -0
  11. package/src/DataGrid/parts/DataGridHeader.tsx +111 -0
  12. package/src/DataGrid/parts/DataGridPagination.tsx +105 -0
  13. package/src/DataGrid/parts/DataGridRow.tsx +84 -0
  14. package/src/DataGrid/parts/index.ts +7 -0
  15. package/src/DataGrid/types.ts +95 -0
  16. package/src/DataTable/README.md +42 -0
  17. package/src/DataTable/context/DataTableContext.tsx +434 -0
  18. package/src/DataTable/context/index.ts +4 -0
  19. package/src/DataTable/index.ts +33 -0
  20. package/src/DataTable/lazy.tsx +23 -0
  21. package/src/DataTable/parts/DataTable.tsx +142 -0
  22. package/src/DataTable/parts/DataTableHeader.tsx +103 -0
  23. package/src/DataTable/parts/DataTablePagination.tsx +115 -0
  24. package/src/DataTable/parts/DataTableRow.tsx +96 -0
  25. package/src/DataTable/parts/index.ts +6 -0
  26. package/src/DataTable/types.ts +88 -0
  27. package/src/FileIcon/FileIcon.tsx +87 -0
  28. package/src/FileIcon/get-file-icon.ts +73 -0
  29. package/src/FileIcon/icons/icon-data.ts +399 -0
  30. package/src/FileIcon/index.ts +19 -0
  31. package/src/FileIcon/loader.ts +29 -0
  32. package/src/FileIcon/specialFolders.ts +110 -0
  33. package/src/FileIcon/treeAdapter.tsx +49 -0
  34. package/src/JsonTree/JsonViewer.tsx +720 -0
  35. package/src/JsonTree/README.md +142 -0
  36. package/src/JsonTree/index.tsx +11 -0
  37. package/src/JsonTree/lazy.tsx +22 -0
  38. package/src/JsonTree/types.ts +91 -0
  39. package/src/Kanban/context/KanbanContext.tsx +165 -0
  40. package/src/Kanban/context/index.ts +4 -0
  41. package/src/Kanban/index.ts +31 -0
  42. package/src/Kanban/lazy.tsx +23 -0
  43. package/src/Kanban/parts/Kanban.tsx +77 -0
  44. package/src/Kanban/parts/KanbanCard.tsx +76 -0
  45. package/src/Kanban/parts/KanbanColumn.tsx +79 -0
  46. package/src/Kanban/parts/KanbanDragOverlay.tsx +46 -0
  47. package/src/Kanban/parts/index.ts +6 -0
  48. package/src/Kanban/types.ts +45 -0
  49. package/src/Listbox/context/ListboxProvider.tsx +616 -0
  50. package/src/Listbox/context/index.ts +8 -0
  51. package/src/Listbox/index.ts +28 -0
  52. package/src/Listbox/lazy.tsx +31 -0
  53. package/src/Listbox/parts/ListboxGroup.tsx +71 -0
  54. package/src/Listbox/parts/ListboxItem.tsx +151 -0
  55. package/src/Listbox/parts/index.ts +12 -0
  56. package/src/Listbox/types.ts +98 -0
  57. package/src/Masonry/README.md +79 -0
  58. package/src/Masonry/context/MasonryProvider.tsx +1205 -0
  59. package/src/Masonry/context/index.ts +8 -0
  60. package/src/Masonry/index.ts +18 -0
  61. package/src/Masonry/lazy.tsx +20 -0
  62. package/src/Masonry/parts/index.ts +2 -0
  63. package/src/Masonry/types.ts +44 -0
  64. package/src/Timeline/context/TimelineProvider.tsx +474 -0
  65. package/src/Timeline/context/index.ts +16 -0
  66. package/src/Timeline/index.ts +29 -0
  67. package/src/Timeline/lazy.tsx +27 -0
  68. package/src/Timeline/parts/index.ts +2 -0
  69. package/src/Timeline/types.ts +25 -0
  70. package/src/Tree/FinderTree.tsx +42 -0
  71. package/src/Tree/README.md +542 -0
  72. package/src/Tree/TreeDndProvider.tsx +137 -0
  73. package/src/Tree/TreeRoot.tsx +290 -0
  74. package/src/Tree/components/TreeChevron.tsx +48 -0
  75. package/src/Tree/components/TreeContent.tsx +70 -0
  76. package/src/Tree/components/TreeDropIndicator.tsx +65 -0
  77. package/src/Tree/components/TreeEmpty.tsx +22 -0
  78. package/src/Tree/components/TreeEmptyArea.tsx +160 -0
  79. package/src/Tree/components/TreeError.tsx +24 -0
  80. package/src/Tree/components/TreeIcon.tsx +39 -0
  81. package/src/Tree/components/TreeIndentGuides.tsx +33 -0
  82. package/src/Tree/components/TreeLabel.tsx +39 -0
  83. package/src/Tree/components/TreeRenameInput.tsx +114 -0
  84. package/src/Tree/components/TreeRow.tsx +300 -0
  85. package/src/Tree/components/TreeSearchInput.tsx +50 -0
  86. package/src/Tree/components/TreeSkeleton.tsx +22 -0
  87. package/src/Tree/components/index.ts +28 -0
  88. package/src/Tree/context/TreeContext.tsx +409 -0
  89. package/src/Tree/context/TreeContextValue.ts +139 -0
  90. package/src/Tree/context/async-children/collect-ids.ts +27 -0
  91. package/src/Tree/context/async-children/index.ts +8 -0
  92. package/src/Tree/context/async-children/use-async-children.ts +157 -0
  93. package/src/Tree/context/clipboard/index.ts +4 -0
  94. package/src/Tree/context/clipboard/use-clipboard.ts +115 -0
  95. package/src/Tree/context/dnd/index.ts +8 -0
  96. package/src/Tree/context/dnd/use-dnd.ts +194 -0
  97. package/src/Tree/context/expansion/index.ts +4 -0
  98. package/src/Tree/context/expansion/use-expansion.ts +55 -0
  99. package/src/Tree/context/hooks.ts +177 -0
  100. package/src/Tree/context/index.ts +16 -0
  101. package/src/Tree/context/menu/builtin-actions.ts +358 -0
  102. package/src/Tree/context/menu/index.ts +11 -0
  103. package/src/Tree/context/menu/render.tsx +104 -0
  104. package/src/Tree/context/menu/use-resolved-menu.ts +141 -0
  105. package/src/Tree/context/persist/index.ts +4 -0
  106. package/src/Tree/context/persist/use-persist-sync.ts +74 -0
  107. package/src/Tree/context/rename/index.ts +4 -0
  108. package/src/Tree/context/rename/use-rename.ts +113 -0
  109. package/src/Tree/context/selection/index.ts +4 -0
  110. package/src/Tree/context/selection/use-selection.ts +146 -0
  111. package/src/Tree/context/state/index.ts +6 -0
  112. package/src/Tree/context/state/initial.ts +41 -0
  113. package/src/Tree/context/state/reducer.ts +76 -0
  114. package/src/Tree/context/state/types.ts +46 -0
  115. package/src/Tree/data/appearance.ts +237 -0
  116. package/src/Tree/data/childCache.ts +43 -0
  117. package/src/Tree/data/clipboard.ts +33 -0
  118. package/src/Tree/data/createDemoTree.ts +42 -0
  119. package/src/Tree/data/dnd.ts +123 -0
  120. package/src/Tree/data/finderShortcuts.ts +67 -0
  121. package/src/Tree/data/flatten.ts +66 -0
  122. package/src/Tree/data/index.ts +45 -0
  123. package/src/Tree/data/persist.ts +62 -0
  124. package/src/Tree/data/renameUtils.ts +51 -0
  125. package/src/Tree/data/selection.ts +161 -0
  126. package/src/Tree/hooks/finder-hotkeys/build-ctx.ts +48 -0
  127. package/src/Tree/hooks/finder-hotkeys/index.ts +8 -0
  128. package/src/Tree/hooks/finder-hotkeys/use-tree-finder-hotkeys.ts +166 -0
  129. package/src/Tree/hooks/index.ts +25 -0
  130. package/src/Tree/hooks/keyboard/activation.ts +27 -0
  131. package/src/Tree/hooks/keyboard/arrow-nav.ts +26 -0
  132. package/src/Tree/hooks/keyboard/expand-collapse.ts +54 -0
  133. package/src/Tree/hooks/keyboard/index.ts +10 -0
  134. package/src/Tree/hooks/keyboard/types.ts +39 -0
  135. package/src/Tree/hooks/keyboard/use-tree-keyboard.ts +196 -0
  136. package/src/Tree/hooks/type-ahead/index.ts +5 -0
  137. package/src/Tree/hooks/type-ahead/match-prefix.ts +42 -0
  138. package/src/Tree/hooks/type-ahead/use-tree-type-ahead.ts +89 -0
  139. package/src/Tree/index.tsx +135 -0
  140. package/src/Tree/lazy.tsx +14 -0
  141. package/src/Tree/types/activation.ts +30 -0
  142. package/src/Tree/types/adapter.ts +70 -0
  143. package/src/Tree/types/index.ts +27 -0
  144. package/src/Tree/types/labels.ts +97 -0
  145. package/src/Tree/types/loader.ts +9 -0
  146. package/src/Tree/types/node.ts +38 -0
  147. package/src/Tree/types/root-props.ts +158 -0
  148. package/src/Tree/types/selection.ts +3 -0
  149. package/src/Tree/types/slots.ts +64 -0
  150. package/src/index.ts +21 -0
  151. package/src/stories/_fixtures/categories.ts +51 -0
  152. package/src/stories/_fixtures/finder-store.ts +196 -0
  153. package/src/stories/_fixtures/fs.ts +83 -0
  154. package/src/stories/_fixtures/index.ts +5 -0
  155. package/src/stories/_fixtures/org.ts +46 -0
  156. package/src/stories/_fixtures/status.ts +21 -0
  157. package/src/styles/index.css +10 -0
@@ -0,0 +1,19 @@
1
+ 'use client';
2
+
3
+ export { FileIcon } from './FileIcon';
4
+ export type { FileIconProps, FileIconSize } from './FileIcon';
5
+
6
+ export { createFileIconSlot } from './treeAdapter';
7
+ export type { CreateFileIconSlotOptions } from './treeAdapter';
8
+
9
+ export { resolveFolderIcon } from './specialFolders';
10
+ export type {
11
+ ResolveFolderIconOptions,
12
+ FolderIconOverrides,
13
+ } from './specialFolders';
14
+
15
+ export { getFileIcon, DEFAULT_FILE_ICON } from './get-file-icon';
16
+ export type { FileIconDef } from './get-file-icon';
17
+
18
+ /** @deprecated Use `getFileIcon` — resolution is now synchronous. */
19
+ export { loadMaterialIcons, getMaterialIconsSync } from './loader';
@@ -0,0 +1,29 @@
1
+ 'use client';
2
+
3
+ /**
4
+ * Back-compat shim for the former `material-file-icons` lazy loader.
5
+ *
6
+ * File icons are now resolved synchronously from a vendored static data
7
+ * module — see `./get-file-icon`. The async API is kept so existing callers
8
+ * of `loadMaterialIcons` / `getMaterialIconsSync` keep working; both resolve
9
+ * immediately to the local resolver.
10
+ *
11
+ * @deprecated Import {@link getFileIcon} from `./get-file-icon` instead.
12
+ */
13
+
14
+ import { getFileIcon } from './get-file-icon';
15
+
16
+ /** Returns an inline SVG string for a file name, or `undefined`. */
17
+ type GetIconFn = (name: string) => { svg?: string } | undefined;
18
+
19
+ const localGetIcon: GetIconFn = (name) => ({ svg: getFileIcon(name).svg });
20
+
21
+ /** @deprecated Use {@link getFileIcon} — resolution is now synchronous. */
22
+ export function loadMaterialIcons(): Promise<GetIconFn> {
23
+ return Promise.resolve(localGetIcon);
24
+ }
25
+
26
+ /** @deprecated Use {@link getFileIcon} — resolution is now synchronous. */
27
+ export function getMaterialIconsSync(): GetIconFn {
28
+ return localGetIcon;
29
+ }
@@ -0,0 +1,110 @@
1
+ 'use client';
2
+
3
+ import {
4
+ BookOpen,
5
+ Component,
6
+ Database,
7
+ FlaskConical,
8
+ Folder,
9
+ FolderCode,
10
+ FolderGit2,
11
+ FolderInput,
12
+ FolderOpen,
13
+ FolderOutput,
14
+ Image as ImageIcon,
15
+ Languages,
16
+ Package,
17
+ Settings,
18
+ Terminal,
19
+ Workflow,
20
+ type LucideIcon,
21
+ } from 'lucide-react';
22
+
23
+ /**
24
+ * Conventional folder names → Lucide icon. Lookup is case-insensitive and
25
+ * trimmed. Anything not in this map falls back to a generic folder icon.
26
+ *
27
+ * Designed to feel "right" across the common dev project layouts (Node,
28
+ * Python, Go, Rust, Django, Next, Vite). Not exhaustive on purpose —
29
+ * keeps the bundle light and the behaviour predictable.
30
+ */
31
+ const SPECIAL_FOLDERS: Record<string, LucideIcon> = {
32
+ src: FolderCode,
33
+ source: FolderCode,
34
+ lib: FolderCode,
35
+ app: FolderCode,
36
+ packages: Package,
37
+ node_modules: Package,
38
+ vendor: Package,
39
+ public: FolderInput,
40
+ static: FolderInput,
41
+ assets: ImageIcon,
42
+ images: ImageIcon,
43
+ media: ImageIcon,
44
+ dist: FolderOutput,
45
+ build: FolderOutput,
46
+ out: FolderOutput,
47
+ '.next': FolderOutput,
48
+ '.nuxt': FolderOutput,
49
+ '.turbo': FolderOutput,
50
+ docs: BookOpen,
51
+ documentation: BookOpen,
52
+ tests: FlaskConical,
53
+ test: FlaskConical,
54
+ __tests__: FlaskConical,
55
+ __test__: FlaskConical,
56
+ spec: FlaskConical,
57
+ scripts: Terminal,
58
+ bin: Terminal,
59
+ config: Settings,
60
+ configs: Settings,
61
+ '.config': Settings,
62
+ '.vscode': Settings,
63
+ '.idea': Settings,
64
+ '.git': FolderGit2,
65
+ '.github': FolderGit2,
66
+ '.gitlab': FolderGit2,
67
+ '.husky': Workflow,
68
+ '.circleci': Workflow,
69
+ components: Component,
70
+ component: Component,
71
+ ui: Component,
72
+ i18n: Languages,
73
+ locale: Languages,
74
+ locales: Languages,
75
+ lang: Languages,
76
+ translations: Languages,
77
+ db: Database,
78
+ database: Database,
79
+ migrations: Database,
80
+ };
81
+
82
+ export interface ResolveFolderIconOptions {
83
+ /** Folder display name (no path). */
84
+ name: string;
85
+ /** Open / closed state — only used for the *generic* folder fallback. */
86
+ isExpanded?: boolean;
87
+ /**
88
+ * Optional override map. Wins over the built-in table. Keys are
89
+ * matched case-insensitively after `trim()`.
90
+ */
91
+ overrides?: Record<string, LucideIcon>;
92
+ }
93
+
94
+ /**
95
+ * Pick the right folder icon for `name`. Returns `Folder` / `FolderOpen`
96
+ * for unknown names so callers can render the generic open/closed pair.
97
+ */
98
+ export function resolveFolderIcon({
99
+ name,
100
+ isExpanded = false,
101
+ overrides,
102
+ }: ResolveFolderIconOptions): LucideIcon {
103
+ const key = name.trim().toLowerCase();
104
+ if (overrides?.[key]) return overrides[key];
105
+ const special = SPECIAL_FOLDERS[key];
106
+ if (special) return special;
107
+ return isExpanded ? FolderOpen : Folder;
108
+ }
109
+
110
+ export type FolderIconOverrides = Record<string, LucideIcon>;
@@ -0,0 +1,49 @@
1
+ 'use client';
2
+
3
+ import type { TreeNode, TreeRowSlot } from '../Tree/types';
4
+ import { FileIcon, type FileIconSize } from './FileIcon';
5
+ import type { FolderIconOverrides } from './specialFolders';
6
+
7
+ export interface CreateFileIconSlotOptions<T> {
8
+ /**
9
+ * How to read the displayed name (with extension) for a node. Use the same
10
+ * accessor you pass to `<TreeRoot getItemName={...} />`.
11
+ */
12
+ getName: (node: TreeNode<T>) => string;
13
+ /** Pixel size for both file and folder icons. Default: 16. */
14
+ size?: FileIconSize;
15
+ /**
16
+ * Override or extend the built-in special-folder mapping (e.g. give
17
+ * `tests` a custom icon). Keys are matched case-insensitively.
18
+ */
19
+ folderOverrides?: FolderIconOverrides;
20
+ }
21
+
22
+ /**
23
+ * Build a `renderIcon` slot for `<TreeRoot>` that uses `<FileIcon>` for both
24
+ * leaves and folders.
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * <TreeRoot
29
+ * data={data}
30
+ * getItemName={(n) => n.data.name}
31
+ * renderIcon={createFileIconSlot({ getName: (n) => n.data.name })}
32
+ * />
33
+ * ```
34
+ */
35
+ export function createFileIconSlot<T>({
36
+ getName,
37
+ size = 16,
38
+ folderOverrides,
39
+ }: CreateFileIconSlotOptions<T>): TreeRowSlot<T> {
40
+ return ({ node, isFolder, isExpanded }) => (
41
+ <FileIcon
42
+ name={getName(node)}
43
+ isFolder={isFolder}
44
+ isExpanded={isExpanded}
45
+ size={size}
46
+ folderOverrides={folderOverrides}
47
+ />
48
+ );
49
+ }