├── blog ├── .gitkeep ├── 2024-08-28-release-notes.md ├── 2024-02-02-luigi-container.md ├── 2024-08-27-luigi-container.md ├── 2024-05-23-release-notes.md ├── 2024-04-19-release-notes.md ├── 2024-11-29-luigi-container.md └── 2025-04-23-luigi-container.md ├── .prettierignore ├── website ├── docs │ ├── .nvmrc │ ├── src │ │ ├── lib │ │ │ └── data │ │ │ │ ├── a │ │ │ │ └── ab │ │ ├── routes │ │ │ ├── +page.server.ts │ │ │ ├── docs │ │ │ │ ├── +page.svelte │ │ │ │ ├── +page.server.ts │ │ │ │ └── [slug] │ │ │ │ │ └── +page.svelte │ │ │ └── +page.svelte │ │ ├── _redirects │ │ ├── luigi-config │ │ │ ├── styles │ │ │ │ └── fonts │ │ │ │ │ └── icon-font │ │ │ │ │ ├── icon-font.eot │ │ │ │ │ ├── icon-font.ttf │ │ │ │ │ └── icon-font.woff │ │ │ └── extended │ │ │ │ └── communication.js │ │ ├── index.test.ts │ │ ├── markdown-conversion │ │ │ ├── unified-plugins │ │ │ │ └── helpers.js │ │ │ └── plugins │ │ │ │ └── buildDocsContent.js │ │ └── app.d.ts │ ├── .npmrc │ ├── public │ │ └── .gitignore │ ├── scripts │ │ └── mocks │ │ │ ├── link.md │ │ │ ├── custom-attributes.md │ │ │ ├── codeblocks.md │ │ │ ├── frontmatter-3.md │ │ │ ├── frontmatter-2.md │ │ │ ├── frontmatter.md │ │ │ ├── links.md │ │ │ ├── plain.md │ │ │ └── custom-wrappers.md │ ├── netlify.toml │ ├── robots.txt │ ├── static │ │ ├── favicon.ico │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── fonts │ │ │ │ └── icon-font │ │ │ │ ├── icon-font.eot │ │ │ │ ├── icon-font.ttf │ │ │ │ └── icon-font.woff │ │ ├── images │ │ │ ├── copy-clipboard-default.svg │ │ │ ├── icon_info.svg │ │ │ └── icon_alert.svg │ │ └── client-js │ │ │ ├── helpers.js │ │ │ └── search-tag.js │ ├── tests │ │ └── test.spec.ts │ ├── .prettierignore │ ├── tsconfig.json │ ├── .prettierrc │ ├── playwright.config.ts │ ├── .gitignore │ └── vite.config.ts ├── fiddle │ ├── .nvmrc │ ├── .node-version │ ├── public │ │ ├── img │ │ │ ├── logos │ │ │ │ ├── .gitkeep │ │ │ │ ├── logo.png │ │ │ │ └── Luigi-logo_rgb.png │ │ │ ├── luigi.ico │ │ │ ├── luigi.png │ │ │ └── luigi_green.png │ │ ├── _redirects │ │ ├── examples │ │ │ └── microfrontends │ │ │ │ └── ui5qs │ │ │ │ └── index.js │ │ ├── secureLeave.html │ │ └── themeHelper.js │ ├── .gitignore │ ├── .npmrc │ ├── src │ │ └── main.js │ ├── patch.js │ └── README.md ├── landingpage │ ├── .nvmrc │ ├── dev │ │ ├── src │ │ │ ├── data │ │ │ │ └── .gitkeep │ │ │ ├── assets │ │ │ │ ├── img │ │ │ │ │ ├── .gitkeep │ │ │ │ │ ├── favicon.png │ │ │ │ │ ├── intro_bg.png │ │ │ │ │ ├── Luigi_Diagramm.png │ │ │ │ │ ├── running_app_2x.png │ │ │ │ │ ├── burger_menu.svg │ │ │ │ │ ├── play_icon.svg │ │ │ │ │ ├── plus.svg │ │ │ │ │ ├── link-arrow.svg │ │ │ │ │ └── burger_menu_close.svg │ │ │ │ ├── scss │ │ │ │ │ ├── components │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ └── global │ │ │ │ │ │ └── _typography.scss │ │ │ │ └── fonts │ │ │ │ │ └── icon-font │ │ │ │ │ └── fonts │ │ │ │ │ ├── icon-font.eot │ │ │ │ │ ├── icon-font.ttf │ │ │ │ │ └── icon-font.woff │ │ │ ├── partials │ │ │ │ ├── .gitkeep │ │ │ │ ├── header-for-error-pages.html │ │ │ │ └── header.html │ │ │ ├── pages │ │ │ │ ├── blog │ │ │ │ │ ├── .gitignore │ │ │ │ │ └── overview.html │ │ │ │ ├── 403.html │ │ │ │ └── 404.html │ │ │ └── root-assets │ │ │ │ ├── robots.txt │ │ │ │ └── sitemap.xml │ │ ├── .bowerrc │ │ ├── .babelrc │ │ ├── CHANGELOG.md │ │ ├── .browserslistrc │ │ └── .gitignore │ ├── public │ │ ├── blog │ │ │ ├── .gitkeep │ │ │ ├── feeds │ │ │ │ └── .gitkeep │ │ │ ├── blog-chunks │ │ │ │ └── .gitkeep │ │ │ └── .gitignore │ │ ├── _redirects │ │ ├── .well-known │ │ │ └── security.txt │ │ ├── robots.txt │ │ ├── assets │ │ │ ├── img │ │ │ │ ├── favicon.png │ │ │ │ ├── intro_bg.png │ │ │ │ ├── presetui.png │ │ │ │ ├── eu-support.png │ │ │ │ ├── form-modal.png │ │ │ │ ├── from-modal.png │ │ │ │ ├── notification.png │ │ │ │ ├── role-based.png │ │ │ │ ├── securityID.png │ │ │ │ ├── Luigi_Diagramm.png │ │ │ │ ├── multi-language.png │ │ │ │ ├── running_app_2x.png │ │ │ │ ├── responsivedesign.png │ │ │ │ ├── burger_menu.svg │ │ │ │ ├── play_icon.svg │ │ │ │ ├── plus.svg │ │ │ │ ├── link-arrow.svg │ │ │ │ └── burger_menu_close.svg │ │ │ └── fonts │ │ │ │ └── icon-font │ │ │ │ └── fonts │ │ │ │ ├── icon-font.eot │ │ │ │ ├── icon-font.ttf │ │ │ │ └── icon-font.woff │ │ └── sitemap.xml │ ├── .gitignore │ └── build.sh └── slack │ └── _redirects ├── core-modular ├── src │ ├── App.svelte │ ├── main.ts │ └── utilities │ │ └── luigi-config-defaults.ts ├── README.md ├── babel.config.json ├── test │ └── tsconfig.json ├── tsconfig.json ├── public_root │ ├── README.md │ └── package.json ├── jest.config.js ├── .gitignore ├── svelte.config.cjs └── eslint.config.mjs ├── test ├── e2e-test-application │ ├── src │ │ ├── assets │ │ │ ├── .gitkeep │ │ │ ├── favicon-sap.ico │ │ │ ├── github-logo.png │ │ │ └── tabHeader.js │ │ ├── app │ │ │ ├── anonymous │ │ │ │ ├── anonymous.component.css │ │ │ │ ├── anonymous.component.html │ │ │ │ └── anonymous.component.ts │ │ │ ├── nav-sync │ │ │ │ └── nav-sync.component.css │ │ │ ├── project │ │ │ │ ├── users │ │ │ │ │ ├── users.component.css │ │ │ │ │ ├── groups │ │ │ │ │ │ ├── groups.component.css │ │ │ │ │ │ └── group-details │ │ │ │ │ │ │ ├── group-details.component.css │ │ │ │ │ │ │ └── group-settings │ │ │ │ │ │ │ └── group-settings.component.css │ │ │ │ │ ├── usersoverview │ │ │ │ │ │ ├── usersoverview.component.css │ │ │ │ │ │ ├── usersoverview.component.html │ │ │ │ │ │ └── usersoverview.component.ts │ │ │ │ │ ├── users.component.html │ │ │ │ │ └── users.component.ts │ │ │ │ ├── developers │ │ │ │ │ └── developers.component.css │ │ │ │ ├── view-group │ │ │ │ │ ├── view-group.component.css │ │ │ │ │ └── view-group.component.html │ │ │ │ ├── miscellaneous │ │ │ │ │ ├── miscellaneous.component.css │ │ │ │ │ ├── miscellaneous.component.html │ │ │ │ │ └── miscellaneous.component.ts │ │ │ │ ├── miscellaneous2 │ │ │ │ │ ├── miscellaneous2.component.css │ │ │ │ │ └── miscellaneous2.component.html │ │ │ │ ├── code-snippet │ │ │ │ │ ├── code-snippet.component.html │ │ │ │ │ ├── code-snippet.component.scss │ │ │ │ │ └── code-snippet.component.ts │ │ │ │ ├── settings │ │ │ │ │ └── settings.component.css │ │ │ │ ├── dynamic │ │ │ │ │ └── dynamic.component.css │ │ │ │ ├── default-child │ │ │ │ │ ├── dps1 │ │ │ │ │ │ ├── child-node-1.component.ts │ │ │ │ │ │ └── child-node-1.component.html │ │ │ │ │ └── dps2 │ │ │ │ │ │ └── child-node-2.component.ts │ │ │ │ ├── drawer │ │ │ │ │ └── drawer.component.scss │ │ │ │ ├── modal │ │ │ │ │ └── modal.component.scss │ │ │ │ ├── hide-side-nav │ │ │ │ │ ├── hide-side-nav.component.ts │ │ │ │ │ └── hide-side-nav.component.html │ │ │ │ ├── navigation │ │ │ │ │ ├── navigation.component.html │ │ │ │ │ └── navigation.component.ts │ │ │ │ └── project.component.scss │ │ │ ├── restricted │ │ │ │ ├── restricted.component.css │ │ │ │ ├── restricted.component.html │ │ │ │ └── restricted.component.ts │ │ │ ├── onNodeActivation │ │ │ │ ├── onNodeActivation.component.css │ │ │ │ └── onNodeActivation.component.ts │ │ │ ├── overview │ │ │ │ └── overview.component.css │ │ │ ├── app.component.html │ │ │ ├── preload │ │ │ │ └── preload.component.ts │ │ │ ├── services │ │ │ │ └── helpers.ts │ │ │ └── app.component.scss │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── typings.d.ts │ │ ├── tsconfig.app.json │ │ ├── sampleapp.html │ │ ├── tsconfig.spec.json │ │ └── main.ts │ ├── .npmrc │ ├── cypress │ │ ├── e2e │ │ │ ├── support │ │ │ │ ├── index.js │ │ │ │ └── events.js │ │ │ ├── test3 │ │ │ │ └── 0-setuptests │ │ │ │ │ └── setup-test.cy.js │ │ │ └── tests │ │ │ │ └── 1-angular │ │ │ │ └── client-support-angular.cy.js │ │ └── config │ │ │ ├── externalmf.config.js │ │ │ ├── e2e-angular-app.config.js │ │ │ └── e2e-js-app.config.js │ ├── .babelrc │ ├── webpack-extra.config.js │ ├── externalMf │ │ ├── package.json │ │ └── index.css │ └── .editorconfig ├── e2e-client-api-test-app │ ├── public │ │ ├── logo.png │ │ ├── favicon.ico │ │ ├── views │ │ │ ├── intro.html │ │ │ ├── core │ │ │ │ └── index.html │ │ │ └── container │ │ │ │ └── index.html │ │ └── index.html │ ├── .gitignore │ ├── cypress.config.js │ └── README.md ├── e2e-js-test-application │ ├── .npmrc │ ├── .gitignore │ ├── public │ │ └── secureLeave.html │ └── package.json └── e2e-client-api.sh ├── client ├── .npmignore ├── .gitignore ├── .npmrc ├── babel.config.js ├── metadata.yaml ├── src │ └── baseClass.js └── public │ ├── package.json │ └── README.md ├── core ├── examples │ ├── luigi-example-next │ │ ├── .eslintignore │ │ ├── public │ │ │ └── favicon.ico │ │ ├── pages │ │ │ ├── index.js │ │ │ ├── LuigiCoreApp.js │ │ │ ├── _app.js │ │ │ ├── home.js │ │ │ ├── sample1.js │ │ │ └── sample2.js │ │ ├── .eslintrc │ │ └── .gitignore │ ├── luigi-example-vue │ │ ├── src │ │ │ ├── app.vue │ │ │ ├── main.js │ │ │ ├── views │ │ │ │ ├── home.vue │ │ │ │ ├── sample1.vue │ │ │ │ └── sample2.vue │ │ │ └── router │ │ │ │ └── index.js │ │ ├── public │ │ │ ├── logo.png │ │ │ ├── favicon.ico │ │ │ ├── sampleapp.html │ │ │ └── index.html │ │ ├── .gitignore │ │ ├── jsconfig.json │ │ ├── package.json │ │ ├── sampleapp.html │ │ └── index.html │ ├── luigi-example-angular │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app.html │ │ │ │ ├── app.css │ │ │ │ ├── app.ts │ │ │ │ ├── app.routes.ts │ │ │ │ └── app.config.ts │ │ │ ├── styles.css │ │ │ ├── environments │ │ │ │ ├── environment.prod.ts │ │ │ │ └── environment.ts │ │ │ ├── favicon.ico │ │ │ ├── typings.d.ts │ │ │ ├── tsconfig.app.json │ │ │ ├── tsconfig.spec.json │ │ │ ├── main.ts │ │ │ └── sampleapp.html │ │ ├── webpack-extra.config.js │ │ ├── .editorconfig │ │ ├── tsconfig.json │ │ └── .gitignore │ ├── luigi-example-js │ │ ├── public │ │ │ ├── logo.png │ │ │ ├── favicon.ico │ │ │ └── views │ │ │ │ └── sample1.html │ │ ├── .gitignore │ │ ├── package.json │ │ └── README.md │ ├── luigi-sample-angular │ │ └── README.md │ ├── luigi-example-react │ │ ├── public │ │ │ ├── logo.png │ │ │ ├── favicon.ico │ │ │ └── sampleapp.html │ │ ├── src │ │ │ └── views │ │ │ │ ├── sample2.js │ │ │ │ └── sample1.js │ │ └── .gitignore │ ├── luigi-example-svelte │ │ ├── src │ │ │ ├── logo.png │ │ │ ├── favicon.ico │ │ │ ├── routes │ │ │ │ ├── Sample2.svelte │ │ │ │ ├── Sample1.svelte │ │ │ │ └── Home.svelte │ │ │ ├── main.js │ │ │ ├── mf.html │ │ │ ├── index.html │ │ │ └── App.svelte │ │ ├── .gitignore │ │ ├── webpack-common-rules.js │ │ └── README.md │ └── luigi-example-openui5 │ │ ├── webapp │ │ ├── logo.png │ │ ├── favicon.ico │ │ ├── sample1 │ │ │ ├── Sample1.controller.js │ │ │ └── index.js │ │ ├── sample2 │ │ │ ├── Sample2.controller.js │ │ │ └── index.js │ │ ├── Component.js │ │ ├── i18n │ │ │ ├── i18n.properties │ │ │ └── i18n_en.properties │ │ ├── index.html │ │ └── home │ │ │ └── Home.view.xml │ │ ├── .gitignore │ │ └── package.json ├── .npmrc ├── src │ ├── variables.scss │ ├── styles │ │ ├── fd_fiori.scss │ │ ├── fd_horizon.scss │ │ ├── _variables.scss │ │ └── _mixins.scss │ ├── utilities │ │ ├── keycode.js │ │ ├── helpers │ │ │ └── index.js │ │ ├── luigi-config-defaults.js │ │ ├── third-party-cookies-check.js │ │ └── constants.js │ ├── services │ │ ├── index.js │ │ ├── messages-listeners.js │ │ └── lifecycle-hooks.js │ ├── core-api │ │ └── baseClass.js │ └── navigation │ │ └── StatusBadge.svelte ├── babel.config.json ├── .editorconfig ├── metadata.yaml ├── jest.config.js ├── dev-tools │ └── templates │ │ └── simple │ │ ├── luigi-config.js │ │ ├── microfrontend.html │ │ └── index.html ├── public │ ├── package.json │ └── README.md ├── public_root │ ├── package.json │ └── README.md └── .gitignore ├── plugins ├── .npmignore ├── auth │ ├── public │ │ ├── auth-oidc │ │ │ ├── .gitignore │ │ │ ├── silent-callback.html │ │ │ └── package.json │ │ ├── auth-oidc-pkce │ │ │ ├── .gitignore │ │ │ ├── silent-callback.html │ │ │ └── package.json │ │ └── auth-oauth2 │ │ │ └── package.json │ └── src │ │ ├── auth-oidc │ │ └── webpack-extra.config.js │ │ ├── auth-oidc-pkce │ │ └── webpack-extra.config.js │ │ └── third-party-cookies-check.js ├── .npmrc ├── .gitignore └── .babelrc ├── logo.png ├── container ├── cypress │ ├── support │ │ └── e2e.js │ └── e2e │ │ ├── examples │ │ ├── README.md │ │ ├── simple-wc-setup.cy.js │ │ ├── simple-iframe-setup.cy.js │ │ └── simple-compound-wc-setup.cy.js │ │ └── test-app │ │ ├── compound │ │ └── README.md │ │ ├── iframe │ │ └── README.md │ │ └── wc │ │ └── README.md ├── public │ ├── LuigiContainer.js │ ├── LuigiCompoundContainer.js │ └── package.json ├── test-app │ ├── favicon.ico │ ├── iframe │ │ ├── microfrontend-allow-rules.html │ │ ├── microfrontend-defer-init.html │ │ ├── microfrontend-sandbox-rules.html │ │ └── README.md │ ├── compound │ │ ├── README.md │ │ ├── dynamic.html │ │ └── defer-init-wc │ │ │ └── compoundWCDeferInit2.js │ └── wc │ │ └── README.md ├── .npmrc ├── .prettierignore ├── src │ ├── events.ts │ ├── global.d.ts │ ├── constants │ │ └── core-api.ts │ └── services │ │ └── iframe-helpers.ts ├── test │ └── README.md ├── typings │ └── index.d.ts ├── examples │ ├── container-iframe │ │ ├── microfrontend.html │ │ └── index.html │ ├── compound-container │ │ ├── myCompoundWebComponent2.js │ │ ├── myCompoundWebComponent3.js │ │ ├── myCompoundWebComponent4.js │ │ └── myCompoundWebComponent1.js │ └── container-wc │ │ └── index.html ├── metadata.yaml ├── babel.config.js ├── tsconfig.json ├── jest.config.js ├── cypress.config.js └── .gitignore ├── scripts ├── hooks │ └── prefix-patterns.txt ├── docs │ ├── summary.hbs │ ├── examples.hbs │ ├── deprecated.hbs │ ├── since.hbs │ ├── mdHelpers.js │ └── header.hbs ├── .babelrc └── .npmrc ├── docs ├── assets │ ├── profile.jpg │ ├── tabnav.jpg │ ├── app-switcher.jpg │ ├── architecture.png │ ├── globalsearch.jpg │ ├── component_events.png │ ├── context-switcher.jpg │ ├── product-switcher.jpg │ ├── usersettingsdialog.png │ ├── component_injections.png │ ├── navigation-structure.jpg │ ├── luigi-overview-diagram.jpg │ └── usersettings-in-profile.png ├── metadata.yaml └── luigi-architecture.md ├── .npmrc ├── cra-template ├── template │ ├── public │ │ ├── logo.png │ │ ├── favicon.ico │ │ └── sampleapp.html │ ├── src │ │ └── views │ │ │ ├── sample2.js │ │ │ └── sample1.js │ └── gitignore ├── .npmrc ├── package.json └── README.md ├── client-frameworks-support ├── client-support-ui5 │ ├── .gitignore │ ├── rollup.config.js │ └── README.md ├── client-support-angular │ ├── projects │ │ ├── client-support-angular │ │ │ ├── src │ │ │ │ ├── lib │ │ │ │ │ ├── component │ │ │ │ │ │ ├── luigi.preload.component.html │ │ │ │ │ │ └── luigi.preload.component.ts │ │ │ │ │ ├── route │ │ │ │ │ │ ├── luigi-activated-route-snapshot-helper.spec.ts │ │ │ │ │ │ ├── luigi-activated-route-snapshot-helper.ts │ │ │ │ │ │ └── luigi-route-strategy.ts │ │ │ │ │ └── service │ │ │ │ │ │ └── luigi-context.service.impl.spec.ts │ │ │ │ ├── public-api.ts │ │ │ │ └── test.ts │ │ │ ├── ng-package.json │ │ │ ├── tsconfig.lib.prod.json │ │ │ ├── tslint.json │ │ │ ├── tsconfig.spec.json │ │ │ └── tsconfig.lib.json │ │ └── metadata.yaml │ ├── .npmrc │ ├── .editorconfig │ └── README.md └── testing-utilities │ ├── .npmrc │ ├── src │ └── index.ts │ ├── test │ ├── cypress │ │ └── config │ │ │ └── e2emockengine.json │ ├── cypress.config.js │ └── package.json │ ├── tsconfig.json │ ├── metadata.yaml │ └── dist │ └── package.json ├── .github ├── workflows │ ├── update-deps │ │ └── action.yml │ ├── publish_cra.yml │ └── code_checks.yml ├── pull-request-template.md ├── stale.yml └── ISSUE_TEMPLATE │ └── feature-request.md ├── REUSE.toml ├── .gitignore ├── CODEOWNERS └── eslint.config.mjs /blog/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | website -------------------------------------------------------------------------------- /website/docs/.nvmrc: -------------------------------------------------------------------------------- 1 | 20 -------------------------------------------------------------------------------- /core-modular/src/App.svelte: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/docs/src/lib/data/a: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/docs/src/lib/data/ab: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/fiddle/.nvmrc: -------------------------------------------------------------------------------- 1 | 18 2 | -------------------------------------------------------------------------------- /website/fiddle/.node-version: -------------------------------------------------------------------------------- 1 | 16 -------------------------------------------------------------------------------- /website/landingpage/.nvmrc: -------------------------------------------------------------------------------- 1 | 20 2 | -------------------------------------------------------------------------------- /website/docs/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /website/docs/src/routes/+page.server.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/docs/src/routes/docs/+page.svelte: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/fiddle/public/img/logos/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/landingpage/dev/src/data/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/landingpage/public/blog/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/docs/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /website/docs/src/routes/docs/+page.server.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/landingpage/dev/src/assets/img/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/landingpage/dev/src/partials/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/landingpage/public/blog/feeds/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/.npmignore: -------------------------------------------------------------------------------- 1 | src/ 2 | webpack* 3 | .babelrc 4 | -------------------------------------------------------------------------------- /core/examples/luigi-example-next/.eslintignore: -------------------------------------------------------------------------------- 1 | **/*.js -------------------------------------------------------------------------------- /plugins/.npmignore: -------------------------------------------------------------------------------- 1 | src/ 2 | webpack* 3 | .babelrc 4 | -------------------------------------------------------------------------------- /website/docs/src/_redirects: -------------------------------------------------------------------------------- 1 | /* /index.html 200 2 | -------------------------------------------------------------------------------- /website/landingpage/public/blog/blog-chunks/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/docs/scripts/mocks/link.md: -------------------------------------------------------------------------------- 1 | [Anchor Link](#noframework) -------------------------------------------------------------------------------- /website/landingpage/dev/src/assets/scss/components/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/landingpage/dev/src/assets/scss/global/_typography.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | public*/luigi-client* 2 | public*/luigi-element* -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/anonymous/anonymous.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/nav-sync/nav-sync.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/users/users.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/landingpage/public/_redirects: -------------------------------------------------------------------------------- 1 | /blog /blog/overview 2 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/logo.png -------------------------------------------------------------------------------- /plugins/auth/public/auth-oidc/.gitignore: -------------------------------------------------------------------------------- 1 | # vendor 2 | oidc-client.min.js -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/restricted/restricted.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /container/cypress/support/e2e.js: -------------------------------------------------------------------------------- 1 | import '@cypress/code-coverage/support'; 2 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/developers/developers.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/users/groups/groups.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/view-group/view-group.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/landingpage/dev/src/pages/blog/.gitignore: -------------------------------------------------------------------------------- 1 | *.html 2 | !overview.html -------------------------------------------------------------------------------- /plugins/auth/public/auth-oidc-pkce/.gitignore: -------------------------------------------------------------------------------- 1 | # vendor 2 | oidc-client-ts.min.js -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/onNodeActivation/onNodeActivation.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/miscellaneous/miscellaneous.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/landingpage/dev/.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "bower_components" 3 | } 4 | -------------------------------------------------------------------------------- /scripts/hooks/prefix-patterns.txt: -------------------------------------------------------------------------------- 1 | fdescribe( 2 | fit( 3 | describe.only( 4 | it.only( -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/miscellaneous2/miscellaneous2.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/docs/summary.hbs: -------------------------------------------------------------------------------- 1 | {{#if summary}} 2 | 3 | {{{inlineLinks summary}}} 4 | {{/if~}} -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/users/usersoverview/usersoverview.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/fiddle/public/_redirects: -------------------------------------------------------------------------------- 1 | /luigi-cdn/* https://www.unpkg.com/@luigi-project/:splat 200 -------------------------------------------------------------------------------- /container/public/LuigiContainer.js: -------------------------------------------------------------------------------- 1 | export { LuigiContainer as default } from './bundle.js'; 2 | -------------------------------------------------------------------------------- /website/landingpage/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # compiled files 3 | app.js* 4 | app.css 5 | public/**/*.html -------------------------------------------------------------------------------- /website/landingpage/public/blog/.gitignore: -------------------------------------------------------------------------------- 1 | # feeds 2 | *.xml 3 | *.json 4 | 5 | # files 6 | *.html -------------------------------------------------------------------------------- /core/examples/luigi-example-vue/src/app.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /docs/assets/profile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/profile.jpg -------------------------------------------------------------------------------- /docs/assets/tabnav.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/tabnav.jpg -------------------------------------------------------------------------------- /scripts/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/preset-env" 5 | ] 6 | ] 7 | } -------------------------------------------------------------------------------- /website/docs/netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | command = "npm run build" 3 | publish = "website/docs/public" -------------------------------------------------------------------------------- /core-modular/README.md: -------------------------------------------------------------------------------- 1 | # Luigi Modular Core 2 | 3 | ## Overview 4 | 5 | Luigi Core, headless, modular. WIP -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/overview/overview.component.css: -------------------------------------------------------------------------------- 1 | .clickable { 2 | cursor: pointer; 3 | } -------------------------------------------------------------------------------- /website/fiddle/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | public/bundle.* 4 | public/vendor 5 | yarn.lock 6 | -------------------------------------------------------------------------------- /container/public/LuigiCompoundContainer.js: -------------------------------------------------------------------------------- 1 | export { LuigiCompoundContainer as default } from './bundle.js'; 2 | -------------------------------------------------------------------------------- /docs/assets/app-switcher.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/app-switcher.jpg -------------------------------------------------------------------------------- /docs/assets/architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/architecture.png -------------------------------------------------------------------------------- /docs/assets/globalsearch.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/globalsearch.jpg -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/code-snippet/code-snippet.component.html: -------------------------------------------------------------------------------- 1 | {{ data }} 2 | -------------------------------------------------------------------------------- /website/docs/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | Sitemap: https://docs.luigi-project.io/sitemap.xml 4 | -------------------------------------------------------------------------------- /website/landingpage/dev/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ "@babel/preset-env" ], 3 | "compact": false 4 | } 5 | -------------------------------------------------------------------------------- /container/test-app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/container/test-app/favicon.ico -------------------------------------------------------------------------------- /website/docs/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/static/favicon.ico -------------------------------------------------------------------------------- /website/landingpage/dev/src/pages/403.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: error-pages 3 | --- 4 | 5 | {{> error-page-content}} 6 | -------------------------------------------------------------------------------- /website/landingpage/dev/src/pages/404.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: error-pages 3 | --- 4 | 5 | {{> error-page-content}} 6 | -------------------------------------------------------------------------------- /docs/assets/component_events.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/component_events.png -------------------------------------------------------------------------------- /docs/assets/context-switcher.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/context-switcher.jpg -------------------------------------------------------------------------------- /docs/assets/product-switcher.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/product-switcher.jpg -------------------------------------------------------------------------------- /docs/assets/usersettingsdialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/usersettingsdialog.png -------------------------------------------------------------------------------- /website/landingpage/dev/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## Version 1.0 (November 19, 2015) 4 | 5 | Initial release. 6 | -------------------------------------------------------------------------------- /website/landingpage/dev/src/partials/header-for-error-pages.html: -------------------------------------------------------------------------------- 1 |
{{> global-nav}}
2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | # Force quit on installing packages with local node version lower than specified in package.json 2 | engine-strict=true -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/src/app/app.html: -------------------------------------------------------------------------------- 1 |
2 | -------------------------------------------------------------------------------- /docs/assets/component_injections.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/component_injections.png -------------------------------------------------------------------------------- /docs/assets/navigation-structure.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/navigation-structure.jpg -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/app.component.html: -------------------------------------------------------------------------------- 1 |
2 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /website/fiddle/public/img/luigi.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/fiddle/public/img/luigi.ico -------------------------------------------------------------------------------- /website/fiddle/public/img/luigi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/fiddle/public/img/luigi.png -------------------------------------------------------------------------------- /core/.npmrc: -------------------------------------------------------------------------------- 1 | # Force quit on installing packages with local node version lower than specified in package.json 2 | engine-strict=true -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/src/styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 0; 3 | } 4 | 5 | .fd-panel { 6 | padding: 15px; 7 | } 8 | -------------------------------------------------------------------------------- /cra-template/template/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/cra-template/template/public/logo.png -------------------------------------------------------------------------------- /docs/assets/luigi-overview-diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/luigi-overview-diagram.jpg -------------------------------------------------------------------------------- /docs/assets/usersettings-in-profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/docs/assets/usersettings-in-profile.png -------------------------------------------------------------------------------- /plugins/.npmrc: -------------------------------------------------------------------------------- 1 | # Force quit on installing packages with local node version lower than specified in package.json 2 | engine-strict=true -------------------------------------------------------------------------------- /scripts/.npmrc: -------------------------------------------------------------------------------- 1 | # Force quit on installing packages with local node version lower than specified in package.json 2 | engine-strict=true -------------------------------------------------------------------------------- /website/docs/static/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/static/public/favicon.ico -------------------------------------------------------------------------------- /client/.npmrc: -------------------------------------------------------------------------------- 1 | # Force quit on installing packages with local node version lower than specified in package.json 2 | engine-strict=true 3 | -------------------------------------------------------------------------------- /container/.npmrc: -------------------------------------------------------------------------------- 1 | # Force quit on installing packages with local node version lower than specified in package.json 2 | engine-strict=true -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /cra-template/.npmrc: -------------------------------------------------------------------------------- 1 | # Force quit on installing packages with local node version lower than specified in package.json 2 | engine-strict=true -------------------------------------------------------------------------------- /cra-template/template/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/cra-template/template/public/favicon.ico -------------------------------------------------------------------------------- /website/fiddle/public/img/logos/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/fiddle/public/img/logos/logo.png -------------------------------------------------------------------------------- /website/fiddle/public/img/luigi_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/fiddle/public/img/luigi_green.png -------------------------------------------------------------------------------- /website/landingpage/dev/.browserslistrc: -------------------------------------------------------------------------------- 1 | # Browsers that we support 2 | last 2 versions 3 | ie >= 9 4 | ios >= 7 5 | android >= 4.4 6 | -------------------------------------------------------------------------------- /client-frameworks-support/client-support-ui5/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | vulsCount.txt 4 | 5 | dist/README.md 6 | dist/ui5-support-lib.js -------------------------------------------------------------------------------- /container/.prettierignore: -------------------------------------------------------------------------------- 1 | typings/constants/events.d.ts 2 | typings/LuigiContainer.svelte.d.ts 3 | typings/LuigiCompoundContainer.svelte.d.ts -------------------------------------------------------------------------------- /test/e2e-client-api-test-app/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/test/e2e-client-api-test-app/public/logo.png -------------------------------------------------------------------------------- /website/fiddle/.npmrc: -------------------------------------------------------------------------------- 1 | # Force quit on installing packages with local node version lower than specified in package.json 2 | engine-strict=true -------------------------------------------------------------------------------- /website/landingpage/dev/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | npm-debug.log 4 | bower_components 5 | dist 6 | *.swp 7 | .cache 8 | .idea -------------------------------------------------------------------------------- /website/landingpage/public/.well-known/security.txt: -------------------------------------------------------------------------------- 1 | Contact: https://www.sap.com/report-a-vulnerability 2 | Expires: 2026-01-30T18:29:00.000Z -------------------------------------------------------------------------------- /website/landingpage/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | Allow: /sitemap.htm 4 | Sitemap: https://luigi-project.io/sitemap.xml 5 | -------------------------------------------------------------------------------- /core/examples/luigi-example-js/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-js/public/logo.png -------------------------------------------------------------------------------- /core/examples/luigi-sample-angular/README.md: -------------------------------------------------------------------------------- 1 | We moved and renamed the luigi-sample-angular to [e2e-test-application](/test/e2e-test-application) 2 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/settings/settings.component.css: -------------------------------------------------------------------------------- 1 | .testSection { 2 | border: 2px dashed #fff; 3 | padding: 10px; 4 | } -------------------------------------------------------------------------------- /website/landingpage/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # netlify is using this file for deployment 4 | 5 | cd dev 6 | npm install 7 | npm run build 8 | -------------------------------------------------------------------------------- /core/examples/luigi-example-js/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-js/public/favicon.ico -------------------------------------------------------------------------------- /core/examples/luigi-example-react/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-react/public/logo.png -------------------------------------------------------------------------------- /core/examples/luigi-example-svelte/src/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-svelte/src/logo.png -------------------------------------------------------------------------------- /core/examples/luigi-example-vue/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-vue/public/logo.png -------------------------------------------------------------------------------- /test/e2e-client-api-test-app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/test/e2e-client-api-test-app/public/favicon.ico -------------------------------------------------------------------------------- /test/e2e-test-application/.npmrc: -------------------------------------------------------------------------------- 1 | # Force quit on installing packages with local node version lower than specified in package.json 2 | engine-strict=true -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/favicon.png -------------------------------------------------------------------------------- /container/src/events.ts: -------------------------------------------------------------------------------- 1 | export { Events as LuigiEvents } from './constants/communication'; 2 | export { LuigiEvent } from './constants/communication'; 3 | -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-angular/src/favicon.ico -------------------------------------------------------------------------------- /core/examples/luigi-example-next/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-next/public/favicon.ico -------------------------------------------------------------------------------- /core/examples/luigi-example-openui5/webapp/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-openui5/webapp/logo.png -------------------------------------------------------------------------------- /core/examples/luigi-example-svelte/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-svelte/src/favicon.ico -------------------------------------------------------------------------------- /core/examples/luigi-example-vue/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-vue/public/favicon.ico -------------------------------------------------------------------------------- /test/e2e-js-test-application/.npmrc: -------------------------------------------------------------------------------- 1 | # Force quit on installing packages with local node version lower than specified in package.json 2 | engine-strict=true -------------------------------------------------------------------------------- /website/fiddle/public/img/logos/Luigi-logo_rgb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/fiddle/public/img/logos/Luigi-logo_rgb.png -------------------------------------------------------------------------------- /website/landingpage/dev/src/assets/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/dev/src/assets/img/favicon.png -------------------------------------------------------------------------------- /website/landingpage/dev/src/assets/img/intro_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/dev/src/assets/img/intro_bg.png -------------------------------------------------------------------------------- /website/landingpage/dev/src/root-assets/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | Allow: /sitemap.htm 4 | Sitemap: https://luigi-project.io/sitemap.xml 5 | -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/intro_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/intro_bg.png -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/presetui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/presetui.png -------------------------------------------------------------------------------- /core/examples/luigi-example-openui5/webapp/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-openui5/webapp/favicon.ico -------------------------------------------------------------------------------- /core/examples/luigi-example-react/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/core/examples/luigi-example-react/public/favicon.ico -------------------------------------------------------------------------------- /scripts/docs/examples.hbs: -------------------------------------------------------------------------------- 1 | 2 | {{#examples}} 3 | **Example**{{#if caption}} *({{caption}})* {{else}} {{/if}} 4 | {{{inlineLinks example}}} 5 | {{/examples}} -------------------------------------------------------------------------------- /test/e2e-test-application/src/assets/favicon-sap.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/test/e2e-test-application/src/assets/favicon-sap.ico -------------------------------------------------------------------------------- /test/e2e-test-application/src/assets/github-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/test/e2e-test-application/src/assets/github-logo.png -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/eu-support.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/eu-support.png -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/form-modal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/form-modal.png -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/from-modal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/from-modal.png -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/notification.png -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/role-based.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/role-based.png -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/securityID.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/securityID.png -------------------------------------------------------------------------------- /client-frameworks-support/client-support-angular/projects/client-support-angular/src/lib/component/luigi.preload.component.html: -------------------------------------------------------------------------------- 1 |

