44 <breadcrumbs v-if =" !restrictFolderNavigation" :path =" path" @navigated =" selectFolder" />
55 <ui-slider size =" sm" class =" mr-2 w-24!" variant =" subtle" v-model =" thumbnailSize" :min =" 60" :max =" 300" :step =" 25" />
66 </ui-panel-header >
7- <!-- Folders -->
7+
88 <ui-card class =" space-y-8" >
9+ <!-- Folders -->
910 <section class =" folder-grid-listing" v-if =" folders.length" >
1011 <div
1112 class =" group/folder relative"
1213 v-for =" folder in folders"
1314 :key =" folder.path"
1415 v-if =" !restrictFolderNavigation"
1516 >
16- <button @dblclick =" selectFolder(folder.path)" class =" w-[80px] h-[66px] group" >
17- <ui-icon name =" asset-folder" class =" size-full text-blue-400/90 hover:text-blue-400" />
18- <div
19- class =" font-mono text-xs text-gray-500 text-center overflow-hidden text-ellipsis whitespace-nowrap"
20- v-text =" folder.basename"
21- :title =" folder.basename"
22- />
23- </button >
24- <dropdown-list
25- v-if =" folderActions(folder).length"
26- class =" absolute top-1 opacity-0 group-hover:opacity-100 end-2"
27- :class =" { 'opacity-100': actionOpened === folder.path }"
28- @opened =" actionOpened = folder.path"
29- @closed =" actionOpened = null"
30- >
31- <data-list-inline-actions
32- :item =" folder.path"
33- :url =" folderActionUrl"
34- :actions =" folderActions(folder)"
35- @started =" actionStarted"
36- @completed =" actionCompleted"
37- />
38- </dropdown-list >
17+ <Context >
18+ <template #trigger >
19+ <button @dblclick =" selectFolder(folder.path)" class =" group h-[66px] w-[80px]" >
20+ <ui-icon name =" asset-folder" class =" size-full text-blue-400/90 hover:text-blue-400" />
21+ <div
22+ class =" overflow-hidden text-center font-mono text-xs text-ellipsis whitespace-nowrap text-gray-500"
23+ v-text =" folder.basename"
24+ :title =" folder.basename"
25+ />
26+ </button >
27+ </template >
28+ <ContextMenu v-if =" folderActions(folder).length" >
29+ <data-list-inline-actions
30+ :item =" folder.path"
31+ :url =" folderActionUrl"
32+ :actions =" folderActions(folder)"
33+ @started =" actionStarted"
34+ @completed =" actionCompleted"
35+ />
36+ </ContextMenu >
37+ </Context >
3938 </div >
4039 <div v-if =" creatingFolder" class =" group/folder relative" >
4140 <div class =" group h-[66px] w-[80px]" >
5958 </section >
6059
6160 <!-- Assets -->
62- <section class =" asset-grid-listing"
63- v-if =" assets.length"
64- :style =" { gridTemplateColumns: gridSize }"
65- >
61+ <section class =" asset-grid-listing" v-if =" assets.length" :style =" { gridTemplateColumns: gridSize }" >
6662 <div
6763 v-for =" (asset, index) in assets"
6864 :key =" asset.id"
6965 class =" group relative"
70- :class =" { ' selected' : isSelected(asset.id) }"
66+ :class =" { selected: isSelected(asset.id) }"
7167 >
72- <div class =" asset-tile group relative" :class =" { 'bg-checkerboard': asset.can_be_transparent }" >
73- <button
74- class =" size-full"
75- @click.stop =" toggleSelection(asset.id, index, $event)"
76- @dblclick.stop =" $emit('edit-asset', asset)"
77- >
78- <div class =" relative flex items-center justify-center aspect-square size-full" >
79- <div class =" asset-thumb" >
80- <img
81- v-if =" asset.is_image"
82- :src =" asset.thumbnail"
83- loading =" lazy"
84- :class =" {
85- 'size-full p-4': asset.extension === 'svg',
86- 'p-1 rounded-lg': asset.orientation === 'square'
87- }"
68+ <Context >
69+ <template #trigger >
70+ <div class =" asset-tile group relative" :class =" { 'bg-checkerboard': asset.can_be_transparent }" >
71+ <button
72+ class =" size-full"
73+ @click.stop =" toggleSelection(asset.id, index, $event)"
74+ @dblclick.stop =" $emit('edit-asset', asset)"
75+ >
76+ <div class =" relative flex aspect-square size-full items-center justify-center" >
77+ <div class =" asset-thumb" >
78+ <img
79+ v-if =" asset.is_image"
80+ :src =" asset.thumbnail"
81+ loading =" lazy"
82+ :class =" {
83+ 'size-full p-4': asset.extension === 'svg',
84+ 'rounded-lg p-1': asset.orientation === 'square',
85+ }"
86+ />
87+ <file-icon v-else :extension =" asset.extension" class =" size-1/2" />
88+ </div >
89+ </div >
90+ </button >
91+ <dropdown-list
92+ class =" absolute top-1 opacity-0 group-hover:opacity-100 end-2"
93+ :class =" { 'opacity-100': actionOpened === asset.id }"
94+ @opened =" actionOpened = asset.id"
95+ @closed =" actionOpened = null"
96+ >
97+ <dropdown-item
98+ :text =" __(canEdit ? 'Edit' : 'View')"
99+ @click =" edit(asset.id)"
100+ />
101+ <div class =" divider" v-if =" asset.actions.length" />
102+ <data-list-inline-actions
103+ :item =" asset.id"
104+ :url =" actionUrl"
105+ :actions =" asset.actions"
106+ @started =" actionStarted"
107+ @completed =" actionCompleted"
88108 />
89- <file-icon v-else :extension =" asset.extension" class =" size-1/2" />
90- </div >
109+ </dropdown-list >
91110 </div >
92- </button >
93- <dropdown-list
94- class =" absolute top-1 opacity-0 group-hover:opacity-100 end-2"
95- :class =" { 'opacity-100': actionOpened === asset.id }"
96- @opened =" actionOpened = asset.id"
97- @closed =" actionOpened = null"
98- >
99- <dropdown-item
100- :text =" __(canEdit ? 'Edit' : 'View')"
101- @click =" edit(asset.id)"
102- />
103- <div class =" divider" v-if =" asset.actions.length" />
111+ </template >
112+ <ContextMenu >
113+ <ContextItem icon =" edit" :text =" __(canEdit ? 'Edit' : 'View')" @click =" edit(asset.id)" />
114+ <ContextSeparator />
104115 <data-list-inline-actions
105116 :item =" asset.id"
106117 :url =" actionUrl"
107118 :actions =" asset.actions"
108119 @started =" actionStarted"
109120 @completed =" actionCompleted"
110121 />
111- </dropdown-list >
112- </div >
113- <div
114- class =" asset-filename"
115- v-text =" truncateFilename(asset.basename)"
116- :title =" asset.basename"
117- />
122+ </ContextMenu >
123+ </Context >
124+ <div class =" asset-filename" v-text =" truncateFilename(asset.basename)" :title =" asset.basename" />
118125 </div >
119126 </section >
120127 </ui-card >
@@ -129,11 +136,23 @@ import AssetBrowserMixin from './AssetBrowserMixin';
129136import Breadcrumbs from ' ./Breadcrumbs.vue' ;
130137import { debounce } from ' lodash-es' ;
131138import { EditableArea , EditableInput , EditablePreview , EditableRoot } from ' reka-ui' ;
132- import { Editable } from ' @statamic/ui' ;
139+ import { Context , ContextMenu , ContextItem , ContextLabel , ContextSeparator , Editable } from ' @statamic/ui' ;
133140
134141export default {
135142 mixins: [AssetBrowserMixin],
136- components: { Editable, EditableInput, EditablePreview, EditableArea, EditableRoot, Breadcrumbs },
143+ components: {
144+ ContextItem,
145+ ContextLabel,
146+ ContextMenu,
147+ ContextSeparator,
148+ Context,
149+ Editable,
150+ EditableInput,
151+ EditablePreview,
152+ EditableArea,
153+ EditableRoot,
154+ Breadcrumbs,
155+ },
137156 props: {
138157 assets: { type: Array },
139158 selectedAssets: { type: Array },
@@ -142,7 +161,6 @@ export default {
142161
143162 data () {
144163 return {
145- actionOpened: null ,
146164 thumbnailSize: 200 ,
147165 newFolderName: null ,
148166 };
0 commit comments