diff --git a/app/components/version-list/row.hbs b/app/components/version-list/row.hbs
new file mode 100644
index 00000000000..785d2d343bf
--- /dev/null
+++ b/app/components/version-list/row.hbs
@@ -0,0 +1,23 @@
+
+
+
+ {{@version.num}}
+
+
+ {{#if @version.yanked}}
+ yanked
+ {{/if}}
+
+
+
+ {{date-format-distance-to-now @version.created_at addSuffix=true}}
+
+
+ {{#if this.isOwner}}
+
+ {{/if}}
+
diff --git a/app/components/version-list/row.js b/app/components/version-list/row.js
new file mode 100644
index 00000000000..876041b51de
--- /dev/null
+++ b/app/components/version-list/row.js
@@ -0,0 +1,12 @@
+import { computed } from '@ember/object';
+import { inject as service } from '@ember/service';
+import Component from '@glimmer/component';
+
+export default class VersionRow extends Component {
+ @service session;
+
+ @computed('args.version.crate.owner_user', 'session.currentUser.id')
+ get isOwner() {
+ return this.args.version.crate?.owner_user?.findBy('id', this.session.currentUser?.id);
+ }
+}
diff --git a/app/components/version-list/row.module.css b/app/components/version-list/row.module.css
new file mode 100644
index 00000000000..419fb1d2eca
--- /dev/null
+++ b/app/components/version-list/row.module.css
@@ -0,0 +1,45 @@
+.row {
+ display: flex;
+ align-items: center;
+ position: relative;
+ padding: 20px;
+ transition: background-color 300ms;
+
+ &:hover {
+ background-color: var(--grey200);
+ transition: background-color 0ms;
+ }
+
+ & >:first-child {
+ flex-grow: 1;
+ }
+}
+
+.num-link {
+ font-variant-numeric: tabular-nums;
+
+ &::after {
+ content: '';
+ position: absolute;
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ }
+}
+
+.date {
+ composes: small from '../../styles/shared/typography.module.css';
+ display: inline-block;
+ margin-left: 20px;
+ position: relative;
+}
+
+.yanked {
+ composes: yanked from '../../styles/shared/typography.module.css';
+}
+
+.yank-button {
+ position: relative;
+ margin-left: 10px;
+}
diff --git a/app/controllers/crate/versions.js b/app/controllers/crate/versions.js
deleted file mode 100644
index fc43b600fb2..00000000000
--- a/app/controllers/crate/versions.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import Controller from '@ember/controller';
-import { computed } from '@ember/object';
-import { inject as service } from '@ember/service';
-
-export default class CrateVersionsController extends Controller {
- @service session;
-
- @computed('model.owner_user', 'session.currentUser.id')
- get isOwner() {
- return this.model.owner_user.findBy('id', this.session.currentUser?.id);
- }
-}
diff --git a/app/styles/application.module.css b/app/styles/application.module.css
index da8b1c37c11..dba8fd26ebe 100644
--- a/app/styles/application.module.css
+++ b/app/styles/application.module.css
@@ -1,6 +1,7 @@
:root {
--violet800: hsl(252, 44%, 24%);
--grey900: hsl(200, 15%, 19%);
+ --grey200: hsl(200, 17%, 96%);
--green800: hsl(115, 31%, 31%);
--yellow500: hsl(44, 100%, 60%);
diff --git a/app/styles/crate/versions.module.css b/app/styles/crate/versions.module.css
index b87805df346..f9e3fe92807 100644
--- a/app/styles/crate/versions.module.css
+++ b/app/styles/crate/versions.module.css
@@ -10,35 +10,17 @@
margin-top: 10px;
padding: 0 20px;
background-color: white;
-}
+ list-style: none;
-.row {
- display: flex;
- justify-content: space-between;
- flex-wrap: wrap;
- padding: 20px 0;
- border-bottom: 2px solid #d5d3cb;
+ > li {
+ border-bottom: 2px solid #d5d3cb;
- &:last-of-type {
- border: none;
+ &:last-of-type {
+ border: none;
+ }
}
}
-.date {
- composes: small from '../shared/typography.module.css';
- display: inline-block;
- margin-left: 20px;
-}
-
-.yanked {
- composes: yanked from '../shared/typography.module.css';
-}
-
-.arrow {
- display: inline-block;
- float: right;
-
- svg {
- background: #EEECDD;
- }
+.row {
+ margin: 0 -20px;
}
diff --git a/app/templates/crate/versions.hbs b/app/templates/crate/versions.hbs
index c0964e7df50..2222a9e8c5b 100644
--- a/app/templates/crate/versions.hbs
+++ b/app/templates/crate/versions.hbs
@@ -8,24 +8,10 @@
{{date-format this.model.created_at 'PPP'}}
-
+