2 | -------------------------------------------------------------------------------- /container/src/global.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | // This file is needed to avoid Typescript warnings about Svelte Components being imported to main.ts 3 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/users/groups/group-details/group-details.component.css: -------------------------------------------------------------------------------- 1 | .sap-icon--navigation-left-arrow::before { 2 | font-size: 11px; 3 | } -------------------------------------------------------------------------------- /website/docs/src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /website/docs/static/public/fonts/icon-font/icon-font.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/static/public/fonts/icon-font/icon-font.eot -------------------------------------------------------------------------------- /website/docs/static/public/fonts/icon-font/icon-font.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/static/public/fonts/icon-font/icon-font.ttf -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/Luigi_Diagramm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/Luigi_Diagramm.png -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/multi-language.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/multi-language.png -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/running_app_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/running_app_2x.png -------------------------------------------------------------------------------- /client-frameworks-support/testing-utilities/.npmrc: -------------------------------------------------------------------------------- 1 | # Force quit on installing packages with local node version lower than specified in package.json 2 | engine-strict=true -------------------------------------------------------------------------------- /container/cypress/e2e/examples/README.md: -------------------------------------------------------------------------------- 1 | ### Test Suite: `/examples` 2 | 3 | Tests to validate and verify our simple examples in the **/container/examples** application. -------------------------------------------------------------------------------- /website/docs/static/public/fonts/icon-font/icon-font.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/static/public/fonts/icon-font/icon-font.woff -------------------------------------------------------------------------------- /website/landingpage/dev/src/assets/img/Luigi_Diagramm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/dev/src/assets/img/Luigi_Diagramm.png -------------------------------------------------------------------------------- /website/landingpage/dev/src/assets/img/running_app_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/dev/src/assets/img/running_app_2x.png -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/responsivedesign.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/img/responsivedesign.png -------------------------------------------------------------------------------- /client-frameworks-support/testing-utilities/src/index.ts: -------------------------------------------------------------------------------- 1 | export { LuigiMockUtil } from './luigi-mock-util.js'; 2 | export { LuigiMockEngine } from './luigi-mock-engine.js'; 3 | -------------------------------------------------------------------------------- /core/examples/luigi-example-next/pages/index.js: -------------------------------------------------------------------------------- 1 | import LuigiCoreApp from './LuigiCoreApp.js'; 2 | 3 | export default function Index() { 4 | return ; 5 | } 6 | -------------------------------------------------------------------------------- /test/e2e-test-application/cypress/e2e/support/index.js: -------------------------------------------------------------------------------- 1 | // This file is processed and loaded automatically before test files. 2 | import './events'; 3 | import './commands'; 4 | -------------------------------------------------------------------------------- /client-frameworks-support/client-support-angular/.npmrc: -------------------------------------------------------------------------------- 1 | # Force quit on installing packages with local node version lower than specified in package.json 2 | engine-strict=true 3 | -------------------------------------------------------------------------------- /scripts/docs/deprecated.hbs: -------------------------------------------------------------------------------- 1 | {{#if deprecated}} 2 | {{#if since}} 3 | 4 | {{else}} 5 | 6 | **Meta**: 7 | * **deprecated:** {{{inlineLinks deprecated}}} 8 | {{/if~}} 9 | {{/if~}} -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/code-snippet/code-snippet.component.scss: -------------------------------------------------------------------------------- 1 | code { 2 | display: block; 3 | font-family: monospace; 4 | word-break: break-all; 5 | } 6 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/users/groups/group-details/group-settings/group-settings.component.css: -------------------------------------------------------------------------------- 1 | .sap-icon--navigation-left-arrow::before { 2 | font-size: 11px; 3 | } -------------------------------------------------------------------------------- /core/examples/luigi-example-js/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /public/fonts -------------------------------------------------------------------------------- /website/docs/src/luigi-config/styles/fonts/icon-font/icon-font.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/src/luigi-config/styles/fonts/icon-font/icon-font.eot -------------------------------------------------------------------------------- /website/docs/src/luigi-config/styles/fonts/icon-font/icon-font.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/src/luigi-config/styles/fonts/icon-font/icon-font.ttf -------------------------------------------------------------------------------- /website/docs/src/luigi-config/styles/fonts/icon-font/icon-font.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/docs/src/luigi-config/styles/fonts/icon-font/icon-font.woff -------------------------------------------------------------------------------- /website/landingpage/public/assets/fonts/icon-font/fonts/icon-font.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/fonts/icon-font/fonts/icon-font.eot -------------------------------------------------------------------------------- /website/landingpage/public/assets/fonts/icon-font/fonts/icon-font.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/fonts/icon-font/fonts/icon-font.ttf -------------------------------------------------------------------------------- /website/landingpage/dev/src/assets/fonts/icon-font/fonts/icon-font.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/dev/src/assets/fonts/icon-font/fonts/icon-font.eot -------------------------------------------------------------------------------- /website/landingpage/dev/src/assets/fonts/icon-font/fonts/icon-font.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/dev/src/assets/fonts/icon-font/fonts/icon-font.ttf -------------------------------------------------------------------------------- /website/landingpage/dev/src/assets/fonts/icon-font/fonts/icon-font.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/dev/src/assets/fonts/icon-font/fonts/icon-font.woff -------------------------------------------------------------------------------- /website/landingpage/public/assets/fonts/icon-font/fonts/icon-font.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luigi-project/luigi/HEAD/website/landingpage/public/assets/fonts/icon-font/fonts/icon-font.woff -------------------------------------------------------------------------------- /website/slack/_redirects: -------------------------------------------------------------------------------- 1 | / https://join.slack.com/t/luigi-project/shared_invite/enQtODA2Nzc3ODk2NzI0LTg2YWY5YTI4MzNlOGUyMmI0MGFmMGNjY2NmMmUxMDYwODgyNTRiODc0N2QxMGZiYzNiMWY2OTMwMWZkOTUyZTY 301 2 | -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /* SystemJS module definition */ 2 | // eslint-disable-next-line 3 | declare var module: NodeModule; 4 | interface NodeModule { 5 | id: string; 6 | } 7 | -------------------------------------------------------------------------------- /core/examples/luigi-example-openui5/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | #production 7 | /dist -------------------------------------------------------------------------------- /scripts/docs/since.hbs: -------------------------------------------------------------------------------- 1 | {{#if since}} 2 | 3 | **Meta**: 4 | * **since:** {{{inlineLinks since}}} 5 | {{#if deprecated}} 6 | * **deprecated:** {{{inlineLinks deprecated}}} 7 | {{/if~}} 8 | {{/if~}} 9 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /* SystemJS module definition */ 2 | // eslint-disable-next-line no-var 3 | declare var module: NodeModule; 4 | interface NodeModule { 5 | id: string; 6 | } 7 | -------------------------------------------------------------------------------- /website/docs/scripts/mocks/custom-attributes.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | > Test 5 | > Line2 6 | 7 | 8 | > Directly -------------------------------------------------------------------------------- /core-modular/src/main.ts: -------------------------------------------------------------------------------- 1 | // import './app.scss'; 2 | import { Luigi } from './core-api/luigi'; 3 | import { LuigiEngine } from './luigi-engine'; 4 | 5 | (window as any).Luigi = new Luigi(new LuigiEngine()); 6 | -------------------------------------------------------------------------------- /core/examples/luigi-example-vue/src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue'; 2 | import App from './app.vue'; 3 | import router from './router'; 4 | 5 | createApp(App) 6 | .use(router) 7 | .mount('#app'); 8 | -------------------------------------------------------------------------------- /website/docs/src/index.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from 'vitest'; 2 | 3 | describe('sum test', () => { 4 | it('adds 1 + 2 to equal 3', () => { 5 | expect(1 + 2).toBe(3); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /test/e2e-client-api-test-app/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /cypress/screenshots 6 | /public/assets/* 7 | -------------------------------------------------------------------------------- /test/e2e-test-application/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-env"], 3 | "plugins": [ 4 | "@babel/plugin-proposal-class-properties", 5 | "@babel/plugin-proposal-optional-chaining" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /plugins/.gitignore: -------------------------------------------------------------------------------- 1 | public/*/plugin.js 2 | 3 | # Ignore files generated by build 4 | auth/public/auth-oidc-pkce/*.LICENSE.txt 5 | auth/public/auth-oidc/*.LICENSE.txt 6 | auth/public/auth-oidc/oidc-client.min.js.LICENSE.txt -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/src/app/app.css: -------------------------------------------------------------------------------- 1 | $fd-scss-font-path: '~fiori-fundamentals/scss/fonts/'; 2 | $fd-icons-path: '~fiori-fundamentals/scss/icons/'; 3 | 4 | .fd-page__header { 5 | padding-left: 1.5rem; 6 | } 7 | -------------------------------------------------------------------------------- /core/src/variables.scss: -------------------------------------------------------------------------------- 1 | /* Variables and mixins declared here will be available in all other SCSS files */ 2 | /* Variables and mixins declared here will be available in all other SCSS files */ 3 | $bg1: #f4f4f4; 4 | $bg2: black; 5 | -------------------------------------------------------------------------------- /test/e2e-test-application/webpack-extra.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | devServer: { 3 | // because of 404 issue, which redirected us to sampleapp.html instead of index.html 4 | historyApiFallback: true 5 | } 6 | }; 7 | -------------------------------------------------------------------------------- /client/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function(api) { 2 | api.cache(true); 3 | const presets = ['@babel/preset-env']; 4 | const plugins = ['@babel/plugin-proposal-optional-chaining']; 5 | return { presets, plugins }; 6 | }; 7 | -------------------------------------------------------------------------------- /website/docs/scripts/mocks/codeblocks.md: -------------------------------------------------------------------------------- 1 | ```javascript 2 | const something = () => {} 3 | ``` 4 | 5 | ``` 6 | some other plain code 7 | ``` 8 | 9 | ```bash 10 | bash code 11 | ``` 12 | 13 | `inline code` should not be copied -------------------------------------------------------------------------------- /website/landingpage/dev/src/partials/header.html: -------------------------------------------------------------------------------- 1 |
2 | {{> global-nav}} 3 |
4 |
5 |
6 | -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/webpack-extra.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | devServer: { 3 | // because of 404 issue, which redirected us to sampleapp.html instead of index.html 4 | historyApiFallback: true 5 | } 6 | }; 7 | -------------------------------------------------------------------------------- /core/examples/luigi-example-svelte/src/routes/Sample2.svelte: -------------------------------------------------------------------------------- 1 |

Sample 2

2 |
3 | Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo 4 | consequat. 5 |
6 | -------------------------------------------------------------------------------- /plugins/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/preset-env" 5 | ] 6 | ], 7 | "plugins": [ 8 | "@babel/plugin-proposal-optional-chaining", 9 | "@babel/plugin-transform-runtime" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /core/babel.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/preset-env", 5 | { 6 | "targets": { 7 | "node": "current" 8 | }, 9 | "loose": true 10 | } 11 | ] 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/preload/preload.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-preload', 5 | template: '', 6 | standalone: false 7 | }) 8 | export class PreloadComponent {} 9 | -------------------------------------------------------------------------------- /website/docs/tests/test.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect, test } from '@playwright/test'; 2 | 3 | test('index page has expected title', async ({ page }) => { 4 | await page.goto('/'); 5 | await expect(page).toHaveTitle(/Documentation - Luigi/); 6 | }); 7 | -------------------------------------------------------------------------------- /website/fiddle/src/main.js: -------------------------------------------------------------------------------- 1 | import App from './App.svelte'; 2 | 3 | const app = new App({ 4 | target: document.body, 5 | props: { 6 | name: 'Luigi Fiddle' 7 | } 8 | }); 9 | 10 | window.app = app; 11 | 12 | export default app; 13 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/services/helpers.ts: -------------------------------------------------------------------------------- 1 | export const toTitleCase = (str: string = ''): string => { 2 | return str.replace(/\w\S*/g, function(txt) { 3 | return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); 4 | }); 5 | }; 6 | -------------------------------------------------------------------------------- /website/docs/.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /website/docs/src/markdown-conversion/unified-plugins/helpers.js: -------------------------------------------------------------------------------- 1 | export function prependForExport() { 2 | if (process.env.NODE_ENV == 'production') { 3 | return '/docu-microfrontend'; 4 | } else { 5 | return ''; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /container/src/constants/core-api.ts: -------------------------------------------------------------------------------- 1 | export namespace LuigiCoreApi { 2 | /** 3 | * A message emmitted from the Microfrontend when a custom message is sent 4 | */ 5 | export const SEND_CONTEXT_TO_MICROFRONTEND = 'sendContextToMicrofrontend'; 6 | } 7 | -------------------------------------------------------------------------------- /core/examples/luigi-example-svelte/src/main.js: -------------------------------------------------------------------------------- 1 | import { mount } from 'svelte'; 2 | 3 | import App from './App.svelte'; 4 | 5 | const app = mount(App, { 6 | target: document.body 7 | }); 8 | 9 | window.app = app; 10 | 11 | export default app; 12 | -------------------------------------------------------------------------------- /container/test/README.md: -------------------------------------------------------------------------------- 1 | # Luigi Container Unit-Tests 2 | 3 | These are the unit tests for the Luigi Container package. 4 | 5 | All these files are from the **container/src** folder. 6 | 7 | Please try to maintain test coverage when adding new files/functionality. -------------------------------------------------------------------------------- /core/examples/luigi-example-svelte/src/routes/Sample1.svelte: -------------------------------------------------------------------------------- 1 |

