├── frontend
├── Procfile
├── tsconfig.json
├── src
│ ├── env.d.ts
│ ├── widgets
│ │ ├── FileWidget.astro
│ │ ├── RichTextWidget.astro
│ │ ├── index.js
│ │ ├── DataSetWidget.astro
│ │ ├── VideoWidget.astro
│ │ ├── ImageWidget.astro
│ │ ├── LinkWidget.astro
│ │ └── AccordionWidget.astro
│ ├── templates
│ │ ├── DefaultPage.astro
│ │ ├── index.js
│ │ ├── ArticleShowPage.astro
│ │ ├── HomePage.astro
│ │ └── ArticleIndexPage.astro
│ ├── pages
│ │ ├── api
│ │ │ └── apos-external-front
│ │ │ │ └── render-area.astro
│ │ └── [...slug].astro
│ ├── components
│ │ ├── Figure.astro
│ │ ├── DataSetTable.astro
│ │ ├── ImageLink.astro
│ │ ├── Pagination.astro
│ │ ├── ArticlesFilter.astro
│ │ ├── Header.astro
│ │ └── Footer.astro
│ ├── lib
│ │ ├── homepage-defaults.js
│ │ ├── use-site-config.js
│ │ └── attachments.js
│ ├── layouts
│ │ └── article-layouts
│ │ │ ├── ShowMagazine.astro
│ │ │ ├── ShowMinimal.astro
│ │ │ ├── Standard.astro
│ │ │ ├── HeroGrid.astro
│ │ │ ├── ListAside.astro
│ │ │ └── ShowFullWidth.astro
│ └── styles
│ │ └── main.scss
├── .vscode
│ ├── extensions.json
│ └── launch.json
├── public
│ ├── fonts
│ │ └── fontawesome
│ │ │ ├── fa-solid-900.woff2
│ │ │ ├── fa-brands-400.woff2
│ │ │ ├── fa-regular-400.woff2
│ │ │ └── fa-v4compatibility.woff2
│ ├── images
│ │ ├── image-widget-placeholder.jpg
│ │ └── missing-icon.svg
│ ├── scripts
│ │ ├── dynamic-navbar-padding.js
│ │ └── VideoWidget.js
│ └── favicon.svg
├── .gitignore
├── postcss.config.js
├── README.md
├── package.json
└── astro.config.mjs
├── backend
├── .stylelintignore
├── sites
│ ├── views
│ │ └── layout.html
│ ├── modules
│ │ ├── @apostrophecms
│ │ │ ├── page
│ │ │ │ ├── views
│ │ │ │ │ └── notFound.html
│ │ │ │ └── index.js
│ │ │ ├── home-page
│ │ │ │ ├── views
│ │ │ │ │ └── page.html
│ │ │ │ └── index.js
│ │ │ ├── widget-type
│ │ │ │ └── index.js
│ │ │ ├── uploadfs
│ │ │ │ └── index.js
│ │ │ ├── image-widget
│ │ │ │ ├── index.js
│ │ │ │ └── public
│ │ │ │ │ └── preview.svg
│ │ │ ├── express
│ │ │ │ └── index.js
│ │ │ ├── video-widget
│ │ │ │ ├── index.js
│ │ │ │ └── public
│ │ │ │ │ └── preview.svg
│ │ │ ├── attachment
│ │ │ │ └── index.js
│ │ │ ├── user
│ │ │ │ └── index.js
│ │ │ ├── admin-bar
│ │ │ │ └── index.js
│ │ │ ├── rich-text-widget
│ │ │ │ ├── index.js
│ │ │ │ └── public
│ │ │ │ │ └── preview.svg
│ │ │ ├── i18n
│ │ │ │ └── index.js
│ │ │ ├── asset
│ │ │ │ └── index.js
│ │ │ └── settings
│ │ │ │ └── index.js
│ │ ├── theme-demo
│ │ │ ├── ui
│ │ │ │ └── src
│ │ │ │ │ └── index.scss
│ │ │ └── index.js
│ │ ├── theme-default
│ │ │ ├── ui
│ │ │ │ └── src
│ │ │ │ │ └── index.scss
│ │ │ └── index.js
│ │ ├── @apostrophecms-pro
│ │ │ └── palette
│ │ │ │ ├── index.js
│ │ │ │ └── lib
│ │ │ │ ├── groups.js
│ │ │ │ └── fields.js
│ │ ├── link-widget
│ │ │ └── index.js
│ │ ├── card-widget
│ │ │ ├── index.js
│ │ │ └── public
│ │ │ │ └── preview.svg
│ │ ├── hero-widget
│ │ │ ├── index.js
│ │ │ └── public
│ │ │ │ └── preview.svg
│ │ ├── slideshow-widget
│ │ │ ├── index.js
│ │ │ └── public
│ │ │ │ └── preview.svg
│ │ ├── default-page
│ │ │ └── index.js
│ │ ├── accordion-widget
│ │ │ ├── public
│ │ │ │ └── preview.svg
│ │ │ └── index.js
│ │ ├── author
│ │ │ └── index.js
│ │ ├── article
│ │ │ └── index.js
│ │ └── article-page
│ │ │ └── index.js
│ ├── lib
│ │ ├── theme-demo.js
│ │ ├── theme-default.js
│ │ ├── helpers
│ │ │ ├── color-options.js
│ │ │ ├── area-widgets.js
│ │ │ └── typography-options.js
│ │ └── schema-mixins
│ │ │ ├── slideshow-fields.js
│ │ │ ├── link-fields.js
│ │ │ ├── hero-fields.js
│ │ │ └── card-fields.js
│ └── index.js
├── .stylelintrc
├── dashboard
│ ├── views
│ │ └── layout.html
│ ├── modules
│ │ ├── @apostrophecms
│ │ │ ├── admin-bar
│ │ │ │ └── index.js
│ │ │ ├── uploadfs
│ │ │ │ └── index.js
│ │ │ ├── express
│ │ │ │ └── index.js
│ │ │ ├── file
│ │ │ │ └── index.js
│ │ │ ├── file-tag
│ │ │ │ └── index.js
│ │ │ ├── image-tag
│ │ │ │ └── index.js
│ │ │ └── asset
│ │ │ │ └── index.js
│ │ └── site
│ │ │ └── index.js
│ └── index.js
├── public
│ └── images
│ │ └── logo.png
├── deployment
│ ├── migrate
│ ├── build
│ └── for-all-themes
├── eslint.config.js
├── themes.js
├── domains.js
├── modules
│ └── @apostrophecms
│ │ └── layout-column-widget
│ │ └── index.js
├── README.md
├── nodemon.json
├── LICENSE
├── .gitignore
├── app.js
├── package.json
└── views
│ └── layout.html
├── .gitignore
├── package.json
└── LICENSE
/frontend/Procfile:
--------------------------------------------------------------------------------
1 | web: node dist/server/entry.mjs
2 |
--------------------------------------------------------------------------------
/backend/.stylelintignore:
--------------------------------------------------------------------------------
1 | **/node_modules
2 | apos-build
3 |
--------------------------------------------------------------------------------
/backend/sites/views/layout.html:
--------------------------------------------------------------------------------
1 | {% extends "../../views/layout.html" %}
2 |
--------------------------------------------------------------------------------
/frontend/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "astro/tsconfigs/base"
3 | }
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | package-lock.json
2 | /node_modules
3 | .DS_Store
4 | /release-id
5 |
--------------------------------------------------------------------------------
/backend/.stylelintrc:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "stylelint-config-apostrophe"
3 | }
4 |
--------------------------------------------------------------------------------
/backend/dashboard/views/layout.html:
--------------------------------------------------------------------------------
1 | {% extends "../../views/layout.html" %}
2 |
--------------------------------------------------------------------------------
/backend/sites/modules/@apostrophecms/page/views/notFound.html:
--------------------------------------------------------------------------------
1 | {% extends "layout.html" %}
2 |
--------------------------------------------------------------------------------
/backend/sites/modules/@apostrophecms/home-page/views/page.html:
--------------------------------------------------------------------------------
1 | {% extends 'layout.html' %}
2 |
--------------------------------------------------------------------------------
/frontend/src/env.d.ts:
--------------------------------------------------------------------------------
1 | ///
| {column} | 27 | ))} 28 |
|---|
| 35 | {row[column] || ''} 36 | | 37 | ))} 38 |
46 | Dataset not selected 47 |
48 | ) : null} 49 | -------------------------------------------------------------------------------- /backend/sites/modules/slideshow-widget/public/preview.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /backend/sites/modules/card-widget/public/preview.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /frontend/src/lib/homepage-defaults.js: -------------------------------------------------------------------------------- 1 | export const heroDefaults = { 2 | layout: 'split', 3 | splitSide: 'right', 4 | background: 'image', 5 | height: 'large', 6 | contentAlignment: 'left', 7 | mainContent: { 8 | title: 'Welcome to Your Site', 9 | subtitle: 'Start customizing your homepage', 10 | titleColor: 'primary', 11 | subtitleColor: 'primary', 12 | } 13 | }; 14 | 15 | export const slideshowDefaults = { 16 | slideDuration: 5000, 17 | transitionSpeed: 300, 18 | autoplay: true, 19 | showControls: true, 20 | slides: [ 21 | { 22 | slideTitle: 'Welcome to Our Site', 23 | titleColor: 'warning', 24 | cardContent: 'Edit this slideshow to add your own content and images.', 25 | contentColor: 'success', 26 | textBlockBackground: 'dark', 27 | textBlockOpacity: '65', 28 | }, 29 | { 30 | slideTitle: 'Customizable Design', 31 | titleColor: 'primary', 32 | cardContent: 'Add your own slides with content.', 33 | contentColor: 'warning', 34 | textBlockBackground: 'dark', 35 | textBlockOpacity: '65', 36 | }, 37 | { 38 | slideTitle: 'Getting Started', 39 | titleColor: 'info', 40 | cardContent: 'Click edit to begin customizing your slideshow.', 41 | contentColor: 'white', 42 | textBlockBackground: 'dark', 43 | textBlockOpacity: '65', 44 | } 45 | ] 46 | }; 47 | -------------------------------------------------------------------------------- /backend/sites/modules/@apostrophecms-pro/palette/lib/groups.js: -------------------------------------------------------------------------------- 1 | import fields from './fields.js'; 2 | 3 | function getKeysWithPrefix(obj, prefix) { 4 | return Object.keys(obj).filter(key => key.startsWith(prefix)); 5 | } 6 | 7 | export default { 8 | site: { 9 | label: 'Site', 10 | fields: getKeysWithPrefix(fields, 'site') 11 | }, 12 | header: { 13 | label: 'Header', 14 | fields: getKeysWithPrefix(fields, 'header') 15 | }, 16 | headings: { 17 | label: 'Headings', 18 | group: { 19 | h1: { 20 | label: 'Heading One', 21 | fields: getKeysWithPrefix(fields, 'h1') 22 | }, 23 | h2: { 24 | label: 'Heading Two', 25 | fields: getKeysWithPrefix(fields, 'h2') 26 | }, 27 | h3: { 28 | label: 'Heading Three', 29 | fields: getKeysWithPrefix(fields, 'h3') 30 | }, 31 | h4: { 32 | label: 'Heading Four', 33 | fields: getKeysWithPrefix(fields, 'h4') 34 | }, 35 | h5: { 36 | label: 'Heading Five', 37 | fields: getKeysWithPrefix(fields, 'h5') 38 | } 39 | } 40 | }, 41 | paragraphs: { 42 | label: 'Paragraphs', 43 | fields: getKeysWithPrefix(fields, 'p') 44 | }, 45 | buttons: { 46 | label: 'Buttons', 47 | fields: getKeysWithPrefix(fields, 'button') 48 | }, 49 | footer: { 50 | label: 'Footer', 51 | fields: getKeysWithPrefix(fields, 'footer') 52 | } 53 | }; 54 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | /public/apos-minified 3 | */apos-build 4 | /apos-build 5 | /public/apos-frontend 6 | /modules/asset/ui/public/site.js 7 | 8 | # dependencies 9 | node_modules/ 10 | 11 | # logs 12 | npm-debug.log 13 | 14 | # locales 15 | /dashboard/locales 16 | /locales 17 | 18 | # content 19 | /public/uploads 20 | # Don't commit masters generated on the fly at startup, these import all the rest 21 | /public/css/master-*.less 22 | */public/apos-frontend 23 | /dashboard/modules/asset/ui/public 24 | /sites/modules/theme-*/ui/public 25 | */public/modules 26 | */public/uploads 27 | */public/svgs/*.svg 28 | */public/apos-minified 29 | # This folder is created on the fly and contains symlinks updated at startup (we'll come up with a Windows solution that actually copies things) 30 | /public/modules 31 | # We don't commit CSS, only LESS 32 | */public/css/*.css 33 | */public/css/*.less 34 | # Don't commit CSS sourcemap files 35 | */public/css/*.map 36 | /public/js/_site-compiled.js 37 | /public/sitemap.xml 38 | dashboard/modules/assets/public/css/site.css 39 | dashboard/modules/assets/public/js/site.js 40 | sites/modules/theme-*/public/js/site.js 41 | sites/modules/theme-*/public/css/site.css 42 | 43 | # local env data 44 | /data 45 | /data/temp/uploadfs 46 | /dashboard/data 47 | /sites/data 48 | 49 | # macOS-specific files 50 | .DS_Store 51 | 52 | # vim swapfiles 53 | *.swp 54 | 55 | # Deployed, but not committed 56 | /release-id 57 | -------------------------------------------------------------------------------- /frontend/src/components/ImageLink.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { image, link } = Astro.props; 3 | 4 | export interface Props { 5 | image: { 6 | src: string; 7 | alt?: string; 8 | style?: string; 9 | srcset?: string; 10 | objectPosition: string; 11 | width?: number | string; 12 | height?: number | string; 13 | aspectRatio?: string; 14 | }; 15 | link?: { 16 | url: string; 17 | title?: string; 18 | target?: string; 19 | rel?: string; 20 | }; 21 | } 22 | 23 | const style = 24 | `object-position: ${image.objectPosition};${image.aspectRatio ? `--aspect-ratio: ${image.aspectRatio};` : ""} 25 | `.trim(); 26 | --- 27 | 28 |