From 3de58d92db52682e1235b15743d005ce975d620e Mon Sep 17 00:00:00 2001 From: Soryn Date: Thu, 30 Apr 2026 19:45:08 +0300 Subject: [PATCH 01/10] feat(app): add layout customization modal (#620) --- packages/histoire-app/src/app/App.vue | 12 ++++ .../src/app/components/app/AppHeader.vue | 16 +++++ .../src/app/components/layout/LayoutItem.vue | 36 ++++++++++ .../app/components/layout/LayoutItemGroup.vue | 18 +++++ .../src/app/components/layout/LayoutModal.vue | 67 +++++++++++++++++++ .../src/app/components/layout/LayoutPane.vue | 45 +++++++++++++ .../histoire-app/src/app/stores/layout.ts | 37 ++++++++++ 7 files changed, 231 insertions(+) create mode 100644 packages/histoire-app/src/app/components/layout/LayoutItem.vue create mode 100644 packages/histoire-app/src/app/components/layout/LayoutItemGroup.vue create mode 100644 packages/histoire-app/src/app/components/layout/LayoutModal.vue create mode 100644 packages/histoire-app/src/app/components/layout/LayoutPane.vue create mode 100644 packages/histoire-app/src/app/stores/layout.ts diff --git a/packages/histoire-app/src/app/App.vue b/packages/histoire-app/src/app/App.vue index ab4c95ed..c8f6fdc8 100644 --- a/packages/histoire-app/src/app/App.vue +++ b/packages/histoire-app/src/app/App.vue @@ -14,6 +14,7 @@ import Breadcrumb from './components/app/Breadcrumb.vue' import InitialLoading from './components/app/InitialLoading.vue' import BaseSplitPane from './components/base/BaseSplitPane.vue' import CommandPromptsModal from './components/command/CommandPromptsModal.vue' +import LayoutModal from './components/layout/LayoutModal.vue' import SearchModal from './components/search/SearchModal.vue' import GenericMountStory from './components/story/GenericMountStory.vue' import StoryList from './components/tree/StoryList.vue' @@ -66,6 +67,10 @@ useTitle(computed(() => { const loadSearch = ref(false) const isSearchOpen = ref(false) +// Layout + +const isLayoutOpen = ref(false) + watch(isSearchOpen, (value) => { if (value) { loadSearch.value = true @@ -136,6 +141,7 @@ const commandStore = useCommandStore()
+ + true, + layout: () => true, }) const themeIcon = computed(() => { @@ -37,6 +39,20 @@ onKeyboardShortcut(['ctrl+shift+d', 'meta+shift+d'], (event) => {
+ + + + +import { Icon } from '@iconify/vue' +import BaseListItem from '../base/BaseListItem.vue' + +defineProps<{ + title: string + icon: string + stateIcon?: string + isActive?: boolean +}>() + +defineEmits<{ + (e: 'click'): void +}>() + + + diff --git a/packages/histoire-app/src/app/components/layout/LayoutItemGroup.vue b/packages/histoire-app/src/app/components/layout/LayoutItemGroup.vue new file mode 100644 index 00000000..98fd6e81 --- /dev/null +++ b/packages/histoire-app/src/app/components/layout/LayoutItemGroup.vue @@ -0,0 +1,18 @@ + + + diff --git a/packages/histoire-app/src/app/components/layout/LayoutModal.vue b/packages/histoire-app/src/app/components/layout/LayoutModal.vue new file mode 100644 index 00000000..5b805ef3 --- /dev/null +++ b/packages/histoire-app/src/app/components/layout/LayoutModal.vue @@ -0,0 +1,67 @@ + + + diff --git a/packages/histoire-app/src/app/components/layout/LayoutPane.vue b/packages/histoire-app/src/app/components/layout/LayoutPane.vue new file mode 100644 index 00000000..f34d3292 --- /dev/null +++ b/packages/histoire-app/src/app/components/layout/LayoutPane.vue @@ -0,0 +1,45 @@ + + + diff --git a/packages/histoire-app/src/app/stores/layout.ts b/packages/histoire-app/src/app/stores/layout.ts new file mode 100644 index 00000000..f6679c54 --- /dev/null +++ b/packages/histoire-app/src/app/stores/layout.ts @@ -0,0 +1,37 @@ +import { useStorage } from '@vueuse/core' +import { defineStore } from 'pinia' + +export type StoryOptionsPlacement = 'right' | 'bottom' + +export interface LayoutSettings { + storyListVisible: boolean + storyOptionsVisible: boolean + storyOptionsPlacement: StoryOptionsPlacement +} + +export const useLayoutStore = defineStore('layout', () => { + const settings = useStorage('_histoire-layout-v1', { + storyListVisible: true, + storyOptionsVisible: true, + storyOptionsPlacement: 'right', + }) + + function toggleStoryList() { + settings.value.storyListVisible = !settings.value.storyListVisible + } + + function toggleStoryOptions() { + settings.value.storyOptionsVisible = !settings.value.storyOptionsVisible + } + + function setStoryOptionsPlacement(value: StoryOptionsPlacement) { + settings.value.storyOptionsPlacement = value + } + + return { + settings, + toggleStoryList, + toggleStoryOptions, + setStoryOptionsPlacement, + } +}) From d108393f7b74b5e25024d0c0ad5efae28aea5182 Mon Sep 17 00:00:00 2001 From: Soryn Date: Thu, 30 Apr 2026 10:10:43 +0300 Subject: [PATCH 02/10] feat(app): promote AppHeader above split pane --- packages/histoire-app/src/app/App.vue | 55 +++++++++++++++------------ 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/packages/histoire-app/src/app/App.vue b/packages/histoire-app/src/app/App.vue index c8f6fdc8..544352ac 100644 --- a/packages/histoire-app/src/app/App.vue +++ b/packages/histoire-app/src/app/App.vue @@ -129,33 +129,38 @@ const commandStore = useCommandStore()
- - - - - + + + + + + + + Date: Thu, 30 Apr 2026 10:25:23 +0300 Subject: [PATCH 03/10] fix(app): histoire-base-list-ite typo --- packages/histoire-app/src/app/components/base/BaseListItem.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/histoire-app/src/app/components/base/BaseListItem.vue b/packages/histoire-app/src/app/components/base/BaseListItem.vue index 0ef27fa1..b768c7cc 100644 --- a/packages/histoire-app/src/app/components/base/BaseListItem.vue +++ b/packages/histoire-app/src/app/components/base/BaseListItem.vue @@ -14,7 +14,7 @@ function handleNavigate() {