Sample 1

2 |
3 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore 4 | magna aliquyam erat, sed diam voluptua. 5 |
6 | -------------------------------------------------------------------------------- /plugins/auth/public/auth-oidc/silent-callback.html: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "baseUrl": "./", 6 | "module": "es2015", 7 | "types": ["node"] 8 | }, 9 | "exclude": [] 10 | } 11 | -------------------------------------------------------------------------------- /website/fiddle/public/examples/microfrontends/ui5qs/index.js: -------------------------------------------------------------------------------- 1 | sap.ui.define([ 2 | "sap/ui/core/mvc/XMLView" 3 | ], function (XMLView) { 4 | "use strict"; 5 | 6 | XMLView.create({viewName: "Quickstart.App"}).then(function (oView) { 7 | oView.placeAt("content"); 8 | }); 9 | }); -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/src/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "baseUrl": "./", 6 | "module": "es2015", 7 | "types": ["node"] 8 | }, 9 | "exclude": [] 10 | } 11 | -------------------------------------------------------------------------------- /plugins/auth/public/auth-oidc-pkce/silent-callback.html: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /website/docs/scripts/mocks/frontmatter-3.md: -------------------------------------------------------------------------------- 1 | 10 | # Frontmatter Testing 11 | 12 | [Link](some-file.md)
-------------------------------------------------------------------------------- /website/docs/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "esModuleInterop": true, 5 | "resolveJsonModule": true, 6 | "skipLibCheck": true, 7 | "sourceMap": true, 8 | "allowSyntheticDefaultImports": true 9 | }, 10 | } -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/burger_menu.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client-frameworks-support/client-support-angular/projects/client-support-angular/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../dist/client-support-angular", 4 | "lib": { 5 | "entryFile": "src/public-api.ts" 6 | } 7 | } -------------------------------------------------------------------------------- /core-modular/babel.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/preset-env", 5 | { 6 | "targets": { 7 | "node": "current" 8 | }, 9 | "loose": true 10 | } 11 | ], 12 | "@babel/preset-typescript" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /core/examples/luigi-example-next/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "@babel/eslint-parser", 3 | "parserOptions": { 4 | "sourceType": "module", 5 | "ecmaFeatures": { 6 | "jsx": true, 7 | "modules": true 8 | } 9 | }, 10 | "extends": ["eslint:recommended"] 11 | } -------------------------------------------------------------------------------- /website/docs/scripts/mocks/frontmatter-2.md: -------------------------------------------------------------------------------- 1 | 10 | # Frontmatter Testing 11 | 12 | [Link](some-file.md)
-------------------------------------------------------------------------------- /website/landingpage/dev/src/assets/img/burger_menu.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/docs/scripts/mocks/frontmatter.md: -------------------------------------------------------------------------------- 1 | 10 | 11 | # Frontmatter Testing 12 | 13 | [Link](some-file.md)
-------------------------------------------------------------------------------- /test/e2e-test-application/src/sampleapp.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | small web app 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /website/docs/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "plugins": ["prettier-plugin-svelte"], 7 | "pluginSearchDirs": ["."], 8 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 9 | } 10 | -------------------------------------------------------------------------------- /website/docs/src/routes/docs/[slug]/+page.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | {@html data.content} 14 | 15 | -------------------------------------------------------------------------------- /website/landingpage/dev/src/assets/img/play_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/play_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/examples/luigi-example-openui5/webapp/sample1/Sample1.controller.js: -------------------------------------------------------------------------------- 1 | sap.ui.define( 2 | ['sap/ui/core/mvc/Controller', 'luigi/demo/libs/luigi-client/luigi-client'], 3 | (Controller) => { 4 | 'use strict'; 5 | 6 | return Controller.extend('luigi.demo.sample1.Sample1', {}); 7 | } 8 | ); 9 | -------------------------------------------------------------------------------- /core/examples/luigi-example-openui5/webapp/sample2/Sample2.controller.js: -------------------------------------------------------------------------------- 1 | sap.ui.define( 2 | ['sap/ui/core/mvc/Controller', 'luigi/demo/libs/luigi-client/luigi-client'], 3 | (Controller) => { 4 | 'use strict'; 5 | 6 | return Controller.extend('luigi.demo.sample2.Sample2', {}); 7 | } 8 | ); 9 | -------------------------------------------------------------------------------- /core/examples/luigi-example-next/pages/LuigiCoreApp.js: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | 3 | export default function LuigiApp() { 4 | useEffect(() => { 5 | require('@luigi-project/core/luigi.js'); 6 | require('../public/luigi-config.js'); 7 | }, []); 8 | 9 | return null; 10 | } 11 | -------------------------------------------------------------------------------- /core/examples/luigi-example-openui5/webapp/sample1/index.js: -------------------------------------------------------------------------------- 1 | sap.ui.require(['sap/ui/core/mvc/XMLView'], (XMLView) => { 2 | 'use strict'; 3 | 4 | XMLView.create({ viewName: 'luigi.demo.sample1.Sample1' }).then(function( 5 | oView 6 | ) { 7 | oView.placeAt('content'); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /core/examples/luigi-example-openui5/webapp/sample2/index.js: -------------------------------------------------------------------------------- 1 | sap.ui.require(['sap/ui/core/mvc/XMLView'], (XMLView) => { 2 | 'use strict'; 3 | 4 | XMLView.create({ viewName: 'luigi.demo.sample2.Sample2' }).then(function( 5 | oView 6 | ) { 7 | oView.placeAt('content'); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/miscellaneous/miscellaneous.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Miscellaneous

4 |
5 |
6 | Misc content. 7 |
8 |
9 | -------------------------------------------------------------------------------- /website/docs/scripts/mocks/links.md: -------------------------------------------------------------------------------- 1 | # Links 2 | 3 | [Internal Link](some-file.md)
4 | [Internal Full Link](https://github.com/luigi-project/luigi/blob/main/docs/application-setup.md)
5 | [External Link](https://luigi-project.io)
6 | [Anchor Link](#noframework)
7 | 8 | -------------------------------------------------------------------------------- /core/src/styles/fd_fiori.scss: -------------------------------------------------------------------------------- 1 | @use '@sap-theming/theming-base-content/content/Base/baseLib/sap_fiori_3/css_variables.css'; 2 | @use 'fundamental-styles/dist/theming/sap_fiori_3.css'; 3 | 4 | // TODO: remove later, not supported in fiori_3 5 | @use './btp_tool_layout.scss'; 6 | 7 | @use './fd_base.scss'; 8 | -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /core/src/utilities/keycode.js: -------------------------------------------------------------------------------- 1 | /* istanbul ignore file */ 2 | export const KEYCODE_ARROW_UP = 38; 3 | export const KEYCODE_ARROW_DOWN = 40; 4 | export const KEYCODE_ENTER = 13; 5 | export const KEYCODE_ESC = 27; 6 | export const KEYCODE_SPACE = 32; 7 | export const KEYCODE_HOME = 36; 8 | export const KEYCODE_END = 35; 9 | -------------------------------------------------------------------------------- /website/landingpage/dev/src/assets/img/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /test/e2e-test-application/externalMf/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "luigi-external-mf", 3 | "version": "0.1.0", 4 | "description": "", 5 | "main": "index.html", 6 | "license": "MIT", 7 | "dependencies": { 8 | "@luigi-project/client": "^1.1.0", 9 | "fundamental-styles": "^0.17.0" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /container/typings/index.d.ts: -------------------------------------------------------------------------------- 1 | export { default as LuigiContainer } from './LuigiContainer.svelte'; 2 | export { default as LuigiCompoundContainer } from './LuigiCompoundContainer.svelte'; 3 | import { Events } from './constants/events'; 4 | export default Events; 5 | export type { PathExistsEvent } from './constants/event-type'; 6 | -------------------------------------------------------------------------------- /core/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /test/e2e-test-application/cypress/e2e/support/events.js: -------------------------------------------------------------------------------- 1 | Cypress.on('uncaught:exception', (err, runnable) => { 2 | // https://docs.cypress.io/api/events/catalog-of-events.html#To-turn-off-all-uncaught-exception-handling 3 | // returning false here prevents Cypress from 4 | // failing the test 5 | return false; 6 | }); 7 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/spec", 5 | "baseUrl": "./", 6 | "target": "es2020", 7 | "types": ["jasmine", "node"] 8 | }, 9 | "files": ["polyfills.ts"], 10 | "include": ["**/*.d.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /website/docs/src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | declare global { 4 | namespace App { 5 | // interface Error {} 6 | // interface Locals {} 7 | // interface PageData {} 8 | // interface Platform {} 9 | } 10 | } 11 | 12 | export {}; 13 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/dynamic/dynamic.component.css: -------------------------------------------------------------------------------- 1 | .clickable { 2 | cursor: pointer; 3 | } 4 | .sap-icon--navigation-right-arrow::before, 5 | .sap-icon--navigation-left-arrow::before { 6 | font-size: 11px; 7 | } 8 | .dynamic-component .fd-layout-panel + .fd-layout-panel { 9 | margin-top: 20px; 10 | } 11 | -------------------------------------------------------------------------------- /website/landingpage/dev/src/assets/img/link-arrow.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/link-arrow.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client-frameworks-support/testing-utilities/test/cypress/config/e2emockengine.json: -------------------------------------------------------------------------------- 1 | { 2 | "integrationFolder": "e2e/0-luigimockengine", 3 | "experimentalSourceRewriting": true, 4 | "pluginsFile": false, 5 | "chromeWebSecurity": false, 6 | "viewportWidth": 1250, 7 | "viewportHeight": 790, 8 | "baseUrl": "http://localhost:8181/" 9 | } -------------------------------------------------------------------------------- /client/metadata.yaml: -------------------------------------------------------------------------------- 1 | 2 | # DXP component metadata file 3 | 4 | kind: Component 5 | metadata: 6 | displayName: Luigi Client 7 | description: Library for building Luigi micro frontends 8 | labels: 9 | language: javascript 10 | tags: 11 | - luigi 12 | spec: 13 | type: 14 | name: ui 15 | lifecycle: production 16 | -------------------------------------------------------------------------------- /core-modular/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "include": [ 4 | "./**/*", 5 | ], 6 | "exclude": [ 7 | "node_modules/*", 8 | "__sapper__/*", 9 | "public/*" 10 | ], 11 | "compilerOptions": { 12 | "module": "ESNext", 13 | "forceConsistentCasingInFileNames": true 14 | }, 15 | } -------------------------------------------------------------------------------- /core/src/styles/fd_horizon.scss: -------------------------------------------------------------------------------- 1 | @use '@sap-theming/theming-base-content/content/Base/baseLib/sap_horizon/css_variables.css'; 2 | @use 'fundamental-styles/dist/theming/sap_horizon.css'; 3 | 4 | @use './btp_tool_layout.scss'; 5 | 6 | @use './fd_base.scss'; 7 | 8 | :root { 9 | --luigi__shellbar--height: 3.5rem; 10 | } 11 | -------------------------------------------------------------------------------- /test/e2e-test-application/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /core/metadata.yaml: -------------------------------------------------------------------------------- 1 | 2 | # DXP component metadata file 3 | 4 | kind: Component 5 | metadata: 6 | displayName: Luigi Core 7 | description: Core library for Luigi applications 8 | labels: 9 | language: javascript 10 | tags: 11 | - luigi 12 | - svelte 13 | spec: 14 | type: 15 | name: ui 16 | lifecycle: production 17 | -------------------------------------------------------------------------------- /core/src/services/index.js: -------------------------------------------------------------------------------- 1 | export * from './messages-listeners'; 2 | export * from './iframe'; 3 | export * from './preloading'; 4 | export * from './routing'; 5 | export * from './split-view'; 6 | export * from './lifecycle-hooks'; 7 | export * from './auth-store'; 8 | export * from './auth-layer'; 9 | export * from './viewurl-decorator'; 10 | -------------------------------------------------------------------------------- /test/e2e-client-api-test-app/cypress.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require('cypress'); 2 | 3 | module.exports = defineConfig({ 4 | projectId: 'czq7qc', 5 | includeShadowDom: true, 6 | e2e: { 7 | viewportWidth: 1250, 8 | viewportHeight: 790, 9 | chromeWebSecurity: false, 10 | supportFile: false 11 | } 12 | }); 13 | -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /client-frameworks-support/testing-utilities/test/cypress.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require('cypress'); 2 | 3 | module.exports = defineConfig({ 4 | e2e: { 5 | testIsolation: false, 6 | experimentalSourceRewriting: true, 7 | setupNodeEvents(on, config) { 8 | // implement node event listeners here 9 | } 10 | } 11 | }); 12 | -------------------------------------------------------------------------------- /container/cypress/e2e/test-app/compound/README.md: -------------------------------------------------------------------------------- 1 | ### Test Suite: `test-app/compound` 2 | 3 | This test suite is used to add tests for all scenarios built and served from **container/test-app/compound** application. 4 | 5 | Please add all **Luigi Compound** related tests here. 6 | 7 | Categorize tests into separate files if needed, so that it is easy to read. -------------------------------------------------------------------------------- /container/examples/container-iframe/microfrontend.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 |

This is an iframe based microfrontend container

11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /container/metadata.yaml: -------------------------------------------------------------------------------- 1 | # DXP component metadata file 2 | 3 | kind: Component 4 | metadata: 5 | displayName: Luigi Container 6 | description: Library for lightweight integration of Luigi micro frontends 7 | labels: 8 | language: typescript 9 | tags: 10 | - luigi 11 | spec: 12 | type: 13 | name: ui 14 | lifecycle: production 15 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/default-child/dps1/child-node-1.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | templateUrl: './child-node-1.component.html', 5 | standalone: false 6 | }) 7 | export class ChildNode1Component implements OnInit { 8 | constructor() {} 9 | 10 | ngOnInit() {} 11 | } 12 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/default-child/dps2/child-node-2.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | templateUrl: './child-node-2.component.html', 5 | standalone: false 6 | }) 7 | export class ChildNode2Component implements OnInit { 8 | constructor() {} 9 | 10 | ngOnInit() {} 11 | } 12 | -------------------------------------------------------------------------------- /website/landingpage/public/assets/img/burger_menu_close.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/spec", 5 | "baseUrl": "./", 6 | "module": "commonjs", 7 | "target": "es2020", 8 | "types": ["jasmine", "node"] 9 | }, 10 | "files": ["polyfills.ts"], 11 | "include": ["**/*.d.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /core/examples/luigi-example-svelte/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /public 4 | yarn.lock 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | 15 | # Editor directories and files 16 | .idea 17 | .vscode 18 | *.suo 19 | *.ntvs* 20 | *.njsproj 21 | *.sln 22 | *.sw* -------------------------------------------------------------------------------- /cra-template/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@luigi-project/cra-template-luigi-microfrontend", 3 | "license": "Apache-2.0", 4 | "version": "1.0.3", 5 | "keywords": [ 6 | "cra-template-luigi", 7 | "microfrontend", 8 | "luigi", 9 | "luigi-microfrontend" 10 | ], 11 | "scripts": {}, 12 | "dependencies": {}, 13 | "devDependencies": {} 14 | } -------------------------------------------------------------------------------- /website/docs/playwright.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from '@playwright/test'; 2 | 3 | export default defineConfig({ 4 | webServer: { 5 | command: 'npm run build && npm run core', 6 | timeout: 120 * 1000, 7 | url: 'http://localhost:4000' 8 | }, 9 | use: { 10 | baseURL: 'http://localhost:4000' 11 | }, 12 | testDir: 'tests' 13 | }); 14 | -------------------------------------------------------------------------------- /website/docs/static/images/copy-clipboard-default.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /website/landingpage/dev/src/assets/img/burger_menu_close.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client-frameworks-support/client-support-angular/projects/client-support-angular/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.lib.json", 4 | "compilerOptions": { 5 | "declarationMap": false 6 | }, 7 | "angularCompilerOptions": { 8 | "compilationMode": "partial" 9 | } 10 | } -------------------------------------------------------------------------------- /client-frameworks-support/testing-utilities/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "es6", 4 | "target": "es2017", 5 | "declaration": true, 6 | "baseUrl": ".", 7 | "outDir": "./dist", 8 | "rootDir": "./src", 9 | "moduleResolution": "node", 10 | }, 11 | "exclude": [ 12 | "node_modules", 13 | "./dist/**/*" 14 | ], 15 | } -------------------------------------------------------------------------------- /container/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function(api) { 2 | api.cache(true); 3 | const presets = [ 4 | [ 5 | '@babel/preset-env', 6 | { 7 | targets: { 8 | node: 'current' 9 | }, 10 | loose: true 11 | } 12 | ], 13 | '@babel/preset-typescript' 14 | ]; 15 | return { 16 | presets 17 | }; 18 | }; 19 | -------------------------------------------------------------------------------- /core-modular/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/svelte/tsconfig.json", 3 | "include": [ 4 | "src/**/*", 5 | "src/node_modules", 6 | ], 7 | "exclude": [ 8 | "node_modules/*", 9 | "__sapper__/*", 10 | "public/*" 11 | ], 12 | "compilerOptions": { 13 | "module": "ESNext", 14 | "forceConsistentCasingInFileNames": true, 15 | }, 16 | } -------------------------------------------------------------------------------- /test/e2e-test-application/cypress/e2e/test3/0-setuptests/setup-test.cy.js: -------------------------------------------------------------------------------- 1 | describe('Navigation', () => { 2 | beforeEach(() => { 3 | cy.visit(Cypress.env('url')); 4 | }); 5 | describe('iFrame check', () => { 6 | it('Check if iFrame exists in running application.', () => { 7 | cy.wait(5000); 8 | cy.get('iframe'); 9 | }); 10 | }); 11 | }); 12 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/users/users.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Users of {{ projectId }}

4 |
5 |
6 |
7 |

Users content.

8 |
9 |
10 |
11 | -------------------------------------------------------------------------------- /container/cypress/e2e/test-app/iframe/README.md: -------------------------------------------------------------------------------- 1 | ### Test Suite: `test-app/iframe` 2 | 3 | This is the test suite of the **container/test-app/iframe** application. The test suite is for the iframe based Luigi Container scenarios. 4 | 5 | Please add all iframe based **Luigi Container** related tests here. 6 | 7 | Categorize tests into separate files if needed, so that it is easy to read. -------------------------------------------------------------------------------- /container/cypress/e2e/test-app/wc/README.md: -------------------------------------------------------------------------------- 1 | ### Test Suite: `test-app/wc` 2 | 3 | This is the test suite of the **container/test-app/wc** application. The test suite is for the Web Component based Luigi Container scenarios. 4 | 5 | Please add all web component based **Luigi Container** related tests here. 6 | 7 | Categorize tests into separate files if needed, so that it is easy to read. -------------------------------------------------------------------------------- /core/examples/luigi-example-vue/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /cra-template/template/src/views/sample2.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const Sample2 = () => { 4 | return ( 5 |
6 |

Sample 2

7 | Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea 8 | commodo consequat. 9 |
10 | ); 11 | }; 12 | 13 | export default Sample2; 14 | -------------------------------------------------------------------------------- /test/e2e-js-test-application/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | 9 | node_modules 10 | dist 11 | dist-ssr 12 | *.local 13 | 14 | # Editor directories and files 15 | .vscode/* 16 | !.vscode/extensions.json 17 | .idea 18 | .DS_Store 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /test/e2e-test-application/externalMf/index.css: -------------------------------------------------------------------------------- 1 | .green { 2 | color: green; 3 | } 4 | 5 | .red { 6 | color: red; 7 | } 8 | 9 | .yellow { 10 | color: yellow; 11 | } 12 | 13 | .active { 14 | font-size: 30px; 15 | } 16 | 17 | .mobileBack { 18 | display: none; 19 | } 20 | 21 | @media (max-width: 600px) { 22 | .mobileBack { 23 | display: block; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/src/app/app.ts: -------------------------------------------------------------------------------- 1 | import { Component, ViewEncapsulation } from '@angular/core'; 2 | import { RouterOutlet } from '@angular/router'; 3 | 4 | @Component({ 5 | selector: 'app-root', 6 | imports: [RouterOutlet], 7 | templateUrl: './app.html', 8 | styleUrl: './app.css', 9 | encapsulation: ViewEncapsulation.None 10 | }) 11 | export class App {} 12 | -------------------------------------------------------------------------------- /website/docs/static/images/icon_info.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/examples/luigi-example-react/src/views/sample2.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const Sample2 = () => { 4 | return ( 5 |
6 |

Sample 2

7 | Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea 8 | commodo consequat. 9 |
10 | ); 11 | }; 12 | 13 | export default Sample2; 14 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/drawer/drawer.component.scss: -------------------------------------------------------------------------------- 1 | @media (max-width: 599px) { 2 | :host .fd-dialog__content:not(.fd-dialog__content--mobile) { 3 | max-width: 90%; 4 | min-width: 90%; 5 | } 6 | } 7 | 8 | @media (min-width: 600px) { 9 | .fd-dialog__content { 10 | max-width: 460px; 11 | } 12 | } 13 | 14 | .fd-dialog { 15 | z-index: 1000; 16 | } 17 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/modal/modal.component.scss: -------------------------------------------------------------------------------- 1 | @media (max-width: 599px) { 2 | :host .fd-dialog__content:not(.fd-dialog__content--mobile) { 3 | max-width: 90%; 4 | min-width: 90%; 5 | } 6 | } 7 | 8 | @media (min-width: 600px) { 9 | .fd-dialog__content { 10 | max-width: 460px; 11 | } 12 | } 13 | 14 | .fd-dialog { 15 | z-index: 1000; 16 | } 17 | -------------------------------------------------------------------------------- /website/docs/src/luigi-config/extended/communication.js: -------------------------------------------------------------------------------- 1 | class Communication { 2 | customMessagesListeners = { 3 | 'search.tag.keyword': (customMessage, mfObject, mfNodeObj) => { 4 | Luigi.globalSearch().openSearchField(); 5 | Luigi.globalSearch().setSearchString(customMessage.keyword); 6 | } 7 | } 8 | } 9 | 10 | export const communication = new Communication(); 11 | -------------------------------------------------------------------------------- /client-frameworks-support/client-support-ui5/rollup.config.js: -------------------------------------------------------------------------------- 1 | import copy from 'rollup-plugin-copy'; 2 | export default { 3 | input: 'src/ui5-support-lib.js', 4 | output: { 5 | file: 'dist/ui5-support-lib.js', 6 | format: 'es', 7 | compact: true 8 | }, 9 | plugins: [ 10 | copy({ 11 | targets: [{ src: 'src/README.md', dest: 'dist' }] 12 | }) 13 | ] 14 | }; 15 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/hide-side-nav/hide-side-nav.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-hide-side-nav', 5 | templateUrl: './hide-side-nav.component.html', 6 | standalone: false 7 | }) 8 | export class HideSideNavComponent implements OnInit { 9 | constructor() {} 10 | 11 | ngOnInit() {} 12 | } 13 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/users/usersoverview/usersoverview.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Usersoverview

4 |
5 |
6 |
7 |

Users overview works.

8 |
9 |
10 |
11 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/restricted/restricted.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

5 | Restricted Area 6 |

7 |

This page is visible to you.

8 |
9 |
10 |
11 | -------------------------------------------------------------------------------- /core/examples/luigi-example-next/pages/_app.js: -------------------------------------------------------------------------------- 1 | import Head from 'next/head'; 2 | 3 | function MyApp({ Component, pageProps }) { 4 | return ( 5 | <> 6 | 7 | 8 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/users/usersoverview/usersoverview.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-usersoverview', 5 | templateUrl: './usersoverview.component.html', 6 | styleUrls: ['./usersoverview.component.css'], 7 | standalone: false 8 | }) 9 | export class UsersoverviewComponent implements OnInit { 10 | constructor() {} 11 | 12 | ngOnInit() {} 13 | } 14 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // The file contents for the current environment will overwrite these during build. 2 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do 3 | // `ng build --env=prod` then `environment.prod.ts` will be used instead. 4 | // The list of which env maps to which file can be found in `.angular-cli.json`. 5 | 6 | export const environment = { 7 | production: false 8 | }; 9 | -------------------------------------------------------------------------------- /container/test-app/compound/README.md: -------------------------------------------------------------------------------- 1 | # luigi-compound-container Based e2e Test App 2 | 3 | This folder contains simple HTML files that use **luigi-compound-container** in different scenarios. 4 | 5 | They serve as a testing environment for our Cypress tests, which reside in the `container/cypress/e2e` folder. 6 | 7 | We try to keep the examples simple and apply separation of concerns. We use plain JS and HTML files to avoid maintaining yet another framework example. 8 | 9 | -------------------------------------------------------------------------------- /container/test-app/iframe/README.md: -------------------------------------------------------------------------------- 1 | # Iframe Based Luigi Container e2e Test App 2 | 3 | This folder contains simple HTML files that use **iframe** based luigi-container in different scenarios. 4 | 5 | They serve as a testing environment for our Cypress tests, which reside in the container/cypress/e2e folder. 6 | 7 | We try to keep our examples simple and apply separation of concerns. We use plain JS and HTML files to avoid maintaining yet another framework example. 8 | 9 | -------------------------------------------------------------------------------- /plugins/auth/src/auth-oidc/webpack-extra.config.js: -------------------------------------------------------------------------------- 1 | const CopyWebpackPlugin = require('copy-webpack-plugin'); 2 | 3 | const pluginRoot = __dirname + '/../../../'; 4 | module.exports = { 5 | plugins: [ 6 | new CopyWebpackPlugin({ 7 | patterns: [ 8 | { 9 | from: pluginRoot + 'node_modules/oidc-client/dist/oidc-client.min.js', 10 | to: pluginRoot + 'auth/public/auth-oidc' 11 | } 12 | ] 13 | }) 14 | ] 15 | }; 16 | -------------------------------------------------------------------------------- /container/test-app/compound/dynamic.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 10 |

This page is used to test Compound-Container dynamic creation

11 | 12 | 13 |
14 | 15 | 16 | -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // The file contents for the current environment will overwrite these during build. 2 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do 3 | // `ng build --env=prod` then `environment.prod.ts` will be used instead. 4 | // The list of which env maps to which file can be found in `.angular-cli.json`. 5 | 6 | export const environment = { 7 | production: false 8 | }; 9 | -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { bootstrapApplication } from '@angular/platform-browser'; 3 | 4 | import { App } from './app/app'; 5 | import { appConfig } from './app/app.config'; 6 | import { environment } from './environments/environment'; 7 | 8 | if (environment.production) { 9 | enableProdMode(); 10 | } 11 | 12 | bootstrapApplication(App, appConfig).catch((err) => console.error(err)); 13 | -------------------------------------------------------------------------------- /container/test-app/wc/README.md: -------------------------------------------------------------------------------- 1 | # Web Component Based luigi-container e2e Test App 2 | 3 | This folder contains simple HTML files that use **Web Component** based luigi-container in different scenarios. 4 | 5 | They serve as a testing environment for our Cypress tests, which reside in the container/cypress/e2e folder. 6 | 7 | We try to keep our examples simple and apply separation of concerns. We use plain JS and HTML files to avoid maintaining yet another framework example. 8 | 9 | -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/src/sampleapp.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | small web app 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /core/examples/luigi-example-openui5/webapp/Component.js: -------------------------------------------------------------------------------- 1 | sap.ui.define(['sap/ui/core/UIComponent'], (UIComponent) => { 2 | 'use strict'; 3 | 4 | return UIComponent.extend('luigi.demo.Component', { 5 | metadata: { 6 | interfaces: ['sap.ui.core.IAsyncContentCreation'], 7 | manifest: 'json', 8 | }, 9 | 10 | init() { 11 | UIComponent.prototype.init.apply(this, arguments); 12 | this.getRouter().initialize(); 13 | } 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /core/jest.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('jest').Config} */ 2 | const config = { 3 | collectCoverage: true, 4 | collectCoverageFrom: ['src/**/*.{js,mjs,ts,svelte}', '!**/node_modules/**', '!**/vendor/**', '!**/*.spec.{js,ts}'], 5 | roots: ['test'], 6 | testEnvironment: 'jsdom', 7 | transform: { 8 | '\\.[jt]sx?$': 'babel-jest' 9 | }, 10 | transformIgnorePatterns: ['/node_modules/(?!(svelte)/)'], 11 | verbose: true 12 | }; 13 | 14 | module.exports = config; 15 | -------------------------------------------------------------------------------- /client-frameworks-support/client-support-angular/projects/client-support-angular/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../../out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts", 12 | ], 13 | "include": [ 14 | "**/*.spec.ts", 15 | "**/*.d.ts" 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/onNodeActivation/onNodeActivation.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { linkManager } from '@luigi-project/client'; 3 | 4 | @Component({ 5 | selector: 'app-on-node-activation', 6 | templateUrl: './onNodeActivation.component.html', 7 | styleUrls: ['./onNodeActivation.component.css'], 8 | standalone: false 9 | }) 10 | export class OnNodeActivationComponent { 11 | public linkManager = linkManager; 12 | } 13 | -------------------------------------------------------------------------------- /website/fiddle/patch.js: -------------------------------------------------------------------------------- 1 | console.log('Patching luigi core js'); 2 | 3 | const replace = require('replace-in-file'); 4 | const options = { 5 | files: 'node_modules/@luigi-project/core/luigi.js', 6 | from: 'import(e)', 7 | to: 'import(/* webpackIgnore: true */ e)' 8 | }; 9 | 10 | try { 11 | const results = replace.sync(options); 12 | console.log('Replacement results:', results); 13 | } catch (error) { 14 | console.error('Error occurred:', error); 15 | } 16 | -------------------------------------------------------------------------------- /client-frameworks-support/client-support-angular/projects/metadata.yaml: -------------------------------------------------------------------------------- 1 | # DXP component metadata file 2 | 3 | kind: Component 4 | metadata: 5 | displayName: Luigi Client Support for angular 6 | description: This library contains angular services and components for easier integration with Luigi micro frontend framework 7 | labels: 8 | language: typescript 9 | tags: 10 | - luigi 11 | - angular 12 | spec: 13 | type: 14 | name: ui 15 | lifecycle: production 16 | -------------------------------------------------------------------------------- /container/cypress.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require('cypress'); 2 | 3 | module.exports = defineConfig({ 4 | projectId: 'czq7qc', 5 | includeShadowDom: true, 6 | e2e: { 7 | viewportWidth: 1250, 8 | viewportHeight: 790, 9 | chromeWebSecurity: false, 10 | supportFile: 'cypress/support/e2e.js', 11 | setupNodeEvents(on, config) { 12 | require('@cypress/code-coverage/task')(on, config); 13 | 14 | return config; 15 | } 16 | } 17 | }); 18 | -------------------------------------------------------------------------------- /website/docs/src/markdown-conversion/plugins/buildDocsContent.js: -------------------------------------------------------------------------------- 1 | import { writeFileSync } from 'fs'; 2 | import path from 'path'; 3 | import { getParsedDocs } from './parser.js'; 4 | 5 | getParsedDocs().then(function(a) { 6 | var __dirname = path.resolve(); 7 | var dataFolder = __dirname + '/src/lib/data'; 8 | var docsFilePath = dataFolder + '/docs.json'; 9 | writeFileSync(docsFilePath, JSON.stringify(a)); 10 | }); 11 | console.log('Generating docs.json file to save to '); 12 | -------------------------------------------------------------------------------- /container/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | 3 | /examples/bundle.js 4 | /examples/bundle.js.map 5 | /public/bundle.js 6 | /public/bundle.js.map 7 | /public/bundle.d.ts 8 | /public/bundle.d.ts.map 9 | /test-app/bundle.js 10 | /test-app/bundle.js.map 11 | /test-app/compound/luigi-element.js 12 | /test-app/iframe/luigi-client.js 13 | /public/**/*.ts 14 | /public/constants/events.js 15 | 16 | /coverage 17 | /e2e-coverage 18 | /instrumented 19 | /.nyc_output 20 | /coverage-summary/index.html 21 | .DS_Store 22 | -------------------------------------------------------------------------------- /scripts/docs/mdHelpers.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Returns simplified name without prefixes. 3 | * 4 | * @param {string} name - orgiginal name 5 | * @returns {string} parsed name 6 | */ 7 | function parseName(name) { 8 | if (!name) { 9 | return ''; 10 | } 11 | 12 | if (name.includes('#')) { 13 | name = name.substring(name.indexOf('#') + 1); 14 | } 15 | 16 | return name.replace('\\_this.', '').replace('\\_proto.', '').replace('exports.', ''); 17 | } 18 | 19 | module.exports = { parseName }; 20 | -------------------------------------------------------------------------------- /client-frameworks-support/testing-utilities/metadata.yaml: -------------------------------------------------------------------------------- 1 | # DXP component metadata file 2 | # For more information, please see: 3 | # https://sap.live.dxp.k8s.ondemand.com/projects/dxp/documentation/Using-DXP/Add-an-existing-component 4 | 5 | kind: Component 6 | metadata: 7 | displayName: Luigi Testing Utilities 8 | description: Micro frontend framework 9 | labels: 10 | language: # javascript 11 | tags: 12 | - Testing 13 | spec: 14 | type: 15 | name: ui 16 | lifecycle: production 17 | -------------------------------------------------------------------------------- /client/src/baseClass.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @private 3 | * @abstract 4 | */ 5 | export class LuigiClientBase { 6 | /** 7 | * @private 8 | */ 9 | constructor() { 10 | this.promises = {}; 11 | } 12 | /** 13 | * Returns the promises object 14 | * @private 15 | */ 16 | setPromise(name, value) { 17 | this.promises[name] = value; 18 | } 19 | /** 20 | * Sets the promises object 21 | * @private 22 | */ 23 | getPromise(name) { 24 | return this.promises[name]; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /core/examples/luigi-example-next/pages/home.js: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import Head from 'next/head'; 3 | 4 | export default function Home() { 5 | useEffect(() => { 6 | const LuigiClient = window['LuigiClient']; 7 | LuigiClient.addInitListener(() => { 8 | console.log('Luigi Initialized'); 9 | }); 10 | }, []); 11 | 12 | return ( 13 | <> 14 | 15 |
16 |

Welcome to Luigi with Next.js

17 |
18 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /client-frameworks-support/client-support-angular/projects/client-support-angular/src/public-api.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Public API Surface of client-support-angular 3 | */ 4 | 5 | export * from './lib/component/luigi.preload.component'; 6 | export * from './lib/luigi.angular.support.module'; 7 | export * from './lib/service/luigi-context-service'; 8 | export * from './lib/service/luigi-context.service.impl'; 9 | export * from './lib/service/luigi-auto-routing.service'; 10 | export * from './lib/luigi-mock/luigi-mock.module'; 11 | -------------------------------------------------------------------------------- /core/src/utilities/helpers/index.js: -------------------------------------------------------------------------------- 1 | export * from './async-helpers'; 2 | export * from './auth-helpers'; 3 | export * from './escaping-helpers'; 4 | export * from './generic-helpers'; 5 | export * from './iframe-helpers'; 6 | export * from './navigation-helpers'; 7 | export * from './routing-helpers'; 8 | export * from './state-helpers'; 9 | export * from './event-listener-helpers'; 10 | export * from './storage-helper'; 11 | export * from './usersetting-dialog-helpers'; 12 | export * from './global-search-helpers'; 13 | -------------------------------------------------------------------------------- /blog/2024-02-02-luigi-container.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Luigi Container v1.1 3 | seoMetaDescription: Release notes for Luigi Container v1.1 4 | author: 5 | - Johannes Doberer 6 | layout: blog 7 | --- 8 | 9 | You can read about the new features in Luigi Container v1.1 in the release notes below. 10 | 11 | 12 | 13 | #### Bugfixes 14 | 15 | With this release, we prevent browser history changes from Luigi client on context update. [changelog](https://github.com/luigi-project/luigi/releases/tag/container%2Fv1.1.0). -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/hide-side-nav/hide-side-nav.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Nothing to see here

4 |
5 |
6 |
7 |

8 | But you should notice there's no left navigation 9 | 10 |

11 |
12 |
13 |
14 | -------------------------------------------------------------------------------- /core-modular/public_root/README.md: -------------------------------------------------------------------------------- 1 | # Luigi Modular Core 2 | 3 | ## Overview 4 | 5 | Luigi Core, headless, modular. 6 | 7 | This is an early version and not yet recommended for production use. 8 | 9 | For details on Luigi Core, see [this](https://github.com/luigi-project/luigi/tree/main/core) document. 10 | 11 | If you want to try Luigi out, see the [examples](https://github.com/luigi-project/luigi/tree/main/core/examples). 12 | 13 | For documentation on Luigi Core, see [Luigi documentation](https://docs.luigi-project.io). 14 | -------------------------------------------------------------------------------- /core/dev-tools/templates/simple/luigi-config.js: -------------------------------------------------------------------------------- 1 | Luigi.setConfig({ 2 | navigation: { 3 | nodes: [{ 4 | pathSegment: 'home', 5 | hideFromNav: true, 6 | hideSideNav: true, 7 | loadingIndicator: { 8 | enabled: false 9 | }, 10 | viewUrl: '/microfrontend.html' 11 | }], 12 | }, 13 | settings: { 14 | responsiveNavigation: 'Fiori3', 15 | header: { 16 | title: 'Luigi Simple Dev' 17 | } 18 | } 19 | }); 20 | -------------------------------------------------------------------------------- /core/examples/luigi-example-svelte/src/mf.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Svelte Micro Frontend 6 | 7 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core'; 2 | import { provideRouter, withHashLocation } from '@angular/router'; 3 | 4 | import { routes } from './app.routes'; 5 | 6 | export const appConfig: ApplicationConfig = { 7 | providers: [ 8 | provideBrowserGlobalErrorListeners(), 9 | provideZoneChangeDetection({ eventCoalescing: true }), 10 | provideRouter(routes, withHashLocation()) 11 | ] 12 | }; 13 | -------------------------------------------------------------------------------- /plugins/auth/src/auth-oidc-pkce/webpack-extra.config.js: -------------------------------------------------------------------------------- 1 | const CopyWebpackPlugin = require('copy-webpack-plugin'); 2 | const path = require('path'); 3 | 4 | const pluginRoot = path.join(__dirname, '/../../../'); 5 | 6 | module.exports = { 7 | plugins: [ 8 | new CopyWebpackPlugin({ 9 | patterns: [ 10 | { 11 | from: pluginRoot + 'node_modules/oidc-client-ts/dist/browser/oidc-client-ts.min.js', 12 | to: pluginRoot + 'auth/public/auth-oidc-pkce' 13 | } 14 | ] 15 | }) 16 | ] 17 | }; 18 | -------------------------------------------------------------------------------- /core/examples/luigi-example-js/public/views/sample1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 |
12 |

Sample 1

13 |
14 |
15 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 16 | tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 17 |
18 | 19 | 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # npm 2 | node_modules 3 | 4 | 5 | # IDEs 6 | .idea 7 | .angulardoc.json 8 | .vscode/diff 9 | .vscode/settings.json 10 | .vs 11 | 12 | .changelog 13 | 14 | # temporary files and folders 15 | tmp-* 16 | container/cypress/videos 17 | container/cypress/screenshots 18 | 19 | # WhiteSource 20 | whitesource.config.json 21 | plugin*.js 22 | core/dev-tools/latest_build.log 23 | core/dev-tools/simple-app* 24 | core-modular/dev-tools/simple-app* 25 | /full_eslint_report.html 26 | test/e2e-test-application/cypress/screenshots 27 | **/.DS_Store 28 | -------------------------------------------------------------------------------- /core/examples/luigi-example-next/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env* 29 | 30 | # vercel 31 | .vercel 32 | 33 | public/core 34 | public/luigi-client.js -------------------------------------------------------------------------------- /website/fiddle/README.md: -------------------------------------------------------------------------------- 1 | [![Netlify Status](https://api.netlify.com/api/v1/badges/6e36180d-2486-4daf-80a5-90a0ab363992/deploy-status)](https://app.netlify.com/sites/relaxed-kowalevski-49f468/deploys) 2 | 3 | Luigi Fiddle, deployed via Netlify and accessible at https://fiddle.luigi-project.io. 4 | The Fiddle allows you to see Luigi in action and configure a sample application. 5 | 6 | ### Install Luigi Fiddle on your machine 7 | 8 | Run the `npm install` command in the root folder to install it. 9 | 10 | ### Run fiddle locally 11 | `npm run dev` 12 | -------------------------------------------------------------------------------- /website/fiddle/public/secureLeave.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Luigi Fiddle 8 | 9 | 10 | 11 | 12 | 13 | 18 | 19 | -------------------------------------------------------------------------------- /test/e2e-test-application/cypress/e2e/tests/1-angular/client-support-angular.cy.js: -------------------------------------------------------------------------------- 1 | describe('Client-support-angular-lib', () => { 2 | describe('context', () => { 3 | it('getContextAsync', () => { 4 | cy.visitLoggedIn('/projects/pr1/developers'); 5 | cy.getIframeBody().then($iframeBody => { 6 | cy.wrap($iframeBody) 7 | .find('.contextAsyncBtn') 8 | .click(); 9 | cy.wrap($iframeBody) 10 | .find('.contextAsync') 11 | .contains('pr1'); 12 | }); 13 | }); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /website/docs/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import { defineConfig } from 'vitest/config'; 3 | 4 | export default defineConfig({ 5 | plugins: [sveltekit()], 6 | css: { 7 | preprocessorOptions: { 8 | scss: { 9 | api: 'modern-compiler' 10 | } 11 | } 12 | }, 13 | test: { 14 | include: ['src/**/*.{test,spec}.{js,ts}'] 15 | }, 16 | build: { 17 | chunkSizeWarningLimit: 900000 18 | }, 19 | server: { 20 | watch: { 21 | usePolling: true 22 | } 23 | } 24 | }); 25 | -------------------------------------------------------------------------------- /core-modular/src/utilities/luigi-config-defaults.ts: -------------------------------------------------------------------------------- 1 | export const TOP_NAV_DEFAULTS = { 2 | logout: { 3 | label: 'Sign Out', 4 | icon: 'log' 5 | }, 6 | userSettingsProfileMenuEntry: { 7 | label: 'Settings', 8 | icon: 'settings' 9 | }, 10 | userSettingsDialog: { 11 | dialogHeader: 'User Settings', 12 | saveBtn: 'Save', 13 | dismissBtn: 'Cancel' 14 | }, 15 | globalSearchCenteredCancelButton: 'Cancel' 16 | }; 17 | 18 | export const NAVIGATION_DEFAULTS = { 19 | externalLink: { 20 | sameWindow: false 21 | } 22 | }; 23 | -------------------------------------------------------------------------------- /core/dev-tools/templates/simple/microfrontend.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 16 | 17 | 18 | 19 |
20 |

Luigi Simple Development Template

21 |

Some content

22 |
23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /core/examples/luigi-example-svelte/src/routes/Home.svelte: -------------------------------------------------------------------------------- 1 | 16 | 17 |

Home

18 |
19 | {message} 20 |
21 | -------------------------------------------------------------------------------- /core/src/core-api/baseClass.js: -------------------------------------------------------------------------------- 1 | /* istanbul ignore file */ 2 | 3 | /** 4 | * @private 5 | * @abstract 6 | */ 7 | export class LuigiCoreAPIBase { 8 | /** 9 | * @private 10 | */ 11 | constructor() { 12 | this.promises = {}; 13 | } 14 | /** 15 | * Returns the promises object 16 | * @private 17 | */ 18 | setPromise(name, value) { 19 | this.promises[name] = value; 20 | } 21 | /** 22 | * Sets the promises object 23 | * @private 24 | */ 25 | getPromise(name) { 26 | return this.promises[name]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /blog/2024-08-27-luigi-container.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Luigi Container v1.3 3 | seoMetaDescription: Release notes for Luigi Container v1.3 4 | author: 5 | - Johannes Doberer 6 | layout: blog 7 | --- 8 | 9 | You can read about the new features in Luigi Container v1.3 in the release notes below. 10 | 11 | 12 | 13 | #### Improving context updating method 14 | 15 | With this release we improved the context updating method in compound container. 16 | 17 | See our [changelog](https://github.com/luigi-project/luigi/releases/tag/container%2Fv1.3.0). 18 | -------------------------------------------------------------------------------- /client/public/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@luigi-project/client", 3 | "description": "Javascript library supporting consumers of the Luigi framework", 4 | "license": "Apache-2.0", 5 | "main": "luigi-client.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "ssh://github.com/luigi-project/luigi.git" 9 | }, 10 | "publishConfig": { 11 | "tag": "luigi-client" 12 | }, 13 | "keywords": [ 14 | "luigi", 15 | "UI", 16 | "extensibility", 17 | "micro-frontends", 18 | "microfrontends" 19 | ], 20 | "version": "2.26.0" 21 | } -------------------------------------------------------------------------------- /core/examples/luigi-example-openui5/webapp/i18n/i18n.properties: -------------------------------------------------------------------------------- 1 | # App Descriptor 2 | appTitle=Luigi OpenUI5 3 | appDescription=A simple app that showcases Luigi Framework applied to OpenUI5 4 | 5 | homeTitle=Home 6 | sample1Title=Sample 1 7 | sample1Text=Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 8 | sample2Title=Sample 2 9 | sample2Text=Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. -------------------------------------------------------------------------------- /core/examples/luigi-example-openui5/webapp/i18n/i18n_en.properties: -------------------------------------------------------------------------------- 1 | # App Descriptor 2 | appTitle=Luigi OpenUI5 3 | appDescription=A simple app that showcases Luigi Framework applied to OpenUI5 4 | 5 | homeTitle=Home 6 | sample1Title=Sample 1 7 | sample1Text=Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 8 | sample2Title=Sample 2 9 | sample2Text=Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. -------------------------------------------------------------------------------- /core/public/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@luigi-project/core", 3 | "description": "Javascript library supporting consumers of the Luigi framework", 4 | "license": "Apache-2.0", 5 | "main": "luigi.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "ssh://github.com/luigi-project/luigi.git" 9 | }, 10 | "publishConfig": { 11 | "tag": "luigi" 12 | }, 13 | "keywords": [ 14 | "luigi", 15 | "core", 16 | "UI", 17 | "extensibility", 18 | "micro-frontends", 19 | "microfrontends" 20 | ], 21 | "version": "2.26.0" 22 | } -------------------------------------------------------------------------------- /plugins/auth/public/auth-oauth2/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@luigi-project/plugin-auth-oauth2", 3 | "description": "OAuth2 implicit grant provider plugin for @luigi-project/core", 4 | "license": "Apache-2.0", 5 | "main": "plugin.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "ssh://github.com/luigi-project/luigi.git" 9 | }, 10 | "publishConfig": { 11 | "tag": "luigi-plugin-auth-oauth2" 12 | }, 13 | "keywords": [ 14 | "luigi", 15 | "core", 16 | "oauth2", 17 | "provider" 18 | ], 19 | "version": "2.26.0" 20 | } -------------------------------------------------------------------------------- /test/e2e-client-api.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e # exit on errors 4 | BASE_DIR="$( cd "$(dirname "$0")" ; pwd -P )" 5 | 6 | source $BASE_DIR/../scripts/shared/bashHelpers.sh 7 | 8 | echo "" 9 | echo "Client API Test App" 10 | cd "$BASE_DIR/e2e-client-api-test-app" 11 | killWebserver 3000 12 | npm run start & 13 | WS_FID_PID=$! 14 | 15 | NG_EXAMPLE="$BASE_DIR/../test/e2e-client-api-test-app" 16 | 17 | cd $NG_EXAMPLE 18 | echo "Running tests without parallelization" 19 | npm run cypress-headless 20 | 21 | RV=$? 22 | kill $WS_FID_PID 23 | exit $RV 24 | -------------------------------------------------------------------------------- /website/landingpage/dev/src/pages/blog/overview.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: Overview 3 | seoMetaDescription: This is the Luigi blog. 4 | layout: blog 5 | --- 6 | 7 | {{{ blogentries }}} 8 | 9 |
10 |
11 | 12 |
13 | 17 |
18 | -------------------------------------------------------------------------------- /core/public_root/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@luigi-project/core", 3 | "description": "Javascript library supporting consumers of the Luigi framework", 4 | "license": "Apache-2.0", 5 | "main": "luigi.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "ssh://github.com/luigi-project/luigi.git" 9 | }, 10 | "publishConfig": { 11 | "tag": "luigi" 12 | }, 13 | "keywords": [ 14 | "luigi", 15 | "core", 16 | "UI", 17 | "extensibility", 18 | "micro-frontends", 19 | "microfrontends" 20 | ], 21 | "version": "2.26.0" 22 | } -------------------------------------------------------------------------------- /plugins/auth/public/auth-oidc/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@luigi-project/plugin-auth-oidc", 3 | "description": "OpenID Connect provider plugin for @luigi-project/core", 4 | "license": "Apache-2.0", 5 | "main": "plugin.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "ssh://github.com/luigi-project/luigi.git" 9 | }, 10 | "publishConfig": { 11 | "tag": "luigi-plugin-auth-oidc" 12 | }, 13 | "keywords": [ 14 | "luigi", 15 | "core", 16 | "oidc", 17 | "openid connect", 18 | "provider" 19 | ], 20 | "version": "2.26.0" 21 | } -------------------------------------------------------------------------------- /.github/workflows/publish_cra.yml: -------------------------------------------------------------------------------- 1 | on: workflow_dispatch 2 | name: Publish Create React App (CRA) template 3 | env: 4 | NPM_LUI_AUTH_TOKEN: ${{ secrets.NPM_LUI_AUTH_TOKEN }} 5 | 6 | jobs: 7 | publish: 8 | runs-on: ubuntu-latest 9 | if: github.ref_name == 'main' 10 | steps: 11 | - uses: actions/checkout@v4 12 | - uses: actions/setup-node@v4 13 | with: 14 | node-version: '20.19.0' 15 | - run: echo "//registry.npmjs.org/:_authToken=$NPM_LUI_AUTH_TOKEN" > ~/.npmrc 16 | - run: bash ./scripts/npmPublish.sh cra-release -------------------------------------------------------------------------------- /core-modular/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = async () => { 2 | return { 3 | verbose: true, 4 | testEnvironment: 'jsdom', 5 | roots: ['test'], 6 | collectCoverage: true, 7 | transform: { 8 | '\\.[jt]sx?$': 'babel-jest' 9 | }, 10 | transformIgnorePatterns: ['/node_modules/(?!(svelte)/)'], 11 | collectCoverageFrom: ['src/**/*.{js,mjs,ts,svelte}', '!**/node_modules/**', '!**/vendor/**', '!**/*.spec.{js,ts}'], 12 | moduleNameMapper: { 13 | '^@luigi-project/container$': '/test/mocks/container.ts' 14 | } 15 | }; 16 | }; 17 | -------------------------------------------------------------------------------- /cra-template/README.md: -------------------------------------------------------------------------------- 1 | # Luigi Project Create React App Microfrontend Template 2 | 3 | The [SAP Luigi](https://luigi-project.io/) template for [Create React App](https://github.com/facebook/create-react-app) 4 | 5 | ## Usage 6 | 7 | To use this template within your project, add `--template @luigi-project/luigi-microfrontend` when creating a new app. 8 | 9 | For example: 10 | 11 | ```sh 12 | npx create-react-app my-app --template @luigi-project/luigi-microfrontend 13 | 14 | # or 15 | 16 | yarn create react-app my-app --template @luigi-project/luigi-microfrontend 17 | ``` 18 | -------------------------------------------------------------------------------- /test/e2e-test-application/cypress/config/externalmf.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require('cypress'); 2 | 3 | module.exports = defineConfig({ 4 | projectId: 'czq7qc', 5 | e2e: { 6 | fixturesFolder: 'cypress/e2e/fixtures', 7 | specPattern: 'cypress/e2e/test2', 8 | supportFile: 'cypress/e2e/support/index.js', 9 | videosFolder: 'cypress/e2e/videos', 10 | screenshotsFolder: 'cypress/screenshots', 11 | chromeWebSecurity: true, 12 | viewportWidth: 1250, 13 | viewportHeight: 790, 14 | baseUrl: 'http://localhost:4200/' 15 | } 16 | }); 17 | -------------------------------------------------------------------------------- /core-modular/public_root/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@luigi-project/core-modular", 3 | "description": "Javascript library supporting consumers of the Luigi framework", 4 | "license": "Apache-2.0", 5 | "main": "luigi.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+ssh://git@github.com/SAP/luigi.git" 9 | }, 10 | "publishConfig": { 11 | "tag": "luigi" 12 | }, 13 | "keywords": [ 14 | "luigi", 15 | "core", 16 | "UI", 17 | "extensibility", 18 | "micro-frontends", 19 | "microfrontends" 20 | ], 21 | "version": "0.0.1" 22 | } -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "outDir": "./dist/out-tsc", 5 | "sourceMap": true, 6 | "declaration": false, 7 | "moduleResolution": "bundler", 8 | "esModuleInterop": true, 9 | "emitDecoratorMetadata": true, 10 | "experimentalDecorators": true, 11 | "target": "ES2022", 12 | "typeRoots": [ 13 | "node_modules/@types" 14 | ], 15 | "lib": [ 16 | "es2017", 17 | "dom" 18 | ], 19 | "module": "es2015", 20 | "baseUrl": "./" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /scripts/docs/header.hbs: -------------------------------------------------------------------------------- 1 | {{#if @prefix}} 2 | {{else}} 3 | {{>heading-indent}} 4 | {{#if virtual}}*{{/if}}{{#with (parentObject)}}{{#if virtual}}*{{/if~}}{{/with~}} 5 | {{#if name}}{{#sig~}} 6 | {{{@depOpen}~}} 7 | {{{@codeOpen}~}} 8 | {{#if (equal defaultvalue undefined)}} 9 | {{#if (isEvent)}}"{{parseName name}}"{{else}}{{parseName (escape name)}}{{/if~}} 10 | {{else}} 11 | {{>defaultvalue}} 12 | {{/if~}} 13 | {{{@codeClose}~}} 14 | {{{@depClose}~}} 15 | {{~/sig}}{{/if~}} 16 | {{#if virtual}}*{{/if}}{{#with (parentObject)}}{{#if virtual}}*{{/if~}}{{/with~}} 17 |   18 | {{/if~}} -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/navigation/navigation.component.html: -------------------------------------------------------------------------------- 1 | 12 |
13 |
    14 | 21 |
22 |
23 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/navigation/navigation.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-navigation', 5 | templateUrl: './navigation.component.html', 6 | styleUrls: ['./navigation.component.scss'], 7 | standalone: false 8 | }) 9 | export class NavigationComponent implements OnInit { 10 | constructor() {} 11 | @Input() topNavConfig; 12 | @Input() leftNavConfig; 13 | 14 | ngOnInit() {} 15 | 16 | handleClick(route) { 17 | parent.window.location.hash = route; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | # This file provides an overview of code owners in the `luigi` repository. 2 | 3 | # Each line is a file pattern followed by one or more owners. 4 | # The last matching pattern has the most precedence. 5 | # For more details, read the following article on GitHub: https://help.github.com/articles/about-codeowners/. 6 | # These are the default owners for the whole content of the `luigi` repository. The default owners are automatically added as reviewers when you open a pull request, unless different owners are specified in the file. 7 | * @hardl @johannesdoberer @vincentullal @walmazacn 8 | -------------------------------------------------------------------------------- /plugins/auth/public/auth-oidc-pkce/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@luigi-project/plugin-auth-oidc-pkce", 3 | "description": "OpenID Connect provider plugin for @luigi-project/core", 4 | "license": "Apache-2.0", 5 | "main": "plugin.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "ssh://github.com/luigi-project/luigi.git" 9 | }, 10 | "publishConfig": { 11 | "tag": "luigi-plugin-auth-oidc-pkce" 12 | }, 13 | "keywords": [ 14 | "luigi", 15 | "core", 16 | "oidc", 17 | "openid connect", 18 | "provider" 19 | ], 20 | "version": "0.42.0" 21 | } -------------------------------------------------------------------------------- /plugins/auth/src/third-party-cookies-check.js: -------------------------------------------------------------------------------- 1 | /* istanbul ignore file */ 2 | let status = 'not_checked'; 3 | 4 | window.addEventListener( 5 | 'message', 6 | function(e) { 7 | if (e.data === 'luigi.tpcDisabled') { 8 | console.warn( 9 | 'Third party cookies are not supported! Silent token renewal might not work!' 10 | ); 11 | status = 'disabled'; 12 | } else if (e.data === 'luigi.tpcEnabled') { 13 | status = 'enabled'; 14 | } 15 | }, 16 | false 17 | ); 18 | 19 | export function thirdPartyCookiesStatus() { 20 | return status; 21 | } 22 | -------------------------------------------------------------------------------- /client-frameworks-support/client-support-angular/projects/client-support-angular/src/lib/service/luigi-context.service.impl.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | import { LuigiContextServiceImpl } from './luigi-context.service.impl'; 3 | 4 | describe('LuigiContextService', () => { 5 | let service: LuigiContextServiceImpl; 6 | 7 | beforeEach(() => { 8 | TestBed.configureTestingModule({}); 9 | service = TestBed.inject(LuigiContextServiceImpl); 10 | }); 11 | 12 | it('should be created', () => { 13 | expect(service).toBeTruthy(); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /core/src/utilities/luigi-config-defaults.js: -------------------------------------------------------------------------------- 1 | export const TOP_NAV_DEFAULTS = { 2 | logout: { 3 | label: 'Sign Out', 4 | icon: 'log' 5 | }, 6 | userSettingsProfileMenuEntry: { 7 | label: 'Settings', 8 | icon: 'settings' 9 | }, 10 | userSettingsDialog: { 11 | dialogHeader: 'User Settings', 12 | saveBtn: 'Save', 13 | dismissBtn: 'Cancel' 14 | }, 15 | globalSearchSubmitButton: 'Search', 16 | globalSearchCenteredCancelButton: 'Cancel' 17 | }; 18 | 19 | export const NAVIGATION_DEFAULTS = { 20 | externalLink: { 21 | sameWindow: false 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /test/e2e-test-application/cypress/config/e2e-angular-app.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require('cypress'); 2 | 3 | module.exports = defineConfig({ 4 | projectId: 'czq7qc', 5 | e2e: { 6 | fixturesFolder: 'cypress/e2e/fixtures', 7 | specPattern: 'cypress/e2e/tests/1-angular', 8 | supportFile: 'cypress/e2e/support/index.js', 9 | videosFolder: 'cypress/e2e/videos', 10 | screenshotsFolder: 'cypress/screenshots', 11 | chromeWebSecurity: false, 12 | viewportWidth: 1250, 13 | viewportHeight: 790, 14 | baseUrl: 'http://localhost:4200/' 15 | } 16 | }); 17 | -------------------------------------------------------------------------------- /test/e2e-test-application/cypress/config/e2e-js-app.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require('cypress'); 2 | 3 | module.exports = defineConfig({ 4 | projectId: 'czq7qc', 5 | e2e: { 6 | fixturesFolder: 'cypress/e2e/fixtures', 7 | specPattern: 'cypress/e2e/tests/0-js-test-app', 8 | supportFile: 'cypress/e2e/support/index.js', 9 | videosFolder: 'cypress/e2e/videos', 10 | screenshotsFolder: 'cypress/screenshots', 11 | chromeWebSecurity: false, 12 | viewportWidth: 1250, 13 | viewportHeight: 790, 14 | baseUrl: 'http://localhost:4500/' 15 | } 16 | }); 17 | -------------------------------------------------------------------------------- /core/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | # testing 7 | /coverage 8 | /.nyc_output 9 | 10 | # production 11 | /build 12 | /public 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | .idea 22 | 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | .vscode/ 28 | /public*/luigi*.css 29 | /public*/luigi*.js 30 | /public*/*.woff 31 | /public*/*.woff2 32 | /public*/*.ttf 33 | 34 | # maps 35 | *.map 36 | -------------------------------------------------------------------------------- /core/examples/luigi-example-openui5/webapp/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Luigi 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/view-group/view-group.component.html: -------------------------------------------------------------------------------- 1 |
2 |

View Group Component: {{ vg }}

3 | 4 |

Luigi Iframe ID: {{ id }}

5 | 6 |

Last Loaded time: {{ time }}

7 |
8 |

9 | Luigi Navigation ViewGroup config: 10 |
11 | 12 |

{{ config }}
13 | 14 |

15 |
16 |

17 | Luigi Microfront iframes: 18 |
19 | 20 |

{{ code }}
21 | 22 |

23 |
24 | -------------------------------------------------------------------------------- /blog/2024-05-23-release-notes.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Luigi v2.13 3 | seoMetaDescription: Release notes for Luigi v2.13 4 | author: 5 | - Mahati Shankar 6 | layout: blog 7 | --- 8 | 9 | You can read about the new features in Luigi v2.13 in the release notes below. 10 | 11 | 12 | 13 | 14 | #### Accessibility for Left Nav in BTP Layout 15 | 16 | The Left Nav is now keyboard accessible when the BTP Layout is active. 17 | 18 | 19 | 20 | #### Bugfixes 21 | 22 | For a full list of bugfixes in this release, see our [changelog](https://github.com/luigi-project/luigi/blob/main/CHANGELOG.md). -------------------------------------------------------------------------------- /container/cypress/e2e/examples/simple-iframe-setup.cy.js: -------------------------------------------------------------------------------- 1 | describe('Simple Examples Iframe Container Test', () => { 2 | beforeEach(() => { 3 | cy.visit('http://localhost:2222'); 4 | }); 5 | 6 | it('Iframe Container Test', () => { 7 | cy.visit('http://localhost:2222/container-iframe/index.html'); 8 | 9 | cy.get('luigi-container') 10 | .shadow() 11 | .get('iframe') 12 | .then(iframe => { 13 | const $body = iframe.contents().find('body'); 14 | cy.wrap($body).contains('This is an iframe based microfrontend container'); 15 | }); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/anonymous/anonymous.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Anonymous content

4 |
5 |
6 |
7 |

8 | This page is visible only for users that are not logged in. 9 |

10 |

11 | This page is visible for all users, also those that are not logged in. 12 |

13 |
14 |
15 |
16 | -------------------------------------------------------------------------------- /.github/workflows/code_checks.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: 4 | - '**' 5 | paths: 6 | - 'container/**' 7 | pull_request: 8 | branches: 9 | - 'main' 10 | name: Code Analysis 11 | 12 | jobs: 13 | container_linting: 14 | name: Container Linting 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: actions/checkout@v4 18 | - uses: actions/setup-node@v4 19 | with: 20 | node-version: '20.19.0' 21 | - name: Install and lint 22 | working-directory: ./container 23 | run: npm i && npm run lint || exit 1 24 | 25 | -------------------------------------------------------------------------------- /client-frameworks-support/client-support-angular/projects/client-support-angular/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/zone'; 4 | import 'zone.js/dist/zone-testing'; 5 | import { getTestBed } from '@angular/core/testing'; 6 | import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; 7 | 8 | // First, initialize the Angular testing environment. 9 | getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); 10 | -------------------------------------------------------------------------------- /docs/luigi-architecture.md: -------------------------------------------------------------------------------- 1 | 16 | 17 | # Luigi Architecture 18 | 19 | This diagram represents an overview of Luigi's architecture. It shows the relationship between the Luigi framework, the web application, and the external micro frontends and authorization providers: 20 | 21 | ![Luigi architecture diagram](/assets/architecture.png) 22 | -------------------------------------------------------------------------------- /test/e2e-client-api-test-app/public/views/intro.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | 14 |
15 |

Intro

16 |

17 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 18 | tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 19 |

20 |
21 | 22 | 23 | -------------------------------------------------------------------------------- /core/examples/luigi-example-openui5/webapp/home/Home.view.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | <f:Card class="sapUiSmallMargin"> 11 | <f:content> 12 | <Title class="sapUiSmallMargin" titleStyle="H4" id="luigi-initialized" text="" wrapping="true" /> 13 | </f:content> 14 | </f:Card> 15 | </VBox> 16 | </App> 17 | </mvc:View> -------------------------------------------------------------------------------- /core/examples/luigi-example-vue/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "luigi-example-view", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build", 8 | "serve": "vite preview" 9 | }, 10 | "dependencies": { 11 | "@luigi-project/client": "^2.25.0", 12 | "vue": "^3.5.22", 13 | "vue-router": "^4.6.3" 14 | }, 15 | "devDependencies": { 16 | "@vitejs/plugin-vue": "^6.0.1", 17 | "vite": "^7.1.11" 18 | }, 19 | "browserslist": [ 20 | "> 1%", 21 | "last 2 versions", 22 | "not dead", 23 | "not ie 11" 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /core/examples/luigi-example-vue/sampleapp.html: -------------------------------------------------------------------------------- 1 | <!DOCTYPE html> 2 | <html lang="en"> 3 | <head> 4 | <meta charset="utf-8" /> 5 | <meta name="viewport" content="width=device-width,initial-scale=1.0" /> 6 | <title>luigi-example-vue 7 | 8 | 9 | 15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /core/public/README.md: -------------------------------------------------------------------------------- 1 | # Luigi Core 2 | 3 | ## Overview 4 | 5 | Luigi is a micro frontend orchestration framework written in Svelte. Use Luigi Core to implement the core application, and Luigi Client to ensure communication between the application and the micro frontend it hosts. 6 | 7 | For details on Luigi Core, see [this](https://github.com/luigi-project/luigi/tree/main/core) document. 8 | 9 | If you want to try Luigi out, see the [examples](https://github.com/luigi-project/luigi/tree/main/core/examples). 10 | 11 | For documentation on Luigi Core, see [Luigi documentation](https://docs.luigi-project.io). 12 | -------------------------------------------------------------------------------- /client-frameworks-support/client-support-angular/projects/client-support-angular/src/lib/route/luigi-activated-route-snapshot-helper.ts: -------------------------------------------------------------------------------- 1 | import { ActivatedRouteSnapshot } from '@angular/router'; 2 | 3 | export class LuigiActivatedRouteSnapshotHelper { 4 | private static _current: ActivatedRouteSnapshot = null as unknown as ActivatedRouteSnapshot; 5 | 6 | static getCurrent(): ActivatedRouteSnapshot { 7 | return LuigiActivatedRouteSnapshotHelper._current; 8 | } 9 | 10 | static setCurrent(current: ActivatedRouteSnapshot): void { 11 | LuigiActivatedRouteSnapshotHelper._current = current; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /client-frameworks-support/client-support-angular/projects/client-support-angular/src/lib/route/luigi-route-strategy.ts: -------------------------------------------------------------------------------- 1 | import { BaseRouteReuseStrategy } from '@angular/router'; 2 | import { ActivatedRouteSnapshot, DetachedRouteHandle } from '@angular/router'; 3 | import { LuigiActivatedRouteSnapshotHelper } from './luigi-activated-route-snapshot-helper'; 4 | 5 | export class LuigiRouteStrategy extends BaseRouteReuseStrategy { 6 | retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null { 7 | LuigiActivatedRouteSnapshotHelper.setCurrent(route); 8 | return super.retrieve(route); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /core/examples/luigi-example-svelte/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Luigi Core 6 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /core/examples/luigi-example-vue/public/sampleapp.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | luigi-example-vue 7 | 8 | 9 | 15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /core/public_root/README.md: -------------------------------------------------------------------------------- 1 | # Luigi Core 2 | 3 | ## Overview 4 | 5 | Luigi is a micro frontend orchestration framework written in Svelte. Use Luigi Core to implement the core application, and Luigi Client to ensure communication between the application and the micro frontend it hosts. 6 | 7 | For details on Luigi Core, see [this](https://github.com/luigi-project/luigi/tree/main/core) document. 8 | 9 | If you want to try Luigi out, see the [examples](https://github.com/luigi-project/luigi/tree/main/core/examples). 10 | 11 | For documentation on Luigi Core, see [Luigi documentation](https://docs.luigi-project.io). 12 | -------------------------------------------------------------------------------- /test/e2e-client-api-test-app/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Luigi App 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /test/e2e-client-api-test-app/public/views/core/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | 14 |
15 |

Core app

16 |

17 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 18 | tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 19 |

20 |
21 | 22 | 23 | -------------------------------------------------------------------------------- /website/fiddle/public/themeHelper.js: -------------------------------------------------------------------------------- 1 | export default function setTheme() { 2 | let theme = LuigiClient.uxManager().getCurrentTheme() || 'sap_fiori_3'; 3 | const themeUrl = `https://cdn.jsdelivr.net/npm/@sap-theming/theming-base-content@11.1.48/content/Base/baseLib/${theme}/css_variables.css`; 4 | const themeTag = document.querySelector('#_theme'); 5 | if (themeTag) { 6 | document.head.removeChild(themeTag); 7 | } 8 | 9 | const link = document.createElement('link'); 10 | link.id = '_theme'; 11 | link.href = themeUrl; 12 | link.rel = 'stylesheet'; 13 | document.head.appendChild(link); 14 | } 15 | -------------------------------------------------------------------------------- /test/e2e-js-test-application/public/secureLeave.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | Luigi Fiddle 11 | 12 | 13 | 14 | 15 | 16 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | // This is used for simpler testing inside dev console 4 | import * as LuigiClient from '@luigi-project/client'; 5 | window['LuigiClient'] = LuigiClient; 6 | 7 | import { AppModule } from './app/app.module'; 8 | import { environment } from './environments/environment'; 9 | 10 | if (environment.production) { 11 | enableProdMode(); 12 | } 13 | 14 | platformBrowserDynamic() 15 | .bootstrapModule(AppModule) 16 | .catch(err => console.error(err)); 17 | -------------------------------------------------------------------------------- /client/public/README.md: -------------------------------------------------------------------------------- 1 | # Luigi Client 2 | 3 | ## Overview 4 | 5 | Luigi is a micro frontend orchestration framework written in Svelte. Use Luigi Client to implement micro frontends and ensure communication between the application and the micro frontend it hosts. 6 | 7 | For details on Luigi Client, see [this](https://github.com/luigi-project/luigi/tree/main/client) document. 8 | 9 | If you want to try Luigi out, see the [examples](https://github.com/luigi-project/luigi/tree/main/core/examples). 10 | 11 | For documentation on Luigi Client, see [Luigi documentation](https://docs.luigi-project.io/docs/luigi-client-setup). 12 | -------------------------------------------------------------------------------- /test/e2e-client-api-test-app/public/views/container/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | 14 |
15 |

Container app

16 |

17 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 18 | tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 19 |

20 |
21 | 22 | 23 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .fd-form-item { 2 | margin-bottom: 10px; 3 | } 4 | 5 | .fd-list__item { 6 | display: block; 7 | border-bottom: none; 8 | height: auto; //override the 2,75rem from FD Styles, otherwise the content doesn#t fit 9 | padding: 10px; 10 | } 11 | 12 | //Add margin bottom to panels 13 | .luigi__margin-bottom--small { 14 | margin-bottom: 15px; 15 | } 16 | //align input field and actionn button next to it on one line 17 | .fd-container { 18 | .luigi__input-button--margin { 19 | margin-top: 4px; 20 | } 21 | } 22 | .luigi__inner-padding { 23 | padding: 8px; 24 | } 25 | -------------------------------------------------------------------------------- /website/landingpage/public/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | https://luigi-project.io/ 5 | monthly 6 | 1.0 7 | 8 | 9 | https://luigi-project.io/about.html 10 | monthly 11 | 1.0 12 | 13 | 14 | -------------------------------------------------------------------------------- /core-modular/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | # testing 7 | /coverage 8 | /.nyc_output 9 | 10 | # production 11 | /build 12 | /public 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | .idea 22 | 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | .vscode/ 28 | /public*/luigi*.css 29 | /public*/luigi*.js 30 | /public*/*.woff 31 | /public*/*.woff2 32 | /public*/*.ttf 33 | 34 | # maps 35 | *.map 36 | 37 | /dev-tools/simple-app -------------------------------------------------------------------------------- /core/src/utilities/third-party-cookies-check.js: -------------------------------------------------------------------------------- 1 | /* istanbul ignore file */ 2 | import { EventListenerHelpers } from './helpers'; 3 | let status = 'not_checked'; 4 | 5 | EventListenerHelpers.addEventListener( 6 | 'message', 7 | function(e) { 8 | if (e.data === 'luigi.tpcDisabled') { 9 | console.warn('Third party cookies are not supported! Silent token renewal might not work!'); 10 | status = 'disabled'; 11 | } else if (e.data === 'luigi.tpcEnabled') { 12 | status = 'enabled'; 13 | } 14 | }, 15 | false 16 | ); 17 | 18 | export function thirdPartyCookiesStatus() { 19 | return status; 20 | } 21 | -------------------------------------------------------------------------------- /website/docs/scripts/mocks/plain.md: -------------------------------------------------------------------------------- 1 | # Lorem ipsum dolor 2 | 3 | Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. 4 | 5 | [Loreim ipsum](#noframework)
6 | [Ipsum Dolor](#angular6)
7 | 8 | Lorem ipsum dolor sit amet: 9 | 10 | 1. At vero eos et accusam et justo duo dolores et ea rebum. 11 | 2. At vero eos et accusam et justo duo dolores et ea rebum. 12 | 13 | ```` 14 | npm install --save @luigi-project/core 15 | npm install --save @luigi-project/client 16 | ```` -------------------------------------------------------------------------------- /core/dev-tools/templates/simple/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Luigi Simple Dev 5 | 6 | 7 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /core/examples/luigi-example-openui5/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "luigi-example-openui5", 3 | "private": true, 4 | "version": "0.2.0", 5 | "author": "SAP SE", 6 | "description": "Luigi with OpenUI5 Demo App", 7 | "scripts": { 8 | "build": "ui5 build --all", 9 | "start": "ui5 serve --open index.html", 10 | "serve": "ws --compress -d dist" 11 | }, 12 | "dependencies": { 13 | "@luigi-project/client": "^2.22.1", 14 | "@luigi-project/core": "^2.22.1" 15 | }, 16 | "devDependencies": { 17 | "@ui5/cli": "^4.0.36", 18 | "cross-spawn": "^7.0.6", 19 | "local-web-server": "^5.4.0" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /website/landingpage/dev/src/root-assets/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | https://luigi-project.io/ 5 | monthly 6 | 1.0 7 | 8 | 9 | https://luigi-project.io/about.html 10 | monthly 11 | 1.0 12 | 13 | 14 | -------------------------------------------------------------------------------- /container/examples/compound-container/myCompoundWebComponent2.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This class is used to test LuigiClient webcomponent based functionality 3 | */ 4 | export default class extends HTMLElement { 5 | constructor() { 6 | super(); 7 | const shadowRoot = this.attachShadow({ mode: 'open' }); 8 | const template = document.createElement('template'); 9 | template.innerHTML = `

Hello From Web Component 2

`; 10 | shadowRoot.appendChild(template.content.cloneNode(true)); 11 | this.$paragraph = shadowRoot.getElementById('paragraph'); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /container/examples/compound-container/myCompoundWebComponent3.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This class is used to test LuigiClient webcomponent based functionality 3 | */ 4 | export default class extends HTMLElement { 5 | constructor() { 6 | super(); 7 | const shadowRoot = this.attachShadow({ mode: 'open' }); 8 | const template = document.createElement('template'); 9 | template.innerHTML = `

Hello From Web Component 3

`; 10 | shadowRoot.appendChild(template.content.cloneNode(true)); 11 | this.$paragraph = shadowRoot.getElementById('paragraph'); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /container/examples/compound-container/myCompoundWebComponent4.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This class is used to test LuigiClient webcomponent based functionality 3 | */ 4 | export default class extends HTMLElement { 5 | constructor() { 6 | super(); 7 | const shadowRoot = this.attachShadow({ mode: 'open' }); 8 | const template = document.createElement('template'); 9 | template.innerHTML = `

Hello From Web Component 4

`; 10 | shadowRoot.appendChild(template.content.cloneNode(true)); 11 | this.$paragraph = shadowRoot.getElementById('paragraph'); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /container/test-app/compound/defer-init-wc/compoundWCDeferInit2.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This class is used to test Compound Container defer-init functionality 3 | */ 4 | export default class extends HTMLElement { 5 | constructor() { 6 | super(); 7 | const shadowRoot = this.attachShadow({ mode: 'open' }); 8 | const template = document.createElement('template'); 9 | template.innerHTML = `

Hello From Web Component 2

`; 10 | shadowRoot.appendChild(template.content.cloneNode(true)); 11 | this.$paragraph = shadowRoot.getElementById('paragraph'); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /core/examples/luigi-example-js/README.md: -------------------------------------------------------------------------------- 1 | # Sample Luigi application written in plain Javascript 2 | 3 | ## Overview 4 | 5 | This is the JS-based sample application which runs with the Luigi framework. 6 | 7 | 8 | ## Development 9 | 10 | To run this application, follow these steps: 11 | 12 | 13 | 1. First, install the dependency `server` to serve your application locally by running the following: 14 | ```bash 15 | npm install 16 | ``` 17 | 18 | 2. Start the application . 19 | ```bash 20 | npm run start 21 | ``` 22 | 23 | 5. Open it in your browser by going to [http://127.0.0.1:3000/](http://127.0.0.1:3000/). 24 | -------------------------------------------------------------------------------- /.github/pull-request-template.md: -------------------------------------------------------------------------------- 1 | 7 | 8 | **Description** 9 | 10 | Changes proposed in this pull request: 11 | 12 | - ... 13 | - ... 14 | - ... 15 | 16 | **Related issue(s)** 17 | 18 | -------------------------------------------------------------------------------- /core/src/services/lifecycle-hooks.js: -------------------------------------------------------------------------------- 1 | import { LuigiUX, LuigiConfig } from './../core-api'; 2 | 3 | class LuigiLifecycleHooks { 4 | luigiAfterInit() { 5 | const shouldHideAppLoadingIndicator = LuigiConfig.getConfigBooleanValue( 6 | 'settings.appLoadingIndicator.hideAutomatically' 7 | ); 8 | if (shouldHideAppLoadingIndicator) { 9 | // Settimeout needed, otherwise app loading indicator might not present yet and when displayed will not be hidden 10 | setTimeout(() => { 11 | LuigiUX.hideAppLoadingIndicator(); 12 | }, 0); 13 | } 14 | } 15 | } 16 | 17 | export const LifecycleHooks = new LuigiLifecycleHooks(); 18 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/users/users.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { ActivatedRoute, Params } from '@angular/router'; 3 | 4 | @Component({ 5 | selector: 'app-users', 6 | templateUrl: './users.component.html', 7 | styleUrls: ['./users.component.css'], 8 | standalone: false 9 | }) 10 | export class UsersComponent implements OnInit { 11 | projectId: string; 12 | constructor(private activatedRoute: ActivatedRoute) {} 13 | 14 | ngOnInit() { 15 | this.activatedRoute.params.subscribe((params: Params) => { 16 | this.projectId = params['projectId']; 17 | }); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /blog/2024-04-19-release-notes.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Luigi v2.11 3 | seoMetaDescription: Release notes for Luigi v2.11 4 | author: 5 | - Mahati Shankar 6 | layout: blog 7 | --- 8 | 9 | You can read about the new features in Luigi v2.11 in the release notes below. 10 | 11 | 12 | 13 | 14 | #### Added onClick Navigation for Categories in the TabNav Bar 15 | 16 | With Luigi v2.11, clicking the category in the TabNav bar can be configured to navigate to a node in the same category. 17 | 18 | 19 | #### Bugfixes 20 | 21 | For a full list of bugfixes in this release, see our [changelog](https://github.com/luigi-project/luigi/blob/main/CHANGELOG.md). -------------------------------------------------------------------------------- /core/src/navigation/StatusBadge.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | {#if node.statusBadge && node.statusBadge.label} 9 | 10 | {node.statusBadge.label} 11 | 12 | {/if} 13 | 14 | 19 | -------------------------------------------------------------------------------- /test/e2e-js-test-application/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "e2e-js-test-application", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "live-server --port=4500 --mount=\"/node_modules\":\"./node_modules\" ./public --no-browser" 8 | }, 9 | "devDependencies": { 10 | "@luigi-project/core": "^2.22.1", 11 | "@luigi-project/client": "^2.22.1", 12 | "@luigi-project/plugin-auth-oauth2": "^2.22.1", 13 | "@sap-theming/theming-base-content": "~11.1.35", 14 | "fundamental-styles": "0.23.0", 15 | "live-server": "^1.2.2" 16 | }, 17 | "engines": { 18 | "node": ">=20.19.0" 19 | } 20 | } -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/miscellaneous2/miscellaneous2.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Miscellaneous 2

4 |
5 |
6 |
7 |

8 | Misc 2 content. 9 |

10 | open confirmation modal 16 |
{{showConsoleText()}}
17 |
18 |
19 |
20 | -------------------------------------------------------------------------------- /container/cypress/e2e/examples/simple-compound-wc-setup.cy.js: -------------------------------------------------------------------------------- 1 | describe('Simple Examples Compound Container Test', () => { 2 | beforeEach(() => { 3 | cy.visit('http://localhost:2222'); 4 | }); 5 | 6 | it('Compound WebComponent Container loading inner text', () => { 7 | cy.visit('http://localhost:2222/compound-container/index.html'); 8 | 9 | cy.get('luigi-compound-container') 10 | .shadow() 11 | .find('h2') 12 | .should( 13 | 'contain.text', 14 | ' Hello From Web Component 1 -- some content -- Hello From Web Component 2 Hello From Web Component 3 Hello From Web Component 4 ' 15 | ); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /test/e2e-client-api-test-app/README.md: -------------------------------------------------------------------------------- 1 | # Luigi JS application for checking if Core and Container WC clientAPI are the same 2 | 3 | ## Overview 4 | 5 | This is the JS-based sample application which runs with the Luigi framework 6 | 7 | ## Development 8 | 9 | To run this application, follow these steps: 10 | 11 | 1. First, install all dependencies to serve your application locally by running the following: 12 | ```bash 13 | npm install 14 | ``` 15 | 16 | 2. Then start the application with the command below: 17 | ```bash 18 | npm start 19 | ``` 20 | 21 | 3. Open it in your browser by going to [http://localhost:3000](http://localhost:3000) 22 | -------------------------------------------------------------------------------- /core/examples/luigi-example-svelte/webpack-common-rules.js: -------------------------------------------------------------------------------- 1 | const mode = process.env.NODE_ENV || 'development'; 2 | const prod = mode === 'production'; 3 | 4 | module.exports = { 5 | svelte: { 6 | test: /\.(html|svelte|svelte\.js)$/, 7 | use: { 8 | loader: 'svelte-loader', 9 | options: { 10 | emitCss: true, 11 | hotReload: true 12 | } 13 | } 14 | }, 15 | // css: { 16 | // test: /\.(sa|sc|c)ss$/, 17 | // use: ['css-loader'] 18 | // }, 19 | urls: { 20 | test: /\.(png|jpg|gif|svg|eot|ttf|woff|woff2)$/, 21 | loader: 'url-loader', 22 | options: { 23 | limit: 50000 24 | } 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/assets/tabHeader.js: -------------------------------------------------------------------------------- 1 | export default class extends HTMLElement { 2 | constructor() { 3 | super(); 4 | const template = document.createElement('template'); 5 | template.innerHTML = `

Hello World from a TabNav Header microfrontend!

`; 6 | 7 | const empty = document.createElement('template'); 8 | empty.innerHTML = `

Test!



`; 9 | 10 | this._shadowRoot = this.attachShadow({ 11 | mode: 'open', 12 | delegatesFocus: false 13 | }); 14 | this._shadowRoot.appendChild(template.content.cloneNode(true)); 15 | } 16 | 17 | set context(ctx) {} 18 | } 19 | -------------------------------------------------------------------------------- /core/examples/luigi-example-vue/src/views/home.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /client-frameworks-support/client-support-angular/projects/client-support-angular/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../../out-tsc/lib", 6 | "declaration": true, 7 | "declarationMap": true, 8 | "inlineSources": true, 9 | "types": [] 10 | }, 11 | "angularCompilerOptions": { 12 | "skipTemplateCodegen": true, 13 | "strictMetadataEmit": true, 14 | "enableResourceInlining": true, 15 | "compilationMode": "partial" 16 | }, 17 | "exclude": [ 18 | "src/test.ts", 19 | "**/*.spec.ts" 20 | ] 21 | } -------------------------------------------------------------------------------- /core/examples/luigi-example-svelte/README.md: -------------------------------------------------------------------------------- 1 | # Sample Luigi application written in Svelte 2 | 3 | ## Overview 4 | 5 | This is the Svelte-based sample application which runs with the Luigi framework. 6 | 7 | 8 | ## Development 9 | 10 | 1. Install dependencies: 11 | 12 | ```bash 13 | cd luigi-example-svelte 14 | npm install 15 | ``` 16 | 17 | 2. Build and run this application in development mode: 18 | 19 | ```bash 20 | npm run build 21 | npm run dev 22 | ``` 23 | 24 | Open it in your browser by going to [localhost:5100](http://localhost:5100). 25 | 26 | Note that this example serves as a starting point and is not to be used directly in production without necessary adjustments. -------------------------------------------------------------------------------- /container/src/services/iframe-helpers.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves the allow rules for iframes and modifies them according to w3c standard conditions. 3 | * @param {string[]} allowRules - qn array of allow rules 4 | * @returns {string|undefined} the modified allow rules joined as a single string, or undefined if allowRules is falsy 5 | */ 6 | export const getAllowRules = (allowRules: string[]) => { 7 | if (!allowRules) return undefined; 8 | const rules = allowRules; 9 | rules.forEach((rule, index) => { 10 | rules[index] = rule + (rule.indexOf(';') != -1 ? '' : ';'); 11 | rules[index] = allowRules[index].replaceAll('"', "'"); 12 | }); 13 | return rules.join(' '); 14 | }; 15 | -------------------------------------------------------------------------------- /core/examples/luigi-example-react/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | 9 | # Compiled binary addons (http://nodejs.org/api/addons.html) 10 | build/Release 11 | 12 | # Dependency directories 13 | node_modules/ 14 | jspm_packages/ 15 | 16 | # Distribution directories 17 | dist/ 18 | #build files 19 | dist 20 | 21 | # Typescript v1 declaration files 22 | typings/ 23 | 24 | # Optional npm cache directory 25 | .npm 26 | 27 | # Optional eslint cache 28 | .eslintcache 29 | 30 | # Optional REPL history 31 | .node_repl_history 32 | 33 | # Output of 'npm pack' 34 | *.tgz 35 | 36 | # Yarn Integrity file 37 | .yarn-integrity -------------------------------------------------------------------------------- /core/examples/luigi-example-vue/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Luigi 5 | 9 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /blog/2024-11-29-luigi-container.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Luigi Container v1.5 3 | seoMetaDescription: Release notes for Luigi Container v1.5 4 | author: 5 | - Johannes Doberer 6 | layout: blog 7 | --- 8 | 9 | You can read about the new features in Luigi Container v1.5 in the release notes below. 10 | 11 | 12 | 13 | #### Possibility to update viewUrl for Luigi Container 14 | 15 | With this release we added the possibility for Luigi Container to [updateViewUrl](https://docs.luigi-project.io/docs/luigi-container-api?section=updateviewurl) for iframe based micro frontends. 16 | 17 | See our [changelog](https://github.com/luigi-project/luigi/releases/tag/container%2Fv1.5.0). 18 | -------------------------------------------------------------------------------- /core-modular/svelte.config.cjs: -------------------------------------------------------------------------------- 1 | // const { resolve } = require('node:path'); 2 | // const { pathToFileURL } = require('node:url'); 3 | const preprocess = require('svelte-preprocess'); 4 | 5 | // const variablePath = resolve(__dirname, 'src/styles', 'variables'); 6 | // const mixinPath = resolve(__dirname, 'src/styles', 'mixins'); 7 | 8 | const config = { 9 | extensions: ['.svelte'], 10 | compilerOptions: { 11 | }, 12 | name: 'Luigi', 13 | preprocess: [ 14 | preprocess({ 15 | // scss: { 16 | // prependData: `@import "${pathToFileURL(variablePath)}", "${pathToFileURL(mixinPath)}";` 17 | // } 18 | }) 19 | ] 20 | }; 21 | 22 | module.exports = config; 23 | -------------------------------------------------------------------------------- /core/examples/luigi-example-vue/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Luigi 5 | 9 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /container/examples/container-wc/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Luigi Webcomponent Container 6 | 7 | 8 | 9 | 13 | 14 | 15 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /core/examples/luigi-example-svelte/src/App.svelte: -------------------------------------------------------------------------------- 1 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 |
23 | -------------------------------------------------------------------------------- /core/examples/luigi-example-vue/src/views/sample1.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /core/examples/luigi-example-vue/src/views/sample2.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /core/src/styles/_mixins.scss: -------------------------------------------------------------------------------- 1 | @mixin transition($args...) { 2 | transition: $args; 3 | } 4 | 5 | @mixin box-shadow($shadow...) { 6 | box-shadow: $shadow; 7 | } 8 | 9 | @mixin border-radius($radius) { 10 | border-radius: $radius; 11 | } 12 | 13 | @mixin luigi-menu__link--border-radius($position) { 14 | :global(.fd-menu__link) { 15 | border-#{$position}-left-radius: 0.25rem; 16 | border-#{$position}-left-radius: var( 17 | --sapElement_BorderCornerRadius, 18 | 0.25rem 19 | ); 20 | border-#{$position}-right-radius: 0.25rem; 21 | border-#{$position}-right-radius: var( 22 | --sapElement_BorderCornerRadius, 23 | 0.25rem 24 | ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /core/src/utilities/constants.js: -------------------------------------------------------------------------------- 1 | export const CSS_BREAKPOINTS = { 2 | desktopMinWidth: 600 3 | }; 4 | 5 | export const MICROFRONTEND_TYPES = [ 6 | { type: 'main', selector: '.iframeContainer iframe' }, 7 | { type: 'split-view', selector: '.iframeSplitViewCnt iframe' }, 8 | { type: 'modal', selector: '.iframeModalCtn._modal iframe' }, 9 | { type: 'drawer', selector: '.iframeModalCtn._drawer iframe' }, 10 | { type: 'user-settings', selector: '.iframeUserSettingsCtn iframe' } 11 | ]; 12 | 13 | export const CUSTOM_LUIGI_CONTAINER = { 14 | cssSelector: '[luigi-app-root]' 15 | }; 16 | 17 | export const APP_LOADING_INDICATOR = { 18 | cssSelector: '[luigi-app-loading-indicator]' 19 | }; 20 | -------------------------------------------------------------------------------- /cra-template/template/public/sampleapp.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Luigi Simple React App 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import neostandard from 'neostandard'; 2 | import pluginCypress from 'eslint-plugin-cypress/flat'; 3 | import stylistic from '@stylistic/eslint-plugin'; 4 | 5 | /** @type {import('eslint').Linter.Config[]} */ 6 | export default [ 7 | ...neostandard(), 8 | pluginCypress.configs.recommended, 9 | stylistic.configs['recommended-flat'], 10 | { 11 | files: ['**/*.js', '**/*.ts'], 12 | plugins: { 13 | cypress: pluginCypress, 14 | '@stylistic': stylistic 15 | }, 16 | rules: { 17 | 'no-ex-assign': 'warn', 18 | '@stylistic/indent': 'off', 19 | '@stylistic/no-tabs': 'off', 20 | '@stylistic/semi': 'error' 21 | } 22 | } 23 | ]; 24 | -------------------------------------------------------------------------------- /core/examples/luigi-example-vue/src/router/index.js: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHashHistory } from 'vue-router'; 2 | import Home from '../views/home.vue'; 3 | import Sample1 from '../views/sample1.vue'; 4 | import Sample2 from '../views/sample2.vue'; 5 | 6 | const routes = [ 7 | { 8 | path: '/home', 9 | name: 'home', 10 | component: Home 11 | }, 12 | { 13 | path: '/sample1', 14 | name: 'sample1', 15 | component: Sample1 16 | }, 17 | { 18 | path: '/sample2', 19 | name: 'sample2', 20 | component: Sample2 21 | } 22 | ]; 23 | 24 | const router = createRouter({ 25 | history: createWebHashHistory(), 26 | routes 27 | }); 28 | 29 | export default router; 30 | -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/anonymous/anonymous.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Router, ActivatedRoute } from '@angular/router'; 3 | 4 | @Component({ 5 | selector: 'app-anonymous', 6 | templateUrl: './anonymous.component.html', 7 | styleUrls: ['./anonymous.component.css'], 8 | standalone: false 9 | }) 10 | export class AnonymousComponent implements OnInit { 11 | exclusive: false; 12 | 13 | constructor(private route: ActivatedRoute) { 14 | this.route.queryParams.subscribe( 15 | (params) => { 16 | this.exclusive = params.exclusive; 17 | }, 18 | (err) => {} 19 | ); 20 | } 21 | 22 | ngOnInit() {} 23 | } 24 | -------------------------------------------------------------------------------- /blog/2025-04-23-luigi-container.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Luigi Container v1.7 3 | seoMetaDescription: Release notes for Luigi Container v1.7 4 | author: 5 | - Johannes Doberer 6 | layout: blog 7 | --- 8 | 9 | You can read about the new features in Luigi Container v1.7 in the release notes below. 10 | 11 | 12 | 13 | 14 | #### Adds missing functions to webcomponent client api 15 | 16 | With this release we added missing functions like `addCoreSearchParams`, `updateModalPathInternalNavigation`, `setDirtyStatus`, `setCurrentLocale` and `updateModalSettings` to the webcomponent client api. 17 | 18 | 19 | See our [changelog](https://github.com/luigi-project/luigi/releases/tag/container%2Fv1.7.0). 20 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 60 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 7 5 | # Label to use when marking an issue as stale 6 | staleLabel: stale 7 | # Comment to post when marking an issue as stale. Set to `false` to disable 8 | markComment: > 9 | This issue has been automatically marked as stale due to the lack of recent activity. It will soon be closed if no further activity occurs. Thank you for your contributions. 10 | # Comment to post when closing a stale issue. Set to `false` to disable 11 | closeComment: > 12 | This issue has been automatically closed due to the lack of recent activity. 13 | -------------------------------------------------------------------------------- /client-frameworks-support/testing-utilities/dist/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@luigi-project/testing-utilities", 3 | "description": "Luigi testing utilities for standalone testing of microfrontends", 4 | "license": "Apache-2.0", 5 | "main": "index.js", 6 | "types": "index.d.ts", 7 | "publishConfig": { 8 | "tag": "testing-utilities" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "ssh://github.com/luigi-project/luigi.git" 13 | }, 14 | "keywords": [ 15 | "luigi", 16 | "UI", 17 | "extensibility", 18 | "micro-frontends", 19 | "microfrontends", 20 | "testing" 21 | ], 22 | "version": "2.26.0", 23 | "engines": { 24 | "node": ">=20.19.0" 25 | } 26 | } -------------------------------------------------------------------------------- /client-frameworks-support/testing-utilities/test/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "luigi-mock-module-test-mf", 3 | "version": "0.1.0", 4 | "description": "", 5 | "license": "MIT", 6 | "scripts": { 7 | "test": "cypress open --env configFile=e2emockengine", 8 | "e2e:run": "cypress run --env configFile=e2emockengine --browser chrome -c video=false", 9 | "start": "live-server --port=8181 --entry-file=index.html --mount=./node_modules:/node_modules" 10 | }, 11 | "dependencies": { 12 | "@luigi-project/client": "^2.23.1", 13 | "@luigi-project/testing-utilities": "^2.23.1", 14 | "cross-spawn": "^7.0.6", 15 | "cypress": "^14.5.3", 16 | "fundamental-styles": "^0.26.5" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /core/examples/luigi-example-angular/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | /tmp 6 | /out-tsc 7 | 8 | # dependencies 9 | /node_modules 10 | 11 | # IDEs and editors 12 | /.idea 13 | .project 14 | .classpath 15 | .c9/ 16 | *.launch 17 | .settings/ 18 | *.sublime-workspace 19 | 20 | # IDE - VSCode 21 | .vscode/* 22 | !.vscode/settings.json 23 | !.vscode/tasks.json 24 | !.vscode/launch.json 25 | !.vscode/extensions.json 26 | 27 | # misc 28 | /.angular/cache 29 | /.sass-cache 30 | /connect.lock 31 | /libpeerconnection.log 32 | npm-debug.log 33 | testem.log 34 | /typings 35 | 36 | 37 | # System Files 38 | .DS_Store 39 | Thumbs.db 40 | -------------------------------------------------------------------------------- /core/examples/luigi-example-next/pages/sample1.js: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import Head from 'next/head'; 3 | 4 | export default function Sample1() { 5 | useEffect(() => { 6 | const LuigiClient = window['LuigiClient']; 7 | LuigiClient.addInitListener(() => { 8 | console.log('Sample 1 Initialized'); 9 | }); 10 | }, []); 11 | 12 | return ( 13 | <> 14 | 15 |
16 |

Sample 1

17 |
18 |
19 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et 20 | dolore magna aliquyam erat, sed diam voluptua. 21 |
22 | 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /core/examples/luigi-example-next/pages/sample2.js: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import Head from 'next/head'; 3 | 4 | export default function Sample2() { 5 | useEffect(() => { 6 | const LuigiClient = window['LuigiClient']; 7 | LuigiClient.addInitListener(() => { 8 | console.log('Sample 2 Initialized'); 9 | }); 10 | }, []); 11 | 12 | return ( 13 | <> 14 | 15 |
16 |

Sample 2

17 |
18 |
19 | Luigi ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et 20 | dolore magna aliquyam erat, sed diam voluptua. 21 |
22 | 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /core/examples/luigi-example-react/public/sampleapp.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Luigi Simple React App 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | -------------------------------------------------------------------------------- /container/public/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@luigi-project/container", 3 | "description": "Javascript library enabling creation of microfrontends", 4 | "license": "Apache-2.0", 5 | "main": "bundle.js", 6 | "types": "index.d.ts", 7 | "repository": { 8 | "type": "git", 9 | "url": "ssh://github.com/luigi-project/luigi.git" 10 | }, 11 | "customElements": "./dist/custom-elements.json", 12 | "publishConfig": { 13 | "tag": "luigi-container" 14 | }, 15 | "keywords": [ 16 | "luigi", 17 | "core", 18 | "UI", 19 | "extensibility", 20 | "micro-frontends", 21 | "microfrontends" 22 | ], 23 | "version": "1.7.6" 24 | } -------------------------------------------------------------------------------- /core-modular/eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import eslint from '@eslint/js'; 2 | import tseslint from 'typescript-eslint'; 3 | 4 | export default tseslint.config( 5 | eslint.configs.recommended, 6 | tseslint.configs.recommended, 7 | { 8 | files: ['src/**/*.ts'], 9 | rules: { 10 | 'no-useless-escape': 'off', 11 | 'prefer-const': 'warn', 12 | '@typescript-eslint/no-empty-object-type': 'warn', 13 | '@typescript-eslint/no-explicit-any': 'off', 14 | '@typescript-eslint/no-namespace': 'off', 15 | '@typescript-eslint/no-unused-expressions': 'off', 16 | '@typescript-eslint/no-unsafe-function-type': 'warn', 17 | '@typescript-eslint/no-unused-vars': 'off' 18 | } 19 | } 20 | ); -------------------------------------------------------------------------------- /test/e2e-test-application/src/app/project/project.component.scss: -------------------------------------------------------------------------------- 1 | section { 2 | button { 3 | margin-bottom: 0.75rem; 4 | &:focus { 5 | border-color: #085caf; 6 | box-shadow: 0 0 0 1px #0a6ed1; 7 | } 8 | } 9 | & > * { 10 | line-height: 1.75em; 11 | } 12 | li { 13 | display: block; 14 | } 15 | li:not(:last-of-type) { 16 | padding-bottom: 20px; 17 | } 18 | .link-manager { 19 | input { 20 | display: inline; 21 | max-width: 25em; 22 | } 23 | button { 24 | margin-bottom: 1px; 25 | padding-top: 1px; 26 | padding-bottom: 1px; 27 | margin-left: 4px; 28 | } 29 | } 30 | button.w100per { 31 | width: 100%; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /website/docs/scripts/mocks/custom-wrappers.md: -------------------------------------------------------------------------------- 1 | # Frequently asked questions 2 | 3 | Here we have some answers to your questions 4 | 5 | 6 | 7 | ### This is the Accordion Headline 8 | 9 | This is the text 10 | This is the text 11 | This is the text 12 | This is the text 13 | 14 | ``` 15 | Sample code 16 | ``` 17 | ### Whats next? 18 | 19 | Everything fine! 20 | 21 | 22 | 23 | And now an accordion with all items openend 24 | 25 | 26 | 27 | 28 | ### Another Section 29 | 30 | This is the text 31 | This is the text 32 | 33 | ### Another Section 34 | 35 | This is the text 36 | This is the text 37 | 38 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an improvement to the project 4 | --- 5 | 6 | 10 | 11 | **Description** 12 | 13 | 14 | 15 | **Reasons** 16 | 17 | 18 | 19 | **Attachments** 20 | 21 | 22 | -------------------------------------------------------------------------------- /container/examples/compound-container/myCompoundWebComponent1.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This class is used to test LuigiClient webcomponent based functionality 3 | */ 4 | export default class extends HTMLElement { 5 | constructor() { 6 | super(); 7 | const shadowRoot = this.attachShadow({ mode: 'open' }); 8 | const template = document.createElement('template'); 9 | template.innerHTML = `

Hello From Web Component 1

`; 10 | shadowRoot.appendChild(template.content.cloneNode(true)); 11 | this.$paragraph = shadowRoot.getElementById('paragraph'); 12 | } 13 | 14 | set context(ctx) { 15 | this.$paragraph.innerHTML += ctx.content; 16 | } 17 | } 18 | --------------------------------------------------------------------------------