Skip to content

Commit a47f2b9

Browse files
committed
wip: clean up - tufte style on editor -d
1 parent a72cbb4 commit a47f2b9

File tree

11 files changed

+80
-88
lines changed

11 files changed

+80
-88
lines changed

@fiction/admin/el/ElSavingSignal.vue

+1-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import XDropDown from '@fiction/ui/common/XDropDown.vue'
77
const {
88
isDirty,
99
navItems = [],
10-
changeType,
1110
classes = {},
1211
} = defineProps<{
1312
isDirty: boolean
@@ -16,9 +15,7 @@ const {
1615
classes?: { text?: string, icon?: string }
1716
}>()
1817
19-
const isOpen = vue.ref(false)
20-
21-
const savedText = vue.computed(() => changeType === 'draft' ? 'Draft Saved' : 'Changes Saved')
18+
const savedText = vue.computed(() => 'Saved')
2219
2320
const statusText = vue.computed(() => isDirty ? 'Saving' : savedText.value)
2421
const statusColor = vue.computed(() => isDirty ? 'fill-orange-500' : 'fill-green-500')

@fiction/cards/CardNavLink.vue

+8-3
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ const hoverClass = 'group-hover/nav-link:text-theme-500 dark:group-hover/nav-lin
6767
v-else-if="item.icon"
6868
:media="item.icon"
6969
:class="hoverClass"
70-
class="size-[1.1em]"
70+
class="size-[1.05em]"
7171
/>
7272

7373
<!-- Text Content -->
@@ -98,9 +98,14 @@ const hoverClass = 'group-hover/nav-link:text-theme-500 dark:group-hover/nav-lin
9898
v-html="item.label"
9999
/>
100100

101-
<!-- External Link Indicator -->
101+
<XIcon
102+
v-if="item.iconAfter"
103+
:media="item.iconAfter"
104+
:class="hoverClass"
105+
class="size-[1.05em]"
106+
/>
102107
<span
103-
v-if="item.target === '_blank'"
108+
v-else-if="item.target === '_blank'"
104109
class="block opacity-30 group-hover:translate-x-[1px] group-hover:-translate-y-[1px] transition-all"
105110
>
106111
<span class="block i-heroicons-arrow-up-right-20-solid" />

@fiction/cards/content-profile/ElCard.vue

+10-7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import EffectFitText from '@fiction/ui/effect/EffectFitText.vue'
99
import EffectGlare from '@fiction/ui/effect/EffectGlare.vue'
1010
import XIcon from '@fiction/ui/media/XIcon.vue'
1111
import XMedia from '@fiction/ui/media/XMedia.vue'
12+
import XEntry from '@fiction/ui/prose/XEntry.vue'
1213
import CardText from '../CardText.vue'
1314
import CardActionArea from '../el/CardActionArea.vue'
1415
import NavDots from '../el/NavDots.vue'
@@ -101,13 +102,15 @@ const hoverClasses = 'group-hover/item:text-primary-600 dark:group-hover/item:te
101102
<CardText :card tag="span" path="title" animate="rise" />
102103
</EffectFitText>
103104

104-
<CardText
105-
tag="div"
106-
:card
107-
class="sub-heading mt-6 prose prose-lg md:prose-2xl leading-normal dark:prose-invert prose-theme"
108-
path="content"
109-
animate="rise"
110-
/>
105+
<XEntry class="text-lg sm:text-xl">
106+
<CardText
107+
tag="div"
108+
:card
109+
class="sub-heading mt-6"
110+
path="content"
111+
animate="rise"
112+
/>
113+
</XEntry>
111114
</div>
112115

113116
<div class="list space-y-4 text-base xl:text-lg @container">

@fiction/site/plugin-builder/SiteEditor.vue

+14-25
Original file line numberDiff line numberDiff line change
@@ -131,28 +131,16 @@ async function resetToPublished() {
131131
<template #headerLeft>
132132
<div>
133133
<CardButton
134-
respond="icon:sm"
135134
:card
136-
theme="primary"
137-
design="outline"
135+
size="sm"
138136
href="/sites"
139-
icon="i-tabler-arrow-left"
140-
>
141-
Back
142-
</CardButton>
137+
icon="i-tabler-home"
138+
/>
143139
</div>
144-
<div class="flex space-x-1 font-medium">
145-
<CardLink
146-
:card
147-
class="whitespace-nowrap dark:text-theme-300 pr-1 hover:text-primary-500 dark:hover:text-theme-0 hidden lg:flex items-center gap-1"
148-
href="/"
149-
>
150-
<span class="i-tabler-browser-plus text-xl inline-block dark:text-theme-500" />
151-
<span>Edit Site</span>
152-
<span class="i-tabler-slash text-xl dark:text-theme-500" />
153-
</CardLink>
154-
155-
<XText v-if="site" v-model="site.title.value" :is-editable="true" class="hover:bg-theme-100 hover:dark:bg-theme-700 whitespace-nowrap" />
140+
<div class="flex space-x-1 font-semibold items-center">
141+
<XText title="Site Title" v-if="site" v-model="site.title.value" :is-editable="true" class="hover:bg-theme-100 hover:dark:bg-theme-700 whitespace-nowrap" />
142+
<span class="i-tabler-slash text-xl dark:text-theme-500" />
143+
<XText title="Page Title" v-if="site.currentPage.value.slug.value" v-model="site.currentPage.value.title.value" :is-editable="false" class="whitespace-nowrap" />
156144
</div>
157145
</template>
158146
<template v-if="site" #headerRight>
@@ -185,8 +173,9 @@ async function resetToPublished() {
185173
:card
186174
theme="default"
187175
target="_blank"
188-
size="md"
176+
size="sm"
189177
icon="i-tabler-eye"
178+
design="ghost"
190179
icon-after="i-tabler-chevron-down"
191180
data-test-id="viewSiteButton"
192181
>
@@ -199,12 +188,12 @@ async function resetToPublished() {
199188
:card
200189
theme="primary"
201190
:loading="sending === 'save'"
202-
icon="i-tabler-arrow-big-up-lines"
203-
size="md"
191+
icon="i-tabler-upload"
192+
size="sm"
204193
data-test-id="publishChangesButton"
205194
@click.prevent="save()"
206195
>
207-
Publish Changes
196+
Publish
208197
</CardButton>
209198
<CardButton
210199
v-else
@@ -213,11 +202,11 @@ async function resetToPublished() {
213202
design="outline"
214203
:loading="sending === 'save'"
215204
icon="i-tabler-check"
216-
size="md"
205+
size="sm"
217206
data-test-id="changesPublishedButton"
218207
@click.prevent="save()"
219208
>
220-
Changes Published
209+
Published
221210
</CardButton>
222211
</template>
223212
<template #default>

@fiction/site/plugin-builder/SiteEditorFrame.vue

+30-21
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
<script lang="ts" setup>
2+
import type { NavListItem } from '@fiction/core'
23
import type { FrameUtility } from '@fiction/ui/frame/elBrowserFrameUtil'
34
import type { Site } from '../site'
45
import type { FramePostMessageList } from '../utils/frame'
56
import { toLabel, vue } from '@fiction/core'
67
import XButton from '@fiction/ui/buttons/XButton.vue'
78
import ElTooltip from '@fiction/ui/common/ElTooltip.vue'
9+
import XDropDown from '@fiction/ui/common/XDropDown.vue'
810
import ElBrowserFrameDevice from '@fiction/ui/frame/ElBrowserFrameDevice.vue'
911
1012
const props = defineProps({
@@ -13,16 +15,20 @@ const props = defineProps({
1315
1416
const frameRef = vue.ref<HTMLElement & { frameUtility: FrameUtility<FramePostMessageList> }>() // Reference to the child component
1517
16-
const deviceModes = [
17-
{ name: 'desktop', icon: 'i-tabler-device-desktop', wrapClass: 'w-full' },
18-
{ name: 'mobile', icon: 'i-tabler-device-mobile', wrapClass: 'w-[60%] max-w-sm' },
19-
{ name: 'tablet', icon: 'i-tabler-device-ipad', wrapClass: 'w-[85%] max-w-xl' },
20-
{ name: 'landscape', icon: 'i-tabler-device-ipad-horizontal', wrapClass: 'w-[90%] max-w-2xl' },
21-
] as const
18+
type DeviceModeKeys = 'desktop' | 'mobile' | 'tablet' | 'landscape'
19+
const activeDeviceModeKey = vue.ref<DeviceMode>('desktop')
20+
const deviceModes: (NavListItem & { wrapClass: string, value: DeviceModeKeys })[] = [
21+
{ value: 'desktop', icon: { class: 'i-tabler-device-desktop' }, wrapClass: 'w-full' },
22+
{ value: 'mobile', icon: { class: 'i-tabler-device-mobile' }, wrapClass: 'w-[60%] max-w-sm' },
23+
{ value: 'tablet', icon: { class: 'i-tabler-device-ipad' }, wrapClass: 'w-[85%] max-w-xl' },
24+
{ value: 'landscape', icon: { class: 'i-tabler-device-ipad-horizontal' }, wrapClass: 'w-[90%] max-w-2xl' },
25+
]
2226
23-
type DeviceMode = typeof deviceModes[number]['name']
24-
const activeDeviceMode = vue.ref<DeviceMode>('desktop')
25-
const deviceModeConfig = vue.computed(() => deviceModes.find(mode => mode.name === activeDeviceMode.value))
27+
const activeDeviceMode = vue.computed(() => deviceModes.find(mode => mode.value === activeDeviceModeKey.value) || deviceModes[0])
28+
29+
type DeviceMode = typeof deviceModes[number]['value']
30+
31+
const deviceModeConfig = vue.computed(() => deviceModes.find(mode => mode.value === activeDeviceModeKey.value))
2632
2733
// Watch for changes in frameRef and assign frameUtility
2834
vue.watch(
@@ -60,18 +66,21 @@ function toggleEditingStyle() {
6066
class=" flex justify-between space-x-2 "
6167
>
6268
<div class="flex items-center gap-2">
63-
<XButton
64-
v-for="(mode, i) in deviceModes"
65-
:key="i"
66-
rounding="full"
67-
respond="icon:xl"
68-
:theme="activeDeviceMode === mode.name ? 'theme' : 'default'"
69-
:icon="mode.icon"
70-
size="xs"
71-
@click.stop="activeDeviceMode = mode.name"
69+
70+
<XDropDown
71+
mode="click"
72+
:items="deviceModes"
73+
v-model="activeDeviceModeKey"
7274
>
73-
{{ toLabel(mode.name) }}
74-
</XButton>
75+
<XButton
76+
rounding="full"
77+
:icon="activeDeviceMode?.icon"
78+
size="xs"
79+
icon-after="i-tabler-chevron-down"
80+
>
81+
{{ toLabel(activeDeviceMode?.value) }}
82+
</XButton>
83+
</XDropDown>
7584
</div>
7685

7786
<div class="flex items-center gap-2">
@@ -142,7 +151,7 @@ function toggleEditingStyle() {
142151
<div v-if="site" class="min-h-0 h-full relative mx-auto pb-10 flex flex-col" :class="deviceModeConfig?.wrapClass">
143152
<ElBrowserFrameDevice
144153
ref="frameRef"
145-
:device-mode="activeDeviceMode"
154+
:device-mode="activeDeviceModeKey"
146155
class="rounded-md shadow-lg border border-theme-200"
147156
:url="site.frame.frameUrl.value"
148157
frame-id="site-builder-iframe"

@fiction/site/plugin-builder/tools/tools.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export function getTools(args: { site: Site }) {
7070
toolId: 'history',
7171
title: 'Revision History',
7272
icon: { class: 'i-tabler-history' },
73-
isPrimary: 'bottom',
73+
isPrimary: true,
7474
el: vue.defineAsyncComponent(async () => import('./ToolPageHistory.vue')),
7575
},
7676
{

@fiction/themes/fiction/config.ts

+7
Original file line numberDiff line numberDiff line change
@@ -299,10 +299,17 @@ export async function getConfig(args: {
299299
{ label: 'Demos', href: '/demos' },
300300
],
301301
utility: [
302+
{
303+
label: 'Sign In',
304+
href: '/app/auth?_reload=1',
305+
onAuthState: 'loggedOut',
306+
iconAfter: { class: 'i-tabler-arrow-right' },
307+
},
302308
{
303309
label: 'Account',
304310
href: '/app?_reload=1',
305311
variant: 'avatar',
312+
onAuthState: 'loggedIn',
306313
list: {
307314
items: [
308315
{ label: 'Sign In', href: '/app/auth?_reload=1', onAuthState: 'loggedOut' },

@fiction/ui/common/XDropDown.vue

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script setup lang="ts">
22
import type { NavListItem, StandardSize } from '@fiction/core'
3-
import { onResetUi, resetUi, useService, vue } from '@fiction/core'
3+
import { normList, onResetUi, resetUi, useService, vue } from '@fiction/core'
44
import { twMerge } from 'tailwind-merge'
55
import TransitionSlide from '../anim/TransitionSlide.vue'
66
import XIcon from '../media/XIcon.vue'
@@ -13,14 +13,16 @@ const {
1313
uiSize = 'md',
1414
classes = {},
1515
} = defineProps<{
16-
items: NavListItem[]
16+
items?: NavListItem[]
1717
placement?: 'top' | 'bottom' | 'left' | 'right'
1818
dropdownAlignment?: 'start' | 'center' | 'end'
1919
mode?: 'hover' | 'click'
2020
uiSize?: StandardSize
2121
classes?: { wrapper?: string, width?: string }
2222
}>()
2323
24+
const normalizedItems = vue.computed(() => normList(items))
25+
2426
const emit = defineEmits<{
2527
(event: 'update:model-value', value: string): void
2628
}>()
@@ -30,7 +32,7 @@ const isHovered = vue.ref(false)
3032
const dropdownRef = vue.ref<HTMLDivElement | null>(null)
3133
const service = useService()
3234
33-
const visibleItems = vue.computed(() => items.filter(item => !item.isHidden))
35+
const visibleItems = vue.computed(() => normalizedItems.value.filter(item => !item.isHidden))
3436
3537
function toggleClicked() {
3638
resetUi({ scope: 'inputs', cause: 'dropdown', trigger: 'elementClick' })
@@ -148,7 +150,7 @@ const wrapperClass = vue.computed(() => {
148150

149151
<TransitionSlide>
150152
<div
151-
v-if="isActive && items?.length"
153+
v-if="isActive && normalizedItems?.length"
152154
:class="menuClasses"
153155
role="menu"
154156
aria-orientation="vertical"

@fiction/ui/entry.less

+1-3
Original file line numberDiff line numberDiff line change
@@ -234,9 +234,7 @@
234234
line-height: 1.75;
235235

236236
li {
237-
@apply my-2 pl-2;
238-
239-
237+
@apply pl-2;
240238
}
241239
p {
242240
margin: 0;

@fiction/ui/lib/systemIcons.ts

+2
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ export const recommendedIcons = [
8484
{ class: 'i-tabler-asterisk', category: 'interface' },
8585
{ class: 'i-tabler-north-star', category: 'interface' },
8686
{ class: 'i-tabler-world', category: 'interface' },
87+
{ class: 'i-tabler-login', category: 'interface' },
88+
{ class: 'i-tabler-logout', category: 'interface' },
8789

8890
// Content - Text editing and content management
8991
{ class: 'i-tabler-file', category: 'content' },

docs/.vitepress/config.ts

-20
Original file line numberDiff line numberDiff line change
@@ -52,26 +52,6 @@ export default defineConfig({
5252
{ text: 'Introduction', link: '/guide/introduction' },
5353
],
5454
},
55-
{
56-
text: 'Essentials',
57-
items: [
58-
{ text: 'Editing Your Site', link: '/guide/editing' },
59-
],
60-
},
61-
],
62-
'/developer/': [
63-
{
64-
text: 'Getting Started',
65-
items: [
66-
{ text: 'Introduction', link: '/developer/introduction' },
67-
],
68-
},
69-
{
70-
text: 'Essentials',
71-
items: [
72-
{ text: 'Create a Site', link: '/developer/site' },
73-
],
74-
},
7555
],
7656
'/resources/': [
7757
{

0 commit comments

Comments
 (0)