diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..35b3ec2 --- /dev/null +++ b/.npmrc @@ -0,0 +1,3 @@ +public-hoist-pattern[]=* +# node-linker=hoisted +pnpmfile=pnpmfile.cjs \ No newline at end of file diff --git a/app.js b/app.js index 430b8fe..6b15984 100644 --- a/app.js +++ b/app.js @@ -68,6 +68,9 @@ apostrophe({ 'article-category': {}, // Import and export content - '@apostrophecms/import-export': {} + '@apostrophecms/import-export': {}, + + // Tour + tour: {} } }); diff --git a/modules/@apostrophecms/home-page/views/page.html b/modules/@apostrophecms/home-page/views/page.html index 641baff..0ccea21 100644 --- a/modules/@apostrophecms/home-page/views/page.html +++ b/modules/@apostrophecms/home-page/views/page.html @@ -5,6 +5,8 @@ {% extends "layout.html" %} +{% block bodyClass %}{{ super() }} home-page{% endblock %} + {# Home page is full width #} {% block pageTitle %}

diff --git a/modules/asset/ui/src/_card.scss b/modules/asset/ui/src/_card.scss index 3f48fea..11d38d6 100644 --- a/modules/asset/ui/src/_card.scss +++ b/modules/asset/ui/src/_card.scss @@ -74,7 +74,7 @@ .card__text { font-size: 1rem; - color: color-mix(in srgb, var(--default-color), transparent 40%); + color: color-mix(in srgb, var(--default-color), transparent 20%); font-weight: 400; line-height: 1.3; } \ No newline at end of file diff --git a/modules/asset/ui/src/_header.scss b/modules/asset/ui/src/_header.scss index 090c1ef..f0398d6 100644 --- a/modules/asset/ui/src/_header.scss +++ b/modules/asset/ui/src/_header.scss @@ -4,7 +4,7 @@ align-items: center; flex-direction: column; height: 62px; - margin: 20px 0 40px 0; + padding: 20px 0 40px 0; } .breadcrumb { diff --git a/modules/asset/ui/src/_nav.scss b/modules/asset/ui/src/_nav.scss index 703180c..d034a6d 100644 --- a/modules/asset/ui/src/_nav.scss +++ b/modules/asset/ui/src/_nav.scss @@ -1,7 +1,7 @@ .nav-bar { font-family: var(--nav-font); z-index: 5; - position: fixed; + // position: fixed; box-sizing: border-box; left: auto; right: auto; @@ -44,9 +44,9 @@ } .mobile-nav { + display: none; z-index: 9999; - position: fixed; - display: flex; + flex-direction: column; align-items: center; justify-content: center; @@ -64,6 +64,8 @@ transition: opacity 0.3s ease; &.active { + position: fixed; + display: flex; opacity: 1; visibility: visible; pointer-events: auto; diff --git a/modules/asset/ui/src/_set-save-prefs.js b/modules/asset/ui/src/_set-save-prefs.js new file mode 100644 index 0000000..9b25507 --- /dev/null +++ b/modules/asset/ui/src/_set-save-prefs.js @@ -0,0 +1,15 @@ +export default () => { + apos.util.onReadyAndRefresh(() => { + + const pagePref = localStorage.getItem('apos-@apostrophecms/page-save-pref'); + if (!pagePref) { + localStorage.setItem('apos-@apostrophecms/page-save-pref', 'onSaveAndView'); + } + + const articlePref = localStorage.getItem('apos-article-save-pref'); + if (!articlePref) { + localStorage.setItem('apos-article-save-pref', 'onSaveAndView'); + } + + }); +}; diff --git a/modules/asset/ui/src/_tracking.js b/modules/asset/ui/src/_tracking.js new file mode 100644 index 0000000..d28ed2e --- /dev/null +++ b/modules/asset/ui/src/_tracking.js @@ -0,0 +1,189 @@ +export default () => { + + const VALIDTARGETS = [ + 'button', + '.apos-table__cell', + '.apos-media-uploader__inner', + '.apos-input--choice', + 'input[class^="apos"]', + 'select[class^="apos"]', + '.apos-rich-text-editor__editor', + '.apos-area-widget-controls--modify', + '.apos-locale-item', + '.apos-doc-locales__switcher' + ]; + + const RULES = [ + { + match: t => t.closest('.apos-admin-bar'), + label: () => 'AdminBar' + }, + { + match: t => t.matches('.apos-locale-item') || t.closest('.apos-locale-item'), + label: () => 'SelectLocaleToLocalizeTo' + }, + { + match: t => t.closest('.apos-media-manager'), + label: () => 'MediaManager' + }, + { + match: t => t.closest('.apos-area-widget-controls--modify'), + label: () => 'WidgetTools' + }, + { + match: t => t.closest('.apos-tag-list'), + label: () => 'FilterByTag' + }, + { + match: t => t.closest('.apos-manager-toolbar'), + label: () => 'ManagerToolbar' + }, + { + match: t => t.closest('.apos-modal-tabs'), + label: () => 'SchemaTab' + }, + { + match: t => t.closest('.apos-rich-text-editor__editor'), + label: t => { + if (t.matches('option')) { + return `RichTextWidget:${t.textContent}`; + } + return 'RichTextWidget'; + }, + suppressLabel: true + }, + { + match: t => t.closest('.apos-filters-menu__set'), + label: t => `FilterChoice:${t.parentElement?.textContent}`, + suppressLabel: true + }, + { + match: t => t.closest('[data-apos-test="selectAll"]'), + label: () => 'SelectAll', + suppressLabel: true + }, + { + match: t => + t.closest('.apos-input-wrapper') || + t.closest('.apos-field__wrapper'), + label: t => { + const field = t.closest('.apos-field'); + const fieldLabel = + field?.querySelector('.apos-field_label-info')?.textContent; + + let value = ''; + + if (t.matches('.apos-button__label') || t.matches('option')) { + value = t.textContent; + } else if (t.classList.contains('apos-input--choice')) { + value = t.parentElement?.textContent; + } + + return `SchemaField:${fieldLabel}:${value}`; + }, + suppressLabel: true + }, + { + match: t => t.closest('[data-apos-test-context-menu-item]'), + label: () => 'ContextMenuItem' + }, + { + match: t => t.closest('.apos-media-manager-display__select'), + label: () => 'ManageImage' + }, + { + match: t => t.closest('.apos-field--search'), + label: () => 'Search' + }, + { + match: t => t.closest('.apos-table__cell'), + label: () => 'ManagerTableCell' + }, + { + match: t => t.closest('.apos-media-uploader'), + label: () => 'MediaUploader', + suppressLabel: true + }, + { + match: t => t.closest('.apos-area-menu__button'), + label: () => 'AddContentItem' + }, + { + match: t => + t.closest('.apos-admin-locales') || + t.matches('.apos-doc-locales__switcher') || + t.closest('.apos-doc-locales__switcher'), + label: () => 'LocaleSwitcher' + }, + { + match: t => + t.closest('[data-apos-test="authenticatedUserMenuTrigger"]'), + label: () => 'UserSettingsMenu' + }, + { + match: t => t.closest('.apos-button--icon-only'), + label: t => t.closest('.apos-button--icon-only')?.textContent, + suppressLabel: true + } + ]; + + const isValidTarget = (t) => + VALIDTARGETS.some(sel => t.matches(sel) || t.closest(sel)); + + apos.util.onReadyAndRefresh(() => { + + function handleClicks(e) { + try { + const t = e.target; + if (!isValidTarget(t)) { + return; + } + + const parts = [ 'AposClick' ]; + let allowText = true; + + for (const rule of RULES) { + if (!rule.match(t)) { + continue; + } + + const label = rule.label(t); + + if (label) { + parts.push(label); + } + + if (rule.suppressLabel) { + allowText = false; + } + } + + if (allowText && t.textContent) { + parts.push(t.textContent); + } + + const msg = pascalCase( + parts.join(':') + .replace(/:+$/, '') + .replace(/\*/g, '') + ); + + window.umami.track(msg); + } catch (_) { + // + } + } + + if (!apos._demoTracking) { + document.addEventListener('click', handleClicks, { capture: true }); + apos._demoTracking = true; + } + + function pascalCase(str) { + return str + .replace(/[_\-]+/g, ' ') + .replace(/(?:^\w|[A-Z]|\b\w)/g, (w, i) => w.toUpperCase()) + .replace(/\s+/g, ''); + } + }); +}; diff --git a/modules/asset/ui/src/index.js b/modules/asset/ui/src/index.js index 4950c27..ad26059 100644 --- a/modules/asset/ui/src/index.js +++ b/modules/asset/ui/src/index.js @@ -1,11 +1,15 @@ import localToggle from './_locales.js'; import modeToggle from './_dark-light-switch.js'; import mobileMenu from './_mobile.js'; +import savePrefs from './_set-save-prefs.js'; +import tracking from './_tracking.js'; export default () => { localToggle(); modeToggle(); mobileMenu(); + savePrefs(); + tracking(); console.log('look at me, I am project level js'); }; diff --git a/modules/card-widget/views/widget.html b/modules/card-widget/views/widget.html index 72e2999..ff5151c 100644 --- a/modules/card-widget/views/widget.html +++ b/modules/card-widget/views/widget.html @@ -22,8 +22,8 @@ {% if widget.linkText %}