@brimveyn/aimux-config 0.4.0 → 0.4.2

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 (74) hide show
  1. package/package.json +1 -1
  2. package/src/actions.ts +47 -0
  3. package/src/defaults.ts +3 -0
  4. package/src/index.ts +9 -1
  5. package/src/normalize-theme.ts +260 -0
  6. package/src/themes/generated/andromeeda.ts +346 -0
  7. package/src/themes/generated/aurora-x.ts +603 -0
  8. package/src/themes/generated/ayu-dark.ts +817 -0
  9. package/src/themes/generated/ayu-light.ts +817 -0
  10. package/src/themes/generated/ayu-mirage.ts +817 -0
  11. package/src/themes/generated/catppuccin-frappe.ts +2041 -0
  12. package/src/themes/generated/catppuccin-latte.ts +2041 -0
  13. package/src/themes/generated/catppuccin-macchiato.ts +2041 -0
  14. package/src/themes/generated/catppuccin-mocha.ts +2041 -0
  15. package/src/themes/generated/dark-plus.ts +614 -0
  16. package/src/themes/generated/dracula-soft.ts +947 -0
  17. package/src/themes/generated/dracula.ts +947 -0
  18. package/src/themes/generated/everforest-dark.ts +2246 -0
  19. package/src/themes/generated/everforest-light.ts +2246 -0
  20. package/src/themes/generated/github-dark-default.ts +605 -0
  21. package/src/themes/generated/github-dark-dimmed.ts +605 -0
  22. package/src/themes/generated/github-dark-high-contrast.ts +608 -0
  23. package/src/themes/generated/github-dark.ts +519 -0
  24. package/src/themes/generated/github-light-default.ts +602 -0
  25. package/src/themes/generated/github-light-high-contrast.ts +604 -0
  26. package/src/themes/generated/github-light.ts +515 -0
  27. package/src/themes/generated/gruvbox-dark-hard.ts +1124 -0
  28. package/src/themes/generated/gruvbox-dark-medium.ts +1124 -0
  29. package/src/themes/generated/gruvbox-dark-soft.ts +1124 -0
  30. package/src/themes/generated/gruvbox-light-hard.ts +1124 -0
  31. package/src/themes/generated/gruvbox-light-medium.ts +1124 -0
  32. package/src/themes/generated/gruvbox-light-soft.ts +1124 -0
  33. package/src/themes/generated/horizon-bright.ts +420 -0
  34. package/src/themes/generated/horizon.ts +418 -0
  35. package/src/themes/generated/houston.ts +1819 -0
  36. package/src/themes/generated/index.ts +140 -0
  37. package/src/themes/generated/kanagawa-dragon.ts +753 -0
  38. package/src/themes/generated/kanagawa-lotus.ts +753 -0
  39. package/src/themes/generated/kanagawa-wave.ts +753 -0
  40. package/src/themes/generated/laserwave.ts +489 -0
  41. package/src/themes/generated/light-plus.ts +639 -0
  42. package/src/themes/generated/material-theme-darker.ts +759 -0
  43. package/src/themes/generated/material-theme-lighter.ts +759 -0
  44. package/src/themes/generated/material-theme-ocean.ts +759 -0
  45. package/src/themes/generated/material-theme-palenight.ts +759 -0
  46. package/src/themes/generated/material-theme.ts +759 -0
  47. package/src/themes/generated/min-dark.ts +326 -0
  48. package/src/themes/generated/min-light.ts +331 -0
  49. package/src/themes/generated/monokai.ts +463 -0
  50. package/src/themes/generated/night-owl-light.ts +1526 -0
  51. package/src/themes/generated/night-owl.ts +1628 -0
  52. package/src/themes/generated/nord.ts +1277 -0
  53. package/src/themes/generated/one-dark-pro.ts +1920 -0
  54. package/src/themes/generated/one-light.ts +1599 -0
  55. package/src/themes/generated/plastic.ts +315 -0
  56. package/src/themes/generated/poimandres.ts +1233 -0
  57. package/src/themes/generated/red.ts +395 -0
  58. package/src/themes/generated/rose-pine-dawn.ts +696 -0
  59. package/src/themes/generated/rose-pine-moon.ts +696 -0
  60. package/src/themes/generated/rose-pine.ts +696 -0
  61. package/src/themes/generated/slack-dark.ts +594 -0
  62. package/src/themes/generated/slack-ochin.ts +461 -0
  63. package/src/themes/generated/snazzy-light.ts +1254 -0
  64. package/src/themes/generated/solarized-dark.ts +387 -0
  65. package/src/themes/generated/solarized-light.ts +379 -0
  66. package/src/themes/generated/synthwave-84.ts +751 -0
  67. package/src/themes/generated/tokyo-night.ts +1420 -0
  68. package/src/themes/generated/vesper.ts +578 -0
  69. package/src/themes/generated/vitesse-black.ts +629 -0
  70. package/src/themes/generated/vitesse-dark.ts +629 -0
  71. package/src/themes/generated/vitesse-light.ts +627 -0
  72. package/src/themes.ts +57 -10
  73. package/src/types.ts +29 -4
  74. package/src/themes.generated.ts +0 -59794
