diff --git a/package-lock.json b/package-lock.json index 4b9d607..3a6669e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "protowiki", - "version": "0.1.0", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "protowiki", - "version": "0.1.0", + "version": "0.2.0", "dependencies": { "@wikimedia/codex": "^2.6.0", "@wikimedia/codex-design-tokens": "^2.6.0", diff --git a/public/images/no-distractions-welcome-hero.png b/public/images/no-distractions-welcome-hero.png new file mode 100644 index 0000000..a97024d Binary files /dev/null and b/public/images/no-distractions-welcome-hero.png differ diff --git a/src/components/MobileWrapper.vue b/src/components/MobileWrapper.vue index 7d81eff..16be3cc 100644 --- a/src/components/MobileWrapper.vue +++ b/src/components/MobileWrapper.vue @@ -13,12 +13,15 @@ interface Props { dir?: 'ltr' | 'rtl' /** Max width of the centred column when clamped (wide viewports). */ maxWidth?: string + /** Side borders on the centred column when previewing above 480px. */ + showFrameBorder?: boolean } const props = withDefaults(defineProps(), { lang: undefined, dir: undefined, maxWidth: '360px', + showFrameBorder: true, }) @@ -26,6 +29,7 @@ const props = withDefaults(defineProps(), {
(), { background-color: var(--background-color-base); border-inline: var(--border-width-base) solid var(--border-color-muted); } + + .mobile-wrapper__column--frameless { + border-inline: none; + } } diff --git a/src/components/PrototypeChromeMenuPanel.vue b/src/components/PrototypeChromeMenuPanel.vue new file mode 100644 index 0000000..8039f87 --- /dev/null +++ b/src/components/PrototypeChromeMenuPanel.vue @@ -0,0 +1,101 @@ + + + + + + + + diff --git a/src/components/PrototypeChromeMenuPopover.vue b/src/components/PrototypeChromeMenuPopover.vue new file mode 100644 index 0000000..0ff8f99 --- /dev/null +++ b/src/components/PrototypeChromeMenuPopover.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/components/article/ArticleHeader.vue b/src/components/article/ArticleHeader.vue index 7093d65..e142ec4 100644 --- a/src/components/article/ArticleHeader.vue +++ b/src/components/article/ArticleHeader.vue @@ -2,6 +2,7 @@ import { computed, inject, ref, watch } from 'vue' import { CdxButton, CdxIcon, CdxPopover, CdxTextInput } from '@wikimedia/codex' import { + cdxIconBookmarkOutline, cdxIconDownTriangle, cdxIconDownload, cdxIconEdit, @@ -38,11 +39,17 @@ interface Props { * Drives the structural mobile vs desktop layout (icon toolbar vs text actions). */ skin?: Skin + /** + * Mobile icon toolbar: watchlist star (default) vs reader bookmark (Minerva + * “save for later” affordance in flows like no-distractions). + */ + bookmarkAffordance?: 'watch' | 'bookmark' } const props = withDefaults(defineProps(), { languagesCount: 18, skin: undefined, + bookmarkAffordance: 'watch', }) const inheritedSkin = inject(PROTOWIKI_CHROME_SKIN) @@ -50,6 +57,16 @@ const effectiveSkin = computed(() => props.skin ?? inheritedSkin?.value ?? const { user } = useConfig() const isLoggedOut = computed(() => user.value === 'logged-out') +const bookmarkLabel = computed(() => + props.bookmarkAffordance === 'bookmark' ? 'Bookmark' : 'Watch', +) +const bookmarkIcon = computed(() => + props.bookmarkAffordance === 'bookmark' ? cdxIconBookmarkOutline : cdxIconUnStar, +) +const bookmarkIconLoggedOut = computed(() => + props.bookmarkAffordance === 'bookmark' ? cdxIconBookmarkOutline : cdxIconStar, +) + const languagesButtonLabel = computed(() => { const n = props.languagesCount ?? 18 return n === 1 ? '1 language' : `${n} languages` @@ -148,10 +165,10 @@ function onLanguagePick(row: ArticleLanguageLink) { - +
@@ -186,10 +203,10 @@ function onLanguagePick(row: ArticleLanguageLink) {