├── tests ├── end-to-end │ ├── .node_version │ ├── .gitignore │ ├── cypress.env.json │ ├── .prettierrc.json │ ├── tsconfig.json │ ├── src │ │ └── main │ │ │ └── features │ │ │ └── howlite_tests_content.json │ ├── .eslintrc.json │ ├── support │ │ ├── types.ts │ │ └── consts.ts │ ├── jest.config.ts │ ├── .percy.yml │ ├── cypress.config.ts │ └── package.json ├── content │ ├── README.md │ └── src │ │ └── main │ │ └── content │ │ ├── jcr_root │ │ └── content │ │ │ └── howlite-test │ │ │ ├── assets │ │ │ ├── .content.xml │ │ │ ├── landscape.jpg │ │ │ │ ├── _jcr_content │ │ │ │ │ └── renditions │ │ │ │ │ │ ├── original.jpg │ │ │ │ │ │ ├── thumbnail-32x32.webp │ │ │ │ │ │ ├── thumbnail-200x200.webp │ │ │ │ │ │ ├── original.jpg.dir │ │ │ │ │ │ └── .content.xml │ │ │ │ │ │ ├── thumbnail-32x32.webp.dir │ │ │ │ │ │ └── .content.xml │ │ │ │ │ │ └── thumbnail-200x200.webp.dir │ │ │ │ │ │ └── .content.xml │ │ │ │ └── .content.xml │ │ │ └── portrait.jpg │ │ │ │ ├── _jcr_content │ │ │ │ └── renditions │ │ │ │ │ ├── original.jpg │ │ │ │ │ ├── thumbnail-32x32.webp │ │ │ │ │ ├── thumbnail-200x200.webp │ │ │ │ │ ├── original.jpg.dir │ │ │ │ │ └── .content.xml │ │ │ │ │ ├── thumbnail-200x200.webp.dir │ │ │ │ │ └── .content.xml │ │ │ │ │ └── thumbnail-32x32.webp.dir │ │ │ │ │ └── .content.xml │ │ │ │ └── .content.xml │ │ │ ├── .content.xml │ │ │ └── pages │ │ │ ├── .content.xml │ │ │ └── Footer │ │ │ └── .content.xml │ │ └── META-INF │ │ └── vault │ │ └── filter.xml ├── README.md └── pom.xml ├── ui.frontend ├── src │ ├── resources │ │ ├── fonts │ │ │ ├── .gitkeep │ │ │ └── ds-font │ │ │ │ ├── ds-iconfonts.eot │ │ │ │ ├── ds-iconfonts.ttf │ │ │ │ ├── ds-iconfonts.woff │ │ │ │ └── ds-iconfonts.woff2 │ │ └── images │ │ │ ├── .gitkeep │ │ │ ├── check.svg │ │ │ └── broken-image.svg │ ├── components │ │ ├── CTA │ │ │ └── _index.scss │ │ ├── Footer │ │ │ └── _index.scss │ │ ├── Header │ │ │ └── _index.scss │ │ ├── Image │ │ │ ├── _index.scss │ │ │ └── image.scss │ │ ├── Quote │ │ │ └── _index.scss │ │ ├── Title │ │ │ ├── _index.scss │ │ │ ├── title.ts │ │ │ └── title.scss │ │ ├── Accordion │ │ │ ├── _index.scss │ │ │ └── accordion.js │ │ ├── CTAsList │ │ │ ├── _index.scss │ │ │ └── ctasList.scss │ │ ├── CardsList │ │ │ └── _index.scss │ │ ├── Container │ │ │ ├── _index.scss │ │ │ └── container.scss │ │ ├── RichText │ │ │ └── _index.scss │ │ ├── LogosCloud │ │ │ ├── _index.scss │ │ │ └── logos-cloud.scss │ │ ├── SocialLinks │ │ │ ├── _index.scss │ │ │ └── social-links.scss │ │ ├── MainContainer │ │ │ ├── _index.scss │ │ │ └── main-container.scss │ │ ├── Navigation │ │ │ └── _index.scss │ │ ├── PageSection │ │ │ ├── _index.scss │ │ │ └── variants │ │ │ │ ├── _index.scss │ │ │ │ └── hl-page-section--featured-content.scss │ │ └── index.scss │ ├── theme.ts │ ├── sass │ │ ├── abstracts │ │ │ ├── _variables.scss │ │ │ ├── _zindex.scss │ │ │ ├── _index.scss │ │ │ ├── _functions.scss │ │ │ ├── _colors.scss │ │ │ ├── _spacing.scss │ │ │ ├── _icons.scss │ │ │ ├── _custom-bootstrap.scss │ │ │ └── _negative-margins.scss │ │ ├── base │ │ │ ├── _utils.scss │ │ │ ├── _index.scss │ │ │ ├── _icons.scss │ │ │ └── _reset.scss │ │ ├── theme │ │ │ └── demo-content-theme.scss │ │ └── global.scss │ ├── author.ts │ ├── js │ │ ├── constants │ │ │ └── breakpoints.js │ │ ├── helpers │ │ │ ├── platform.js │ │ │ └── utils.js │ │ └── scrollbar.js │ ├── main.ts │ └── main.scss ├── .eslintignore ├── .babelrc ├── tsconfig.json ├── README.md ├── assembly.xml └── .eslintrc.js ├── core ├── src │ ├── main │ │ ├── resources │ │ │ └── libs │ │ │ │ └── howlite │ │ │ │ ├── author │ │ │ │ ├── author.js │ │ │ │ └── author.css │ │ │ │ ├── components │ │ │ │ ├── common │ │ │ │ │ ├── .content.json │ │ │ │ │ ├── stylevariant │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── headinglevel │ │ │ │ │ │ └── .content.json │ │ │ │ │ └── headingsize │ │ │ │ │ │ └── .content.json │ │ │ │ ├── pagesection │ │ │ │ │ ├── template │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── .content.json │ │ │ │ │ └── pagesection.html │ │ │ │ ├── layouts │ │ │ │ │ ├── onecol │ │ │ │ │ │ ├── template │ │ │ │ │ │ │ └── .content.json │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── threecols │ │ │ │ │ │ ├── .content.json │ │ │ │ │ │ └── template │ │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── twocols │ │ │ │ │ │ ├── .content.json │ │ │ │ │ │ └── template │ │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── fourcolumns │ │ │ │ │ │ ├── .content.json │ │ │ │ │ │ └── template │ │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── imageleftsection │ │ │ │ │ │ ├── .content.json │ │ │ │ │ │ └── template │ │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── imagerightsection │ │ │ │ │ │ ├── .content.json │ │ │ │ │ │ └── template │ │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── calltoactionsection │ │ │ │ │ │ ├── .content.json │ │ │ │ │ │ └── template │ │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── contentimagefullwidth │ │ │ │ │ │ ├── .content.json │ │ │ │ │ │ └── template │ │ │ │ │ │ │ └── .content.json │ │ │ │ │ └── herosection │ │ │ │ │ │ └── .content.json │ │ │ │ ├── image │ │ │ │ │ ├── .content.json │ │ │ │ │ ├── template │ │ │ │ │ │ └── .content.json │ │ │ │ │ └── image.html │ │ │ │ ├── quote │ │ │ │ │ ├── .content.json │ │ │ │ │ ├── editConfig │ │ │ │ │ │ └── .content.json │ │ │ │ │ └── template │ │ │ │ │ │ └── .content.json │ │ │ │ ├── title │ │ │ │ │ ├── .content.json │ │ │ │ │ ├── editConfig │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── template │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── title.html │ │ │ │ │ └── template.html │ │ │ │ ├── footer │ │ │ │ │ ├── .content.json │ │ │ │ │ └── footer.html │ │ │ │ ├── header │ │ │ │ │ ├── .content.json │ │ │ │ │ └── header.html │ │ │ │ ├── footerreference │ │ │ │ │ ├── .content.json │ │ │ │ │ └── footerreference.html │ │ │ │ ├── headerreference │ │ │ │ │ ├── .content.json │ │ │ │ │ └── headerreference.html │ │ │ │ ├── navigation │ │ │ │ │ ├── .content.json │ │ │ │ │ ├── navigation.html │ │ │ │ │ └── template.html │ │ │ │ ├── richtext │ │ │ │ │ ├── .content.json │ │ │ │ │ ├── editConfig │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── template │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── template.html │ │ │ │ │ ├── richtext.html │ │ │ │ │ └── dialog │ │ │ │ │ │ └── .content.json │ │ │ │ ├── sociallinks │ │ │ │ │ ├── .content.json │ │ │ │ │ ├── template │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── sociallinks.html │ │ │ │ │ └── template.html │ │ │ │ ├── cardslist │ │ │ │ │ ├── card │ │ │ │ │ │ ├── .content.json │ │ │ │ │ │ └── editConfig │ │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── .content.json │ │ │ │ │ └── template │ │ │ │ │ │ └── .content.json │ │ │ │ ├── accordion │ │ │ │ │ ├── accordionitem │ │ │ │ │ │ ├── .content.json │ │ │ │ │ │ ├── template │ │ │ │ │ │ │ └── .content.json │ │ │ │ │ │ ├── dialog │ │ │ │ │ │ │ └── .content.json │ │ │ │ │ │ └── accordionitem.html │ │ │ │ │ ├── .content.json │ │ │ │ │ ├── dialog │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── template │ │ │ │ │ │ └── .content.json │ │ │ │ │ └── accordion.html │ │ │ │ ├── cta │ │ │ │ │ ├── editConfig │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── .content.json │ │ │ │ │ ├── template │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── cta.html │ │ │ │ │ └── template.html │ │ │ │ ├── ctaslist │ │ │ │ │ ├── .content.json │ │ │ │ │ ├── dialog │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── template │ │ │ │ │ │ └── .content.json │ │ │ │ │ └── ctaslist.html │ │ │ │ ├── logoscloud │ │ │ │ │ ├── .content.json │ │ │ │ │ ├── dialog │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── template │ │ │ │ │ │ └── .content.json │ │ │ │ │ └── logoscloud.html │ │ │ │ ├── container │ │ │ │ │ ├── template │ │ │ │ │ │ └── .content.json │ │ │ │ │ ├── .content.json │ │ │ │ │ ├── fixedContainer │ │ │ │ │ │ ├── .content.json │ │ │ │ │ │ └── fixedContainer.html │ │ │ │ │ ├── dialog │ │ │ │ │ │ └── .content.json │ │ │ │ │ └── container.html │ │ │ │ ├── rootcontainer │ │ │ │ │ ├── fixedrootcontainer │ │ │ │ │ │ ├── .content.json │ │ │ │ │ │ └── fixedrootcontainer.html │ │ │ │ │ ├── .content.json │ │ │ │ │ └── rootcontainer.html │ │ │ │ ├── page │ │ │ │ │ ├── .content.json │ │ │ │ │ ├── head-libs.html │ │ │ │ │ ├── body-content.html │ │ │ │ │ └── body.html │ │ │ │ └── maincontainer │ │ │ │ │ ├── fixedmaincontainer │ │ │ │ │ ├── .content.json │ │ │ │ │ └── fixedmaincontainer.html │ │ │ │ │ ├── .content.json │ │ │ │ │ └── maincontainer.html │ │ │ │ ├── .content.json │ │ │ │ └── templates │ │ │ │ ├── homepage │ │ │ │ ├── .content.json │ │ │ │ └── initial │ │ │ │ │ └── .content.json │ │ │ │ ├── contentpage │ │ │ │ ├── .content.json │ │ │ │ └── initial │ │ │ │ │ └── .content.json │ │ │ │ └── pagesspace │ │ │ │ └── .content.json │ │ └── java │ │ │ └── pl │ │ │ └── ds │ │ │ └── howlite │ │ │ └── components │ │ │ ├── Styled.java │ │ │ ├── package-info.java │ │ │ ├── utils │ │ │ ├── GridDisplayType.java │ │ │ ├── package-info.java │ │ │ └── DefaultImageUtil.java │ │ │ ├── models │ │ │ ├── package-info.java │ │ │ ├── AccordionItemComponent.java │ │ │ ├── NavigationComponent.java │ │ │ ├── FooterReferenceComponent.java │ │ │ ├── HeaderReferenceComponent.java │ │ │ ├── HeaderComponent.java │ │ │ ├── FooterComponent.java │ │ │ ├── SocialLinksComponent.java │ │ │ ├── DefaultGridComponent.java │ │ │ ├── NavigationItemComponent.java │ │ │ ├── DefaultStyledComponent.java │ │ │ ├── SingleSocialLinkComponent.java │ │ │ └── CardsListComponent.java │ │ │ ├── Grid.java │ │ │ └── GridImpl.java │ └── test │ │ ├── resources │ │ ├── example.json │ │ ├── cta.json │ │ ├── title.json │ │ ├── quote.json │ │ ├── image.json │ │ ├── navigation.json │ │ ├── sociallinks.json │ │ ├── accordionItem.json │ │ ├── header.json │ │ ├── styled.json │ │ └── footer.json │ │ └── java │ │ └── pl │ │ └── ds │ │ └── howlite │ │ └── components │ │ └── utils │ │ └── DefaultImageUtilTest.java ├── bnd.bnd └── README.md ├── COPYRIGHT ├── RELEASING.md ├── .mvn ├── extensions.xml └── wrapper │ └── maven-wrapper.properties ├── .github ├── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md ├── dependabot.yml └── PULL_REQUEST_TEMPLATE.md ├── .gitignore └── google_checks_suppressions.xml /tests/end-to-end/.node_version: -------------------------------------------------------------------------------- 1 | 14.18.2 -------------------------------------------------------------------------------- /ui.frontend/src/resources/fonts/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ui.frontend/src/resources/images/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/author/author.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui.frontend/.eslintignore: -------------------------------------------------------------------------------- 1 | ./src/main/webpack/tests/ 2 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/common/.content.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/.content.json: -------------------------------------------------------------------------------- 1 | {"sling:resourceType": "ws:Application"} -------------------------------------------------------------------------------- /core/bnd.bnd: -------------------------------------------------------------------------------- 1 | WebSight-Apps-WebRoot: /libs/howlite/web_root 2 | Sling-Bundle-Resources: /libs/howlite 3 | -------------------------------------------------------------------------------- /tests/end-to-end/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | cypress 4 | node 5 | target 6 | 7 | launcher 8 | -------------------------------------------------------------------------------- /tests/end-to-end/cypress.env.json: -------------------------------------------------------------------------------- 1 | { 2 | "loginUsername": "wsadmin", 3 | "loginPassword": "wsadmin" 4 | } 5 | -------------------------------------------------------------------------------- /tests/end-to-end/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "singleQuote": true, 4 | "trailingComma": "none" 5 | } 6 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/pagesection/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "nt:unstructured", 3 | "classes": "" 4 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/onecol/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "classes": "", 3 | "jcr:primaryType": "nt:unstructured" 4 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/image/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": "Howlite", 3 | "sling:resourceType": "ws:Component", 4 | "title": "Image" 5 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/quote/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": "Howlite", 3 | "sling:resourceType": "ws:Component", 4 | "title": "Quote" 5 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/title/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": "Howlite", 3 | "sling:resourceType": "ws:Component", 4 | "title": "Title" 5 | } -------------------------------------------------------------------------------- /ui.frontend/src/resources/fonts/ds-font/ds-iconfonts.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/websight-io/howlite/HEAD/ui.frontend/src/resources/fonts/ds-font/ds-iconfonts.eot -------------------------------------------------------------------------------- /ui.frontend/src/resources/fonts/ds-font/ds-iconfonts.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/websight-io/howlite/HEAD/ui.frontend/src/resources/fonts/ds-font/ds-iconfonts.ttf -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/footer/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": ".hidden", 3 | "sling:resourceType": "ws:Component", 4 | "title": "Footer" 5 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/header/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": ".hidden", 3 | "sling:resourceType": "ws:Component", 4 | "title": "Header" 5 | } -------------------------------------------------------------------------------- /ui.frontend/src/resources/fonts/ds-font/ds-iconfonts.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/websight-io/howlite/HEAD/ui.frontend/src/resources/fonts/ds-font/ds-iconfonts.woff -------------------------------------------------------------------------------- /ui.frontend/src/resources/fonts/ds-font/ds-iconfonts.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/websight-io/howlite/HEAD/ui.frontend/src/resources/fonts/ds-font/ds-iconfonts.woff2 -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/footerreference/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": ".hidden", 3 | "sling:resourceType": "ws:Component", 4 | "title": "Footer" 5 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/headerreference/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": ".hidden", 3 | "sling:resourceType": "ws:Component", 4 | "title": "Header" 5 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/navigation/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": ".hidden", 3 | "sling:resourceType": "ws:Component", 4 | "title": "Navigation" 5 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/richtext/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": "Howlite", 3 | "sling:resourceType": "ws:Component", 4 | "title": "Rich text editor" 5 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/sociallinks/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": "Howlite", 3 | "sling:resourceType": "ws:Component", 4 | "title": "Social Links" 5 | } -------------------------------------------------------------------------------- /core/src/test/resources/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "nt:unstructured", 3 | "exampleTitle": "Example title", 4 | "sling:resourceType": "howlite/components/example" 5 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/cardslist/card/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": "Howlite Restricted", 3 | "sling:resourceType": "ws:Component", 4 | "title": "Card Item" 5 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/accordion/accordionitem/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": "Howlite Restricted", 3 | "sling:resourceType": "ws:Component", 4 | "title": "Accordion Item" 5 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/cta/editConfig/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "inlineEditing": { 3 | "config": { 4 | "property": "label", 5 | "editor": "text" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/cta/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": "Howlite", 3 | "sling:resourceType": "ws:Component", 4 | "description": "This is CTA component for Howlite", 5 | "title": "CTA" 6 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/cta/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "nt:unstructured", 3 | "classes": "hl-cta--secondary", 4 | "displayIcon": false, 5 | "openInNewTab": false 6 | } -------------------------------------------------------------------------------- /tests/content/README.md: -------------------------------------------------------------------------------- 1 | # Howlite test content 2 | Content for testing Howlite components 3 | 4 | ## Sync test content 5 | Create package with WebSight CMS Package Manager, unzip in `src/main/content/jcr_root` and clean all dates etc. -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/richtext/editConfig/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "inlineEditing": { 3 | "config": { 4 | "property": "text", 5 | "editor": "rich-text" 6 | } 7 | } 8 | } 9 | 10 | 11 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/templates/homepage/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "allowedChildren": ["/libs/howlite/templates/contentpage"], 3 | "sling:resourceType": "ws:PageTemplate", 4 | "description": "Howlite", 5 | "title": "Home Page" 6 | } -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/assets/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | -------------------------------------------------------------------------------- /ui.frontend/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/typescript" 4 | ], 5 | "plugins": [ 6 | "@babel/plugin-proposal-class-properties", 7 | "@babel/plugin-proposal-object-rest-spread" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/templates/contentpage/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "allowedChildren": ["/libs/howlite/templates/contentpage"], 3 | "sling:resourceType": "ws:PageTemplate", 4 | "description": "Howlite", 5 | "title": "Content Page" 6 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/ctaslist/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "isContainer": true, 3 | "group": "Howlite", 4 | "allowedComponents": "/libs/howlite/components/cta", 5 | "sling:resourceType": "ws:Component", 6 | "title": "CTAs List" 7 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/sociallinks/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "nt:unstructured", 3 | "icon1": "icon-linkedin", 4 | "icon2": "icon-linkedin", 5 | "icon3": "icon-linkedin", 6 | "icon4": "icon-linkedin" 7 | } -------------------------------------------------------------------------------- /tests/end-to-end/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["es5", "dom", "ES2021.String"], 5 | "types": ["cypress", "@percy/cypress", "node", "@4tw/cypress-drag-drop"] 6 | }, 7 | "include": ["**/*.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/image/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "nt:unstructured", 3 | "lgColSize": "12", 4 | "lgOffset": "", 5 | "mdColSize": "12", 6 | "mdOffset": "", 7 | "smColSize": "12", 8 | "smOffset": "" 9 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/logoscloud/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "isContainer": true, 3 | "group": "Howlite", 4 | "allowedComponents": "/libs/howlite/components/image", 5 | "sling:resourceType": "ws:Component", 6 | "title": "Logo cloud" 7 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/cardslist/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "isContainer": true, 3 | "group": "Howlite", 4 | "allowedComponents": "/libs/howlite/components/cardslist/card", 5 | "sling:resourceType": "ws:Component", 6 | "title": "Cards List" 7 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/container/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "nt:unstructured", 3 | "lgColSize": "12", 4 | "lgOffset": "", 5 | "mdColSize": "12", 6 | "mdOffset": "", 7 | "smColSize": "12", 8 | "smOffset": "" 9 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/title/editConfig/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "inlineEditing": { 3 | "config": { 4 | "property": "title", 5 | "domSelectors": [".hl-title__heading"], 6 | "editor": "text" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/cardslist/card/editConfig/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "inlineEditing": { 3 | "config": { 4 | "property": "title", 5 | "domSelectors": [".card__title"], 6 | "editor": "text" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/threecols/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "instanceResourceType": "howlite/components/pagesection", 3 | "isLayout": true, 4 | "group": "Empty Sections", 5 | "sling:resourceType": "ws:Component", 6 | "title": "3 Columns" 7 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/twocols/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "instanceResourceType": "howlite/components/pagesection", 3 | "isLayout": true, 4 | "group": "Empty Sections", 5 | "sling:resourceType": "ws:Component", 6 | "title": "2 Columns" 7 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/accordion/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "isContainer": true, 3 | "group": "Howlite", 4 | "allowedComponents": "/libs/howlite/components/accordion/accordionitem", 5 | "sling:resourceType": "ws:Component", 6 | "title": "Accordion" 7 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/fourcolumns/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "instanceResourceType": "howlite/components/pagesection", 3 | "isLayout": true, 4 | "group": "Empty Sections", 5 | "sling:resourceType": "ws:Component", 6 | "title": "4 Columns" 7 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/rootcontainer/fixedrootcontainer/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "isContainer": false, 3 | "group": ".hidden", 4 | "sling:resourceType": "ws:Component", 5 | "description": "Use for most outer, non-editable root", 6 | "title": "Body" 7 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/templates/pagesspace/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "allowedChildren": [ 3 | "/libs/howlite/templates/homepage", 4 | "/libs/howlite/templates/contentpage" 5 | ], 6 | "sling:resourceType": "ws:PagesTemplate", 7 | "title": "Howlite pages" 8 | } -------------------------------------------------------------------------------- /core/README.md: -------------------------------------------------------------------------------- 1 | ## Description: 2 | 3 | Module contains components logic for Howlite 4 | 5 | ## Usage: 6 | 7 | Build 8 | ```bash 9 | ../mvnw clean install 10 | ``` 11 | 12 | Build with local deployment 13 | ```bash 14 | ../mvnw clean install -P autoInstallBundle 15 | ``` 16 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/imageleftsection/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "instanceResourceType": "howlite/components/pagesection", 3 | "isLayout": true, 4 | "group": "Filled Sections", 5 | "sling:resourceType": "ws:Component", 6 | "title": "Image Left" 7 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/container/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "isContainer": true, 3 | "group": "Howlite", 4 | "allowedComponents": "Howlite", 5 | "sling:resourceType": "ws:Component", 6 | "description": "Editable components wrapper", 7 | "title": "Container" 8 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/imagerightsection/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "instanceResourceType": "howlite/components/pagesection", 3 | "isLayout": true, 4 | "group": "Filled Sections", 5 | "sling:resourceType": "ws:Component", 6 | "title": "Image Right" 7 | } -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/assets/landscape.jpg/_jcr_content/renditions/original.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/websight-io/howlite/HEAD/tests/content/src/main/content/jcr_root/content/howlite-test/assets/landscape.jpg/_jcr_content/renditions/original.jpg -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/assets/portrait.jpg/_jcr_content/renditions/original.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/websight-io/howlite/HEAD/tests/content/src/main/content/jcr_root/content/howlite-test/assets/portrait.jpg/_jcr_content/renditions/original.jpg -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/calltoactionsection/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "instanceResourceType": "howlite/components/pagesection", 3 | "isLayout": true, 4 | "group": "Filled Sections", 5 | "sling:resourceType": "ws:Component", 6 | "title": "Call To Action" 7 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/contentimagefullwidth/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "instanceResourceType": "howlite/components/pagesection", 3 | "isLayout": true, 4 | "group": "Filled Sections", 5 | "sling:resourceType": "ws:Component", 6 | "title": "Full Width Image" 7 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/quote/editConfig/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "inlineEditing": { 3 | "config": { 4 | "property": "quoteText", 5 | "editor": "rich-text", 6 | "domSelectors": [".hl-quote__content .hl-rich-text"] 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/quote/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "nt:unstructured", 3 | "classes": "", 4 | "lgColSize": "12", 5 | "lgOffset": "", 6 | "mdColSize": "12", 7 | "mdOffset": "", 8 | "smColSize": "12", 9 | "smOffset": "" 10 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/richtext/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "nt:unstructured", 3 | "classes": "", 4 | "lgColSize": "12", 5 | "lgOffset": "", 6 | "mdColSize": "12", 7 | "mdOffset": "", 8 | "smColSize": "12", 9 | "smOffset": "" 10 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/container/fixedContainer/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "isContainer": false, 3 | "group": ".hidden", 4 | "sling:resourceType": "ws:Component", 5 | "description": "Non-editable container used in initial content to create layouts", 6 | "title": "Container" 7 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/rootcontainer/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "isContainer": true, 3 | "group": ".hidden", 4 | "allowedComponents": "Howlite", 5 | "sling:resourceType": "ws:Component", 6 | "description": "Use for most outer, editable (homepage) root", 7 | "title": "Body" 8 | } -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/assets/landscape.jpg/_jcr_content/renditions/thumbnail-32x32.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/websight-io/howlite/HEAD/tests/content/src/main/content/jcr_root/content/howlite-test/assets/landscape.jpg/_jcr_content/renditions/thumbnail-32x32.webp -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/assets/portrait.jpg/_jcr_content/renditions/thumbnail-32x32.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/websight-io/howlite/HEAD/tests/content/src/main/content/jcr_root/content/howlite-test/assets/portrait.jpg/_jcr_content/renditions/thumbnail-32x32.webp -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/assets/landscape.jpg/_jcr_content/renditions/thumbnail-200x200.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/websight-io/howlite/HEAD/tests/content/src/main/content/jcr_root/content/howlite-test/assets/landscape.jpg/_jcr_content/renditions/thumbnail-200x200.webp -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/assets/portrait.jpg/_jcr_content/renditions/thumbnail-200x200.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/websight-io/howlite/HEAD/tests/content/src/main/content/jcr_root/content/howlite-test/assets/portrait.jpg/_jcr_content/renditions/thumbnail-200x200.webp -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/onecol/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "instanceResourceType": "howlite/components/pagesection", 3 | "isLayout": true, 4 | "group": "Empty Sections", 5 | "sling:resourceType": "ws:Component", 6 | "description": "Empty Page Section", 7 | "title": "1 Column" 8 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/page/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "sling:resourceSuperType": "wcm/core/components/page", 3 | "group": ".hidden", 4 | "sling:resourceType": "ws:Component", 5 | "description": "Page component that can be used to render Howlite pages.", 6 | "title": "Howlite Page" 7 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/pagesection/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "isContainer": true, 3 | "group": ".hidden", 4 | "allowedComponents": "Howlite", 5 | "sling:resourceType": "ws:Component", 6 | "description": "Use for 12 cols page sections, inside main content", 7 | "title": "Page Section" 8 | } -------------------------------------------------------------------------------- /COPYRIGHT: -------------------------------------------------------------------------------- 1 | Copyright (C) 2023 Dynamic Solutions sp. z o.o. sp. k. All rights reserved. 2 | 3 | This file is licensed to you under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. You may obtain a copy 5 | of the License at http://www.apache.org/licenses/LICENSE-2.0 6 | -------------------------------------------------------------------------------- /RELEASING.md: -------------------------------------------------------------------------------- 1 | # Releasing 2 | Howlite release is done using GitHub Actions `Release Howlite` workflow. 3 | 4 | The 'Prepare release' step requires configuring: 5 | - a public key as [deploy keys](https://docs.github.com/v3/guides/managing-deploy-keys/#deploy-keys) 6 | - a private key as a GitHub Action secret (`SSH_SECRET_KEY`). 7 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/herosection/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "instanceResourceType": "howlite/components/pagesection", 3 | "isLayout": true, 4 | "group": "Filled Sections", 5 | "sling:resourceType": "ws:Component", 6 | "description": "First section of any content page", 7 | "title": "Hero" 8 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/maincontainer/fixedmaincontainer/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "isContainer": false, 3 | "group": ".hidden", 4 | "sling:resourceType": "ws:Component", 5 | "description": "Non-editable container, use for main content, inside body tag, between header and footer", 6 | "title": "Main Content" 7 | } -------------------------------------------------------------------------------- /tests/end-to-end/src/main/features/howlite_tests_content.json: -------------------------------------------------------------------------------- 1 | { 2 | "bundles": [ 3 | { 4 | "id": "pl.ds.howlite:howlite-core:${howlite.version}", 5 | "start-order": "25" 6 | } 7 | ], 8 | "content-packages:ARTIFACTS|true": [ 9 | "pl.ds.howlite:howlite-tests-content:zip:${howlite.version}" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/accordion/accordionitem/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "nt:unstructured", 3 | "sling:resourceType": "howlite/components/accordion/accordionitem", 4 | "lgColSize": "12", 5 | "lgOffset": "", 6 | "mdColSize": "12", 7 | "mdOffset": "", 8 | "smColSize": "12", 9 | "smOffset": "" 10 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/title/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "nt:unstructured", 3 | "headingLevel": "h2", 4 | "headingSize": "hl-title__heading--size-4", 5 | "classes": "", 6 | "lgColSize": "12", 7 | "lgOffset": "", 8 | "mdColSize": "12", 9 | "mdOffset": "", 10 | "smColSize": "12", 11 | "smOffset": "" 12 | } -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/accordion/dialog/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "sling:resourceType": "wcm/dialogs/dialog", 3 | "tabs": { 4 | "sling:resourceType": "wcm/dialogs/components/tabs", 5 | "gridTab": { 6 | "sling:resourceType": "wcm/dialogs/components/include", 7 | "path": "/libs/howlite/components/common/gridTab" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/ctaslist/dialog/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "sling:resourceType": "wcm/dialogs/dialog", 3 | "tabs": { 4 | "sling:resourceType": "wcm/dialogs/components/tabs", 5 | "gridTab": { 6 | "sling:resourceType": "wcm/dialogs/components/include", 7 | "path": "/libs/howlite/components/common/gridTab" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/logoscloud/dialog/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "sling:resourceType": "wcm/dialogs/dialog", 3 | "tabs": { 4 | "sling:resourceType": "wcm/dialogs/components/tabs", 5 | "gridTab": { 6 | "sling:resourceType": "wcm/dialogs/components/include", 7 | "path": "/libs/howlite/components/common/gridTab" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /ui.frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "es6", 5 | "baseUrl": "../ui.frontend", 6 | "removeComments": true, 7 | "allowJs": true, 8 | "preserveConstEnums": true, 9 | "allowSyntheticDefaultImports": true, 10 | "sourceMap": true 11 | }, 12 | "include": [ "./src/**/*.ts" ] 13 | } 14 | -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/assets/landscape.jpg/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/assets/portrait.jpg/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /core/src/test/resources/cta.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": { 3 | "jcr:primaryType": "nt:unstructured", 4 | "sling:resourceType": "howlite/components/cta", 5 | "label": "Sample CTA" 6 | }, 7 | "complex": { 8 | "jcr:primaryType": "nt:unstructured", 9 | "sling:resourceType": "howlite/components/cta", 10 | "label": "Sample CTA", 11 | "link": "https://www.example.com", 12 | "displayIcon": "true", 13 | "openInNewTab": "true" 14 | } 15 | } -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/assets/landscape.jpg/_jcr_content/renditions/original.jpg.dir/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/assets/portrait.jpg/_jcr_content/renditions/original.jpg.dir/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/maincontainer/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "isContainer": true, 3 | "group": ".hidden", 4 | "allowedComponents": [ 5 | "/libs/howlite/components/pagesection", 6 | "/libs/howlite/components/container", 7 | "Empty Sections", 8 | "Filled Sections" 9 | ], 10 | "sling:resourceType": "ws:Component", 11 | "description": "Use for main content, inside body tag, between header and footer", 12 | "title": "Main Content" 13 | } -------------------------------------------------------------------------------- /tests/end-to-end/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2021": true 5 | }, 6 | "extends": [ 7 | "eslint:recommended", 8 | "plugin:@typescript-eslint/recommended", 9 | "plugin:cypress/recommended", 10 | "plugin:chai-friendly/recommended" 11 | ], 12 | "parser": "@typescript-eslint/parser", 13 | "parserOptions": { 14 | "ecmaVersion": "latest", 15 | "sourceType": "module" 16 | }, 17 | "plugins": ["@typescript-eslint"], 18 | "rules": {} 19 | } 20 | -------------------------------------------------------------------------------- /core/src/test/resources/title.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": { 3 | "jcr:primaryType": "nt:unstructured", 4 | "sling:resourceType": "howlite/components/title" 5 | }, 6 | "complex": { 7 | "jcr:primaryType": "nt:unstructured", 8 | "title": "Title", 9 | "subtitle": "Subtitle", 10 | "headingLevel": "h1", 11 | "classes": "title-class other-title-class", 12 | "smColSize": 12, 13 | "mdColSize": 6, 14 | "lgColSize": 3, 15 | "sling:resourceType": "howlite/components/title" 16 | } 17 | } -------------------------------------------------------------------------------- /core/src/test/resources/quote.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": { 3 | "jcr:primaryType": "nt:unstructured", 4 | "sling:resourceType": "howlite/components/quote" 5 | }, 6 | "complex": { 7 | "jcr:primaryType": "nt:unstructured", 8 | "sling:resourceType": "howlite/components/quote", 9 | "quoteText": "Sample Quote", 10 | "authorName": "Author Name", 11 | "authorDescription": "Author Description", 12 | "authorImage": "http://content/author/image", 13 | "imageAlt": "Author profile image" 14 | } 15 | } -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/pages/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | <Page-Section/> 10 | <Quote/> 11 | <Rich-text/> 12 | <Accordion/> 13 | <Cards/> 14 | <Logo-cloud/> 15 | <Container/> 16 | </jcr:root> 17 | -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/assets/landscape.jpg/_jcr_content/renditions/thumbnail-32x32.webp.dir/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:oak="http://jackrabbit.apache.org/oak/ns/1.0" 3 | jcr:primaryType="nt:file"> 4 | <jcr:content 5 | jcr:lastModifiedBy="websight-assets-renditions-image-provider" 6 | jcr:mimeType="image/webp" 7 | jcr:primaryType="oak:Resource"/> 8 | </jcr:root> 9 | -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/assets/portrait.jpg/_jcr_content/renditions/thumbnail-200x200.webp.dir/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:oak="http://jackrabbit.apache.org/oak/ns/1.0" 3 | jcr:primaryType="nt:file"> 4 | <jcr:content 5 | jcr:lastModifiedBy="websight-assets-renditions-image-provider" 6 | jcr:mimeType="image/webp" 7 | jcr:primaryType="oak:Resource"/> 8 | </jcr:root> 9 | -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/assets/portrait.jpg/_jcr_content/renditions/thumbnail-32x32.webp.dir/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:oak="http://jackrabbit.apache.org/oak/ns/1.0" 3 | jcr:primaryType="nt:file"> 4 | <jcr:content 5 | jcr:lastModifiedBy="websight-assets-renditions-image-provider" 6 | jcr:mimeType="image/webp" 7 | jcr:primaryType="oak:Resource"/> 8 | </jcr:root> 9 | -------------------------------------------------------------------------------- /ui.frontend/README.md: -------------------------------------------------------------------------------- 1 | ## Description 2 | 3 | Module contains Front-End for Howlite. During build it copy build results to web root folder i core. 4 | 5 | ## Usage: 6 | 7 | Build 8 | 9 | ```bash 10 | ../mvnw clean install 11 | ``` 12 | 13 | Local development 14 | 15 | Run `npm run sync` to watch your changes. Those will be deployed to local environment on the fly 16 | 17 | Local deployment 18 | 19 | Front-End files are deployed as a part of `core` bundle. 20 | 21 | 1. Build this module 22 | 2. Build with local deployment `core` module 23 | -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/assets/landscape.jpg/_jcr_content/renditions/thumbnail-200x200.webp.dir/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:oak="http://jackrabbit.apache.org/oak/ns/1.0" 3 | jcr:primaryType="nt:file"> 4 | <jcr:content 5 | jcr:lastModifiedBy="websight-assets-renditions-image-provider" 6 | jcr:mimeType="image/webp" 7 | jcr:primaryType="oak:Resource"/> 8 | </jcr:root> 9 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/ctaslist/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "nt:unstructured", 3 | "cta1": { 4 | "jcr:primaryType": "nt:unstructured", 5 | "sling:resourceType": "howlite/components/cta", 6 | "classes": "hl-cta--secondary", 7 | "displayIcon": false, 8 | "openInNewTab": false 9 | }, 10 | "cta2": { 11 | "jcr:primaryType": "nt:unstructured", 12 | "sling:resourceType": "howlite/components/cta", 13 | "classes": "hl-cta--secondary", 14 | "displayIcon": false, 15 | "openInNewTab": false 16 | } 17 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/cardslist/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "nt:unstructured", 3 | "card1": { 4 | "jcr:primaryType": "nt:unstructured", 5 | "ctaLabel": "Link", 6 | "sling:resourceType": "howlite/components/cardslist/card" 7 | }, 8 | "card2": { 9 | "jcr:primaryType": "nt:unstructured", 10 | "ctaLabel": "Link", 11 | "sling:resourceType": "howlite/components/cardslist/card" 12 | }, 13 | "card3": { 14 | "jcr:primaryType": "nt:unstructured", 15 | "ctaLabel": "Link", 16 | "sling:resourceType": "howlite/components/cardslist/card" 17 | } 18 | } -------------------------------------------------------------------------------- /.mvn/extensions.xml: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (c) 2023 Dynamic Solutions sp. z o.o. sp. k. 3 | 4 | Use of this software is governed by the Business Source License included 5 | in the LICENSE file. 6 | */--> 7 | <extensions xmlns="http://maven.apache.org/EXTENSIONS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 8 | xsi:schemaLocation="http://maven.apache.org/EXTENSIONS/1.0.0 http://maven.apache.org/xsd/core-extensions-1.0.0.xsd"> 9 | <extension> 10 | <groupId>com.google.cloud.artifactregistry</groupId> 11 | <artifactId>artifactregistry-maven-wagon</artifactId> 12 | <version>2.2.1</version> 13 | </extension> 14 | </extensions> -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/templates/homepage/initial/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "ws:Page", 3 | "jcr:content": { 4 | "jcr:primaryType": "ws:PageContent", 5 | "sling:resourceType": "howlite/components/page", 6 | "rootcontainer": { 7 | "sling:resourceType": "howlite/components/rootcontainer/fixedrootcontainer", 8 | "header": {"sling:resourceType": "howlite/components/header"}, 9 | "maincontainer": { 10 | "sling:resourceType": "howlite/components/maincontainer", 11 | "pagesection": {"sling:resourceType": "howlite/components/pagesection"} 12 | }, 13 | "footer": {"sling:resourceType": "howlite/components/footer"} 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/twocols/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "classes": "", 3 | "jcr:primaryType": "nt:unstructured", 4 | "container1": { 5 | "jcr:primaryType": "nt:unstructured", 6 | "sling:resourceType": "howlite/components/container", 7 | "smColSize": 12, 8 | "mdColSize": 6, 9 | "lgColSize": 6, 10 | "lgOffset": "", 11 | "mdOffset": "", 12 | "smOffset": "" 13 | }, 14 | "container2": { 15 | "jcr:primaryType": "nt:unstructured", 16 | "sling:resourceType": "howlite/components/container", 17 | "smColSize": 12, 18 | "mdColSize": 6, 19 | "lgColSize": 6, 20 | "lgOffset": "", 21 | "mdOffset": "", 22 | "smOffset": "" 23 | } 24 | } -------------------------------------------------------------------------------- /ui.frontend/src/components/CTA/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'cta'; 18 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/templates/contentpage/initial/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "ws:Page", 3 | "jcr:content": { 4 | "jcr:primaryType": "ws:PageContent", 5 | "sling:resourceType": "howlite/components/page", 6 | "rootcontainer": { 7 | "sling:resourceType": "howlite/components/rootcontainer/fixedrootcontainer", 8 | "header": {"sling:resourceType": "howlite/components/headerreference"}, 9 | "maincontainer": { 10 | "sling:resourceType": "howlite/components/maincontainer", 11 | "pagesection": {"sling:resourceType": "howlite/components/pagesection"} 12 | }, 13 | "footer": {"sling:resourceType": "howlite/components/footerreference"} 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /ui.frontend/src/components/Footer/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'footer'; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/components/Header/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'header'; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/components/Image/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'image'; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/components/Quote/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'quote'; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/components/Title/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'title'; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/components/Accordion/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'accordion'; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/components/CTAsList/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'ctasList'; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/components/CardsList/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'cards-list'; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/components/Container/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'container'; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/components/RichText/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'rich-text'; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/theme.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | import "./sass/theme/demo-content-theme.scss"; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/components/LogosCloud/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'logos-cloud'; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/components/SocialLinks/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'social-links'; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/components/MainContainer/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'main-container'; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/components/Navigation/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'navigation.scss'; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/sass/abstracts/_variables.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | $page-padding-horizontal: 1.5rem; 18 | -------------------------------------------------------------------------------- /ui.frontend/src/sass/base/_utils.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | .v-min-height { 18 | min-height: 100vh; 19 | } 20 | -------------------------------------------------------------------------------- /ui.frontend/src/sass/base/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'typography'; 18 | @forward 'icons'; 19 | @forward 'grid'; 20 | -------------------------------------------------------------------------------- /ui.frontend/src/author.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | // Stylesheets that will be loaded in Edit mode only 18 | import "./author.scss"; 19 | -------------------------------------------------------------------------------- /ui.frontend/src/components/PageSection/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'page-section'; 18 | @forward './variants/index'; 19 | -------------------------------------------------------------------------------- /ui.frontend/src/js/constants/breakpoints.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | export const breakpoints = { 18 | sm: 0, 19 | md: 768, 20 | lg: 970 21 | }; 22 | -------------------------------------------------------------------------------- /core/src/test/resources/image.json: -------------------------------------------------------------------------------- 1 | { 2 | "lgImage": { 3 | "jcr:primaryType": "nt:unstructured", 4 | "sling:resourceType": "howlite/components/image", 5 | "lgImageSrc": "/content/space/assets/imageLg.jpg" 6 | }, 7 | "lgAndMdImage": { 8 | "jcr:primaryType": "nt:unstructured", 9 | "sling:resourceType": "howlite/components/image", 10 | "lgImageSrc": "/content/space/assets/imageLg.jpg", 11 | "mdImageSrc": "/content/space/assets/imageMd.jpg" 12 | }, 13 | "lgAndMdAndSmImage": { 14 | "jcr:primaryType": "nt:unstructured", 15 | "sling:resourceType": "howlite/components/image", 16 | "lgImageSrc": "/content/space/assets/imageLg.jpg", 17 | "mdImageSrc": "/content/space/assets/imageMd.jpg", 18 | "smImageSrc": "/content/space/assets/imageSm.jpg" 19 | } 20 | } -------------------------------------------------------------------------------- /ui.frontend/src/main.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | 18 | // Stylesheets 19 | import "./main.scss"; 20 | 21 | // Javascript or Typescript 22 | import "./**/*.+(js|ts)"; 23 | -------------------------------------------------------------------------------- /ui.frontend/src/sass/abstracts/_zindex.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | $z-index: ( 18 | 'second-floor': 2, 19 | 'first-floor': 1, 20 | 'basement': -1, 21 | ); 22 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/page/head-libs.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <link href="/libs/howlite/web_root/theme.css" rel="stylesheet" type="text/css"> -------------------------------------------------------------------------------- /core/src/test/resources/navigation.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": { 3 | "jcr:primaryType": "nt:unstructured", 4 | "sling:resourceType": "howlite/components/navigation" 5 | }, 6 | "complex": { 7 | "jcr:primaryType": "nt:unstructured", 8 | "sling:resourceType": "howlite/components/navigation", 9 | "menuItems": { 10 | "jcr:primaryType": "nt:unstructured", 11 | "1": { 12 | "jcr:primaryType": "nt:unstructured", 13 | "label": "Navigation item 1", 14 | "link": "http://www.navigate-to-link-1.com", 15 | "openInNewTab": "true" 16 | }, 17 | "2": { 18 | "jcr:primaryType": "nt:unstructured", 19 | "label": "Navigation item 2", 20 | "link": "http://www.navigate-to-link-2.com", 21 | "openInNewTab": "false" 22 | } 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /tests/end-to-end/support/types.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | export enum SelectionMode { 18 | FULL_MATCH = '', 19 | STARTS_WITH = '^', 20 | ENDS_WITH = '$', 21 | CONTAINS = '*' 22 | } -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/Styled.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components; 18 | 19 | public interface Styled { 20 | 21 | String[] getClasses(); 22 | 23 | } -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @Version("1.0.0") 18 | package pl.ds.howlite.components; 19 | 20 | import org.osgi.annotation.versioning.Version; -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/utils/GridDisplayType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components.utils; 18 | 19 | public enum GridDisplayType { 20 | 21 | GRID 22 | } 23 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/container/fixedContainer/fixedContainer.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-include="${'container.html' @ prependPath='../../container'}"></sly> -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/models/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @Version("1.0.0") 18 | package pl.ds.howlite.components.models; 19 | 20 | import org.osgi.annotation.versioning.Version; -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/utils/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @Version("1.0.0") 18 | package pl.ds.howlite.components.utils; 19 | 20 | import org.osgi.annotation.versioning.Version; -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/maincontainer/fixedmaincontainer/fixedmaincontainer.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-include="${'maincontainer.html' @ prependPath='../../maincontainer'}"></sly> -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/rootcontainer/fixedrootcontainer/fixedrootcontainer.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-include="${'rootcontainer.html' @ prependPath='../../rootcontainer'}"></sly> -------------------------------------------------------------------------------- /ui.frontend/src/main.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @use '../node_modules/@glidejs/glide/src/assets/sass/glide.core.scss'; 18 | 19 | @import './sass/global'; 20 | @import './sass/base/index'; 21 | @import './components/index'; 22 | -------------------------------------------------------------------------------- /tests/content/src/main/content/META-INF/vault/filter.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!-- 3 | Copyright (C) 2022 Dynamic Solutions 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); 6 | you may not use this file except in compliance with the License. 7 | You may obtain a copy of the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, 13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | See the License for the specific language governing permissions and 15 | limitations under the License. 16 | --> 17 | 18 | <workspaceFilter version="1.0"> 19 | <filter root="/content/howlite-test"/> 20 | </workspaceFilter> 21 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/page/body-content.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-resource="${'rootcontainer' @ resourceType=properties.resourceType}"></sly> 17 | <script src="/libs/howlite/web_root/main.js"></script> -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/rootcontainer/rootcontainer.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-repeat.paragraph="${resource.children}" data-sly-resource="${paragraph.path @ resourceType=paragraph.resourceType}"></sly> 17 | -------------------------------------------------------------------------------- /core/src/test/resources/sociallinks.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": { 3 | "jcr:primaryType": "nt:unstructured", 4 | "sling:resourceType": "howlite/components/sociallinks" 5 | }, 6 | 7 | "complex": { 8 | "jcr:primaryType": "nt:unstructured", 9 | "socialLinkItems": { 10 | "1": { 11 | "title": "Title linkedin", 12 | "url": "http://www.linkedin.com", 13 | "icon": "linkedin" 14 | }, 15 | "2": { 16 | "title": "Title facebook", 17 | "url": "http://www.facebook.com", 18 | "icon": "facebook" 19 | }, 20 | "3": { 21 | "title": "Title twitter", 22 | "url": "http://www.twitter.com", 23 | "icon": "twitter" 24 | }, 25 | "4": { 26 | "title": "Title instagram", 27 | "url": "http://www.instagram.com", 28 | "icon": "instagram" 29 | } 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/richtext/template.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <template data-sly-template.richtext="${ @ text, classes}"> 17 | <div class="hl-rich-text ${classes @ join=' '}">${text @ context='html'}</div> 18 | </template> -------------------------------------------------------------------------------- /tests/README.md: -------------------------------------------------------------------------------- 1 | # Howlite tests 2 | This module is responsible for the automatic validation of the Howlite components. 3 | 4 | It contains: 5 | - [content](./content) - providing the minimal set of components and pages used during testing 6 | - [end-to-end](./end-to-end) - end-to-end tests validating both Howlite components on authoring and publication 7 | 8 | ## How to run tests without Percy 9 | 10 | ```bash 11 | ../mvnw clean install -P e2e 12 | ``` 13 | 14 | ## How to run tests with Percy 15 | You need to set HOWLITE_PERCY_TOKEN variable to upload snapshot to Percy. 16 | ```bash 17 | ../mvnw clean install -P e2e-visual 18 | ``` 19 | 20 | Remember that e2e and e2e-visual are overlaying in some part and should not be run together! 21 | 22 | Packs the content package, then builds a Docker image that contains the package. Finally, it runs the container with the created Docker image 23 | and runs functional tests. -------------------------------------------------------------------------------- /ui.frontend/src/sass/abstracts/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'colors'; 18 | @forward 'custom-bootstrap'; 19 | @forward 'fonts'; 20 | @forward 'icons'; 21 | @forward 'negative-margins'; 22 | @forward 'spacing'; 23 | @forward 'variables'; 24 | @forward 'zindex'; 25 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/header/header.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.HeaderComponent" 17 | data-sly-use.template="./template.html" 18 | data-sly-call="${template.header @ model=model}"> 19 | </sly> -------------------------------------------------------------------------------- /ui.frontend/src/resources/images/check.svg: -------------------------------------------------------------------------------- 1 | <!-- 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | --> 16 | <svg width="14" height="11" viewBox="0 0 14 11" fill="none" xmlns="http://www.w3.org/2000/svg"> 17 | <path d="M12.3346 2L5.0013 9.33333L1.66797 6" stroke="#151515" stroke-width="2" stroke-linecap="square"/> 18 | </svg> 19 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/footer/footer.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.FooterComponent" 17 | data-sly-use.template="./template.html" 18 | data-sly-call="${template.footer @ model=model}"> 19 | </sly> 20 | -------------------------------------------------------------------------------- /tests/end-to-end/jest.config.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | module.exports = { 18 | preset: 'ts-jest', 19 | testEnvironment: 'node', 20 | transform: { 21 | '^.+\\.ts?$': 'ts-jest' 22 | }, 23 | transformIgnorePatterns: ['<rootDir>/node_modules/'], 24 | roots: ['./support/'] 25 | }; 26 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/author/author.css: -------------------------------------------------------------------------------- 1 | .hl-main-container{padding-bottom:40px;padding-top:40px}.hl-placeholder--image{align-items:center;background-color:#f4f5f7;display:flex;height:50px;justify-content:center;min-width:60px}.hl-placeholder--image.hl-image--featured{min-height:605px}.hl-image--broken{align-items:center;background-color:#f4f5f7;display:flex;height:50px;justify-content:center}.hl-image--broken:after{background-image:url(../web_root/images/broken-image.svg);background-position:50%;background-repeat:no-repeat;background-size:contain;content:"";height:28px;width:28px}.hl-cards-list .hl-placeholder--image.card__image{margin-bottom:40px;min-height:90pt;padding-bottom:0}.hl-page-section--featured-banner>.hl-placeholder--image{min-height:300px}.hl-logos-cloud .hl-image--broken,.hl-logos-cloud .hl-placeholder--image{width:90pt}.hl-page-section--featured-banner .hl-placeholder.hl-social-links{margin-top:3pc!important;min-width:150px} -------------------------------------------------------------------------------- /ui.frontend/src/sass/abstracts/_functions.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @use 'sass:math'; 18 | 19 | @function strip-unit($number) { 20 | @if type-of($number) == 'number' and not unitless($number) { 21 | @return math.div($number, $number * 0 + 1); 22 | } 23 | 24 | @return $number; 25 | } 26 | -------------------------------------------------------------------------------- /tests/end-to-end/.percy.yml: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2022 Dynamic Solutions 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | version: 2 16 | snapshot: 17 | widths: 18 | - 1280 19 | minHeight: 1024 20 | discovery: 21 | allowedHostnames: [] 22 | disallowedHostnames: [] 23 | networkIdleTimeout: 100 24 | upload: 25 | files: '**/*.{png,jpg,jpeg}' 26 | ignore: '' 27 | stripExtensions: false 28 | -------------------------------------------------------------------------------- /tests/end-to-end/support/consts.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | export const selectors = { 18 | overlayName: 'span.name', 19 | autosuggestionsBox: '.autosuggestion-options' 20 | }; 21 | 22 | export const testIds = { 23 | editIcon: 'ToolbarItem_Properties', 24 | dialogSubmitButton: 'Action_Submit' 25 | }; 26 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/richtext/richtext.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.RichTextComponent" 17 | data-sly-use.template="./template.html" 18 | data-sly-call="${template.richtext @ text=model.text, classes=model.classes}"> 19 | </sly> -------------------------------------------------------------------------------- /ui.frontend/src/components/PageSection/variants/_index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @forward 'hl-page-section--call-to-action'; 18 | @forward 'hl-page-section--featured-banner'; 19 | @forward 'hl-page-section--featured-content'; 20 | @forward 'hl-page-section--contact-form'; 21 | @forward 'hl-page-section--bleeding-image'; 22 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Description** 11 | Provide a clear and concise description of what the bug is. 12 | 13 | **Steps to reproduce** 14 | 1. Go to '...' 15 | 2. Click on '....' 16 | 3. Scroll down to '....' 17 | 18 | **Current result** 19 | Describe the result caused by the bug. 20 | 21 | **Expected behavior** 22 | A clear and concise description of what you expected to happen. 23 | 24 | **Screenshots** 25 | If applicable, add screenshots to help explain your problem. 26 | 27 | **WebSight CMS version** 28 | A version of CMS you are using (you will find it on the login page). 29 | 30 | **Desktop (please complete the following information):** 31 | - OS: [e.g. iOS] 32 | - Browser [e.g. chrome, safari] 33 | - Version [e.g. 22] 34 | 35 | **Additional context** 36 | Add any other context about the problem here. 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # These are some examples of commonly ignored file patterns. 2 | # You should customize this list as applicable to your project. 3 | # Learn more about .gitignore: 4 | # https://www.atlassian.com/git/tutorials/saving-changes/gitignore 5 | 6 | # Node artifact files 7 | node_modules/ 8 | node/ 9 | 10 | # Compiled Java class files 11 | *.class 12 | 13 | # Compiled Python bytecode 14 | *.py[cod] 15 | 16 | # Log files 17 | *.log 18 | 19 | # Package files 20 | *.jar 21 | 22 | # Maven 23 | target/ 24 | dist/ 25 | 26 | # JetBrains and VSC IDE 27 | .idea/ 28 | .history/ 29 | 30 | # Unit test reports 31 | TEST*.xml 32 | 33 | # Generated by MacOS 34 | .DS_Store 35 | 36 | # Generated by Windows 37 | Thumbs.db 38 | 39 | # Applications 40 | *.app 41 | *.exe 42 | *.war 43 | 44 | # Large media files 45 | *.mp4 46 | *.tiff 47 | *.avi 48 | *.flv 49 | *.mov 50 | *.wmv 51 | 52 | # IntelliJ files 53 | *.iml 54 | 55 | /core/src/main/resources/libs/howlite/web_root/* 56 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/navigation/navigation.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.NavigationComponent" 17 | data-sly-use.template="./template.html" 18 | data-sly-call="${template.navigation @ menuItems=model.menuItems, classes=model.classes}"> 19 | </sly> -------------------------------------------------------------------------------- /google_checks_suppressions.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!-- 3 | Copyright (C) 2022 Dynamic Solutions 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); 6 | you may not use this file except in compliance with the License. 7 | You may obtain a copy of the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, 13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | See the License for the specific language governing permissions and 15 | limitations under the License. 16 | --> 17 | 18 | <!DOCTYPE suppressions PUBLIC 19 | "-//Puppy Crawl//DTD Suppressions 1.2//EN" 20 | "http://checkstyle.sourceforge.net/dtds/suppressions_1_2.dtd"> 21 | <suppressions> 22 | <suppress message="Missing a Javadoc comment"/> 23 | </suppressions> -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/sociallinks/sociallinks.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.SocialLinksComponent" 17 | data-sly-use.template="./template.html" 18 | data-sly-call="${template.sociallinks @ socialLinkItems=model.socialLinkItems, classes=model.classes}"> 19 | </sly> -------------------------------------------------------------------------------- /core/src/test/resources/accordionItem.json: -------------------------------------------------------------------------------- 1 | { 2 | "accordion-default": { 3 | "jcr:primaryType": "nt:unstructured", 4 | "sling:resourceType": "howlite/components/accordion", 5 | "accordionitem-default": { 6 | "jcr:primaryType": "nt:unstructured", 7 | "sling:resourceType": "howlite/components/accordion/accordionitem" 8 | }, 9 | "accordionitem-simple": { 10 | "jcr:primaryType": "nt:unstructured", 11 | "sling:resourceType": "howlite/components/accordion/accordionitem", 12 | "headingLevel": "h6", 13 | "title": "Simple title", 14 | "content": "Simple content" 15 | } 16 | }, 17 | "accordion-with-hlevel": { 18 | "jcr:primaryType": "nt:unstructured", 19 | "sling:resourceType": "howlite/components/accordion", 20 | "headingLevel": "h1", 21 | "accordionitem-without-hlevel": { 22 | "jcr:primaryType": "nt:unstructured", 23 | "sling:resourceType": "howlite/components/accordion/accordionitem" 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /ui.frontend/src/components/SocialLinks/social-links.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @use 'sass:map'; 18 | @use '../../sass/abstracts'; 19 | 20 | 21 | $social-media-icon-padding: 10px; 22 | 23 | .hl-social-links { 24 | display: flex; 25 | gap: map.get(abstracts.$spacing, 'medium'); 26 | 27 | &__link { 28 | @include abstracts.social-icon; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /ui.frontend/src/js/helpers/platform.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | export const isRunningIos = () => { 18 | return ( 19 | ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(navigator.platform) || 20 | // iPad on iOS 13 detection 21 | (navigator.userAgent.includes('Mac') && 'ontouchend' in document) 22 | ); 23 | }; 24 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/threecols/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "classes": "", 3 | "jcr:primaryType": "nt:unstructured", 4 | "container1": { 5 | "jcr:primaryType": "nt:unstructured", 6 | "sling:resourceType": "howlite/components/container", 7 | "smColSize": 12, 8 | "mdColSize": 4, 9 | "lgColSize": 4, 10 | "lgOffset": "", 11 | "mdOffset": "", 12 | "smOffset": "" 13 | }, 14 | "container2": { 15 | "jcr:primaryType": "nt:unstructured", 16 | "sling:resourceType": "howlite/components/container", 17 | "smColSize": 12, 18 | "mdColSize": 4, 19 | "lgColSize": 4, 20 | "lgOffset": "", 21 | "mdOffset": "", 22 | "smOffset": "" 23 | }, 24 | "container3": { 25 | "jcr:primaryType": "nt:unstructured", 26 | "sling:resourceType": "howlite/components/container", 27 | "smColSize": 12, 28 | "mdColSize": 4, 29 | "lgColSize": 4, 30 | "lgOffset": "", 31 | "mdOffset": "", 32 | "smOffset": "" 33 | } 34 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/page/body.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <body class="${properties.defaultTemplateCSS} ${properties.bodyClasses} ${wcmmode.isEdit ? '' : 'v-min-height'}"> 17 | <sly data-sly-include="body-start.html"></sly> 18 | <sly data-sly-include="body-content.html"></sly> 19 | <sly data-sly-include="body-end.html"></sly> 20 | </body> 21 | -------------------------------------------------------------------------------- /ui.frontend/src/components/Image/image.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @use 'sass:map'; 18 | 19 | @use '../../sass/abstracts'; 20 | 21 | .hl-image { 22 | &__link { 23 | width: fit-content; 24 | } 25 | 26 | &__img { 27 | max-width: 100%; 28 | } 29 | } 30 | 31 | .hl-image.hl-image--featured { 32 | margin-top: map.get(abstracts.$spacing, 'large'); 33 | } 34 | -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/Grid.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components; 18 | 19 | public interface Grid { 20 | 21 | Integer getSmColSize(); 22 | 23 | Integer getMdColSize(); 24 | 25 | Integer getLgColSize(); 26 | 27 | Integer getSmOffset(); 28 | 29 | Integer getMdOffset(); 30 | 31 | Integer getLgOffset(); 32 | 33 | } 34 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/cta/cta.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.CtaComponent" 17 | data-sly-use.template="./template.html" 18 | data-sly-call="${template.cta @ label=model.label, link=model.link, openInNewTab=model.openInNewTab, displayIcon=model.displayIcon, classes=model.classes}"> 19 | </sly> -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2022 Dynamic Solutions 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | version: 2 16 | updates: 17 | - package-ecosystem: "maven" 18 | directory: "/" 19 | schedule: 20 | interval: "weekly" 21 | - package-ecosystem: "npm" 22 | directory: "/ui.frontend" 23 | schedule: 24 | interval: "weekly" 25 | - package-ecosystem: "npm" 26 | directory: "/tests/end-to-end" 27 | schedule: 28 | interval: "weekly" 29 | -------------------------------------------------------------------------------- /ui.frontend/src/sass/abstracts/_colors.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | $neutral-50: #151515; 18 | $neutral-200: #313131; 19 | $neutral-500: #818181; 20 | $neutral-800: #cfcfcf; 21 | 22 | $primary-colors: ( 23 | 'blue': #39d1fe, 24 | 'purple': #9875e3, 25 | 'green': #1ce3a4, 26 | 'red': #fb6991, 27 | 'yellow': #e3d339, 28 | ); 29 | 30 | $shades-0: #000000; 31 | $shades-100: #ffffff; 32 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/accordion/accordionitem/dialog/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "sling:resourceType": "wcm/dialogs/dialog", 3 | "tabs": { 4 | "sling:resourceType": "wcm/dialogs/components/tabs", 5 | "generalTab": { 6 | "sling:resourceType": "wcm/dialogs/components/tab", 7 | "label": "General", 8 | "title": { 9 | "sling:resourceType": "wcm/dialogs/components/textfield", 10 | "name": "title", 11 | "label": "Title" 12 | }, 13 | "dialogContent": { 14 | "sling:resourceType": "wcm/dialogs/components/richtext", 15 | "name": "content", 16 | "label": "Content", 17 | "ws:disallowedContext": ["edit:panel"] 18 | }, 19 | "panelContent": { 20 | "sling:resourceType": "wcm/dialogs/components/richtext", 21 | "name": "content", 22 | "label": "Content", 23 | "ws:disallowedContext": ["edit:dialog"], 24 | "configuration": "wcm/dialogs/components/richtext/configurations/compact" 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/accordion/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "nt:unstructured", 3 | "accordionitem1": { 4 | "jcr:primaryType": "nt:unstructured", 5 | "sling:resourceType": "howlite/components/accordion/accordionitem", 6 | "lgColSize": "12", 7 | "lgOffset": "", 8 | "mdColSize": "12", 9 | "mdOffset": "", 10 | "smColSize": "12", 11 | "smOffset": "" 12 | }, 13 | "accordionitem2": { 14 | "jcr:primaryType": "nt:unstructured", 15 | "sling:resourceType": "howlite/components/accordion/accordionitem", 16 | "lgColSize": "12", 17 | "lgOffset": "", 18 | "mdColSize": "12", 19 | "mdOffset": "", 20 | "smColSize": "12", 21 | "smOffset": "" 22 | }, 23 | "accordionitem3": { 24 | "jcr:primaryType": "nt:unstructured", 25 | "sling:resourceType": "howlite/components/accordion/accordionitem", 26 | "lgColSize": "12", 27 | "lgOffset": "", 28 | "mdColSize": "12", 29 | "mdOffset": "", 30 | "smColSize": "12", 31 | "smOffset": "" 32 | } 33 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/footerreference/footerreference.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.FooterReferenceComponent"> 17 | <sly data-sly-test="${model.component}" 18 | data-sly-use.template="/libs/howlite/components/footer/template.html" 19 | data-sly-call="${template.footer @ model=model.component}"> 20 | </sly> 21 | </sly> -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/headerreference/headerreference.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.HeaderReferenceComponent"> 17 | <sly data-sly-test="${model.component}" 18 | data-sly-use.template="/libs/howlite/components/header/template.html" 19 | data-sly-call="${template.header @ model=model.component}"> 20 | </sly> 21 | </sly> -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/title/title.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.TitleComponent" 17 | data-sly-use.template="./template.html" 18 | data-sly-call="${template.title @ title=model.title, anchorId=model.anchorId, showSubtitle=model.showSubtitle, subtitle=model.subtitle, headingLevel=model.headingLevel, headingSize=model.headingSize, classes=model.classes}"> 19 | </sly> -------------------------------------------------------------------------------- /ui.frontend/src/components/Title/title.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2023 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | import { TitleComponent } from './title.class'; 18 | 19 | const initTitleComponents = () => { 20 | document.addEventListener( 'DOMContentLoaded', () => { 21 | Array.from(document.querySelectorAll(TitleComponent.SELECTOR)).forEach(component => { 22 | new TitleComponent(component); 23 | }); 24 | }); 25 | }; 26 | 27 | initTitleComponents(); 28 | -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | # Licensed to the Apache Software Foundation (ASF) under one 2 | # or more contributor license agreements. See the NOTICE file 3 | # distributed with this work for additional information 4 | # regarding copyright ownership. The ASF licenses this file 5 | # to you under the Apache License, Version 2.0 (the 6 | # "License"); you may not use this file except in compliance 7 | # with the License. You may obtain a copy of the License at 8 | # 9 | # https://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, 12 | # software distributed under the License is distributed on an 13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 14 | # KIND, either express or implied. See the License for the 15 | # specific language governing permissions and limitations 16 | # under the License. 17 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip 18 | wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar 19 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/logoscloud/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "nt:unstructured", 3 | "lgColSize": "12", 4 | "lgOffset": "", 5 | "mdColSize": "12", 6 | "mdOffset": "", 7 | "smColSize": "12", 8 | "smOffset": "", 9 | "image1": { 10 | "jcr:primaryType": "nt:unstructured", 11 | "sling:resourceType": "howlite/components/image", 12 | "lgColSize": "12", 13 | "lgOffset": "", 14 | "mdColSize": "12", 15 | "mdOffset": "", 16 | "smColSize": "12", 17 | "smOffset": "" 18 | }, 19 | "image2": { 20 | "jcr:primaryType": "nt:unstructured", 21 | "sling:resourceType": "howlite/components/image", 22 | "lgColSize": "12", 23 | "lgOffset": "", 24 | "mdColSize": "12", 25 | "mdOffset": "", 26 | "smColSize": "12", 27 | "smOffset": "" 28 | }, 29 | "image3": { 30 | "jcr:primaryType": "nt:unstructured", 31 | "sling:resourceType": "howlite/components/image", 32 | "lgColSize": "12", 33 | "lgOffset": "", 34 | "mdColSize": "12", 35 | "mdOffset": "", 36 | "smColSize": "12", 37 | "smOffset": "" 38 | } 39 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/cta/template.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <template data-sly-template.cta="${ @ label, link, openInNewTab, displayIcon, classes}"> 17 | <a data-sly-attribute.href="${link}" 18 | data-sly-attribute.target="${openInNewTab ? '_blank' : ''}" 19 | class="hl-cta ${iconName ? 'hl-cta--with-icon' : ''} ${classes @ join=' '}"> 20 | <span class="hl-cta__text">${label}<sly data-sly-test="${displayIcon}"><i class="hl-icon hl-cta__icon"></i></sly></span> 21 | </a> 22 | </template> -------------------------------------------------------------------------------- /ui.frontend/src/js/scrollbar.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | export const getScrollbarWidth = () => { 18 | return window.innerWidth - document.documentElement.clientWidth; 19 | }; 20 | 21 | 22 | const initScrollbarCssVariable = () => { 23 | document.addEventListener( 24 | 'DOMContentLoaded', 25 | () => { 26 | document.documentElement.style.setProperty( 27 | '--scrollbar-width', 28 | `${getScrollbarWidth()}px`, 29 | ); 30 | }, 31 | { once: true }, 32 | ); 33 | }; 34 | 35 | initScrollbarCssVariable(); 36 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/common/stylevariant/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "sling:resourceType": "wcm/dialogs/components/select", 3 | "name": "bodyClasses", 4 | "label": "Style variant", 5 | "default": { 6 | "sling:resourceType": "wcm/dialogs/components/select/selectitem", 7 | "label": "Default color", 8 | "value": "" 9 | }, 10 | "yellow": { 11 | "sling:resourceType": "wcm/dialogs/components/select/selectitem", 12 | "label": "Yellow", 13 | "value": "primary-color--yellow" 14 | }, 15 | "blue": { 16 | "sling:resourceType": "wcm/dialogs/components/select/selectitem", 17 | "label": "Blue", 18 | "value": "primary-color--blue" 19 | }, 20 | "green": { 21 | "sling:resourceType": "wcm/dialogs/components/select/selectitem", 22 | "label": "Green", 23 | "value": "primary-color--green" 24 | }, 25 | "red": { 26 | "sling:resourceType": "wcm/dialogs/components/select/selectitem", 27 | "label": "Red", 28 | "value": "primary-color--red" 29 | }, 30 | "purple": { 31 | "sling:resourceType": "wcm/dialogs/components/select/selectitem", 32 | "label": "Purple", 33 | "value": "primary-color--purple" 34 | } 35 | } -------------------------------------------------------------------------------- /ui.frontend/src/sass/theme/demo-content-theme.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @import url('https://fonts.googleapis.com/css2?family=Jost&display=swap'); 18 | 19 | body { 20 | --color-primary: #0F154A; 21 | 22 | --color-default: #1D1F31; 23 | --color-body-background: #FFFFFF; 24 | --color-neutral-800: #151515; 25 | --color-neutral-500: #727272; 26 | --color-neutral-200: #F0F0F0; 27 | 28 | --font-headings: 'Jost', 'Montserrat', sans-serif; 29 | --font-body: 'Avenir', 'Montserrat', sans-serif; 30 | --links-text-transform: uppercase; 31 | } 32 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/common/headinglevel/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "sling:resourceType": "wcm/dialogs/components/radio", 3 | "name": "headingLevel", 4 | "description": "HTML heading level help to communicate the organization and hierarchy of the content (for SEO and accessibility)", 5 | "label": "Heading level", 6 | "h1": { 7 | "sling:resourceType": "wcm/dialogs/components/radio/option", 8 | "label": "H1", 9 | "value": "h1" 10 | }, 11 | "h2": { 12 | "sling:resourceType": "wcm/dialogs/components/radio/option", 13 | "label": "H2", 14 | "selected": true, 15 | "value": "h2" 16 | }, 17 | "h3": { 18 | "sling:resourceType": "wcm/dialogs/components/radio/option", 19 | "label": "H3", 20 | "value": "h3" 21 | }, 22 | "h4": { 23 | "sling:resourceType": "wcm/dialogs/components/radio/option", 24 | "label": "H4", 25 | "value": "h4" 26 | }, 27 | "h5": { 28 | "sling:resourceType": "wcm/dialogs/components/radio/option", 29 | "label": "H5", 30 | "value": "h5" 31 | }, 32 | "h6": { 33 | "sling:resourceType": "wcm/dialogs/components/radio/option", 34 | "label": "H6", 35 | "value": "h6" 36 | } 37 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/contentimagefullwidth/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "jcr:primaryType": "nt:unstructured", 3 | "classes": "hl-page-section--featured-content", 4 | "image": { 5 | "jcr:primaryType": "nt:unstructured", 6 | "sling:resourceType": "howlite/components/image" 7 | }, 8 | "container": { 9 | "jcr:primaryType": "nt:unstructured", 10 | "sling:resourceType": "howlite/components/container", 11 | "title": { 12 | "jcr:primaryType": "nt:unstructured", 13 | "smColSize": 12, 14 | "mdColSize": 12, 15 | "lgColSize": 5, 16 | "lgOffset": 1, 17 | "title": "Add your section title here", 18 | "headingLevel": "h2", 19 | "subtitle": "Add your subtitle here", 20 | "showSubtitle": true, 21 | "sling:resourceType": "howlite/components/title" 22 | }, 23 | "richtext": { 24 | "jcr:primaryType": "nt:unstructured", 25 | "smColSize": 12, 26 | "mdColSize": 12, 27 | "lgColSize": 6, 28 | "sling:resourceType": "howlite/components/richtext", 29 | "classes": "", 30 | "lgOffset": "", 31 | "mdOffset": "", 32 | "smOffset": "" 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/title/template.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <template data-sly-template.title="${ @ title, anchorId, showSubtitle, subtitle, headingLevel, headingSize, classes}"> 17 | <header id="${anchorId}" class="hl-title ${classes @ join=' '}"> 18 | <sly data-sly-test="${showSubtitle && subtitle}"> 19 | <p class="subtitle">${subtitle}</p> 20 | </sly> 21 | <h2 data-sly-element="${headingLevel}" class="hl-title__heading ${headingSize}">${title}</h2> 22 | 23 | </header> 24 | </template> -------------------------------------------------------------------------------- /ui.frontend/src/components/CTAsList/ctasList.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @use 'sass:map'; 18 | @use '../../sass/abstracts'; 19 | 20 | .hl-ctas-list { 21 | display: flex; 22 | flex-wrap: wrap; 23 | gap: map.get(abstracts.$spacing, 'small-3'); 24 | justify-content: center; 25 | 26 | .hl-cta { 27 | margin: 0; 28 | } 29 | } 30 | 31 | * + .hl-ctas-list { 32 | margin-top: map.get(abstracts.$spacing, 'medium-2'); 33 | 34 | @include abstracts.media-breakpoint-up(md) { 35 | margin-top: map.get(abstracts.$spacing, 'medium-4'); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /ui.frontend/src/components/Container/container.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @use 'sass:map'; 18 | @use '../../sass/abstracts'; 19 | 20 | .hl-container { 21 | align-items: center; 22 | 23 | background-image: var(--bg-image-sm); 24 | @include abstracts.media-breakpoint-up(md) { 25 | background-image: var(--bg-image-md); 26 | } 27 | @include abstracts.media-breakpoint-up(lg) { 28 | background-image: var(--bg-image-lg); 29 | } 30 | 31 | background-size: contain; 32 | background-repeat: no-repeat; 33 | background-position: center; 34 | } 35 | -------------------------------------------------------------------------------- /ui.frontend/src/components/index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @import './Accordion/index'; 18 | @import './CardsList/index'; 19 | @import './Container/index'; 20 | @import './CTA/index'; 21 | @import './CTAsList/index'; 22 | @import './Footer/index'; 23 | @import './Image/index'; 24 | @import './MainContainer/index'; 25 | @import './Navigation/index'; 26 | @import './Header/index'; 27 | @import './Quote/index'; 28 | @import './RichText/index'; 29 | @import './SocialLinks/index'; 30 | @import './Title/index'; 31 | @import './PageSection/index'; 32 | @import './LogosCloud/index'; 33 | -------------------------------------------------------------------------------- /ui.frontend/src/resources/images/broken-image.svg: -------------------------------------------------------------------------------- 1 | <!-- 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | --> 16 | <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> 17 | <path d="M29.1999 29.1998L17.8799 17.8798L4.78659 4.78647L2.79992 2.7998L0.919922 4.6798L3.99992 7.77314V25.3331C3.99992 26.7998 5.19992 27.9998 6.66659 27.9998H24.2266L27.3066 31.0798L29.1999 29.1998ZM6.66659 23.9998L11.3333 17.9998L14.6666 22.0131L16.2266 19.9998L20.2266 23.9998H6.66659ZM27.9999 24.2265L7.77326 3.9998H25.3333C26.7999 3.9998 27.9999 5.1998 27.9999 6.66647V24.2265Z" fill="#C1C7D0"/> 18 | </svg> -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/maincontainer/maincontainer.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <main class="hl-main-container"> 17 | <sly data-sly-repeat.paragraph="${resource.children}" data-sly-resource="${paragraph.path @ resourceType=paragraph.resourceType}"></sly> 18 | <sly data-sly-test="${!resource.hasChildren}"> 19 | <sly data-sly-use.lib="/libs/wcm/foundation/components/commons/templates.html" 20 | data-sly-call="${lib.placeholder @ classes='hl-grid hl-grid-12 hl-grid-cols-12'}"> 21 | </sly> 22 | </sly> 23 | </main><!--/*do not add empty line at the end of file*/--> -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/GridImpl.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components; 18 | 19 | import lombok.Builder; 20 | import lombok.Getter; 21 | import lombok.RequiredArgsConstructor; 22 | 23 | @Getter 24 | @Builder 25 | @RequiredArgsConstructor 26 | public class GridImpl implements Grid { 27 | 28 | private final Integer smColSize; 29 | 30 | private final Integer mdColSize; 31 | 32 | private final Integer lgColSize; 33 | 34 | private final Integer smOffset; 35 | 36 | private final Integer mdOffset; 37 | 38 | private final Integer lgOffset; 39 | 40 | } 41 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/accordion/accordionitem/accordionitem.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.AccordionItemComponent"> 17 | <li class="hl-accordion-item"> 18 | <button aria-expanded="false" class="hl-accordion-item__title"> 19 | ${model.title} 20 | <i class="hl-icon icon-chevron-down hl-accordion-item__icon"></i> 21 | </button> 22 | <div role="region" class="hl-accordion-item__content"> 23 | ${model.content @ context='html'} 24 | </div> 25 | </li> 26 | </sly> -------------------------------------------------------------------------------- /ui.frontend/src/components/MainContainer/main-container.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @use 'sass:map'; 18 | 19 | @use '../../sass/abstracts'; 20 | 21 | .hl-main-container { 22 | margin: 0 auto; 23 | max-width: 100%; 24 | padding-right: abstracts.$page-padding-horizontal; 25 | padding-left: abstracts.$page-padding-horizontal; 26 | 27 | @include abstracts.media-breakpoint-up(md) { 28 | max-width: map.get(abstracts.$container-max-widths, 'md'); 29 | } 30 | 31 | @include abstracts.media-breakpoint-up(lg) { 32 | max-width: map.get(abstracts.$container-max-widths, 'lg'); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/container/dialog/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "sling:resourceType": "wcm/dialogs/dialog", 3 | "tabs": { 4 | "sling:resourceType": "wcm/dialogs/components/tabs", 5 | "generalTab": { 6 | "sling:resourceType": "wcm/dialogs/components/tab", 7 | "label": "General", 8 | "backgroundImageLg": { 9 | "sling:resourceType": "wcm/dialogs/components/assetreference", 10 | "mimeTypes": ["image/*"], 11 | "name": "backgroundImageLg", 12 | "label": "Background image - L breakpoint" 13 | }, 14 | "backgroundImageMd": { 15 | "sling:resourceType": "wcm/dialogs/components/assetreference", 16 | "mimeTypes": ["image/*"], 17 | "name": "backgroundImageMd", 18 | "label": "Background image - M breakpoint" 19 | }, 20 | "backgroundImageSm": { 21 | "sling:resourceType": "wcm/dialogs/components/assetreference", 22 | "mimeTypes": ["image/*"], 23 | "name": "backgroundImageSm", 24 | "label": "Background image - S breakpoint" 25 | } 26 | }, 27 | "gridTab": { 28 | "sling:resourceType": "wcm/dialogs/components/include", 29 | "path": "/libs/howlite/components/common/gridTab" 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /ui.frontend/src/js/helpers/utils.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | export const throttle = (fn, limit = 25) => { 18 | let isBusy = false; 19 | return (...args) => { 20 | if (!isBusy) { 21 | fn.apply(this, args); 22 | isBusy = true; 23 | setTimeout(() => { 24 | isBusy = false; 25 | }, limit); 26 | } 27 | }; 28 | }; 29 | 30 | export const debounce = (fn, timeout = 50) => { 31 | let timer = null; 32 | return (...args) => { 33 | clearTimeout(timer); 34 | timer = setTimeout(() => { 35 | timer = null; 36 | fn.apply(this, args); 37 | }, timeout); 38 | }; 39 | }; 40 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/common/headingsize/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "sling:resourceType": "wcm/dialogs/components/radio", 3 | "name": "headingSize", 4 | "description": "Changes font size (without affecting html heading level)", 5 | "label": "Heading size", 6 | "xs": { 7 | "sling:resourceType": "wcm/dialogs/components/radio/option", 8 | "label": "XS", 9 | "value": "hl-title__heading--size-6" 10 | }, 11 | "s": { 12 | "sling:resourceType": "wcm/dialogs/components/radio/option", 13 | "label": "S", 14 | "value": "hl-title__heading--size-5" 15 | }, 16 | "m": { 17 | "sling:resourceType": "wcm/dialogs/components/radio/option", 18 | "label": "M", 19 | "selected": true, 20 | "value": "hl-title__heading--size-4" 21 | }, 22 | "l": { 23 | "sling:resourceType": "wcm/dialogs/components/radio/option", 24 | "label": "L", 25 | "value": "hl-title__heading--size-3" 26 | }, 27 | "xl": { 28 | "sling:resourceType": "wcm/dialogs/components/radio/option", 29 | "label": "XL", 30 | "value": "hl-title__heading--size-2" 31 | }, 32 | "xxl": { 33 | "sling:resourceType": "wcm/dialogs/components/radio/option", 34 | "label": "XXL", 35 | "value": "hl-title__heading--size-1" 36 | } 37 | } -------------------------------------------------------------------------------- /ui.frontend/src/sass/abstracts/_spacing.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | $spacing: ( 18 | // the px values are listed with assumption that 19 | // rem is calculated based on the 16px 20 | // 21 | // 4px 22 | 'small': 0.25rem, 23 | // 8px 24 | 'small-2': 0.5rem, 25 | // 16px 26 | 'small-3': 1rem, 27 | // 24px 28 | 'medium': 1.5rem, 29 | // 32px 30 | 'medium-2': 2rem, 31 | // 40px 32 | 'medium-3': 2.5rem, 33 | // 48px 34 | 'medium-4': 3rem, 35 | // 56px 36 | 'large': 3.5rem, 37 | // 64px 38 | 'large-2': 4rem, 39 | // 80px 40 | 'large-3': 5rem, 41 | // 128px 42 | 'large-4': 8rem 43 | ); 44 | -------------------------------------------------------------------------------- /tests/end-to-end/cypress.config.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | import { defineConfig } from 'cypress'; 18 | 19 | export default defineConfig({ 20 | chromeWebSecurity: false, 21 | screenshotsFolder: 'build/screenshots', 22 | videosFolder: 'build/video', 23 | fixturesFolder: false, 24 | video: false, 25 | viewportWidth: 1280, 26 | viewportHeight: 1024, 27 | e2e: { 28 | setupNodeEvents(on, config) {}, 29 | baseUrl: 'http://localhost:8080', 30 | specPattern: 'tests/**/*.cy.{js,jsx,ts,tsx}', 31 | supportFile: 'support/index.ts', 32 | experimentalSessionAndOrigin: true, 33 | defaultCommandTimeout: 30000 34 | } 35 | }); 36 | -------------------------------------------------------------------------------- /tests/end-to-end/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "websight-e2e-tests", 3 | "version": "0.0.1", 4 | "description": "WebSight distribution functional and visual tests.", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "cypress open --browser chrome", 8 | "test": "cypress run --browser chrome", 9 | "test:formatting": "prettier --check . && eslint **/*.ts", 10 | "test:visual": "percy exec -- cypress run", 11 | "format": "prettier --write .", 12 | "format:watch": "onchange \"**/*\" -- prettier --write --ignore-unknown {{changed}}", 13 | "rebuild-content": "cd ../content && mvn clean install -P autoInstallPackage" 14 | }, 15 | "devDependencies": { 16 | "@4tw/cypress-drag-drop": "^2.2.5", 17 | "@percy/cli": "^1.28.7", 18 | "@percy/cypress": "^3.1.2", 19 | "@types/jest": "^29.5.12", 20 | "@types/node": "^20.14.0", 21 | "@typescript-eslint/eslint-plugin": "^7.13.0", 22 | "chai": "^5.1.1", 23 | "cypress": "^13.11.0", 24 | "eslint": "^8.57.0", 25 | "eslint-plugin-chai-friendly": "^1.0.0", 26 | "eslint-plugin-cypress": "^3.3.0", 27 | "onchange": "^7.1.0", 28 | "prettier": "^3.3.2", 29 | "ts-jest": "^29.1.4", 30 | "ts-node": "^10.9.2", 31 | "typescript": "^5.4.5", 32 | "wait-on": "^7.2.0" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/fourcolumns/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "classes": "", 3 | "jcr:primaryType": "nt:unstructured", 4 | "container1": { 5 | "jcr:primaryType": "nt:unstructured", 6 | "sling:resourceType": "howlite/components/container", 7 | "smColSize": 12, 8 | "mdColSize": 6, 9 | "lgColSize": 3, 10 | "lgOffset": "", 11 | "mdOffset": "", 12 | "smOffset": "" 13 | }, 14 | "container2": { 15 | "jcr:primaryType": "nt:unstructured", 16 | "sling:resourceType": "howlite/components/container", 17 | "smColSize": 12, 18 | "mdColSize": 6, 19 | "lgColSize": 3, 20 | "lgOffset": "", 21 | "mdOffset": "", 22 | "smOffset": "" 23 | }, 24 | "container3": { 25 | "jcr:primaryType": "nt:unstructured", 26 | "sling:resourceType": "howlite/components/container", 27 | "smColSize": 12, 28 | "mdColSize": 6, 29 | "lgColSize": 3, 30 | "lgOffset": "", 31 | "mdOffset": "", 32 | "smOffset": "" 33 | }, 34 | "container4": { 35 | "jcr:primaryType": "nt:unstructured", 36 | "sling:resourceType": "howlite/components/container", 37 | "smColSize": 12, 38 | "mdColSize": 6, 39 | "lgColSize": 3, 40 | "lgOffset": "", 41 | "mdOffset": "", 42 | "smOffset": "" 43 | } 44 | } -------------------------------------------------------------------------------- /core/src/test/resources/header.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": { 3 | "jcr:primaryType": "nt:unstructured", 4 | "sling:resourceType": "howlite/components/header" 5 | }, 6 | "complex": { 7 | "jcr:primaryType": "nt:unstructured", 8 | "sling:resourceType": "howlite/components/header", 9 | "image": { 10 | "jcr:primaryType": "nt:unstructured", 11 | "lgImageSrc": "/content/space/assets/imageLg.jpg", 12 | "alt": "alt test text" 13 | }, 14 | "navigation": { 15 | "jcr:primaryType": "nt:unstructured", 16 | "menuItems": { 17 | "jcr:primaryType": "nt:unstructured", 18 | "1": { 19 | "jcr:primaryType": "nt:unstructured", 20 | "label": "Navigation item 1", 21 | "link": "http://www.navigate-to-link-1.com", 22 | "openInNewTab": "true" 23 | }, 24 | "2": { 25 | "jcr:primaryType": "nt:unstructured", 26 | "label": "Navigation item 2", 27 | "link": "http://www.navigate-to-link-2.com", 28 | "openInNewTab": "false" 29 | } 30 | } 31 | }, 32 | "cta": { 33 | "jcr:primaryType": "nt:unstructured", 34 | "label": "Test CTA", 35 | "link": "http://www.example.domain.com", 36 | "openInNewTab": "false", 37 | "displayIcon": "true" 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /ui.frontend/src/sass/global.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @use './abstracts'; 18 | 19 | // CSS reset 20 | @import './base/reset'; 21 | @import './base/utils'; 22 | 23 | * { 24 | box-sizing: border-box; 25 | color: var(--color-default); 26 | } 27 | 28 | a { 29 | text-decoration: none; 30 | } 31 | 32 | img, 33 | svg { 34 | vertical-align: middle; 35 | } 36 | 37 | // global styles 38 | body { 39 | background-color: var(--color-body-background); 40 | 41 | @include abstracts.font-body; 42 | 43 | &.primary-color { 44 | @each $name, $color in abstracts.$primary-colors { 45 | &--#{$name} { 46 | --color-primary: #{$color}; 47 | } 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/models/AccordionItemComponent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components.models; 18 | 19 | import javax.inject.Inject; 20 | import lombok.Getter; 21 | import org.apache.sling.api.resource.Resource; 22 | import org.apache.sling.models.annotations.Default; 23 | import org.apache.sling.models.annotations.Model; 24 | 25 | @Model(adaptables = Resource.class) 26 | public class AccordionItemComponent { 27 | 28 | @Getter 29 | @Inject 30 | @Default(values = "Accordion item title") 31 | private String title; 32 | 33 | @Getter 34 | @Inject 35 | @Default(values = "Add your content here") 36 | private String content; 37 | 38 | } 39 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/image/image.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.ImageComponent" 17 | data-sly-test.isValid="${model.defaultImage}" 18 | data-sly-use.template="./template.html" 19 | data-sly-call="${template.image @ imagesCount=model.imagesCount, defaultImage=model.defaultImage, imageSources=model.imageSources, alt=model.alt, showLink=model.showLink, url=model.url, openInNewTab=model.openInNewTab, classes=model.classes}"> 20 | </sly> 21 | <sly data-sly-test="${!isValid && wcmmode.isEdit}" 22 | data-sly-use.template="./template.html" 23 | data-sly-call="${template.imagePlaceholder @ classes=model.classes}"> 24 | </sly> -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | <!--- Provide a general summary of your changes in the Title above --> 2 | 3 | ## Description 4 | <!--- Describe your changes in detail --> 5 | 6 | ## Motivation and Context 7 | <!--- Why is this change required? What problem does it solve? --> 8 | <!--- If it fixes an open issue, please link to the issue here. --> 9 | 10 | ## Screenshots (if appropriate) 11 | 12 | ## Upgrade notes (if appropriate) 13 | <!-- What changes user have to do in order to migrate from the previous version to the version with this feature --> 14 | 15 | ## Types of changes 16 | <!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: --> 17 | - [ ] Bug fix (non-breaking change which fixes an issue) labeled with `bug` 18 | - [ ] New feature (non-breaking change which adds functionality) labeled with `enhancement` 19 | - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) 20 | 21 | ## Checklist: 22 | <!--- Go over all the following points, and put an `x` in all the boxes that apply. --> 23 | <!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! --> 24 | - [ ] My code follows the [code standards](/CONTRIBUTING.md) of this project. 25 | - [ ] My change requires updating the documentation. I have updated the documentation accordingly. 26 | -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/models/NavigationComponent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components.models; 18 | 19 | import static org.apache.sling.models.annotations.DefaultInjectionStrategy.OPTIONAL; 20 | 21 | import java.util.Collections; 22 | import java.util.List; 23 | import javax.annotation.PostConstruct; 24 | import javax.inject.Inject; 25 | import lombok.Getter; 26 | import org.apache.sling.api.resource.Resource; 27 | import org.apache.sling.models.annotations.Model; 28 | 29 | @Model(adaptables = Resource.class, defaultInjectionStrategy = OPTIONAL) 30 | public class NavigationComponent { 31 | 32 | @Inject 33 | @Getter 34 | private List<NavigationItemComponent> menuItems; 35 | 36 | } 37 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/ctaslist/ctaslist.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.DefaultStyledGridComponent"> 17 | <sly data-sly-set.CSSclasses="hl-ctas-list ${model.classes @ join=' '}"></sly> 18 | 19 | <div data-sly-test="${resource.hasChildren}" class="${CSSclasses}"> 20 | <sly data-sly-include="${'parsys.html' @ prependPath='/libs/wcm/foundation/components/parsys'}"></sly> 21 | </div> 22 | 23 | <sly data-sly-test="${!resource.hasChildren}"> 24 | <sly data-sly-use.lib="/libs/wcm/foundation/components/commons/templates.html" 25 | data-sly-call="${lib.placeholder @ classes=CSSclasses}"> 26 | </sly> 27 | </sly> 28 | </sly> -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/logoscloud/logoscloud.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.DefaultStyledGridComponent"> 17 | <sly data-sly-set.CSSclasses="hl-logos-cloud ${model.classes @ join=' '}"></sly> 18 | <div data-sly-test="${resource.hasChildren}" class="${CSSclasses}"> 19 | <sly data-sly-include="${'parsys.html' @ prependPath='/libs/wcm/foundation/components/parsys'}"></sly> 20 | </div> 21 | 22 | <sly data-sly-test="${!resource.hasChildren}"> 23 | <sly data-sly-use.lib="/libs/wcm/foundation/components/commons/templates.html" 24 | data-sly-call="${lib.placeholder @ classes=CSSclasses}"> 25 | </sly> 26 | </sly> 27 | </sly> -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/utils/DefaultImageUtil.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components.utils; 18 | 19 | import java.util.Arrays; 20 | import java.util.Collections; 21 | import java.util.List; 22 | import org.apache.commons.lang3.StringUtils; 23 | import org.jetbrains.annotations.NotNull; 24 | import org.jetbrains.annotations.Nullable; 25 | 26 | public class DefaultImageUtil { 27 | 28 | @Nullable 29 | public static String chooseDefaultImage(@NotNull String... sources) { 30 | List<String> images = Arrays.asList(sources); 31 | Collections.reverse(images); 32 | return images.stream() 33 | .filter(StringUtils::isNotEmpty) 34 | .findFirst() 35 | .orElse(null); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /ui.frontend/src/components/Title/title.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @use 'sass:map'; 18 | @use '../../sass/abstracts'; 19 | 20 | 21 | .hl-title { 22 | .subtitle { 23 | color: var(--color-default); 24 | line-height: 1.5rem; 25 | font-weight: abstracts.$font-weight-xbold; 26 | font-size: abstracts.$font-regular-small; 27 | padding-bottom: map.get(abstracts.$spacing, 'small-2'); 28 | 29 | @include abstracts.media-breakpoint-up(md) { 30 | font-size: abstracts.$font-regular; 31 | padding-bottom: map.get(abstracts.$spacing, 'small-3'); 32 | } 33 | } 34 | 35 | .hl-main-container &.hl-title--centered { 36 | text-align: center; 37 | } 38 | } 39 | 40 | .hl-container > .hl-title { 41 | text-align: center; 42 | } 43 | -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/models/FooterReferenceComponent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components.models; 18 | 19 | import static org.apache.sling.models.annotations.DefaultInjectionStrategy.OPTIONAL; 20 | 21 | import org.apache.sling.api.resource.Resource; 22 | import org.apache.sling.models.annotations.Model; 23 | 24 | @Model(adaptables = Resource.class, defaultInjectionStrategy = OPTIONAL) 25 | public class FooterReferenceComponent extends HomepageComponentReference<FooterComponent> { 26 | 27 | @Override 28 | public String getPath() { 29 | return "jcr:content/rootcontainer/footer"; 30 | } 31 | 32 | @Override 33 | public Class<FooterComponent> getType() { 34 | return FooterComponent.class; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/models/HeaderReferenceComponent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components.models; 18 | 19 | import static org.apache.sling.models.annotations.DefaultInjectionStrategy.OPTIONAL; 20 | 21 | import org.apache.sling.api.resource.Resource; 22 | import org.apache.sling.models.annotations.Model; 23 | 24 | @Model(adaptables = Resource.class, defaultInjectionStrategy = OPTIONAL) 25 | public class HeaderReferenceComponent extends HomepageComponentReference<HeaderComponent> { 26 | 27 | @Override 28 | public String getPath() { 29 | return "jcr:content/rootcontainer/header"; 30 | } 31 | 32 | @Override 33 | public Class<HeaderComponent> getType() { 34 | return HeaderComponent.class; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /ui.frontend/src/sass/abstracts/_icons.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @use './colors'; 18 | 19 | $social-icon-size: 40px; 20 | 21 | @mixin social-icon { 22 | text-decoration: none; 23 | border-radius: 50%; 24 | display: block; 25 | appearance: none; 26 | background: transparent; 27 | border: 0; 28 | padding: 0; 29 | 30 | &:hover { 31 | .hl-icon { 32 | background-color: var(--color-default); 33 | color: var(--color-body-background); 34 | } 35 | } 36 | 37 | .hl-icon { 38 | display: block; 39 | border: 2px solid var(--color-default); 40 | border-radius: 50%; 41 | width: $social-icon-size; 42 | height: $social-icon-size; 43 | display: flex; 44 | justify-content: center; 45 | align-items: center; 46 | } 47 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/accordion/accordion.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.DefaultStyledGridComponent"> 17 | <sly data-sly-set.CSSclasses="hl-accordion ${model.classes @ join=' '}"></sly> 18 | <div data-sly-test="${resource.hasChildren}" class="${CSSclasses}"> 19 | <ul> 20 | <sly data-sly-include="${'parsys.html' @ prependPath='/libs/wcm/foundation/components/parsys'}"></sly> 21 | </ul> 22 | </div> 23 | 24 | <sly data-sly-test="${!resource.hasChildren}"> 25 | <sly data-sly-use.lib="/libs/wcm/foundation/components/commons/templates.html" 26 | data-sly-call="${lib.placeholder @ classes=CSSclasses}"> 27 | </sly> 28 | </sly> 29 | </sly> -------------------------------------------------------------------------------- /ui.frontend/src/sass/abstracts/_custom-bootstrap.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | // based on https://getbootstrap.com/docs/5.0/customize/sass/ 18 | 19 | @import '../../../node_modules/bootstrap/scss/functions'; 20 | 21 | // custom variables 22 | $grid-columns: 12; 23 | $grid-gutter-width: 1.5rem; 24 | $spacer: 1rem; 25 | 26 | $gutters: ( 27 | 0: 0, 28 | 1: $spacer * 0.25, 29 | 2: $spacer * 0.5, 30 | 3: $spacer, 31 | 4: $spacer * 1.5, 32 | 5: $spacer * 2 33 | ); 34 | 35 | $grid-breakpoints: ( 36 | sm: 0, 37 | md: 768px, 38 | lg: 970px, 39 | xl: 1200px 40 | ); 41 | 42 | $container-max-widths: ( 43 | md: 100%, 44 | lg: 1300px 45 | ); 46 | 47 | @import '../../../node_modules/bootstrap/scss/variables'; 48 | @import '../../../node_modules/bootstrap/scss/mixins'; 49 | -------------------------------------------------------------------------------- /tests/content/src/main/content/jcr_root/content/howlite-test/pages/Footer/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:ws="http://ds.pl/websight" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" 3 | jcr:primaryType="ws:Page"> 4 | <jcr:content 5 | jcr:primaryType="ws:PageContent" 6 | jcr:title="Footer" 7 | sling:resourceType="howlite/components/page" 8 | ws:template="/libs/howlite/templates/homepage" 9 | description="\0" 10 | ogDescription="\0" 11 | ogImage="\0" 12 | ogTitle="\0" 13 | ogUrl="\0" 14 | title="\0" 15 | twitterDescription="\0" 16 | twitterImage="\0" 17 | twitterImageAlt="\0" 18 | twitterSite="\0" 19 | twitterTitle="\0"> 20 | <rootcontainer 21 | jcr:primaryType="nt:unstructured" 22 | sling:resourceType="howlite/components/rootcontainer/fixedrootcontainer"> 23 | <header 24 | jcr:primaryType="nt:unstructured" 25 | sling:resourceType="howlite/components/header"/> 26 | <maincontainer 27 | jcr:primaryType="nt:unstructured" 28 | sling:resourceType="howlite/components/maincontainer"> 29 | </maincontainer> 30 | <footer 31 | jcr:primaryType="nt:unstructured" 32 | sling:resourceType="howlite/components/footer"/> 33 | </rootcontainer> 34 | </jcr:content> 35 | </jcr:root> 36 | -------------------------------------------------------------------------------- /ui.frontend/assembly.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!-- 3 | Copyright (C) 2022 Dynamic Solutions 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); 6 | you may not use this file except in compliance with the License. 7 | You may obtain a copy of the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, 13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | See the License for the specific language governing permissions and 15 | limitations under the License. 16 | --> 17 | <assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" 18 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 19 | xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd"> 20 | <id>distribution</id> 21 | <formats> 22 | <format>zip</format> 23 | </formats> 24 | <includeBaseDirectory>false</includeBaseDirectory> 25 | <fileSets> 26 | <fileSet> 27 | <directory>${basedir}/dist</directory> 28 | <includes> 29 | <include>**/*</include> 30 | </includes> 31 | <outputDirectory></outputDirectory> 32 | </fileSet> 33 | </fileSets> 34 | </assembly> -------------------------------------------------------------------------------- /ui.frontend/src/components/PageSection/variants/hl-page-section--featured-content.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @use 'sass:map'; 18 | @use '../../../sass/abstracts'; 19 | 20 | .hl-page-section--featured-content { 21 | .hl-image { 22 | margin-bottom: map.get(abstracts.$spacing, 'large'); 23 | } 24 | 25 | .hl-title { 26 | padding-bottom: map.get(abstracts.$spacing, 'medium'); 27 | @include abstracts.media-breakpoint-up(lg) { 28 | padding-bottom: 0; 29 | padding-right: map.get(abstracts.$spacing, 'medium'); 30 | } 31 | } 32 | 33 | .hl-main-container > &.hl-page-section .hl-title { 34 | text-align: left; 35 | align-self: start; 36 | 37 | + * { 38 | margin-top: 0; 39 | } 40 | } 41 | 42 | .hl-rich-text { 43 | align-self: start; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/models/HeaderComponent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components.models; 18 | 19 | import static org.apache.sling.models.annotations.DefaultInjectionStrategy.OPTIONAL; 20 | 21 | import javax.inject.Inject; 22 | import lombok.Getter; 23 | import org.apache.sling.api.resource.Resource; 24 | import org.apache.sling.models.annotations.Model; 25 | 26 | @Model(adaptables = Resource.class, defaultInjectionStrategy = OPTIONAL) 27 | public class HeaderComponent { 28 | 29 | @Getter 30 | @Inject 31 | private String mobileMenuTitle; 32 | 33 | @Inject 34 | @Getter 35 | private ImageComponent image; 36 | 37 | @Inject 38 | @Getter 39 | private NavigationComponent navigation; 40 | 41 | @Inject 42 | @Getter 43 | private CtaComponent cta; 44 | } -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/models/FooterComponent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components.models; 18 | 19 | import static org.apache.sling.models.annotations.DefaultInjectionStrategy.OPTIONAL; 20 | 21 | import javax.inject.Inject; 22 | import lombok.Getter; 23 | import org.apache.sling.api.resource.Resource; 24 | import org.apache.sling.models.annotations.Model; 25 | 26 | @Model(adaptables = Resource.class, defaultInjectionStrategy = OPTIONAL) 27 | public class FooterComponent { 28 | 29 | @Inject 30 | @Getter 31 | private ImageComponent image; 32 | 33 | @Inject 34 | @Getter 35 | private NavigationComponent navigation; 36 | 37 | @Inject 38 | @Getter 39 | private SocialLinksComponent socialLinks; 40 | 41 | @Inject 42 | @Getter 43 | private String copyright; 44 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/calltoactionsection/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "classes": "hl-page-section--call-to-action", 3 | "jcr:primaryType": "nt:unstructured", 4 | "image": { 5 | "jcr:primaryType": "nt:unstructured", 6 | "sling:resourceType": "howlite/components/image", 7 | "openInNewTab": false 8 | }, 9 | "title": { 10 | "jcr:primaryType": "nt:unstructured", 11 | "sling:resourceType": "howlite/components/title", 12 | "headingLevel": "h2", 13 | "headingSize": "hl-title__heading--size-4", 14 | "classes": "", 15 | "lgColSize": "12", 16 | "lgOffset": "", 17 | "mdColSize": "12", 18 | "mdOffset": "", 19 | "smColSize": "12", 20 | "smOffset": "" 21 | }, 22 | "ctaslist": { 23 | "jcr:primaryType": "nt:unstructured", 24 | "sling:resourceType": "howlite/components/ctaslist", 25 | "cta_1": { 26 | "jcr:primaryType": "nt:unstructured", 27 | "sling:resourceType": "howlite/components/cta", 28 | "displayIcon": false, 29 | "classes": "hl-cta--primary", 30 | "link": "https://test.com", 31 | "label": "Link", 32 | "openInNewTab": false 33 | }, 34 | "cta": { 35 | "jcr:primaryType": "nt:unstructured", 36 | "sling:resourceType": "howlite/components/cta", 37 | "classes": "hl-cta--text", 38 | "displayIcon": false, 39 | "link": "https://test.com", 40 | "label": "Link", 41 | "openInNewTab": false 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/navigation/template.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <template data-sly-template.navigation="${ @ menuItems, classes}"> 17 | <ul class="hl-navigation ${model.classes @ join=' '}"> 18 | <div data-sly-list.item="${menuItems}" data-sly-unwrap> 19 | <sly data-sly-test="${item.label}"> 20 | <li> 21 | <a data-sly-attribute.href="${item.link}" 22 | data-sly-attribute.target="${item.openInNewTab ? '_blank' : ''}" 23 | class="hl-navigation__link ${currentPage.path == item.linkPath ? 'hl-navigation__link--active' : ''}"> 24 | <span class="hl-navigation__text"> 25 | ${item.label} 26 | </span> 27 | </a> 28 | </li> 29 | </sly> 30 | </div> 31 | </ul> 32 | </template> -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/container/container.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.ContainerComponent"> 17 | <sly data-sly-set.CSSclasses="hl-container ${model.classes @ join=' '}"></sly> 18 | <div data-sly-test="${resource.hasChildren}" class="${CSSclasses}" 19 | style="--bg-image-sm:${model.backgroundImageSm @ context='text'};--height-sm:auto;--bg-image-md: ${model.backgroundImageMd @ context='text'};--height-md:auto;--bg-image-lg:${model.backgroundImageLg @ context='text'};--height-lg:auto;"> 20 | <sly data-sly-include="${'parsys.html' @ prependPath='/libs/wcm/foundation/components/parsys'}"></sly> 21 | </div> 22 | 23 | <sly data-sly-test="${!resource.hasChildren}"> 24 | <sly data-sly-use.lib="/libs/wcm/foundation/components/commons/templates.html" 25 | data-sly-call="${lib.placeholder @ classes=CSSclasses}"> 26 | </sly> 27 | </sly> 28 | </sly> -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/pagesection/pagesection.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <sly data-sly-use.model="pl.ds.howlite.components.models.PageSectionComponent"> 17 | <sly data-sly-set.CSSclasses="hl-page-section ${model.classes @ join=' '}"></sly> 18 | <section data-sly-test="${resource.hasChildren}" class="${CSSclasses}" 19 | style="--bg-image-sm:${model.backgroundImageSm @ context='text'};--height-sm:auto;--bg-image-md: ${model.backgroundImageMd @ context='text'};--height-md:auto;--bg-image-lg:${model.backgroundImageLg @ context='text'};--height-lg:auto;"> 20 | <sly data-sly-include="${'parsys.html' @ prependPath='/libs/wcm/foundation/components/parsys'}"></sly> 21 | </section> 22 | 23 | <sly data-sly-test="${!resource.hasChildren}"> 24 | <sly data-sly-use.lib="/libs/wcm/foundation/components/commons/templates.html" 25 | data-sly-call="${lib.placeholder @ classes=CSSclasses}"> 26 | </sly> 27 | </sly> 28 | </sly> -------------------------------------------------------------------------------- /ui.frontend/src/components/LogosCloud/logos-cloud.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @use 'sass:map'; 18 | @use '../../sass/abstracts'; 19 | 20 | .hl-logos-cloud { 21 | justify-content: center; 22 | display: flex; 23 | flex-wrap: wrap; 24 | column-gap: map.get(abstracts.$spacing, 'medium-4'); 25 | row-gap: map.get(abstracts.$spacing, 'medium-2'); 26 | margin-top: map.get(abstracts.$spacing, 'medium-2'); 27 | 28 | @include abstracts.media-breakpoint-up(md) { 29 | margin-top: map.get(abstracts.$spacing, 'medium-3'); 30 | column-gap: map.get(abstracts.$spacing, 'large-3'); 31 | } 32 | @include abstracts.media-breakpoint-up(lg) { 33 | margin-top: map.get(abstracts.$spacing, 'medium-4'); 34 | } 35 | 36 | .hl-image { 37 | max-height: 32px; 38 | width: auto; 39 | max-width: 120px; 40 | 41 | img, 42 | .hl-image__link { 43 | max-height: inherit; 44 | } 45 | 46 | @include abstracts.media-breakpoint-up(md) { 47 | max-width: 100%; 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /core/src/test/resources/styled.json: -------------------------------------------------------------------------------- 1 | { 2 | "noDisplayTypeWithSameSize": { 3 | "smColSize": 6, 4 | "mdColSize": 6, 5 | "lgColSize": 6, 6 | "//Expected classes": "hl-grid-component hl-cols-6" 7 | }, 8 | "noDisplayTypeWithDifferentSize": { 9 | "smColSize": 4, 10 | "mdColSize": 5, 11 | "lgColSize": 6, 12 | "//Expected classes": "hl-grid-component hl-cols-sm-4 hl-cols-md-5 hl-cols-lg-6" 13 | }, 14 | "noDisplayTypeWithSameSizeAndSameOffset": { 15 | "smColSize": 6, 16 | "mdColSize": 6, 17 | "lgColSize": 6, 18 | "smOffset": 3, 19 | "mdOffset": 3, 20 | "lgOffset": 3, 21 | "//Expected classes": "hl-grid-component hl-offset-3 hl-cols-6" 22 | }, 23 | "noDisplayTypeWithSameSizeAndDifferentOffset": { 24 | "smColSize": 6, 25 | "mdColSize": 6, 26 | "lgColSize": 6, 27 | "smOffset": 1, 28 | "mdOffset": 2, 29 | "lgOffset": 3, 30 | "//Expected classes": "hl-grid-component hl-offset-sm-1 hl-offset-md-2 hl-offset-lg-3 hl-cols-6" 31 | }, 32 | "noDisplayTypeWithDifferentSizeAndOffset": { 33 | "smColSize": 4, 34 | "mdColSize": 5, 35 | "lgColSize": 6, 36 | "smOffset": 1, 37 | "mdOffset": 2, 38 | "lgOffset": 3, 39 | "//Expected classes": "hl-grid-component hl-offset-sm-1 hl-cols-sm-4 hl-offset-md-2 hl-cols-md-5 hl-offset-lg-3 hl-cols-lg-6" 40 | }, 41 | "noDisplayTypeWithDifferentSizeAndSameOffset": { 42 | "smColSize": 4, 43 | "mdColSize": 5, 44 | "lgColSize": 6, 45 | "smOffset": 3, 46 | "mdOffset": 3, 47 | "lgOffset": 3, 48 | "//Expected classes": "hl-grid-component hl-offset-3 hl-cols-sm-4 hl-cols-md-5 hl-cols-lg-6" 49 | } 50 | } -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/models/SocialLinksComponent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components.models; 18 | 19 | import static org.apache.sling.models.annotations.DefaultInjectionStrategy.OPTIONAL; 20 | 21 | import java.util.Collections; 22 | import java.util.List; 23 | import javax.annotation.PostConstruct; 24 | import javax.inject.Inject; 25 | import lombok.Getter; 26 | import lombok.experimental.Delegate; 27 | import org.apache.sling.api.resource.Resource; 28 | import org.apache.sling.models.annotations.Model; 29 | import org.apache.sling.models.annotations.injectorspecific.Self; 30 | import pl.ds.howlite.components.Grid; 31 | import pl.ds.howlite.components.Styled; 32 | 33 | @Model(adaptables = Resource.class, defaultInjectionStrategy = OPTIONAL) 34 | public class SocialLinksComponent implements Styled, Grid { 35 | 36 | @Inject 37 | @Getter 38 | private List<SingleSocialLinkComponent> socialLinkItems; 39 | 40 | @Self 41 | @Delegate 42 | private DefaultStyledGridComponent style; 43 | 44 | } 45 | -------------------------------------------------------------------------------- /ui.frontend/src/components/Accordion/accordion.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | const accordionItemClass = 'hl-accordion-item'; 18 | const accordionButtonClass = 'hl-accordion-item__title'; 19 | const openedClass= 'opened'; 20 | 21 | const handleAccordionOpening = (accordionItem) => { 22 | const accordionButton = accordionItem.querySelector(`.${accordionButtonClass}`); 23 | 24 | accordionButton.addEventListener('click', () => { 25 | accordionItem.classList.toggle(openedClass); 26 | accordionButton.ariaExpanded = accordionItem.classList.contains(openedClass) 27 | ? 'true' 28 | : 'false'; 29 | }); 30 | }; 31 | 32 | const initAccordion = () => { 33 | document.addEventListener( 34 | 'DOMContentLoaded', 35 | () => { 36 | const elements = document.querySelectorAll(`.${accordionItemClass}`); 37 | 38 | if (!elements?.length) { 39 | return; 40 | } 41 | 42 | elements.forEach((accordionItem) => handleAccordionOpening(accordionItem)); 43 | }, 44 | { once: true } 45 | ); 46 | }; 47 | 48 | initAccordion(); 49 | -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/models/DefaultGridComponent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components.models; 18 | 19 | import static org.apache.sling.models.annotations.DefaultInjectionStrategy.OPTIONAL; 20 | 21 | import javax.inject.Inject; 22 | import lombok.Getter; 23 | import org.apache.sling.api.resource.Resource; 24 | import org.apache.sling.models.annotations.Default; 25 | import org.apache.sling.models.annotations.Model; 26 | import pl.ds.howlite.components.Grid; 27 | 28 | @Getter 29 | @Model(adaptables = Resource.class, defaultInjectionStrategy = OPTIONAL) 30 | public class DefaultGridComponent implements Grid { 31 | 32 | @Inject 33 | @Default(intValues = 12) 34 | private Integer smColSize; 35 | 36 | @Inject 37 | @Default(intValues = 12) 38 | private Integer mdColSize; 39 | 40 | @Inject 41 | @Default(intValues = 12) 42 | private Integer lgColSize; 43 | 44 | @Inject 45 | private Integer smOffset; 46 | 47 | @Inject 48 | private Integer mdOffset; 49 | 50 | @Inject 51 | private Integer lgOffset; 52 | 53 | } 54 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/richtext/dialog/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "sling:resourceType": "wcm/dialogs/dialog", 3 | "tabs": { 4 | "sling:resourceType": "wcm/dialogs/components/tabs", 5 | "generalTab": { 6 | "sling:resourceType": "wcm/dialogs/components/tab", 7 | "label": "General", 8 | "dialogText": { 9 | "sling:resourceType": "wcm/dialogs/components/richtext", 10 | "name": "text", 11 | "label": "Text", 12 | "ws:disallowedContext": ["edit:panel"] 13 | }, 14 | "panelText": { 15 | "sling:resourceType": "wcm/dialogs/components/richtext", 16 | "name": "text", 17 | "label": "Text", 18 | "ws:disallowedContext": ["edit:dialog"], 19 | "configuration": "wcm/dialogs/components/richtext/configurations/compact" 20 | } 21 | }, 22 | "styleTab": { 23 | "sling:resourceType": "wcm/dialogs/components/tab", 24 | "label": "Style", 25 | "cssClasses": { 26 | "sling:resourceType": "wcm/dialogs/components/select", 27 | "name": "classes", 28 | "default": { 29 | "sling:resourceType": "wcm/dialogs/components/select/selectitem", 30 | "label": "Default", 31 | "selected": true, 32 | "value": "" 33 | }, 34 | "black": { 35 | "sling:resourceType": "wcm/dialogs/components/select/selectitem", 36 | "label": "Checked bullet points", 37 | "value": "hl-rich-text--checked-bullet-points" 38 | } 39 | } 40 | }, 41 | "gridTab": { 42 | "sling:resourceType": "wcm/dialogs/components/include", 43 | "path": "/libs/howlite/components/common/gridTab" 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /ui.frontend/.eslintrc.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | module.exports = { 18 | parser: '@typescript-eslint/parser', // Specifies the ESLint parser 19 | extends: [ 20 | 'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin 21 | ], 22 | parserOptions: { 23 | ecmaVersion: 2018, // Allows for the parsing of modern ECMAScript features 24 | sourceType: 'module', // Allows for the use of imports 25 | }, 26 | rules: { 27 | "curly": 1, 28 | "@typescript-eslint/explicit-function-return-type": [0], 29 | "@typescript-eslint/no-explicit-any": [0], 30 | "ordered-imports": [0], 31 | "object-literal-sort-keys": [0], 32 | "max-len": [1, 120], 33 | "new-parens": 1, 34 | "no-bitwise": 1, 35 | "no-cond-assign": 1, 36 | "no-trailing-spaces": 0, 37 | "eol-last": 1, 38 | "func-style": ["error", "declaration", { "allowArrowFunctions": true }], 39 | "semi": 1, 40 | "no-var": 0 41 | }, 42 | }; 43 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/imageleftsection/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "classes": "hl-page-section--bleeding-image", 3 | "jcr:primaryType": "nt:unstructured", 4 | "image": { 5 | "jcr:primaryType": "nt:unstructured", 6 | "sling:resourceType": "howlite/components/image", 7 | "smColSize": 12, 8 | "mdColSize": 6, 9 | "lgColSize": 6 10 | }, 11 | "container": { 12 | "jcr:primaryType": "nt:unstructured", 13 | "sling:resourceType": "howlite/components/container", 14 | "lgOffset": 1, 15 | "smColSize": 12, 16 | "mdColSize": 6, 17 | "lgColSize": 5, 18 | "mdOffset": "", 19 | "smOffset": "", 20 | "title": { 21 | "jcr:primaryType": "nt:unstructured", 22 | "sling:resourceType": "howlite/components/title", 23 | "headingLevel": "h2", 24 | "headingSize": "hl-title__heading--size-4", 25 | "classes": "", 26 | "lgColSize": "12", 27 | "lgOffset": "", 28 | "mdColSize": "12", 29 | "mdOffset": "", 30 | "smColSize": "12", 31 | "smOffset": "" 32 | }, 33 | "richtext": { 34 | "jcr:primaryType": "nt:unstructured", 35 | "sling:resourceType": "howlite/components/richtext", 36 | "classes": "", 37 | "lgColSize": "12", 38 | "lgOffset": "", 39 | "mdColSize": "12", 40 | "mdOffset": "", 41 | "smColSize": "12", 42 | "smOffset": "" 43 | }, 44 | "cta": { 45 | "jcr:primaryType": "nt:unstructured", 46 | "sling:resourceType": "howlite/components/cta", 47 | "classes": "hl-cta--text", 48 | "displayIcon": true, 49 | "link": "https://test.com", 50 | "label": "Link", 51 | "openInNewTab": true 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/sociallinks/template.html: -------------------------------------------------------------------------------- 1 | <!--/* 2 | Copyright (C) 2022 Dynamic Solutions 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */--> 16 | <template data-sly-template.sociallinks="${ @ socialLinkItems, classes}"> 17 | <ul data-sly-test="${socialLinkItems}" class="hl-social-links ${classes @ join=' '}"> 18 | <div data-sly-list.item="${socialLinkItems}" data-sly-unwrap> 19 | <sly data-sly-test="${item}"> 20 | <li> 21 | <a class="hl-social-links__link" href="${item.url}" 22 | target="_blank" aria-label="${item.title}" 23 | rel="${item.nofollow ? 'nofollow' : ''}"> 24 | <i class="hl-icon ${item.icon}"> 25 | </i> 26 | </a> 27 | </li> 28 | </sly> 29 | </div> 30 | </ul> 31 | <sly data-sly-test="${!socialLinkItems}"> 32 | <sly data-sly-use.lib="/libs/wcm/foundation/components/commons/templates.html" 33 | data-sly-call="${lib.placeholder @ classes='hl-placeholder hl-social-links'}"> 34 | </sly> 35 | </sly> 36 | </template> 37 | -------------------------------------------------------------------------------- /core/src/main/resources/libs/howlite/components/layouts/imagerightsection/template/.content.json: -------------------------------------------------------------------------------- 1 | { 2 | "classes": "hl-page-section--bleeding-image", 3 | "jcr:primaryType": "nt:unstructured", 4 | "container": { 5 | "jcr:primaryType": "nt:unstructured", 6 | "sling:resourceType": "howlite/components/container", 7 | "smColSize": 12, 8 | "mdColSize": 6, 9 | "lgColSize": 5, 10 | "lgOffset": "", 11 | "mdOffset": "", 12 | "smOffset": "", 13 | "title": { 14 | "jcr:primaryType": "nt:unstructured", 15 | "sling:resourceType": "howlite/components/title", 16 | "headingLevel": "h2", 17 | "headingSize": "hl-title__heading--size-4", 18 | "classes": "", 19 | "lgColSize": "12", 20 | "lgOffset": "", 21 | "mdColSize": "12", 22 | "mdOffset": "", 23 | "smColSize": "12", 24 | "smOffset": "" 25 | }, 26 | "richtext": { 27 | "jcr:primaryType": "nt:unstructured", 28 | "sling:resourceType": "howlite/components/richtext", 29 | "classes": "", 30 | "lgColSize": "12", 31 | "lgOffset": "", 32 | "mdColSize": "12", 33 | "mdOffset": "", 34 | "smColSize": "12", 35 | "smOffset": "" 36 | }, 37 | "cta": { 38 | "jcr:primaryType": "nt:unstructured", 39 | "sling:resourceType": "howlite/components/cta", 40 | "classes": "hl-cta--text", 41 | "displayIcon": true, 42 | "link": "https://test.com", 43 | "label": "Link", 44 | "openInNewTab": true 45 | } 46 | }, 47 | "image": { 48 | "jcr:primaryType": "nt:unstructured", 49 | "sling:resourceType": "howlite/components/image", 50 | "lgOffset": 1, 51 | "smColSize": 12, 52 | "mdColSize": 6, 53 | "lgColSize": 6, 54 | "mdOffset": "", 55 | "smOffset": "" 56 | } 57 | } -------------------------------------------------------------------------------- /ui.frontend/src/sass/abstracts/_negative-margins.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @use 'sass:map'; 18 | @use './custom-bootstrap'; 19 | @use './variables'; 20 | 21 | @mixin bleed-left { 22 | margin-left: -1 * variables.$page-padding-horizontal; 23 | 24 | @include custom-bootstrap.media-breakpoint-up(md) { 25 | margin-left: calc( 26 | (-1 * (100vw - var(--scrollbar-width) - map.get(custom-bootstrap.$container-max-widths, 'md')) / 2) - 27 | variables.$page-padding-horizontal 28 | ); 29 | } 30 | @include custom-bootstrap.media-breakpoint-up(md) { 31 | margin-left: calc((100vw - var(--scrollbar-width) - 100%) / -2); 32 | } 33 | } 34 | 35 | @mixin bleed-right { 36 | margin-right: -1 * variables.$page-padding-horizontal; 37 | 38 | @include custom-bootstrap.media-breakpoint-up(md) { 39 | margin-right: calc( 40 | (-1 * (100vw - var(--scrollbar-width) - map.get(custom-bootstrap.$container-max-widths, 'md')) / 2) - 41 | variables.$page-padding-horizontal 42 | ); 43 | } 44 | @include custom-bootstrap.media-breakpoint-up(md) { 45 | margin-right: calc((100vw - var(--scrollbar-width) - 100%) / -2); 46 | } 47 | } 48 | 49 | @mixin bleed { 50 | @include bleed-left; 51 | @include bleed-right; 52 | } 53 | -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/models/NavigationItemComponent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components.models; 18 | 19 | import static org.apache.sling.models.annotations.DefaultInjectionStrategy.OPTIONAL; 20 | 21 | import javax.inject.Inject; 22 | import lombok.Getter; 23 | import org.apache.sling.api.resource.Resource; 24 | import org.apache.sling.api.resource.ResourceResolver; 25 | import org.apache.sling.models.annotations.Default; 26 | import org.apache.sling.models.annotations.Model; 27 | import org.apache.sling.models.annotations.injectorspecific.SlingObject; 28 | import pl.ds.howlite.components.utils.LinkUtil; 29 | 30 | @Model(adaptables = Resource.class, defaultInjectionStrategy = OPTIONAL) 31 | public class NavigationItemComponent { 32 | 33 | @SlingObject 34 | private ResourceResolver resourceResolver; 35 | 36 | @Getter 37 | @Inject 38 | private String label; 39 | 40 | @Inject 41 | private String link; 42 | 43 | @Getter 44 | @Inject 45 | @Default(values = "false") 46 | private String openInNewTab; 47 | 48 | public String getLink() { 49 | return LinkUtil.handleLink(link, resourceResolver); 50 | } 51 | 52 | public String getLinkPath() { 53 | return link; 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /tests/pom.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!-- 3 | Copyright (C) 2022 Dynamic Solutions 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); 6 | you may not use this file except in compliance with the License. 7 | You may obtain a copy of the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, 13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | See the License for the specific language governing permissions and 15 | limitations under the License. 16 | --> 17 | 18 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 19 | <modelVersion>4.0.0</modelVersion> 20 | 21 | <parent> 22 | <groupId>pl.ds.howlite</groupId> 23 | <artifactId>howlite-parent</artifactId> 24 | <version>1.0.24-SNAPSHOT</version> 25 | </parent> 26 | 27 | <modules> 28 | <module>content</module> 29 | <module>end-to-end</module> 30 | </modules> 31 | 32 | <artifactId>howlite-tests</artifactId> 33 | <name>Howlite: Tests</name> 34 | <packaging>pom</packaging> 35 | 36 | <properties> 37 | <frontend-maven-plugin.version>1.15.0</frontend-maven-plugin.version> 38 | <node.version>v16.15.0</node.version> 39 | </properties> 40 | 41 | <build> 42 | <plugins> 43 | <plugin> 44 | <groupId>org.apache.maven.plugins</groupId> 45 | <artifactId>maven-deploy-plugin</artifactId> 46 | <version>3.1.2</version> 47 | <configuration> 48 | <skip>true</skip> 49 | </configuration> 50 | </plugin> 51 | </plugins> 52 | </build> 53 | 54 | </project> -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/models/DefaultStyledComponent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components.models; 18 | 19 | import static org.apache.sling.models.annotations.DefaultInjectionStrategy.OPTIONAL; 20 | 21 | import java.util.Arrays; 22 | import java.util.LinkedList; 23 | import java.util.List; 24 | import javax.annotation.PostConstruct; 25 | import javax.inject.Inject; 26 | import org.apache.commons.lang3.StringUtils; 27 | import org.apache.sling.api.resource.Resource; 28 | import org.apache.sling.models.annotations.Model; 29 | import pl.ds.howlite.components.Styled; 30 | 31 | @Model(adaptables = Resource.class, defaultInjectionStrategy = OPTIONAL) 32 | public class DefaultStyledComponent implements Styled { 33 | 34 | @Inject 35 | private String classes; 36 | 37 | private String[] componentClasses; 38 | 39 | public String[] getClasses() { 40 | return componentClasses; 41 | } 42 | 43 | @PostConstruct 44 | private void init() { 45 | List<String> componentClasses = new LinkedList<>(); 46 | 47 | if (StringUtils.isNotEmpty(classes)) { 48 | componentClasses.addAll(Arrays.asList(classes.split(" "))); 49 | } 50 | this.componentClasses = componentClasses.toArray(new String[]{}); 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /ui.frontend/src/sass/base/_icons.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @use '../../sass/abstracts'; 18 | 19 | .hl-icon { 20 | &.icon-arrow-left::before { 21 | content: "\e800"; 22 | } 23 | 24 | &.icon-arrow-right::before { 25 | content: "\e801"; 26 | } 27 | 28 | &.icon-arrow-up-right::before { 29 | content: "\e802"; 30 | } 31 | 32 | &.icon-check-circle::before { 33 | content: "\e803"; 34 | } 35 | 36 | &.icon-chevron-down::before { 37 | content: "\e804"; 38 | } 39 | 40 | &.icon-chevron-right::before { 41 | content: "\e805"; 42 | } 43 | 44 | &.icon-chevron-up::before { 45 | content: "\e806"; 46 | } 47 | 48 | &.icon-close::before { 49 | content: "\e807"; 50 | } 51 | 52 | &.icon-map-pin::before { 53 | content: "\e808"; 54 | } 55 | 56 | &.icon-menu::before { 57 | content: "\e809"; 58 | } 59 | 60 | &.icon-twitter::before { 61 | content: "\e80a"; 62 | } 63 | 64 | &.icon-scroll::before { 65 | content: "\e80c"; 66 | } 67 | 68 | &.icon-copy::before { 69 | content: "\e812"; 70 | } 71 | 72 | &.icon-facebook::before { 73 | content: "\e80e"; 74 | } 75 | 76 | &.icon-linkedin::before { 77 | content: "\e80f"; 78 | } 79 | 80 | &.icon-instagram::before { 81 | content: "\e80b"; 82 | } 83 | } -------------------------------------------------------------------------------- /core/src/test/resources/footer.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": { 3 | "jcr:primaryType": "nt:unstructured", 4 | "sling:resourceType": "howlite/components/footer" 5 | }, 6 | "complex": { 7 | "jcr:primaryType": "nt:unstructured", 8 | "sling:resourceType": "howlite/components/footer", 9 | "image": { 10 | "jcr:primaryType": "nt:unstructured", 11 | "lgImageSrc": "/content/space/assets/imageLg.jpg", 12 | "alt": "alt test text" 13 | }, 14 | "navigation": { 15 | "jcr:primaryType": "nt:unstructured", 16 | "menuItems": { 17 | "jcr:primaryType": "nt:unstructured", 18 | "1": { 19 | "jcr:primaryType": "nt:unstructured", 20 | "label": "Navigation item 1", 21 | "link": "http://www.navigate-to-link-1.com", 22 | "openInNewTab": "true" 23 | }, 24 | "2": { 25 | "jcr:primaryType": "nt:unstructured", 26 | "label": "Navigation item 2", 27 | "link": "http://www.navigate-to-link-2.com", 28 | "openInNewTab": "false" 29 | } 30 | } 31 | }, 32 | "socialLinks": { 33 | "jcr:primaryType": "nt:unstructured", 34 | "socialLinkItems": { 35 | "1": { 36 | "title": "Title linkedin", 37 | "url": "http://www.linkedin.com", 38 | "icon": "linkedin" 39 | }, 40 | "2": { 41 | "title": "Title facebook", 42 | "url": "http://www.facebook.com", 43 | "icon": "facebook", 44 | "nofollow" : false 45 | }, 46 | "3": { 47 | "title": "Title twitter", 48 | "url": "http://www.twitter.com", 49 | "icon": "twitter", 50 | "nofollow" : true 51 | }, 52 | "4": { 53 | "title": "Title instagram", 54 | "url": "http://www.instagram.com", 55 | "icon": "instagram" 56 | } 57 | } 58 | }, 59 | "copyright": "copyrights test" 60 | } 61 | } -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/models/SingleSocialLinkComponent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components.models; 18 | 19 | import static org.apache.sling.models.annotations.DefaultInjectionStrategy.OPTIONAL; 20 | 21 | import javax.inject.Inject; 22 | import lombok.Getter; 23 | import org.apache.commons.lang3.StringUtils; 24 | import org.apache.sling.api.resource.Resource; 25 | import org.apache.sling.api.resource.ResourceResolver; 26 | import org.apache.sling.models.annotations.Default; 27 | import org.apache.sling.models.annotations.Model; 28 | import org.apache.sling.models.annotations.injectorspecific.SlingObject; 29 | import pl.ds.howlite.components.utils.LinkUtil; 30 | 31 | @Model(adaptables = Resource.class, defaultInjectionStrategy = OPTIONAL) 32 | public class SingleSocialLinkComponent { 33 | 34 | @SlingObject 35 | private ResourceResolver resourceResolver; 36 | 37 | @Inject 38 | @Getter 39 | private String title; 40 | 41 | @Inject 42 | @Default(values = StringUtils.EMPTY) 43 | private String url; 44 | 45 | @Inject 46 | @Getter 47 | private String icon; 48 | 49 | @Inject 50 | @Getter 51 | @Default(booleanValues = false) 52 | private boolean nofollow; 53 | 54 | public String getUrl() { 55 | return LinkUtil.handleLink(url, resourceResolver); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /ui.frontend/src/sass/base/_reset.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | /* http://meyerweb.com/eric/tools/css/reset/ 18 | v2.0 | 20110126 19 | License: none (public domain) 20 | */ 21 | 22 | html, body, div, span, applet, object, iframe, 23 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 24 | a, abbr, acronym, address, big, cite, code, 25 | del, dfn, em, img, ins, kbd, q, s, samp, 26 | small, strike, strong, sub, sup, tt, var, 27 | b, u, i, center, 28 | dl, dt, dd, ol, ul, li, 29 | fieldset, form, label, legend, 30 | table, caption, tbody, tfoot, thead, tr, th, td, 31 | article, aside, canvas, details, embed, 32 | figure, figcaption, footer, header, hgroup, 33 | menu, nav, output, ruby, section, summary, 34 | time, mark, audio, video { 35 | margin: 0; 36 | padding: 0; 37 | border: 0; 38 | font-size: 100%; 39 | font: inherit; 40 | vertical-align: baseline; 41 | } 42 | 43 | /* HTML5 display-role reset for older browsers */ 44 | article, aside, details, figcaption, figure, 45 | footer, header, hgroup, menu, nav, section { 46 | display: block; 47 | } 48 | 49 | body { 50 | line-height: 1; 51 | } 52 | 53 | ol, ul { 54 | list-style: none; 55 | } 56 | 57 | blockquote, q { 58 | quotes: none; 59 | } 60 | 61 | blockquote:before, blockquote:after, 62 | q:before, q:after { 63 | content: ''; 64 | content: none; 65 | } 66 | 67 | table { 68 | border-collapse: collapse; 69 | border-spacing: 0; 70 | } 71 | -------------------------------------------------------------------------------- /core/src/main/java/pl/ds/howlite/components/models/CardsListComponent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components.models; 18 | 19 | import javax.inject.Inject; 20 | import lombok.Getter; 21 | import lombok.experimental.Delegate; 22 | import org.apache.sling.api.resource.Resource; 23 | import org.apache.sling.models.annotations.Default; 24 | import org.apache.sling.models.annotations.Model; 25 | import org.apache.sling.models.annotations.injectorspecific.Self; 26 | import pl.ds.howlite.components.Grid; 27 | import pl.ds.howlite.components.Styled; 28 | 29 | @Model(adaptables = Resource.class) 30 | public class CardsListComponent implements Styled, Grid { 31 | 32 | @Getter 33 | @Inject 34 | @Default(booleanValues = false) 35 | private boolean isSlider; 36 | 37 | @Getter 38 | @Inject 39 | @Default(values = "h3") 40 | private String headingLevel; 41 | 42 | @Getter 43 | @Inject 44 | @Default(values = "hl-title__heading--size-5") 45 | private String headingSize; 46 | 47 | @Getter 48 | @Inject 49 | @Default(intValues = 2) 50 | private Integer itemsPerRowSm; 51 | 52 | @Getter 53 | @Inject 54 | @Default(intValues = 2) 55 | private Integer itemsPerRowMd; 56 | 57 | @Getter 58 | @Inject 59 | @Default(intValues = 3) 60 | private Integer itemsPerRowLg; 61 | 62 | @Self 63 | @Delegate 64 | private DefaultStyledGridComponent grid; 65 | 66 | } 67 | -------------------------------------------------------------------------------- /core/src/test/java/pl/ds/howlite/components/utils/DefaultImageUtilTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Dynamic Solutions 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package pl.ds.howlite.components.utils; 18 | 19 | import static org.assertj.core.api.Assertions.assertThat; 20 | 21 | import java.util.stream.Stream; 22 | import org.junit.jupiter.params.ParameterizedTest; 23 | import org.junit.jupiter.params.provider.Arguments; 24 | import org.junit.jupiter.params.provider.MethodSource; 25 | 26 | class DefaultImageUtilTest { 27 | 28 | @ParameterizedTest 29 | @MethodSource(value = "sources") 30 | void findLastNotEmptyImage(String defaultImage, String[] sources) { 31 | 32 | //when: 33 | String chosenImage = DefaultImageUtil.chooseDefaultImage(sources); 34 | 35 | //then: 36 | assertThat(chosenImage).isEqualTo(defaultImage); 37 | } 38 | 39 | private static Stream<Arguments> sources() { 40 | return Stream.of( 41 | Arguments.of("third", new String[]{"first", "second", "third"}), 42 | Arguments.of("second", new String[]{"first", "second", ""}), 43 | Arguments.of("second", new String[]{"first", "second", null}), 44 | Arguments.of("second", new String[]{"first", "second"}), 45 | Arguments.of("first", new String[]{"first", "", ""}), 46 | Arguments.of("first", new String[]{"first"}) 47 | ); 48 | } 49 | 50 | 51 | } --------------------------------------------------------------------------------