package/src/themes.ts CHANGED
@@ -5,14 +5,18 @@ import type {
5
5
  ThemeColorMap,
6
6
  ThemeDefinition,
7
7
  ThemeId,
8
+ UserThemeInput,
8
9
  } from './types'
9
10
 
10
11
  import { HOUSE_THEME_IDS, HOUSE_THEMES } from './house-themes'
11
- import { GENERATED_THEME_IDS, GENERATED_THEMES } from './themes.generated'
12
+ import { normalizeTheme } from './normalize-theme'
13
+ import { GENERATED_THEME_IDS, GENERATED_THEMES } from './themes/generated'
12
14
 
13
15
  export const THEMES: Record<string, Theme> = { ...GENERATED_THEMES, ...HOUSE_THEMES }
14
16
  export const THEME_IDS: ThemeId[] = [...GENERATED_THEME_IDS, ...HOUSE_THEME_IDS]
15
17
 
18
+ const DEFAULT_THEME_ID: ThemeId = 'aimux'
19
+
16
20
  const LEGACY_THEME_ALIASES: Record<string, ThemeId> = {
17
21
  'everforest': 'everforest-dark',
18
22
  'gruvbox-dark': 'gruvbox-dark-hard',
@@ -26,28 +30,71 @@ export function migrateThemeId(id: string | undefined): ThemeId {
26
30
  const alias = LEGACY_THEME_ALIASES[id]
27
31
  if (alias !== undefined) return alias
28
32
  }
29
- return 'aimux'
33
+ return DEFAULT_THEME_ID
34
+ }
35
+
36
+ export function isKnownThemeId(id: string): boolean {
37
+ return id in THEMES
38
+ }
39
+
40
+ function isFullTheme(
41
+ def: NamedTheme | NamedThemeDefinition | UserThemeInput
42
+ ): def is NamedTheme | UserThemeInput {
43
+ return 'settings' in def || 'fg' in def || 'bg' in def
44
+ }
45
+
46
+ /**
47
+ * Merge user-declared themes into the registry. Both the full and palette
48
+ * shortcut paths run through `normalizeTheme` so every registered theme has
49
+ * all AIMUX_COLOR_KEYS populated — same guarantees as shipped themes.
50
+ */
51
+ export function registerUserThemes(
52
+ defs: Record<string, NamedTheme | NamedThemeDefinition | UserThemeInput> | undefined
53
+ ): void {
54
+ if (!defs) return
55
+ const fallback = THEMES[DEFAULT_THEME_ID]
56
+ if (!fallback) return
57
+ for (const [id, def] of Object.entries(defs)) {
58
+ if (isFullTheme(def)) {
59
+ THEMES[id] = normalizeTheme({ ...def, name: def.name ?? id })
60
+ } else {
61
+ const base = def.base ? (THEMES[def.base] ?? fallback) : fallback
62
+ const colors: Record<string, string> = { ...base.colors }
63
+ for (const [k, v] of Object.entries(def.colors ?? {})) {
64
+ if (typeof v === 'string') colors[k] = v
65
+ }
66
+ THEMES[id] = normalizeTheme({
67
+ bg: base.bg,
68
+ colors,
69
+ displayName: def.name,
70
+ fg: base.fg,
71
+ name: id,
72
+ settings: base.settings,
73
+ type: base.type,
74
+ })
75
+ }
76
+ if (!THEME_IDS.includes(id)) THEME_IDS.push(id)
77
+ }
30
78
  }
31
79
 
32
80
  export const themes = {
33
81
  /**
34
- * Palette shortcut. Clones `base`'s Theme and patches a few VSCode color keys
35
- * in `colors`. Token settings inherit from the base unchanged.
82
+ * Palette shortcut. Patches VSCode color keys on top of an existing theme;
83
+ * token settings inherit from the base unchanged.
36
84
  */
37
85
  define(name: string, base: ThemeId, overrides: Partial<ThemeColorMap>): NamedThemeDefinition {
38
86
  return { base, colors: overrides, name }
39
87
  },
40
- /**
41
- * Lower-level, unnamed variant of `define`. Prefer `define` for config entries.
42
- */
88
+ /** Unnamed variant of `define`. Prefer `define` in config. */
43
89
  extend(base: ThemeId, overrides: Partial<ThemeColorMap>): ThemeDefinition {
44
90
  return { base, colors: overrides }
45
91
  },
46
92
  /**
47
- * Identity passthrough for a full raw Shiki theme. Use this to drop a VSCode
48
- * theme JSON verbatim into aimux config.
93
+ * Passthrough for a raw Shiki / VSCode-shape theme. Missing
94
+ * `AIMUX_COLOR_KEYS` are filled at registration via the same fallback chain
95
+ * the shipped themes go through.
49
96
  */
50
- full(theme: NamedTheme): NamedTheme {
97
+ full(theme: UserThemeInput): UserThemeInput {
51
98
  return theme
52
99
  },
53
100
  }
package/src/types.ts CHANGED
@@ -165,12 +165,14 @@ export interface GitPaneState {
165
165
  ratio: number
166
166
  diffModeRatio: number
167
167
  fileListMode: GitFileListMode
168
+ treeCompaction: boolean
168
169
  path: GitPanePathConfig
169
170
  diffCount: GitPaneDiffCountConfig
171
+ prefetchRadius: number
170
172
  }
171
173
 
172
174
  export type GitFileStatus = 'M' | 'A' | 'D' | 'R' | 'C' | 'U' | '?'
173
- export type GitFileSection = 'staged' | 'unstaged' | 'untracked'
175
+ export type GitFileSection = 'staged' | 'unstaged' | 'untracked' | 'historical'
174
176
 
175
177
  export interface GitFileEntry {
176
178
  path: string
@@ -215,11 +217,16 @@ export interface GitModeState {
215
217
  selectedEntryKey: string | null
216
218
  collapsedFolders: Record<string, true>
217
219
  diffs: Record<string, DiffData>
220
+ /** Parsed diff cache (internal); detailed shape lives in src/state/types. */
221
+ parsedFiles: Record<string, { hash: string; file: unknown }>
222
+ /** Syntax-highlight cache (internal). */
223
+ highlights: Record<string, { hash: string; themeId: string; add: unknown; del: unknown }>
218
224
  loading: Record<string, boolean>
219
225
  pendingDeletePath: string | null
220
226
  actionMessage: string | null
221
227
  diffView: GitDiffView
222
228
  folds: Record<string, Record<string, FoldState>>
229
+ headOffset: number
223
230
  }
224
231
 
225
232
  interface ModalBase {
@@ -463,12 +470,15 @@ export type GitModeAction =
463
470
  | { type: 'git-mode-collapse-selection' }
464
471
  | { type: 'git-mode-expand-selection' }
465
472
  | { type: 'git-mode-toggle-file-list-mode' }
466
- | { type: 'git-mode-set-diff'; key: string; diff: DiffData }
473
+ | { type: 'git-mode-toggle-tree-compaction' }
474
+ | { type: 'git-mode-set-diff'; key: string; diff: DiffData; hash: string }
467
475
  | { type: 'git-mode-set-loading'; key: string; loading: boolean }
468
476
  | { type: 'git-mode-set-pending-delete'; path: string | null }
469
477
  | { type: 'git-mode-clear-diff-cache'; path: string }
470
478
  | { type: 'git-mode-set-message'; message: string | null }
471
479
  | { type: 'git-mode-toggle-diff-view' }
480
+ | { type: 'git-mode-shift-head-offset'; delta: number }
481
+ | { type: 'git-mode-set-head-offset'; offset: number }
472
482
  | {
473
483
  type: 'git-mode-fold-adjust'
474
484
  key: string
@@ -526,6 +536,7 @@ export type SideEffect =
526
536
  | { type: 'scroll-git-diff'; delta: number }
527
537
  | { type: 'persist-git-diff-mode-ratio'; ratio: number }
528
538
  | { type: 'persist-git-file-list-mode'; mode: GitFileListMode }
539
+ | { type: 'persist-git-tree-compaction'; enabled: boolean }
529
540
  | { type: 'git-stage'; path: string }
530
541
  | { type: 'git-unstage'; path: string }
531
542
  | { type: 'git-restore'; path: string }
@@ -680,6 +691,17 @@ export interface NamedTheme extends Theme {
680
691
  displayName: string
681
692
  }
682
693
 
694
+ /**
695
+ * Input shape accepted by `themes.full(...)` — lets users paste a shiki /
696
+ * VSCode theme JSON without typing every AIMUX_COLOR_KEY. `registerUserThemes`
697
+ * runs it through `normalizeTheme` to produce a complete `Theme`.
698
+ */
699
+ export interface UserThemeInput extends Partial<Omit<Theme, 'colors' | 'name' | 'displayName'>> {
700
+ name: string
701
+ displayName: string
702
+ colors?: Partial<ThemeColorMap> & Record<string, string | undefined>
703
+ }
704
+
683
705
  // ─── Backend config (stub) ────────────────────────────────────────────────────
684
706
 
685
707
  export interface BackendConfig {
@@ -773,8 +795,11 @@ interface GitPaneBaseConfig {
773
795
  ratio?: number
774
796
  diffModeRatio?: number
775
797
  fileListMode?: GitFileListMode
798
+ treeCompaction?: boolean
776
799
  path?: GitPanePathConfig
777
800
  diffCount?: GitPaneDiffCountConfig
801
+ /** Prefetch N neighbouring diffs around the cursor; 0 disables. */
802
+ prefetchRadius?: number
778
803
  }
779
804
 
780
805
  export interface GitPaneEmbeddedConfig extends GitPaneBaseConfig {
@@ -791,7 +816,7 @@ export type GitPaneConfig = GitPaneEmbeddedConfig | GitPanePaneConfig
791
816
 
792
817
  export interface AimuxUserConfig {
793
818
  theme?: ThemeId
794
- themes?: Record<string, NamedThemeDefinition>
819
+ themes?: Record<string, NamedThemeDefinition | UserThemeInput>
795
820
  keymaps?: (k: KeymapBuilderApi) => KeymapBuilderApi
796
821
  backends?: Record<string, BackendConfig>
797
822
  sidebar?: SidebarConfig
@@ -825,7 +850,7 @@ export interface ResolvedKeymapConfig {
825
850
 
826
851
  export interface ResolvedConfig {
827
852
  theme: ThemeId | undefined
828
- themes: Record<string, NamedThemeDefinition>
853
+ themes: Record<string, NamedThemeDefinition | UserThemeInput>
829
854
  keymaps: ResolvedKeymapConfig
830
855
  backends: Record<string, BackendConfig>
831
856
  sidebar: SidebarConfig