├── .github ├── FUNDING.yml └── workflows │ └── npm-publish.yml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── Dockerfile ├── LICENSE ├── README.md ├── angular.json ├── bun.lock ├── documents └── todos.md ├── nginx.conf ├── nixpacks.toml ├── package-lock.json ├── package.json ├── projects ├── design-system │ ├── public │ │ ├── favicon.ico │ │ ├── icon.svg │ │ ├── logo.svg │ │ ├── ship-favicon.png │ │ ├── ship-logo-text.svg │ │ └── ship-logo.svg │ ├── src │ │ ├── app │ │ │ ├── app.component.ts │ │ │ ├── app.config.server.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.server.ts │ │ │ ├── app.routes.ts │ │ │ ├── core │ │ │ │ ├── providers │ │ │ │ │ └── window.ts │ │ │ │ └── services │ │ │ │ │ └── localstorage.token.ts │ │ │ ├── getting-started │ │ │ │ ├── getting-started.component.html │ │ │ │ ├── getting-started.component.scss │ │ │ │ └── getting-started.component.ts │ │ │ ├── hello │ │ │ │ ├── hello.component.html │ │ │ │ ├── hello.component.scss │ │ │ │ └── hello.component.ts │ │ │ ├── layout │ │ │ │ ├── layout.component.html │ │ │ │ ├── layout.component.scss │ │ │ │ ├── layout.component.ts │ │ │ │ ├── layout.state.ts │ │ │ │ └── logo │ │ │ │ │ ├── logo.component.html │ │ │ │ │ ├── logo.component.scss │ │ │ │ │ └── logo.component.ts │ │ │ ├── previewer │ │ │ │ ├── highlight-file │ │ │ │ │ ├── highlight-file.component.html │ │ │ │ │ ├── highlight-file.component.scss │ │ │ │ │ └── highlight-file.component.ts │ │ │ │ ├── highlight │ │ │ │ │ ├── highlight.component.html │ │ │ │ │ ├── highlight.component.scss │ │ │ │ │ └── highlight.component.ts │ │ │ │ ├── previewer.component.html │ │ │ │ ├── previewer.component.scss │ │ │ │ └── previewer.component.ts │ │ │ ├── property-viewer │ │ │ │ ├── property-viewer.component.html │ │ │ │ ├── property-viewer.component.scss │ │ │ │ └── property-viewer.component.ts │ │ │ ├── ship │ │ │ │ ├── alerts │ │ │ │ │ ├── alerts.component.html │ │ │ │ │ ├── alerts.component.scss │ │ │ │ │ ├── alerts.component.ts │ │ │ │ │ └── examples │ │ │ │ │ │ ├── alerts-sandbox.component.html │ │ │ │ │ │ ├── alerts-sandbox.component.scss │ │ │ │ │ │ ├── alerts-sandbox.component.ts │ │ │ │ │ │ ├── base-alert │ │ │ │ │ │ ├── base-alert.component.html │ │ │ │ │ │ ├── base-alert.component.scss │ │ │ │ │ │ └── base-alert.component.ts │ │ │ │ │ │ ├── flat-alert │ │ │ │ │ │ ├── flat-alert.component.html │ │ │ │ │ │ ├── flat-alert.component.scss │ │ │ │ │ │ └── flat-alert.component.ts │ │ │ │ │ │ ├── outlined-alert │ │ │ │ │ │ ├── outlined-alert.component.html │ │ │ │ │ │ ├── outlined-alert.component.scss │ │ │ │ │ │ └── outlined-alert.component.ts │ │ │ │ │ │ ├── raised-alert │ │ │ │ │ │ ├── raised-alert.component.html │ │ │ │ │ │ ├── raised-alert.component.scss │ │ │ │ │ │ └── raised-alert.component.ts │ │ │ │ │ │ └── simple-alert │ │ │ │ │ │ ├── simple-alert.component.html │ │ │ │ │ │ ├── simple-alert.component.scss │ │ │ │ │ │ └── simple-alert.component.ts │ │ │ │ ├── blueprints │ │ │ │ │ ├── blueprints.component.html │ │ │ │ │ ├── blueprints.component.scss │ │ │ │ │ └── blueprints.component.ts │ │ │ │ ├── button-groups │ │ │ │ │ ├── button-groups.component.html │ │ │ │ │ ├── button-groups.component.scss │ │ │ │ │ ├── button-groups.component.ts │ │ │ │ │ └── examples │ │ │ │ │ │ └── base-button-group │ │ │ │ │ │ ├── base-button-group.component.html │ │ │ │ │ │ ├── base-button-group.component.scss │ │ │ │ │ │ └── base-button-group.component.ts │ │ │ │ ├── buttons │ │ │ │ │ ├── buttons.component.html │ │ │ │ │ ├── buttons.component.scss │ │ │ │ │ ├── buttons.component.ts │ │ │ │ │ └── examples │ │ │ │ │ │ ├── base-button │ │ │ │ │ │ ├── base-button.component.html │ │ │ │ │ │ ├── base-button.component.scss │ │ │ │ │ │ └── base-button.component.ts │ │ │ │ │ │ ├── button-sandbox │ │ │ │ │ │ ├── button-sandbox.component.html │ │ │ │ │ │ ├── button-sandbox.component.scss │ │ │ │ │ │ └── button-sandbox.component.ts │ │ │ │ │ │ ├── flat-button │ │ │ │ │ │ ├── flat-button.component.html │ │ │ │ │ │ ├── flat-button.component.scss │ │ │ │ │ │ └── flat-button.component.ts │ │ │ │ │ │ ├── outlined-button │ │ │ │ │ │ ├── outlined-button.component.html │ │ │ │ │ │ ├── outlined-button.component.scss │ │ │ │ │ │ └── outlined-button.component.ts │ │ │ │ │ │ ├── raised-button │ │ │ │ │ │ ├── raised-button.component.html │ │ │ │ │ │ ├── raised-button.component.scss │ │ │ │ │ │ └── raised-button.component.ts │ │ │ │ │ │ └── simple-button │ │ │ │ │ │ ├── simple-button.component.html │ │ │ │ │ │ ├── simple-button.component.scss │ │ │ │ │ │ └── simple-button.component.ts │ │ │ │ ├── cards │ │ │ │ │ ├── cards.component.html │ │ │ │ │ ├── cards.component.scss │ │ │ │ │ ├── cards.component.ts │ │ │ │ │ └── examples │ │ │ │ │ │ ├── card-sandbox │ │ │ │ │ │ ├── card-sandbox.component.html │ │ │ │ │ │ ├── card-sandbox.component.scss │ │ │ │ │ │ └── card-sandbox.component.ts │ │ │ │ │ │ ├── toggle-card-disallowed │ │ │ │ │ │ ├── toggle-card-disallowed.component.html │ │ │ │ │ │ └── toggle-card-disallowed.component.ts │ │ │ │ │ │ ├── toggle-card │ │ │ │ │ │ ├── toggle-card.component.html │ │ │ │ │ │ └── toggle-card.component.ts │ │ │ │ │ │ ├── type-a-card │ │ │ │ │ │ ├── type-a-card.component.html │ │ │ │ │ │ └── type-a-card.component.ts │ │ │ │ │ │ ├── type-b-card │ │ │ │ │ │ ├── type-b-card.component.html │ │ │ │ │ │ └── type-b-card.component.ts │ │ │ │ │ │ └── type-c-card │ │ │ │ │ │ ├── type-c-card.component.html │ │ │ │ │ │ └── type-c-card.component.ts │ │ │ │ ├── checkboxes │ │ │ │ │ ├── checkboxes.component.html │ │ │ │ │ ├── checkboxes.component.scss │ │ │ │ │ ├── checkboxes.component.ts │ │ │ │ │ └── examples │ │ │ │ │ │ ├── base-checkbox │ │ │ │ │ │ ├── base-checkbox.component.html │ │ │ │ │ │ ├── base-checkbox.component.scss │ │ │ │ │ │ └── base-checkbox.component.ts │ │ │ │ │ │ ├── checkbox-sandbox.component.html │ │ │ │ │ │ ├── checkbox-sandbox.component.scss │ │ │ │ │ │ ├── checkbox-sandbox.component.ts │ │ │ │ │ │ ├── flat-checkbox │ │ │ │ │ │ ├── flat-checkbox.component.html │ │ │ │ │ │ ├── flat-checkbox.component.scss │ │ │ │ │ │ └── flat-checkbox.component.ts │ │ │ │ │ │ ├── outlined-checkbox │ │ │ │ │ │ ├── outlined-checkbox.component.html │ │ │ │ │ │ ├── outlined-checkbox.component.scss │ │ │ │ │ │ └── outlined-checkbox.component.ts │ │ │ │ │ │ ├── raised-checkbox │ │ │ │ │ │ ├── raised-checkbox.component.html │ │ │ │ │ │ ├── raised-checkbox.component.scss │ │ │ │ │ │ └── raised-checkbox.component.ts │ │ │ │ │ │ └── simple-checkbox │ │ │ │ │ │ ├── simple-checkbox.component.html │ │ │ │ │ │ ├── simple-checkbox.component.scss │ │ │ │ │ │ └── simple-checkbox.component.ts │ │ │ │ ├── chip-inputs │ │ │ │ │ ├── chip-inputs.component.html │ │ │ │ │ ├── chip-inputs.component.scss │ │ │ │ │ └── chip-inputs.component.ts │ │ │ │ ├── chips │ │ │ │ │ ├── chips.component.html │ │ │ │ │ ├── chips.component.scss │ │ │ │ │ ├── chips.component.ts │ │ │ │ │ └── examples │ │ │ │ │ │ ├── base-chip │ │ │ │ │ │ ├── base-chip.component.html │ │ │ │ │ │ ├── base-chip.component.scss │ │ │ │ │ │ └── base-chip.component.ts │ │ │ │ │ │ ├── chip-sandbox │ │ │ │ │ │ ├── chip-sandbox.component.html │ │ │ │ │ │ ├── chip-sandbox.component.scss │ │ │ │ │ │ └── chip-sandbox.component.ts │ │ │ │ │ │ ├── chip.example.html │ │ │ │ │ │ ├── flat-chip │ │ │ │ │ │ ├── flat-chip.component.html │ │ │ │ │ │ ├── flat-chip.component.scss │ │ │ │ │ │ └── flat-chip.component.ts │ │ │ │ │ │ ├── outlined-chip │ │ │ │ │ │ ├── outlined-chip.component.html │ │ │ │ │ │ ├── outlined-chip.component.scss │ │ │ │ │ │ └── outlined-chip.component.ts │ │ │ │ │ │ ├── raised-chip │ │ │ │ │ │ ├── raised-chip.component.html │ │ │ │ │ │ ├── raised-chip.component.scss │ │ │ │ │ │ └── raised-chip.component.ts │ │ │ │ │ │ └── simple-chip │ │ │ │ │ │ ├── simple-chip.component.html │ │ │ │ │ │ ├── simple-chip.component.scss │ │ │ │ │ │ └── simple-chip.component.ts │ │ │ │ ├── color-pickers │ │ │ │ │ ├── color-pickers.component.html │ │ │ │ │ ├── color-pickers.component.scss │ │ │ │ │ ├── color-pickers.component.ts │ │ │ │ │ └── examples │ │ │ │ │ │ └── base-color-picker │ │ │ │ │ │ ├── base-color-picker.component.html │ │ │ │ │ │ ├── base-color-picker.component.scss │ │ │ │ │ │ └── base-color-picker.component.ts │ │ │ │ ├── datepickers │ │ │ │ │ ├── datepickers.component.html │ │ │ │ │ ├── datepickers.component.scss │ │ │ │ │ ├── datepickers.component.ts │ │ │ │ │ └── examples │ │ │ │ │ │ ├── base-datepicker │ │ │ │ │ │ ├── base-datepicker.component.html │ │ │ │ │ │ ├── base-datepicker.component.scss │ │ │ │ │ │ └── base-datepicker.component.ts │ │ │ │ │ │ ├── datepicker-sandbox │ │ │ │ │ │ ├── datepicker-sandbox.component.html │ │ │ │ │ │ ├── datepicker-sandbox.component.scss │ │ │ │ │ │ └── datepicker-sandbox.component.ts │ │ │ │ │ │ ├── input-datepicker-ngmodel │ │ │ │ │ │ ├── input-datepicker-ngmodel.component.html │ │ │ │ │ │ ├── input-datepicker-ngmodel.component.scss │ │ │ │ │ │ └── input-datepicker-ngmodel.component.ts │ │ │ │ │ │ ├── input-datepicker-reactive │ │ │ │ │ │ ├── input-datepicker-reactive.component.html │ │ │ │ │ │ ├── input-datepicker-reactive.component.scss │ │ │ │ │ │ └── input-datepicker-reactive.component.ts │ │ │ │ │ │ ├── range-datepicker-sandbox │ │ │ │ │ │ ├── range-datepicker-sandbox.component.html │ │ │ │ │ │ ├── range-datepicker-sandbox.component.scss │ │ │ │ │ │ └── range-datepicker-sandbox.component.ts │ │ │ │ │ │ ├── range-datepicker │ │ │ │ │ │ ├── range-datepicker.component.html │ │ │ │ │ │ ├── range-datepicker.component.scss │ │ │ │ │ │ └── range-datepicker.component.ts │ │ │ │ │ │ └── range-input-datepicker │ │ │ │ │ │ ├── range-input-datepicker.component.html │ │ │ │ │ │ ├── range-input-datepicker.component.scss │ │ │ │ │ │ └── range-input-datepicker.component.ts │ │ │ │ ├── dialogs │ │ │ │ │ ├── dialogs.component.html │ │ │ │ │ ├── dialogs.component.scss │ │ │ │ │ ├── dialogs.component.ts │ │ │ │ │ └── examples │ │ │ │ │ │ ├── basic-dynamic-dialog │ │ │ │ │ │ ├── basic-dynamic-dialog.component.html │ │ │ │ │ │ ├── basic-dynamic-dialog.component.scss │ │ │ │ │ │ └── basic-dynamic-dialog.component.ts │ │ │ │ │ │ ├── data-passing-dialog │ │ │ │ │ │ ├── data-dialog-content.component.html │ │ │ │ │ │ ├── data-dialog-content.component.scss │ │ │ │ │ │ ├── data-passing-dialog.component.html │ │ │ │ │ │ ├── data-passing-dialog.component.scss │ │ │ │ │ │ └── data-passing-dialog.component.ts │ │ │ │ │ │ ├── dialog-as-component │ │ │ │ │ │ ├── dialog-as-component.component.html │ │ │ │ │ │ ├── dialog-as-component.component.scss │ │ │ │ │ │ └── dialog-as-component.component.ts │ │ │ │ │ │ └── header-footer-dialog │ │ │ │ │ │ ├── header-footer-dialog-content.component.html │ │ │ │ │ │ ├── header-footer-dialog-content.component.scss │ │ │ │ │ │ ├── header-footer-dialog.component.html │ │ │ │ │ │ ├── header-footer-dialog.component.scss │ │ │ │ │ │ └── header-footer-dialog.component.ts │ │ │ │ ├── dividers │ │ │ │ │ ├── dividers.component.html │ │ │ │ │ ├── dividers.component.scss │ │ │ │ │ ├── dividers.component.ts │ │ │ │ │ └── examples │ │ │ │ │ │ ├── base-divider │ │ │ │ │ │ ├── base-divider.component.html │ │ │ │ │ │ ├── base-divider.component.scss │ │ │ │ │ │ ├── base-divider.component.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── text-divider │ │ │ │ │ │ ├── text-divider.component.html │ │ │ │ │ │ ├── text-divider.component.scss │ │ │ │ │ │ └── text-divider.component.ts │ │ │ │ ├── event-cards │ │ │ │ │ ├── event-cards.component.html │ │ │ │ │ ├── event-cards.component.scss │ │ │ │ │ ├── event-cards.component.ts │ │ │ │ │ └── examples │ │ │ │ │ │ ├── base-event-card │ │ │ │ │ │ ├── base-event-card.component.html │ │ │ │ │ │ ├── base-event-card.component.scss │ │ │ │ │ │ └── base-event-card.component.ts │ │ │ │ │ │ ├── event-card-sandbox │ │ │ │ │ │ ├── event-card-sandbox.component.html │ │ │ │ │ │ ├── event-card-sandbox.component.scss │ │ │ │ │ │ └── event-card-sandbox.component.ts │ │ │ │ │ │ ├── flat-event-card │ │ │ │ │ │ ├── flat-event-card.component.html │ │ │ │ │ │ ├── flat-event-card.component.scss │ │ │ │ │ │ └── flat-event-card.component.ts │ │ │ │ │ │ ├── outlined-event-card │ │ │ │ │ │ ├── outlined-event-card.component.html │ │ │ │ │ │ ├── outlined-event-card.component.scss │ │ │ │ │ │ └── outlined-event-card.component.ts │ │ │ │ │ │ ├── raised-event-card │ │ │ │ │ │ ├── raised-event-card.component.html │ │ │ │ │ │ ├── raised-event-card.component.scss │ │ │ │ │ │ └── raised-event-card.component.ts │ │ │ │ │ │ └── simple-event-card │ │ │ │ │ │ ├── simple-event-card.component.html │ │ │ │ │ │ ├── simple-event-card.component.scss │ │ │ │ │ │ └── simple-event-card.component.ts │ │ │ │ ├── expansion-panels │ │ │ │ │ ├── expansion-panels.component.html │ │ │ │ │ ├── expansion-panels.component.scss │ │ │ │ │ └── expansion-panels.component.ts │ │ │ │ ├── file-uploads │ │ │ │ │ ├── examples │ │ │ │ │ │ ├── base-file-upload │ │ │ │ │ │ │ ├── base-file-upload.component.html │ │ │ │ │ │ │ ├── base-file-upload.component.scss │ │ │ │ │ │ │ └── base-file-upload.component.ts │ │ │ │ │ │ └── file-upload-sandbox │ │ │ │ │ │ │ ├── file-upload-sandbox.component.html │ │ │ │ │ │ │ ├── file-upload-sandbox.component.scss │ │ │ │ │ │ │ └── file-upload-sandbox.component.ts │ │ │ │ │ ├── file-uploads.component.html │ │ │ │ │ ├── file-uploads.component.scss │ │ │ │ │ └── file-uploads.component.ts │ │ │ │ ├── form-fields │ │ │ │ │ ├── examples │ │ │ │ │ │ ├── base-form-field │ │ │ │ │ │ │ ├── base-form-field.component.html │ │ │ │ │ │ │ ├── base-form-field.component.scss │ │ │ │ │ │ │ └── base-form-field.component.ts │ │ │ │ │ │ ├── form-field-sandbox │ │ │ │ │ │ │ ├── form-field-sandbox.component.html │ │ │ │ │ │ │ ├── form-field-sandbox.component.scss │ │ │ │ │ │ │ └── form-field-sandbox.component.ts │ │ │ │ │ │ └── small-form-field │ │ │ │ │ │ │ ├── small-form-field.component.html │ │ │ │ │ │ │ ├── small-form-field.component.scss │ │ │ │ │ │ │ └── small-form-field.component.ts │ │ │ │ │ ├── form-fields.component.html │ │ │ │ │ ├── form-fields.component.scss │ │ │ │ │ └── form-fields.component.ts │ │ │ │ ├── icons │ │ │ │ │ ├── examples │ │ │ │ │ │ └── sandbox-icon │ │ │ │ │ │ │ ├── sandbox-icon.component.html │ │ │ │ │ │ │ ├── sandbox-icon.component.scss │ │ │ │ │ │ │ └── sandbox-icon.component.ts │ │ │ │ │ ├── icons.component.html │ │ │ │ │ ├── icons.component.scss │ │ │ │ │ └── icons.component.ts │ │ │ │ ├── input-mask │ │ │ │ │ ├── examples │ │ │ │ │ │ └── base-input-mask │ │ │ │ │ │ │ ├── base-input-mask.component.html │ │ │ │ │ │ │ ├── base-input-mask.component.scss │ │ │ │ │ │ │ └── base-input-mask.component.ts │ │ │ │ │ ├── input-mask.component.html │ │ │ │ │ ├── input-mask.component.scss │ │ │ │ │ └── input-mask.component.ts │ │ │ │ ├── lists │ │ │ │ │ ├── examples │ │ │ │ │ │ └── base-list-example │ │ │ │ │ │ │ ├── base-list-example.component.html │ │ │ │ │ │ │ ├── base-list-example.component.scss │ │ │ │ │ │ │ └── base-list-example.component.ts │ │ │ │ │ ├── lists.component.html │ │ │ │ │ ├── lists.component.scss │ │ │ │ │ └── lists.component.ts │ │ │ │ ├── menus │ │ │ │ │ ├── examples │ │ │ │ │ │ ├── base-menu-example │ │ │ │ │ │ │ ├── base-menu-example.component.html │ │ │ │ │ │ │ ├── base-menu-example.component.scss │ │ │ │ │ │ │ └── base-menu-example.component.ts │ │ │ │ │ │ ├── icon-suffix-menu │ │ │ │ │ │ │ ├── icon-suffix-menu.component.html │ │ │ │ │ │ │ ├── icon-suffix-menu.component.scss │ │ │ │ │ │ │ └── icon-suffix-menu.component.ts │ │ │ │ │ │ ├── multi-layer-menu-example │ │ │ │ │ │ │ ├── multi-layer-menu-example.component.html │ │ │ │ │ │ │ ├── multi-layer-menu-example.component.scss │ │ │ │ │ │ │ └── multi-layer-menu-example.component.ts │ │ │ │ │ │ ├── search-menu-example │ │ │ │ │ │ │ ├── search-menu-example.component.html │ │ │ │ │ │ │ ├── search-menu-example.component.scss │ │ │ │ │ │ │ └── search-menu-example.component.ts │ │ │ │ │ │ └── toggle-select-menu-example │ │ │ │ │ │ │ ├── toggle-select-menu-example.component.html │ │ │ │ │ │ │ ├── toggle-select-menu-example.component.scss │ │ │ │ │ │ │ └── toggle-select-menu-example.component.ts │ │ │ │ │ ├── menus.component.html │ │ │ │ │ ├── menus.component.scss │ │ │ │ │ └── menus.component.ts │ │ │ │ ├── popovers │ │ │ │ │ ├── examples │ │ │ │ │ │ ├── button-popover │ │ │ │ │ │ │ ├── button-popover.component.html │ │ │ │ │ │ │ ├── button-popover.component.scss │ │ │ │ │ │ │ └── button-popover.component.ts │ │ │ │ │ │ ├── sh-button-popover │ │ │ │ │ │ │ ├── sh-button-popover.component.html │ │ │ │ │ │ │ ├── sh-button-popover.component.scss │ │ │ │ │ │ │ └── sh-button-popover.component.ts │ │ │ │ │ │ └── trigger-attribute-popover │ │ │ │ │ │ │ ├── trigger-attribute-popover.component.html │ │ │ │ │ │ │ ├── trigger-attribute-popover.component.scss │ │ │ │ │ │ │ └── trigger-attribute-popover.component.ts │ │ │ │ │ ├── popovers.component.html │ │ │ │ │ ├── popovers.component.scss │ │ │ │ │ └── popovers.component.ts │ │ │ │ ├── progress-bars │ │ │ │ │ ├── examples │ │ │ │ │ │ ├── base-progress-bar │ │ │ │ │ │ │ ├── base-progress-bar.component.html │ │ │ │ │ │ │ ├── base-progress-bar.component.scss │ │ │ │ │ │ │ └── base-progress-bar.component.ts │ │ │ │ │ │ ├── flat-progress-bar │ │ │ │ │ │ │ ├── flat-progress-bar.component.html │ │ │ │ │ │ │ ├── flat-progress-bar.component.scss │ │ │ │ │ │ │ └── flat-progress-bar.component.ts │ │ │ │ │ │ ├── indeterminte-progress-bar │ │ │ │ │ │ │ ├── indeterminte-progress-bar.component.html │ │ │ │ │ │ │ ├── indeterminte-progress-bar.component.scss │ │ │ │ │ │ │ └── indeterminte-progress-bar.component.ts │ │ │ │ │ │ ├── outlined-progress-bar │ │ │ │ │ │ │ ├── outlined-progress-bar.component.html │ │ │ │ │ │ │ ├── outlined-progress-bar.component.scss │ │ │ │ │ │ │ └── outlined-progress-bar.component.ts │ │ │ │ │ │ └── raised-progress-bar │ │ │ │ │ │ │ ├── raised-progress-bar.component.html │ │ │ │ │ │ │ ├── raised-progress-bar.component.scss │ │ │ │ │ │ │ └── raised-progress-bar.component.ts │ │ │ │ │ ├── progress-bars.component.html │ │ │ │ │ ├── progress-bars.component.scss │ │ │ │ │ └── progress-bars.component.ts │ │ │ │ ├── radio-buttons │ │ │ │ │ ├── examples │ │ │ │ │ │ ├── base-radio │ │ │ │ │ │ │ ├── base-radio.component.html │ │ │ │ │ │ │ ├── base-radio.component.scss │ │ │ │ │ │ │ └── base-radio.component.ts │ │ │ │ │ │ ├── flat-radio │ │ │ │ │ │ │ ├── flat-radio.component.html │ │ │ │ │ │ │ ├── flat-radio.component.scss │ │ │ │ │ │ │ └── flat-radio.component.ts │ │ │ │ │ │ ├── outlined-radio │ │ │ │ │ │ │ ├── outlined-radio.component.html │ │ │ │ │ │ │ ├── outlined-radio.component.scss │ │ │ │ │ │ │ └── outlined-radio.component.ts │ │ │ │ │ │ ├── radio-sandbox.component.html │ │ │ │ │ │ ├── radio-sandbox.component.scss │ │ │ │ │ │ ├── radio-sandbox.component.ts │ │ │ │ │ │ ├── raised-radio │ │ │ │ │ │ │ ├── raised-radio.component.html │ │ │ │ │ │ │ ├── raised-radio.component.scss │ │ │ │ │ │ │ └── raised-radio.component.ts │ │ │ │ │ │ └── simple-radio │ │ │ │ │ │ │ ├── simple-radio.component.html │ │ │ │ │ │ │ ├── simple-radio.component.scss │ │ │ │ │ │ │ └── simple-radio.component.ts │ │ │ │ │ ├── radio-buttons.component.html │ │ │ │ │ ├── radio-buttons.component.scss │ │ │ │ │ └── radio-buttons.component.ts │ │ │ │ ├── range-sliders │ │ │ │ │ ├── examples │ │ │ │ │ │ ├── always-show-indicator-range-slider │ │ │ │ │ │ │ ├── always-show-indicator-range-slider.component.html │ │ │ │ │ │ │ ├── always-show-indicator-range-slider.component.scss │ │ │ │ │ │ │ └── always-show-indicator-range-slider.component.ts │ │ │ │ │ │ ├── base-range-slider │ │ │ │ │ │ │ ├── base-range-slider.component.html │ │ │ │ │ │ │ ├── base-range-slider.component.scss │ │ │ │ │ │ │ └── base-range-slider.component.ts │ │ │ │ │ │ ├── disabled-range-slider │ │ │ │ │ │ │ ├── disabled-range-slider.component.html │ │ │ │ │ │ │ ├── disabled-range-slider.component.scss │ │ │ │ │ │ │ └── disabled-range-slider.component.ts │ │ │ │ │ │ ├── float-range-slider │ │ │ │ │ │ │ ├── float-range-slider.component.html │ │ │ │ │ │ │ ├── float-range-slider.component.scss │ │ │ │ │ │ │ └── float-range-slider.component.ts │ │ │ │ │ │ ├── range-slider-sandbox │ │ │ │ │ │ │ ├── range-slider-sandbox.component.html │ │ │ │ │ │ │ ├── range-slider-sandbox.component.scss │ │ │ │ │ │ │ └── range-slider-sandbox.component.ts │ │ │ │ │ │ ├── reactive-range-slider │ │ │ │ │ │ │ ├── reactive-range-slider.component.html │ │ │ │ │ │ │ ├── reactive-range-slider.component.scss │ │ │ │ │ │ │ └── reactive-range-slider.component.ts │ │ │ │ │ │ ├── readonly-range-slider │ │ │ │ │ │ │ ├── readonly-range-slider.component.html │ │ │ │ │ │ │ ├── readonly-range-slider.component.scss │ │ │ │ │ │ │ └── readonly-range-slider.component.ts │ │ │ │ │ │ └── unit-range-slider │ │ │ │ │ │ │ ├── unit-range-slider.component.html │ │ │ │ │ │ │ ├── unit-range-slider.component.scss │ │ │ │ │ │ │ └── unit-range-slider.component.ts │ │ │ │ │ ├── range-sliders.component.html │ │ │ │ │ ├── range-sliders.component.scss │ │ │ │ │ └── range-sliders.component.ts │ │ │ │ ├── selects │ │ │ │ │ ├── examples │ │ │ │ │ │ ├── base-select │ │ │ │ │ │ │ ├── base-select.component.html │ │ │ │ │ │ │ ├── base-select.component.scss │ │ │ │ │ │ │ └── base-select.component.ts │ │ │ │ │ │ ├── disabled-select │ │ │ │ │ │ │ ├── disabled-select.component.html │ │ │ │ │ │ │ ├── disabled-select.component.scss │ │ │ │ │ │ │ └── disabled-select.component.ts │ │ │ │ │ │ ├── inline-search-multiple-select │ │ │ │ │ │ │ ├── inline-search-multiple-select.component.html │ │ │ │ │ │ │ ├── inline-search-multiple-select.component.scss │ │ │ │ │ │ │ └── inline-search-multiple-select.component.ts │ │ │ │ │ │ ├── inline-search-select │ │ │ │ │ │ │ ├── inline-search-select.component.html │ │ │ │ │ │ │ ├── inline-search-select.component.scss │ │ │ │ │ │ │ └── inline-search-select.component.ts │ │ │ │ │ │ ├── lazy-search-multiple-select │ │ │ │ │ │ │ ├── lazy-search-multiple-select.component.html │ │ │ │ │ │ │ ├── lazy-search-multiple-select.component.scss │ │ │ │ │ │ │ └── lazy-search-multiple-select.component.ts │ │ │ │ │ │ ├── lazy-search-select │ │ │ │ │ │ │ ├── lazy-search-select.component.html │ │ │ │ │ │ │ ├── lazy-search-select.component.scss │ │ │ │ │ │ │ └── lazy-search-select.component.ts │ │ │ │ │ │ ├── multiple-select-as-text │ │ │ │ │ │ │ ├── multiple-select-as-text.component.html │ │ │ │ │ │ │ ├── multiple-select-as-text.component.scss │ │ │ │ │ │ │ └── multiple-select-as-text.component.ts │ │ │ │ │ │ ├── multiple-select │ │ │ │ │ │ │ ├── multiple-select.component.html │ │ │ │ │ │ │ ├── multiple-select.component.scss │ │ │ │ │ │ │ └── multiple-select.component.ts │ │ │ │ │ │ ├── object-select │ │ │ │ │ │ │ ├── object-select.component.html │ │ │ │ │ │ │ ├── object-select.component.scss │ │ │ │ │ │ │ └── object-select.component.ts │ │ │ │ │ │ ├── option-template-select │ │ │ │ │ │ │ ├── option-template-select.component.html │ │ │ │ │ │ │ ├── option-template-select.component.scss │ │ │ │ │ │ │ └── option-template-select.component.ts │ │ │ │ │ │ ├── placeholder-template-select │ │ │ │ │ │ │ ├── placeholder-template-select.component.html │ │ │ │ │ │ │ ├── placeholder-template-select.component.scss │ │ │ │ │ │ │ └── placeholder-template-select.component.ts │ │ │ │ │ │ ├── reactive-select-disabled │ │ │ │ │ │ │ ├── reactive-select-disabled.component.html │ │ │ │ │ │ │ ├── reactive-select-disabled.component.scss │ │ │ │ │ │ │ └── reactive-select-disabled.component.ts │ │ │ │ │ │ ├── reactive-select │ │ │ │ │ │ │ ├── reactive-select-example.component.html │ │ │ │ │ │ │ ├── reactive-select-example.component.scss │ │ │ │ │ │ │ └── reactive-select-example.component.ts │ │ │ │ │ │ └── readonly-select │ │ │ │ │ │ │ ├── readonly-select.component.html │ │ │ │ │ │ │ ├── readonly-select.component.scss │ │ │ │ │ │ │ └── readonly-select.component.ts │ │ │ │ │ ├── selects.component.html │ │ │ │ │ ├── selects.component.scss │ │ │ │ │ └── selects.component.ts │ │ │ │ ├── sheets │ │ │ │ │ ├── sheets.component.html │ │ │ │ │ ├── sheets.component.scss │ │ │ │ │ └── sheets.component.ts │ │ │ │ ├── sidenavs │ │ │ │ │ ├── examples │ │ │ │ │ │ └── sandbox-sidenav │ │ │ │ │ │ │ ├── sandbox-sidenav.component.html │ │ │ │ │ │ │ ├── sandbox-sidenav.component.scss │ │ │ │ │ │ │ └── sandbox-sidenav.component.ts │ │ │ │ │ ├── sidenavs.component.html │ │ │ │ │ ├── sidenavs.component.scss │ │ │ │ │ └── sidenavs.component.ts │ │ │ │ ├── sortables │ │ │ │ │ ├── examples │ │ │ │ │ │ └── base-sortable │ │ │ │ │ │ │ ├── base-sortable.component.html │ │ │ │ │ │ │ ├── base-sortable.component.scss │ │ │ │ │ │ │ └── base-sortable.component.ts │ │ │ │ │ ├── sortables.component.html │ │ │ │ │ ├── sortables.component.scss │ │ │ │ │ └── sortables.component.ts │ │ │ │ ├── spinners │ │ │ │ │ ├── examples │ │ │ │ │ │ └── sandbox-spinner │ │ │ │ │ │ │ ├── sandbox-spinner.component.html │ │ │ │ │ │ │ ├── sandbox-spinner.component.scss │ │ │ │ │ │ │ └── sandbox-spinner.component.ts │ │ │ │ │ ├── spinners.component.html │ │ │ │ │ ├── spinners.component.scss │ │ │ │ │ └── spinners.component.ts │ │ │ │ ├── steppers │ │ │ │ │ ├── examples │ │ │ │ │ │ ├── custom-stepper │ │ │ │ │ │ │ ├── custom-steppers.component.html │ │ │ │ │ │ │ ├── custom-steppers.component.scss │ │ │ │ │ │ │ └── custom-steppers.component.ts │ │ │ │ │ │ ├── default-stepper │ │ │ │ │ │ │ ├── default-steppers.component.html │ │ │ │ │ │ │ ├── default-steppers.component.scss │ │ │ │ │ │ │ └── default-steppers.component.ts │ │ │ │ │ │ ├── router-stepper │ │ │ │ │ │ │ ├── router-steppers.component.html │ │ │ │ │ │ │ ├── router-steppers.component.scss │ │ │ │ │ │ │ └── router-steppers.component.ts │ │ │ │ │ │ └── stepper-sandbox │ │ │ │ │ │ │ ├── stepper-sandbox.component.html │ │ │ │ │ │ │ ├── stepper-sandbox.component.scss │ │ │ │ │ │ │ └── stepper-sandbox.component.ts │ │ │ │ │ ├── step-1.component.ts │ │ │ │ │ ├── step-2.component.ts │ │ │ │ │ ├── step-3.component.ts │ │ │ │ │ ├── step-4.component.ts │ │ │ │ │ ├── step-5.component.ts │ │ │ │ │ ├── steppers.component.html │ │ │ │ │ ├── steppers.component.scss │ │ │ │ │ └── steppers.component.ts │ │ │ │ ├── tables │ │ │ │ │ ├── examples │ │ │ │ │ │ ├── base-table │ │ │ │ │ │ │ ├── base-table.component.html │ │ │ │ │ │ │ └── base-table.component.ts │ │ │ │ │ │ ├── multi-sticky-table │ │ │ │ │ │ │ ├── multi-sticky-table.component.html │ │ │ │ │ │ │ ├── multi-sticky-table.component.scss │ │ │ │ │ │ │ └── multi-sticky-table.component.ts │ │ │ │ │ │ ├── multi-table-header │ │ │ │ │ │ │ ├── multi-table-header.component.html │ │ │ │ │ │ │ ├── multi-table-header.component.scss │ │ │ │ │ │ │ └── multi-table-header.component.ts │ │ │ │ │ │ ├── resizing-table │ │ │ │ │ │ │ ├── resizing-table.component.html │ │ │ │ │ │ │ ├── resizing-table.component.scss │ │ │ │ │ │ │ └── resizing-table.component.ts │ │ │ │ │ │ ├── sorting-table │ │ │ │ │ │ │ ├── sorting-table.component.html │ │ │ │ │ │ │ └── sorting-table.component.ts │ │ │ │ │ │ └── toggle-row-table │ │ │ │ │ │ │ ├── toggle-row-table.component.html │ │ │ │ │ │ │ └── toggle-row-table.component.ts │ │ │ │ │ ├── tables.component.html │ │ │ │ │ ├── tables.component.scss │ │ │ │ │ └── tables.component.ts │ │ │ │ ├── tabs │ │ │ │ │ ├── examples │ │ │ │ │ │ ├── custom-tabs │ │ │ │ │ │ │ ├── custom-tabs.component.html │ │ │ │ │ │ │ ├── custom-tabs.component.scss │ │ │ │ │ │ │ └── custom-tabs.component.ts │ │ │ │ │ │ ├── default-tabs │ │ │ │ │ │ │ ├── default-tabs.component.html │ │ │ │ │ │ │ ├── default-tabs.component.scss │ │ │ │ │ │ │ └── default-tabs.component.ts │ │ │ │ │ │ ├── router-tabs │ │ │ │ │ │ │ ├── router-tabs.component.html │ │ │ │ │ │ │ ├── router-tabs.component.scss │ │ │ │ │ │ │ └── router-tabs.component.ts │ │ │ │ │ │ └── tabs-sandbox │ │ │ │ │ │ │ ├── tabs-sandbox.component.html │ │ │ │ │ │ │ ├── tabs-sandbox.component.scss │ │ │ │ │ │ │ └── tabs-sandbox.component.ts │ │ │ │ │ ├── tab │ │ │ │ │ │ ├── tab.component.html │ │ │ │ │ │ ├── tab.component.scss │ │ │ │ │ │ └── tab.component.ts │ │ │ │ │ ├── tabs.component.html │ │ │ │ │ ├── tabs.component.scss │ │ │ │ │ └── tabs.component.ts │ │ │ │ ├── toggles │ │ │ │ │ ├── examples │ │ │ │ │ │ ├── base-toggle │ │ │ │ │ │ │ ├── base-toggle.component.html │ │ │ │ │ │ │ ├── base-toggle.component.scss │ │ │ │ │ │ │ └── base-toggle.component.ts │ │ │ │ │ │ ├── flat-toggle │ │ │ │ │ │ │ ├── flat-toggle.component.html │ │ │ │ │ │ │ ├── flat-toggle.component.scss │ │ │ │ │ │ │ └── flat-toggle.component.ts │ │ │ │ │ │ ├── outlined-toggle │ │ │ │ │ │ │ ├── outlined-toggle.component.html │ │ │ │ │ │ │ ├── outlined-toggle.component.scss │ │ │ │ │ │ │ └── outlined-toggle.component.ts │ │ │ │ │ │ ├── raised-toggle │ │ │ │ │ │ │ ├── raised-toggle.component.html │ │ │ │ │ │ │ ├── raised-toggle.component.scss │ │ │ │ │ │ │ └── raised-toggle.component.ts │ │ │ │ │ │ ├── simple-toggle │ │ │ │ │ │ │ ├── simple-toggle.component.html │ │ │ │ │ │ │ ├── simple-toggle.component.scss │ │ │ │ │ │ │ └── simple-toggle.component.ts │ │ │ │ │ │ ├── toggle-sandbox.component.html │ │ │ │ │ │ ├── toggle-sandbox.component.scss │ │ │ │ │ │ └── toggle-sandbox.component.ts │ │ │ │ │ ├── toggles.component.html │ │ │ │ │ ├── toggles.component.scss │ │ │ │ │ └── toggles.component.ts │ │ │ │ ├── tooltips │ │ │ │ │ ├── examples │ │ │ │ │ │ ├── basic-tooltip copy │ │ │ │ │ │ │ └── basic-tooltip.component.ts │ │ │ │ │ │ ├── basic-tooltip │ │ │ │ │ │ │ ├── basic-tooltip.component.html │ │ │ │ │ │ │ ├── basic-tooltip.component.scss │ │ │ │ │ │ │ └── basic-tooltip.component.ts │ │ │ │ │ │ ├── long-tooltip │ │ │ │ │ │ │ ├── long-tooltip.component.html │ │ │ │ │ │ │ ├── long-tooltip.component.scss │ │ │ │ │ │ │ └── long-tooltip.component.ts │ │ │ │ │ │ ├── scrolled-tooltip │ │ │ │ │ │ │ ├── basic-tooltip.component.ts │ │ │ │ │ │ │ ├── scrolled-tooltip.component.html │ │ │ │ │ │ │ ├── scrolled-tooltip.component.scss │ │ │ │ │ │ │ └── scrolled-tooltip.component.ts │ │ │ │ │ │ ├── template-tooltip │ │ │ │ │ │ │ ├── template-tooltip.component.html │ │ │ │ │ │ │ ├── template-tooltip.component.scss │ │ │ │ │ │ │ └── template-tooltip.component.ts │ │ │ │ │ │ └── themed-tooltip │ │ │ │ │ │ │ ├── themed-tooltip.component.html │ │ │ │ │ │ │ ├── themed-tooltip.component.scss │ │ │ │ │ │ │ └── themed-tooltip.component.ts │ │ │ │ │ ├── tooltips.component.html │ │ │ │ │ ├── tooltips.component.scss │ │ │ │ │ └── tooltips.component.ts │ │ │ │ └── virtual-scrolls │ │ │ │ │ ├── virtual-scrolls.component.html │ │ │ │ │ ├── virtual-scrolls.component.scss │ │ │ │ │ └── virtual-scrolls.component.ts │ │ │ ├── theme-editor │ │ │ │ ├── theme-editor.component.html │ │ │ │ ├── theme-editor.component.scss │ │ │ │ └── theme-editor.component.ts │ │ │ └── typography │ │ │ │ ├── typography.component.html │ │ │ │ ├── typography.component.scss │ │ │ │ └── typography.component.ts │ │ ├── environments │ │ │ ├── environment-token.ts │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── index.html │ │ ├── main.server.ts │ │ ├── main.ts │ │ ├── server.ts │ │ └── styles.scss │ └── tsconfig.app.json └── ship-ui │ ├── LICENSE │ ├── README.md │ ├── assets │ └── fonts │ │ └── InterTight-VariableFont_wght.woff2 │ ├── bin │ ├── ship-fg-node │ ├── ship-fg.ts │ ├── src │ │ ├── ship-fg-node.js │ │ ├── ship-fg.ts │ │ ├── utilities.js │ │ └── utilities.ts │ └── tsconfig.app.json │ ├── ng-package.json │ ├── package.json │ ├── src │ ├── lib │ │ ├── directives │ │ │ ├── ship-file-drag-drop.directive.ts │ │ │ ├── ship-input-mask.ts │ │ │ ├── ship-prevent-wheel.directive.ts │ │ │ └── ship-tooltip.directive.ts │ │ ├── ship-alert │ │ │ ├── ship-alert-container.component.html │ │ │ ├── ship-alert-container.component.ts │ │ │ ├── ship-alert.component.ts │ │ │ ├── ship-alert.module.ts │ │ │ └── ship-alert.service.ts │ │ ├── ship-blueprint │ │ │ ├── autolayout.ts │ │ │ ├── ship-blueprint.component.ts │ │ │ └── validatePorts.ts │ │ ├── ship-button-group │ │ │ └── ship-button-group.component.ts │ │ ├── ship-button │ │ │ └── ship-button.component.ts │ │ ├── ship-card │ │ │ └── ship-card.component.ts │ │ ├── ship-checkbox │ │ │ └── ship-checkbox.component.ts │ │ ├── ship-chip │ │ │ └── ship-chip.component.ts │ │ ├── ship-color-picker │ │ │ └── ship-color-picker.component.ts │ │ ├── ship-datepicker │ │ │ ├── ship-datepicker-input.component.ts │ │ │ ├── ship-datepicker.component.ts │ │ │ └── ship-daterange-input.component.ts │ │ ├── ship-dialog │ │ │ ├── ship-dialog.component.ts │ │ │ └── ship-dialog.service.ts │ │ ├── ship-divider │ │ │ └── ship-divider.component.ts │ │ ├── ship-event-card │ │ │ └── ship-event-card.component.ts │ │ ├── ship-file-upload │ │ │ └── ship-file-upload.component.ts │ │ ├── ship-form-field │ │ │ ├── ship-form-field-popover.component.ts │ │ │ └── ship-form-field.component.ts │ │ ├── ship-icon │ │ │ └── ship-icon.component.ts │ │ ├── ship-list │ │ │ └── ship-list.component.ts │ │ ├── ship-menu │ │ │ └── ship-menu.component.ts │ │ ├── ship-popover │ │ │ └── ship-popover.component.ts │ │ ├── ship-progress-bar │ │ │ └── ship-progress-bar.component.ts │ │ ├── ship-radio │ │ │ └── ship-radio.component.ts │ │ ├── ship-range-slider │ │ │ └── ship-range-slider.component.ts │ │ ├── ship-select │ │ │ └── ship-select.component.ts │ │ ├── ship-sidenav │ │ │ └── ship-sidenav.component.ts │ │ ├── ship-sortable │ │ │ ├── grid-sortable.directive.ts │ │ │ ├── ship-sortable.component.ts │ │ │ └── ship-sortable.directive.ts │ │ ├── ship-spinner │ │ │ └── ship-spinner.component.ts │ │ ├── ship-stepper │ │ │ └── ship-stepper.component.ts │ │ ├── ship-table │ │ │ └── ship-table.component.ts │ │ ├── ship-tabs │ │ │ └── ship-tabs.component.ts │ │ ├── ship-toggle-card │ │ │ └── ship-toggle-card.component.ts │ │ ├── ship-toggle │ │ │ └── ship-toggle.component.ts │ │ ├── ship-tooltip │ │ │ └── ship-tooltip.component.ts │ │ ├── ship-virtual-scroll │ │ │ └── ship-virtual-scroll.component.ts │ │ └── utilities │ │ │ ├── class-mutation-signal.ts │ │ │ ├── content-projection-signal.ts │ │ │ ├── create-input-example.component.ts │ │ │ ├── create-input-signal.ts │ │ │ ├── observe-elements.ts │ │ │ ├── random-id.ts │ │ │ └── ship-config.ts │ └── public-api.ts │ ├── styles │ ├── components │ │ ├── ship-alert-container.component.scss │ │ ├── ship-alert.component.scss │ │ ├── ship-blueprint.component.scss │ │ ├── ship-button-group.component.scss │ │ ├── ship-button.component.scss │ │ ├── ship-card.component.scss │ │ ├── ship-checkbox.component.scss │ │ ├── ship-chip.component.scss │ │ ├── ship-color-picker.component.scss │ │ ├── ship-datepicker.component.scss │ │ ├── ship-dialog.component.scss │ │ ├── ship-divider.component.scss │ │ ├── ship-event-card.component.scss │ │ ├── ship-file-upload.component.scss │ │ ├── ship-form-field.component.scss │ │ ├── ship-icon.component.scss │ │ ├── ship-list.component.scss │ │ ├── ship-menu.component.scss │ │ ├── ship-popover.component.scss │ │ ├── ship-progress-bar.component.scss │ │ ├── ship-radio.component.scss │ │ ├── ship-range-slider.component.scss │ │ ├── ship-select.component.scss │ │ ├── ship-sheet.utility.scss │ │ ├── ship-sidenav.component.scss │ │ ├── ship-sortable.component.scss │ │ ├── ship-spinner.component.scss │ │ ├── ship-stepper.component.scss │ │ ├── ship-table.component.scss │ │ ├── ship-tabs.component.scss │ │ ├── ship-toggle-card.component.scss │ │ ├── ship-toggle.component.scss │ │ ├── ship-tooltip.component.scss │ │ └── ship-virtual-scroll.component.scss │ ├── core │ │ ├── apexcharts │ │ │ └── apexcharts.scss │ │ ├── core.scss │ │ ├── core │ │ │ ├── layout.scss │ │ │ ├── loader.scss │ │ │ ├── palette-variables.scss │ │ │ ├── typography.scss │ │ │ └── variables.scss │ │ ├── fonts │ │ │ └── _inter-tight.scss │ │ ├── helpers │ │ │ ├── fn │ │ │ │ ├── color-mix.scss │ │ │ │ ├── dp.scss │ │ │ │ └── p2r.scss │ │ │ └── mixins │ │ │ │ ├── border-gradient.scss │ │ │ │ ├── breakpoint.scss │ │ │ │ ├── ellipsis.scss │ │ │ │ ├── overflow-scrolling.scss │ │ │ │ ├── scroll-shadows.scss │ │ │ │ └── wrapper.scss │ │ └── polyfill │ │ │ └── light-dark.scss │ ├── helpers.scss │ └── index.scss │ ├── tsconfig.lib.json │ ├── tsconfig.lib.prod.json │ ├── tsconfig.spec.json │ └── variable-abbrevation-cheatsheet.md ├── public └── phb.css ├── serve-docs.ts └── tsconfig.json /.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 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "useTabs": false, 4 | "singleQuote": true, 5 | "semi": true, 6 | "bracketSpacing": true, 7 | "arrowParens": "always", 8 | "trailingComma": "es5", 9 | "bracketSameLine": true, 10 | "printWidth": 120, 11 | "htmlWhitespaceSensitivity": "ignore" 12 | } 13 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 3 | "recommendations": ["angular.ng-template"] 4 | } 5 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 3 | "version": "0.2.0", 4 | "configurations": [ 5 | { 6 | "name": "ng serve", 7 | "type": "chrome", 8 | "request": "launch", 9 | "preLaunchTask": "npm: start", 10 | "url": "http://localhost:4200/" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "angular-schematics.schematicsDefaultOptions": { 3 | "angular-*": { 4 | "style": "scss", 5 | "externalTemplate": true 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 3 | "version": "2.0.0", 4 | "tasks": [ 5 | { 6 | "type": "npm", 7 | "script": "start", 8 | "isBackground": true, 9 | "problemMatcher": { 10 | "owner": "typescript", 11 | "pattern": "$tsc", 12 | "background": { 13 | "activeOnStart": true, 14 | "beginsPattern": { 15 | "regexp": "(.*?)" 16 | }, 17 | "endsPattern": { 18 | "regexp": "bundle generation complete" 19 | } 20 | } 21 | } 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /nixpacks.toml: -------------------------------------------------------------------------------- 1 | buildImage = 'ghcr.io/railwayapp/nixpacks:latest' 2 | 3 | [phases.setup] 4 | nixpkgsArchive = '4400a454f328c3f5a998ff0a29bb4c0afc890403' 5 | nixPkgs = [ 6 | 'nodejs_24', 7 | 'bun', 8 | ] 9 | 10 | [phases.install] 11 | cmds = ["npm install"] # changed 12 | 13 | [phases.build] 14 | cmds = ["npm run build"] # changed 15 | -------------------------------------------------------------------------------- /projects/design-system/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shipuicom/core/6de4218d5679c9e8440674dd1a9415fa04601197/projects/design-system/public/favicon.ico -------------------------------------------------------------------------------- /projects/design-system/public/ship-favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shipuicom/core/6de4218d5679c9e8440674dd1a9415fa04601197/projects/design-system/public/ship-favicon.png -------------------------------------------------------------------------------- /projects/design-system/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { RouterOutlet } from '@angular/router'; 3 | 4 | @Component({ 5 | selector: 'app-root', 6 | imports: [RouterOutlet], 7 | template: ` 8 | 9 | `, 10 | styles: [] 11 | }) 12 | export default class AppComponent {} 13 | -------------------------------------------------------------------------------- /projects/design-system/src/app/app.config.server.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig, mergeApplicationConfig } from '@angular/core'; 2 | import { provideServerRendering, withRoutes } from '@angular/ssr'; 3 | import { appConfig } from './app.config'; 4 | import { serverRoutes } from './app.routes.server'; 5 | 6 | const serverConfig: ApplicationConfig = { 7 | providers: [provideServerRendering(withRoutes(serverRoutes))], 8 | }; 9 | 10 | export const config = mergeApplicationConfig(appConfig, serverConfig); 11 | -------------------------------------------------------------------------------- /projects/design-system/src/app/app.routes.server.ts: -------------------------------------------------------------------------------- 1 | import { RenderMode, ServerRoute } from '@angular/ssr'; 2 | 3 | export const serverRoutes: ServerRoute[] = [ 4 | { 5 | path: 'tabs/tab/:id', 6 | renderMode: RenderMode.Prerender, 7 | async getPrerenderParams() { 8 | return [{ id: '1' }, { id: '2' }, { id: '3' }]; 9 | }, 10 | }, 11 | { 12 | path: '**', 13 | renderMode: RenderMode.Prerender, 14 | }, 15 | ]; 16 | -------------------------------------------------------------------------------- /projects/design-system/src/app/core/providers/window.ts: -------------------------------------------------------------------------------- 1 | import { InjectionToken } from '@angular/core'; 2 | 3 | export const WINDOW = new InjectionToken('WindowToken', { 4 | providedIn: 'root', 5 | factory: () => (typeof window !== 'undefined' ? window : ({} as Window)), 6 | }); 7 | -------------------------------------------------------------------------------- /projects/design-system/src/app/getting-started/getting-started.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | max-width: p2r(700); 9 | } 10 | -------------------------------------------------------------------------------- /projects/design-system/src/app/hello/hello.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | max-width: p2r(700); 9 | } 10 | -------------------------------------------------------------------------------- /projects/design-system/src/app/hello/hello.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-hello', 5 | imports: [], 6 | templateUrl: './hello.component.html', 7 | styleUrl: './hello.component.scss', 8 | changeDetection: ChangeDetectionStrategy.OnPush, 9 | }) 10 | export default class HelloComponent {} 11 | -------------------------------------------------------------------------------- /projects/design-system/src/app/layout/logo/logo.component.html: -------------------------------------------------------------------------------- 1 |

logo works!

, 2 | -------------------------------------------------------------------------------- /projects/design-system/src/app/layout/logo/logo.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | gap: p2r(12); 4 | align-items: center; 5 | justify-content: center; 6 | 7 | img { 8 | height: p2r(36); 9 | width: auto; 10 | } 11 | 12 | .house-mark { 13 | box-shadow: var(--box-shadow-20); 14 | border-radius: p2r(8); 15 | } 16 | 17 | .text { 18 | height: p2r(24); 19 | fill: var(--base-12); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /projects/design-system/src/app/previewer/highlight-file/highlight-file.component.html: -------------------------------------------------------------------------------- 1 |
{{ fileResource.value() }}
2 | 3 | 10 | -------------------------------------------------------------------------------- /projects/design-system/src/app/previewer/highlight-file/highlight-file.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: block; 5 | width: 100%; 6 | position: relative; 7 | 8 | &.hidden { 9 | display: none; 10 | } 11 | } 12 | 13 | button { 14 | position: absolute; 15 | top: p2r(6); 16 | right: p2r(6); 17 | } 18 | 19 | pre { 20 | padding: 0; 21 | margin: 0; 22 | border: none; 23 | background: none; 24 | overflow: auto; 25 | 26 | code { 27 | padding-right: p2r(60); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /projects/design-system/src/app/previewer/highlight/highlight.component.html: -------------------------------------------------------------------------------- 1 |
{{ content() }}
2 | 3 | 10 | -------------------------------------------------------------------------------- /projects/design-system/src/app/previewer/highlight/highlight.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: block; 5 | width: 100%; 6 | position: relative; 7 | 8 | &.hidden { 9 | display: none; 10 | } 11 | } 12 | 13 | button { 14 | position: absolute; 15 | top: p2r(6); 16 | right: p2r(6); 17 | } 18 | 19 | pre { 20 | padding: 0; 21 | margin: 0; 22 | border: none; 23 | background: none; 24 | overflow: auto; 25 | } 26 | -------------------------------------------------------------------------------- /projects/design-system/src/app/property-viewer/property-viewer.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /projects/design-system/src/app/property-viewer/property-viewer.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: block; 5 | } 6 | 7 | sh-card { 8 | --card-bg: var(--primary-1); 9 | --card-bc: var(--primary-4); 10 | --card-c: var(--primary-8); 11 | 12 | display: grid; 13 | grid-template-columns: 1fr 1fr; 14 | gap: p2r(20); 15 | padding: p2r(20); 16 | } 17 | -------------------------------------------------------------------------------- /projects/design-system/src/app/property-viewer/property-viewer.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipCardComponent } from '../../../../ship-ui/src/public-api'; 3 | 4 | @Component({ 5 | selector: 'app-property-viewer', 6 | imports: [ShipCardComponent], 7 | templateUrl: './property-viewer.component.html', 8 | styleUrl: './property-viewer.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class PropertyViewerComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/alerts.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: 20px; 7 | padding: 40px; 8 | } 9 | 10 | .example { 11 | display: flex; 12 | flex-direction: column; 13 | gap: p2r(10); 14 | } 15 | 16 | .sandbox-example { 17 | margin-bottom: 2rem; 18 | } 19 | 20 | .content { 21 | display: flex; 22 | display: grid; 23 | grid-template-columns: 1fr; 24 | gap: p2r(40); 25 | } 26 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/examples/base-alert/base-alert.component.html: -------------------------------------------------------------------------------- 1 | Base alert 2 | Primary alert 3 | Accent alert 4 | Warn alert 5 | Error alert 6 | Success alert 7 | 8 | Success alert 9 |

with a paragraph

10 |
11 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/examples/base-alert/base-alert.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/examples/base-alert/base-alert.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipAlertComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-base-alert', 6 | standalone: true, 7 | imports: [ShipAlertComponent], 8 | templateUrl: './base-alert.component.html', 9 | styleUrl: './base-alert.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class BaseAlertComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/examples/flat-alert/flat-alert.component.html: -------------------------------------------------------------------------------- 1 | Flat alert 2 | Primary flat alert 3 | Accent flat alert 4 | Warn flat alert 5 | Error flat alert 6 | 7 | Success flat alert 8 |

with a paragraph

9 |
10 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/examples/flat-alert/flat-alert.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/examples/flat-alert/flat-alert.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipAlertComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-flat-alert', 6 | standalone: true, 7 | imports: [ShipAlertComponent], 8 | templateUrl: './flat-alert.component.html', 9 | styleUrl: './flat-alert.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class FlatAlertComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/examples/outlined-alert/outlined-alert.component.html: -------------------------------------------------------------------------------- 1 | Outlined alert 2 | Primary outlined alert 3 | Accent outlined alert 4 | Warn outlined alert 5 | Error outlined alert 6 | 7 | Success outlined alert 8 |

with a paragraph

9 |
10 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/examples/outlined-alert/outlined-alert.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/examples/outlined-alert/outlined-alert.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipAlertComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-outlined-alert', 6 | standalone: true, 7 | imports: [ShipAlertComponent], 8 | templateUrl: './outlined-alert.component.html', 9 | styleUrl: './outlined-alert.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class OutlinedAlertComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/examples/raised-alert/raised-alert.component.html: -------------------------------------------------------------------------------- 1 | Raised alert 2 | Primary raised alert 3 | Accent raised alert 4 | Warn raised alert 5 | Error raised alert 6 | 7 | Success raised alert 8 |

with a paragraph

9 |
10 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/examples/raised-alert/raised-alert.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/examples/raised-alert/raised-alert.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipAlertComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-raised-alert', 6 | standalone: true, 7 | imports: [ShipAlertComponent], 8 | templateUrl: './raised-alert.component.html', 9 | styleUrl: './raised-alert.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class RaisedAlertComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/examples/simple-alert/simple-alert.component.html: -------------------------------------------------------------------------------- 1 | Simple alert 2 | Primary simple alert 3 | Accent simple alert 4 | Warn simple alert 5 | Error simple alert 6 | 7 | Success simple alert 8 |

with a paragraph

9 |
10 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/examples/simple-alert/simple-alert.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/alerts/examples/simple-alert/simple-alert.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipAlertComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-simple-alert', 6 | standalone: true, 7 | imports: [ShipAlertComponent], 8 | templateUrl: './simple-alert.component.html', 9 | styleUrl: './simple-alert.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class SimpleAlertComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/blueprints/blueprints.component.html: -------------------------------------------------------------------------------- 1 |

2 | WIP Blueprints 3 | Show as dots 4 |

5 | 6 |
7 | 8 | 12 | 13 |
14 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/blueprints/blueprints.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | width: 100%; 7 | height: 100vh; 8 | } 9 | 10 | h3 { 11 | display: flex; 12 | align-items: center; 13 | gap: p2r(16); 14 | } 15 | 16 | section { 17 | flex: 1 0; 18 | height: 100%; 19 | width: 100%; 20 | } 21 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/button-groups/button-groups.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | width: calc(100% - var(--sh-sidenav)); 9 | } 10 | 11 | h1 { 12 | font: var(--title-20B); 13 | } 14 | 15 | h3 { 16 | font: var(--paragraph-10); 17 | } 18 | 19 | .example { 20 | display: flex; 21 | flex-wrap: wrap; 22 | align-items: flex-start; 23 | justify-content: flex-start; 24 | gap: p2r(8); 25 | } 26 | 27 | .content { 28 | display: flex; 29 | flex-direction: column; 30 | width: 100%; 31 | gap: p2r(20); 32 | } 33 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/button-groups/examples/base-button-group/base-button-group.component.html: -------------------------------------------------------------------------------- 1 | 2 | @for (item of items(); track $index) { 3 | 7 | } 8 | 9 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/button-groups/examples/base-button-group/base-button-group.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/buttons/buttons.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | width: calc(100% - var(--sh-sidenav)); 9 | } 10 | 11 | h1 { 12 | font: var(--title-20B); 13 | } 14 | 15 | h3 { 16 | font: var(--paragraph-10); 17 | } 18 | 19 | .example { 20 | display: flex; 21 | flex-wrap: wrap; 22 | align-items: flex-start; 23 | justify-content: center; 24 | gap: p2r(8); 25 | } 26 | 27 | .content { 28 | display: flex; 29 | flex-direction: column; 30 | width: 100%; 31 | gap: p2r(20); 32 | } 33 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/buttons/examples/base-button/base-button.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/buttons/examples/base-button/base-button.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipIconComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-base-button', 6 | imports: [ShipIconComponent, ShipButtonComponent], 7 | templateUrl: './base-button.component.html', 8 | styleUrl: './base-button.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class BaseButtonComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/buttons/examples/button-sandbox/button-sandbox.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: 0; 8 | } 9 | 10 | .controls { 11 | display: flex; 12 | flex-direction: column; 13 | gap: p2r(8); 14 | border-bottom: 1px solid var(--base-4); 15 | padding: p2r(20); 16 | background-color: var(--base-2); 17 | } 18 | 19 | header { 20 | display: flex; 21 | flex-direction: column; 22 | gap: p2r(12); 23 | 24 | .row { 25 | display: flex; 26 | flex-wrap: wrap; 27 | gap: p2r(8); 28 | } 29 | } 30 | 31 | .sandbox { 32 | display: flex; 33 | flex-wrap: wrap; 34 | align-items: center; 35 | justify-content: center; 36 | gap: p2r(8); 37 | padding: p2r(60 20); 38 | } 39 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/buttons/examples/flat-button/flat-button.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/buttons/examples/flat-button/flat-button.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipIconComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-flat-button', 6 | imports: [ShipIconComponent, ShipButtonComponent], 7 | templateUrl: './flat-button.component.html', 8 | styleUrl: './flat-button.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class FlatButtonComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/buttons/examples/outlined-button/outlined-button.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/buttons/examples/outlined-button/outlined-button.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipIconComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-outlined-button', 6 | imports: [ShipIconComponent, ShipButtonComponent], 7 | templateUrl: './outlined-button.component.html', 8 | styleUrl: './outlined-button.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class OutlinedButtonComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/buttons/examples/raised-button/raised-button.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/buttons/examples/raised-button/raised-button.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipIconComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-raised-button', 6 | imports: [ShipIconComponent, ShipButtonComponent], 7 | templateUrl: './raised-button.component.html', 8 | styleUrl: './raised-button.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class RaisedButtonComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/buttons/examples/simple-button/simple-button.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/buttons/examples/simple-button/simple-button.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipIconComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-simple-button', 6 | imports: [ShipIconComponent, ShipButtonComponent], 7 | templateUrl: './simple-button.component.html', 8 | styleUrl: './simple-button.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class SimpleButtonComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/cards/cards.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(40); 7 | padding: p2r(40); 8 | } 9 | 10 | .example { 11 | display: flex; 12 | flex-direction: column; 13 | gap: 20px; 14 | max-width: 500px; 15 | width: 100%; 16 | 17 | h3 { 18 | margin: 0; 19 | } 20 | } 21 | 22 | .content { 23 | display: flex; 24 | flex-direction: column; 25 | gap: p2r(20); 26 | } 27 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/cards/examples/toggle-card-disallowed/toggle-card-disallowed.component.html: -------------------------------------------------------------------------------- 1 | 2 | Advanced options 3 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

4 |
5 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/cards/examples/toggle-card-disallowed/toggle-card-disallowed.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipToggleCardComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-toggle-card-disallowed-example', 6 | standalone: true, 7 | imports: [ShipToggleCardComponent], 8 | templateUrl: './toggle-card-disallowed.component.html', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class ToggleCardDisallowedExampleComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/cards/examples/toggle-card/toggle-card.component.html: -------------------------------------------------------------------------------- 1 | 2 | Advanced options 3 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

4 |
5 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/cards/examples/toggle-card/toggle-card.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipToggleCardComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-toggle-card-example', 6 | standalone: true, 7 | imports: [ShipToggleCardComponent], 8 | templateUrl: './toggle-card.component.html', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class ToggleCardExampleComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/cards/examples/type-a-card/type-a-card.component.html: -------------------------------------------------------------------------------- 1 | hello world 2 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/cards/examples/type-a-card/type-a-card.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipCardComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-type-a-card', 6 | standalone: true, 7 | imports: [ShipCardComponent], 8 | templateUrl: './type-a-card.component.html', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class TypeACardComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/cards/examples/type-b-card/type-b-card.component.html: -------------------------------------------------------------------------------- 1 | hello world 2 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/cards/examples/type-b-card/type-b-card.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipCardComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-type-b-card', 6 | standalone: true, 7 | imports: [ShipCardComponent], 8 | templateUrl: './type-b-card.component.html', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class TypeBCardComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/cards/examples/type-c-card/type-c-card.component.html: -------------------------------------------------------------------------------- 1 | hello world 2 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/cards/examples/type-c-card/type-c-card.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipCardComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-type-c-card', 6 | standalone: true, 7 | imports: [ShipCardComponent], 8 | templateUrl: './type-c-card.component.html', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class TypeCCardComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/checkboxes.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(40); 7 | padding: p2r(40); 8 | } 9 | 10 | .example { 11 | display: flex; 12 | gap: p2r(10); 13 | } 14 | 15 | .sandbox-example { 16 | margin-bottom: 2rem; 17 | } 18 | 19 | .content { 20 | display: flex; 21 | display: grid; 22 | grid-template-columns: 1fr 1fr; 23 | gap: p2r(40); 24 | } 25 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/examples/base-checkbox/base-checkbox.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/examples/base-checkbox/base-checkbox.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/examples/base-checkbox/base-checkbox.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipCheckboxComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-base-checkbox', 6 | standalone: true, 7 | imports: [ShipCheckboxComponent], 8 | templateUrl: './base-checkbox.component.html', 9 | styleUrl: './base-checkbox.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class BaseCheckboxComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/examples/checkbox-sandbox.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: 0; 8 | } 9 | 10 | .controls { 11 | display: flex; 12 | flex-direction: column; 13 | gap: p2r(8); 14 | border-bottom: 1px solid var(--base-4); 15 | padding: p2r(20); 16 | background-color: var(--base-2); 17 | } 18 | 19 | header { 20 | display: flex; 21 | flex-direction: column; 22 | gap: p2r(12); 23 | 24 | .row { 25 | display: flex; 26 | flex-wrap: wrap; 27 | gap: p2r(8); 28 | } 29 | } 30 | 31 | .sandbox { 32 | display: flex; 33 | gap: p2r(8); 34 | flex-wrap: wrap; 35 | padding: p2r(20); 36 | } 37 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/examples/flat-checkbox/flat-checkbox.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/examples/flat-checkbox/flat-checkbox.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/examples/flat-checkbox/flat-checkbox.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipCheckboxComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-flat-checkbox', 6 | standalone: true, 7 | imports: [ShipCheckboxComponent], 8 | templateUrl: './flat-checkbox.component.html', 9 | styleUrl: './flat-checkbox.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class FlatCheckboxComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/examples/outlined-checkbox/outlined-checkbox.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/examples/outlined-checkbox/outlined-checkbox.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/examples/outlined-checkbox/outlined-checkbox.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipCheckboxComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-outlined-checkbox', 6 | standalone: true, 7 | imports: [ShipCheckboxComponent], 8 | templateUrl: './outlined-checkbox.component.html', 9 | styleUrl: './outlined-checkbox.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class OutlinedCheckboxComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/examples/raised-checkbox/raised-checkbox.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/examples/raised-checkbox/raised-checkbox.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; 3 | import { ShipCheckboxComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-raised-checkbox', 7 | standalone: true, 8 | imports: [FormsModule, ReactiveFormsModule, ShipCheckboxComponent], 9 | templateUrl: './raised-checkbox.component.html', 10 | styleUrl: './raised-checkbox.component.scss', 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class RaisedCheckboxComponent { 14 | active = signal(false); 15 | formCtrl = new FormControl(false); 16 | } 17 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/examples/simple-checkbox/simple-checkbox.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/examples/simple-checkbox/simple-checkbox.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/checkboxes/examples/simple-checkbox/simple-checkbox.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipCheckboxComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-simple-checkbox', 6 | standalone: true, 7 | imports: [ShipCheckboxComponent], 8 | templateUrl: './simple-checkbox.component.html', 9 | styleUrl: './simple-checkbox.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class SimpleCheckboxComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/chip-inputs/chip-inputs.component.html: -------------------------------------------------------------------------------- 1 |

sh-chips-input works!

2 | , 3 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/chip-inputs/chip-inputs.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/chip-inputs/chip-inputs.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-chip-inputs', 5 | imports: [], 6 | templateUrl: './chip-inputs.component.html', 7 | styleUrl: './chip-inputs.component.scss', 8 | changeDetection: ChangeDetectionStrategy.OnPush, 9 | }) 10 | export default class ChipInputsComponent {} 11 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/chips/chips.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | width: calc(100% - var(--sh-sidenav)); 9 | } 10 | 11 | h1 { 12 | font: var(--title-20B); 13 | } 14 | 15 | h3 { 16 | font: var(--paragraph-10); 17 | } 18 | 19 | .example { 20 | display: flex; 21 | flex-wrap: wrap; 22 | align-items: flex-start; 23 | justify-content: flex-start; 24 | gap: p2r(8); 25 | } 26 | 27 | .content { 28 | display: flex; 29 | flex-direction: column; 30 | width: 100%; 31 | gap: p2r(20); 32 | } 33 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/chips/examples/base-chip/base-chip.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | flex-wrap: wrap; 4 | align-items: flex-start; 5 | justify-content: flex-start; 6 | gap: 8px; 7 | } 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/chips/examples/base-chip/base-chip.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipChipComponent, ShipIconComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-base-chip', 6 | imports: [ShipIconComponent, ShipChipComponent], 7 | templateUrl: './base-chip.component.html', 8 | styleUrl: './base-chip.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class BaseChipComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/chips/examples/chip.example.html: -------------------------------------------------------------------------------- 1 | 2 | circle 3 | Default chip 4 | circle 5 | 6 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/chips/examples/flat-chip/flat-chip.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | flex-wrap: wrap; 4 | align-items: flex-start; 5 | justify-content: flex-start; 6 | gap: 8px; 7 | } 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/chips/examples/flat-chip/flat-chip.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipChipComponent, ShipIconComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-flat-chip', 6 | imports: [ShipIconComponent, ShipChipComponent], 7 | templateUrl: './flat-chip.component.html', 8 | styleUrl: './flat-chip.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class FlatChipComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/chips/examples/outlined-chip/outlined-chip.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | flex-wrap: wrap; 4 | align-items: flex-start; 5 | justify-content: flex-start; 6 | gap: 8px; 7 | } 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/chips/examples/outlined-chip/outlined-chip.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipChipComponent, ShipIconComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-outlined-chip', 6 | imports: [ShipIconComponent, ShipChipComponent], 7 | templateUrl: './outlined-chip.component.html', 8 | styleUrl: './outlined-chip.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class OutlinedChipComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/chips/examples/raised-chip/raised-chip.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | flex-wrap: wrap; 4 | align-items: flex-start; 5 | justify-content: flex-start; 6 | gap: 8px; 7 | } 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/chips/examples/raised-chip/raised-chip.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipChipComponent, ShipIconComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-raised-chip', 6 | imports: [ShipIconComponent, ShipChipComponent], 7 | templateUrl: './raised-chip.component.html', 8 | styleUrl: './raised-chip.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class RaisedChipComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/chips/examples/simple-chip/simple-chip.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | flex-wrap: wrap; 4 | align-items: flex-start; 5 | justify-content: flex-start; 6 | gap: 8px; 7 | } 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/chips/examples/simple-chip/simple-chip.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipChipComponent, ShipIconComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-simple-chip', 6 | imports: [ShipIconComponent, ShipChipComponent], 7 | templateUrl: './simple-chip.component.html', 8 | styleUrl: './simple-chip.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class SimpleChipComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/color-pickers/color-pickers.component.html: -------------------------------------------------------------------------------- 1 |

Color picker

2 | 3 | 4 | IMPORTANT - not production ready 5 | 6 | This is an early version of the color picker. It is not yet ready for production use. We will probably be changing 7 | the api quite a bit and could also introduce a component per render type for color selection. 8 | 9 | 10 | 11 |
12 |

Variations

13 | 14 | 15 | 16 | 17 |
18 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/color-pickers/color-pickers.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | min-height: 100%; 9 | height: 100%; 10 | } 11 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/color-pickers/color-pickers.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipAlertComponent } from 'ship-ui'; 3 | import { PreviewerComponent } from '../../previewer/previewer.component'; 4 | import { BaseColorPickerComponent } from './examples/base-color-picker/base-color-picker.component'; 5 | 6 | @Component({ 7 | selector: 'app-color-pickers', 8 | imports: [ShipAlertComponent, PreviewerComponent, BaseColorPickerComponent], 9 | templateUrl: './color-pickers.component.html', 10 | styleUrl: './color-pickers.component.scss', 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export default class ColorPickersComponent {} 14 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/color-pickers/examples/base-color-picker/base-color-picker.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | justify-content: center; 8 | align-items: center; 9 | flex: 1 0; 10 | } 11 | 12 | .colors { 13 | display: grid; 14 | grid-template-columns: 30px 1fr; 15 | gap: 10px; 16 | width: 200px; 17 | 18 | .swatch { 19 | width: 30px; 20 | height: 30px; 21 | border-radius: var(--shape-2); 22 | border: 1px solid var(--base-4); 23 | } 24 | 25 | .color-text { 26 | display: flex; 27 | flex-direction: column; 28 | gap: 10px; 29 | width: 100%; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/datepickers.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | width: calc(100% - var(--sh-sidenav)); 9 | } 10 | 11 | h1 { 12 | font: var(--title-20B); 13 | } 14 | 15 | h3 { 16 | font: var(--paragraph-10); 17 | } 18 | 19 | .example { 20 | display: flex; 21 | flex-direction: column; 22 | gap: p2r(8); 23 | } 24 | 25 | .content { 26 | display: flex; 27 | flex-direction: column; 28 | width: 100%; 29 | gap: p2r(20); 30 | } 31 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/examples/base-datepicker/base-datepicker.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Selected: {{ selectedDate() | date: 'mediumDate' }}

4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/examples/base-datepicker/base-datepicker.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/examples/base-datepicker/base-datepicker.component.ts: -------------------------------------------------------------------------------- 1 | import { DatePipe } from '@angular/common'; 2 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { ShipDatepickerComponent } from 'ship-ui'; 5 | 6 | @Component({ 7 | selector: 'app-base-datepicker', 8 | standalone: true, 9 | imports: [FormsModule, ShipDatepickerComponent, DatePipe], 10 | templateUrl: './base-datepicker.component.html', 11 | styleUrl: './base-datepicker.component.scss', 12 | changeDetection: ChangeDetectionStrategy.OnPush, 13 | }) 14 | export class BaseDatepickerComponent { 15 | selectedDate = signal(new Date()); 16 | } 17 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/examples/datepicker-sandbox/datepicker-sandbox.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: block; 5 | } 6 | 7 | .controls { 8 | display: flex; 9 | flex-direction: column; 10 | gap: p2r(8); 11 | border-bottom: 1px solid var(--base-4); 12 | padding: p2r(20); 13 | background-color: var(--base-2); 14 | } 15 | 16 | .content { 17 | display: flex; 18 | align-items: center; 19 | flex-direction: column; 20 | gap: p2r(8); 21 | padding: p2r(60 20); 22 | width: 100%; 23 | max-width: p2r(640); 24 | align-self: center; 25 | } 26 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/examples/input-datepicker-ngmodel/input-datepicker-ngmodel.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | clock 11 |
12 |
13 |
14 | 15 |

Selected: {{ date() | date: 'medium' }}

16 | 18 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/examples/input-datepicker-ngmodel/input-datepicker-ngmodel.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: block; 5 | } 6 | 7 | .row { 8 | display: flex; 9 | gap: p2r(16); 10 | align-items: flex-end; 11 | 12 | sh-datepicker-input { 13 | flex: 1 0; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/examples/input-datepicker-reactive/input-datepicker-reactive.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |

Selected: {{ dateControl.value | date: 'mediumDate' }}

6 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/examples/input-datepicker-reactive/input-datepicker-reactive.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/examples/input-datepicker-reactive/input-datepicker-reactive.component.ts: -------------------------------------------------------------------------------- 1 | import { DatePipe } from '@angular/common'; 2 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 3 | import { FormControl, ReactiveFormsModule } from '@angular/forms'; 4 | import { ShipDatepickerInputComponent } from 'ship-ui'; 5 | 6 | @Component({ 7 | selector: 'app-input-datepicker-reactive', 8 | standalone: true, 9 | imports: [ReactiveFormsModule, ShipDatepickerInputComponent, DatePipe], 10 | templateUrl: './input-datepicker-reactive.component.html', 11 | styleUrl: './input-datepicker-reactive.component.scss', 12 | changeDetection: ChangeDetectionStrategy.OnPush, 13 | }) 14 | export class InputDatepickerReactiveComponent { 15 | dateControl = new FormControl(new Date()); 16 | } 17 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/examples/range-datepicker-sandbox/range-datepicker-sandbox.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: block; 5 | } 6 | 7 | .controls { 8 | display: flex; 9 | flex-direction: column; 10 | gap: p2r(8); 11 | border-bottom: 1px solid var(--base-4); 12 | padding: p2r(20); 13 | background-color: var(--base-2); 14 | } 15 | 16 | .content { 17 | display: flex; 18 | align-items: center; 19 | flex-direction: column; 20 | gap: p2r(8); 21 | padding: p2r(60 20); 22 | width: 100%; 23 | max-width: p2r(640); 24 | align-self: center; 25 | } 26 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/examples/range-datepicker/range-datepicker.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Start: {{ startDate() ? (startDate() | date: 'mediumDate') : 'None' }}

4 |

End: {{ endDate() ? (endDate() | date: 'mediumDate') : 'None' }}

5 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/examples/range-datepicker/range-datepicker.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/examples/range-datepicker/range-datepicker.component.ts: -------------------------------------------------------------------------------- 1 | import { DatePipe } from '@angular/common'; 2 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { ShipDatepickerComponent } from 'ship-ui'; 5 | 6 | @Component({ 7 | selector: 'app-range-datepicker', 8 | standalone: true, 9 | imports: [FormsModule, ShipDatepickerComponent, DatePipe], 10 | templateUrl: './range-datepicker.component.html', 11 | styleUrl: './range-datepicker.component.scss', 12 | changeDetection: ChangeDetectionStrategy.OnPush, 13 | }) 14 | export class RangeDatepickerComponent { 15 | startDate = signal(null); 16 | endDate = signal(null); 17 | } 18 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/examples/range-input-datepicker/range-input-datepicker.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | calendar 6 | 7 |

Start: {{ startDate.value | date: 'mediumDate' }}

8 |

End: {{ endDate.value | date: 'mediumDate' }}

9 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/datepickers/examples/range-input-datepicker/range-input-datepicker.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dialogs/dialogs.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | width: calc(100% - var(--sh-sidenav)); 9 | } 10 | 11 | h1 { 12 | font: var(--title-20B); 13 | } 14 | 15 | h3 { 16 | font: var(--paragraph-10); 17 | } 18 | 19 | .example { 20 | display: flex; 21 | flex-direction: column; 22 | gap: p2r(8); 23 | } 24 | 25 | .content { 26 | display: flex; 27 | flex-direction: column; 28 | width: 100%; 29 | gap: p2r(20); 30 | } 31 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dialogs/examples/basic-dynamic-dialog/basic-dynamic-dialog.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dialogs/examples/basic-dynamic-dialog/basic-dynamic-dialog.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | justify-content: center; 4 | align-items: center; 5 | height: 200px; 6 | } 7 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dialogs/examples/data-passing-dialog/data-dialog-content.component.html: -------------------------------------------------------------------------------- 1 |
2 |

Dialog received: {{ data()?.message }}

3 | 4 |
5 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dialogs/examples/data-passing-dialog/data-dialog-content.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dialogs/examples/data-passing-dialog/data-passing-dialog.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dialogs/examples/data-passing-dialog/data-passing-dialog.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | justify-content: center; 4 | align-items: center; 5 | height: 200px; 6 | } 7 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dialogs/examples/dialog-as-component/dialog-as-component.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | hello im dialog content 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dialogs/examples/dialog-as-component/dialog-as-component.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dialogs/examples/dialog-as-component/dialog-as-component.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, input, signal } from '@angular/core'; 2 | import { ShipButtonComponent, ShipDialogComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-dialog-as-component', 6 | imports: [ShipDialogComponent, ShipButtonComponent], 7 | templateUrl: './dialog-as-component.component.html', 8 | styleUrl: './dialog-as-component.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class DialogAsComponentComponent { 12 | type = input(); 13 | 14 | isOpen = signal(false); 15 | 16 | openDialog() { 17 | this.isOpen.set(true); 18 | } 19 | 20 | close() { 21 | this.isOpen.set(false); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dialogs/examples/header-footer-dialog/header-footer-dialog-content.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dialogs/examples/header-footer-dialog/header-footer-dialog.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dialogs/examples/header-footer-dialog/header-footer-dialog.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | justify-content: center; 4 | align-items: center; 5 | height: 200px; 6 | } 7 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dividers/dividers.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | width: calc(100% - var(--sh-sidenav)); 9 | } 10 | 11 | h1 { 12 | font: var(--title-20B); 13 | } 14 | 15 | h3 { 16 | font: var(--paragraph-10); 17 | } 18 | 19 | .example { 20 | display: flex; 21 | flex-direction: column; 22 | gap: p2r(8); 23 | width: p2r(500); 24 | } 25 | 26 | .content { 27 | display: flex; 28 | flex-direction: column; 29 | width: 100%; 30 | gap: p2r(20); 31 | } 32 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dividers/dividers.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { PreviewerComponent } from '../../previewer/previewer.component'; 3 | import { PropertyViewerComponent } from '../../property-viewer/property-viewer.component'; 4 | import { BaseDividerComponent } from './examples/base-divider/base-divider.component'; 5 | import { TextDividerComponent } from './examples/text-divider/text-divider.component'; 6 | 7 | @Component({ 8 | selector: 'app-dividers', 9 | imports: [BaseDividerComponent, TextDividerComponent, PropertyViewerComponent, PreviewerComponent], 10 | templateUrl: './dividers.component.html', 11 | styleUrl: './dividers.component.scss', 12 | changeDetection: ChangeDetectionStrategy.OnPush, 13 | }) 14 | export default class DividersComponent {} 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dividers/examples/base-divider/base-divider.component.html: -------------------------------------------------------------------------------- 1 |
Above the divider
2 | 3 |
Below the divider
4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dividers/examples/base-divider/base-divider.component.scss: -------------------------------------------------------------------------------- 1 | div { 2 | margin: 8px 0; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dividers/examples/base-divider/base-divider.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipDividerComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-base-divider', 6 | standalone: true, 7 | imports: [ShipDividerComponent], 8 | templateUrl: './base-divider.component.html', 9 | styleUrl: './base-divider.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class BaseDividerComponent {} 13 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dividers/examples/base-divider/index.ts: -------------------------------------------------------------------------------- 1 | export * from './base-divider.component'; 2 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dividers/examples/text-divider/text-divider.component.html: -------------------------------------------------------------------------------- 1 |
Above the divider
2 | Text in divider 3 |
Below the divider
4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dividers/examples/text-divider/text-divider.component.scss: -------------------------------------------------------------------------------- 1 | div { 2 | margin: 8px 0; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/dividers/examples/text-divider/text-divider.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipDividerComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-text-divider', 6 | standalone: true, 7 | imports: [ShipDividerComponent], 8 | templateUrl: './text-divider.component.html', 9 | styleUrl: './text-divider.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class TextDividerComponent {} 13 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/event-cards/event-cards.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | padding: p2r(40); 7 | gap: p2r(16); 8 | } 9 | 10 | section { 11 | display: flex; 12 | flex-direction: column; 13 | gap: p2r(8); 14 | width: 100%; 15 | } 16 | 17 | .content { 18 | display: flex; 19 | flex-direction: column; 20 | gap: p2r(16); 21 | } 22 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/event-cards/examples/base-event-card/base-event-card.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: grid; 3 | gap: 12px; 4 | } 5 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/event-cards/examples/base-event-card/base-event-card.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipEventCardComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-base-event-card', 6 | imports: [ShipEventCardComponent, ShipButtonComponent], 7 | templateUrl: './base-event-card.component.html', 8 | styleUrl: './base-event-card.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class BaseEventCardComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/event-cards/examples/flat-event-card/flat-event-card.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: grid; 3 | gap: 12px; 4 | } 5 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/event-cards/examples/flat-event-card/flat-event-card.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipEventCardComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-flat-event-card', 6 | imports: [ShipEventCardComponent, ShipButtonComponent], 7 | templateUrl: './flat-event-card.component.html', 8 | styleUrl: './flat-event-card.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class FlatEventCardComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/event-cards/examples/outlined-event-card/outlined-event-card.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: grid; 3 | gap: 12px; 4 | } 5 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/event-cards/examples/outlined-event-card/outlined-event-card.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipEventCardComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-outlined-event-card', 6 | imports: [ShipEventCardComponent, ShipButtonComponent], 7 | templateUrl: './outlined-event-card.component.html', 8 | styleUrl: './outlined-event-card.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class OutlinedEventCardComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/event-cards/examples/raised-event-card/raised-event-card.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: grid; 3 | gap: 12px; 4 | } 5 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/event-cards/examples/raised-event-card/raised-event-card.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipEventCardComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-raised-event-card', 6 | imports: [ShipEventCardComponent, ShipButtonComponent], 7 | templateUrl: './raised-event-card.component.html', 8 | styleUrl: './raised-event-card.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class RaisedEventCardComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/event-cards/examples/simple-event-card/simple-event-card.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: grid; 3 | gap: 12px; 4 | } 5 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/event-cards/examples/simple-event-card/simple-event-card.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipEventCardComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-simple-event-card', 6 | imports: [ShipEventCardComponent, ShipButtonComponent], 7 | templateUrl: './simple-event-card.component.html', 8 | styleUrl: './simple-event-card.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class SimpleEventCardComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/expansion-panels/expansion-panels.component.html: -------------------------------------------------------------------------------- 1 |

Probably rename to accordion to align with html spec

2 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/expansion-panels/expansion-panels.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/expansion-panels/expansion-panels.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-expansion-panels', 5 | imports: [], 6 | templateUrl: './expansion-panels.component.html', 7 | styleUrl: './expansion-panels.component.scss', 8 | changeDetection: ChangeDetectionStrategy.OnPush, 9 | }) 10 | export default class ExpansionPanelsComponent {} 11 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/file-uploads/examples/base-file-upload/base-file-upload.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/file-uploads/examples/base-file-upload/base-file-upload.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/file-uploads/examples/base-file-upload/base-file-upload.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipFileUploadComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-base-file-upload', 6 | imports: [ShipFileUploadComponent], 7 | templateUrl: './base-file-upload.component.html', 8 | styleUrl: './base-file-upload.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class BaseFileUploadComponent { 12 | files = signal([]); 13 | } 14 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/file-uploads/file-uploads.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(40); 7 | padding: p2r(40); 8 | } 9 | 10 | h3 { 11 | margin: 0; 12 | font: var(--title-30); 13 | } 14 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/form-fields/examples/base-form-field/base-form-field.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/form-fields/examples/small-form-field/small-form-field.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/form-fields/form-fields.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(40); 7 | padding: p2r(40); 8 | } 9 | 10 | h3 { 11 | margin: 0; 12 | font: var(--title-30); 13 | } 14 | 15 | .example { 16 | display: flex; 17 | flex-direction: column; 18 | gap: p2r(32); 19 | padding: p2r(60 20); 20 | width: 100%; 21 | max-width: p2r(640); 22 | align-self: center; 23 | } 24 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/icons/examples/sandbox-icon/sandbox-icon.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { ShipButtonGroupComponent, ShipIconComponent, ShipRangeSliderComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-sandbox-icon', 7 | imports: [FormsModule, ShipIconComponent, ShipButtonGroupComponent, ShipRangeSliderComponent], 8 | templateUrl: './sandbox-icon.component.html', 9 | styleUrl: './sandbox-icon.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class SandboxIconComponent { 13 | size = signal(''); 14 | sizeValue = signal(10); 15 | colorClass = signal(''); 16 | } 17 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/icons/icons.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | width: calc(100% - var(--sh-sidenav)); 9 | } 10 | 11 | h1 { 12 | font: var(--title-20B); 13 | } 14 | 15 | h3 { 16 | font: var(--paragraph-10); 17 | } 18 | 19 | app-property-viewer { 20 | section { 21 | display: flex; 22 | flex-direction: column; 23 | align-items: flex-start; 24 | gap: p2r(8); 25 | } 26 | } 27 | 28 | .example { 29 | display: flex; 30 | flex-direction: column; 31 | gap: p2r(8); 32 | } 33 | 34 | .content { 35 | display: flex; 36 | flex-direction: column; 37 | width: 100%; 38 | gap: p2r(20); 39 | } 40 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/input-mask/examples/base-input-mask/base-input-mask.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/input-mask/input-mask.component.html: -------------------------------------------------------------------------------- 1 |

Input Mask

2 | 3 | 4 |
5 |

[shInputMask]

6 |

You can pass a string or a function to the directive to set the input mask.

7 |
8 |
9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/input-mask/input-mask.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(40); 7 | padding: p2r(40); 8 | } 9 | 10 | h3 { 11 | margin: 0; 12 | font: var(--title-30); 13 | } 14 | 15 | .example { 16 | display: flex; 17 | flex-direction: column; 18 | gap: p2r(32); 19 | padding: p2r(60 20); 20 | width: 100%; 21 | max-width: p2r(640); 22 | align-self: center; 23 | } 24 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/input-mask/input-mask.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { PreviewerComponent } from '../../previewer/previewer.component'; 3 | import { PropertyViewerComponent } from '../../property-viewer/property-viewer.component'; 4 | import { BaseInputMaskComponent } from './examples/base-input-mask/base-input-mask.component'; 5 | 6 | @Component({ 7 | selector: 'app-input-mask', 8 | imports: [BaseInputMaskComponent, PropertyViewerComponent, PreviewerComponent], 9 | templateUrl: './input-mask.component.html', 10 | styleUrl: './input-mask.component.scss', 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export default class InputMaskComponent {} 14 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/lists/examples/base-list-example/base-list-example.component.scss: -------------------------------------------------------------------------------- 1 | sh-list { 2 | width: 400px; 3 | } 4 | 5 | :host { 6 | display: block; 7 | padding: 24px; 8 | } 9 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/lists/lists.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | @include wrapper(); 5 | } 6 | 7 | sh-list { 8 | width: 500px; 9 | } 10 | 11 | .example { 12 | padding: 40px; 13 | } 14 | 15 | .l20-example { 16 | padding: 40px; 17 | background-color: var(--base-2); 18 | } 19 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/menus/examples/base-menu-example/base-menu-example.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @for (item of menuItems; track item.value) { 5 | 8 | } 9 | 10 | 11 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/menus/examples/base-menu-example/base-menu-example.component.scss: -------------------------------------------------------------------------------- 1 | .menu { 2 | display: flex; 3 | gap: 8px; 4 | } 5 | 6 | button.selected { 7 | font-weight: bold; 8 | color: #1976d2; 9 | } 10 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/menus/examples/base-menu-example/base-menu-example.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipMenuComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'base-menu-example', 6 | templateUrl: './base-menu-example.component.html', 7 | styleUrls: ['./base-menu-example.component.scss'], 8 | imports: [ShipMenuComponent, ShipButtonComponent], 9 | }) 10 | export class BaseMenuExampleComponent { 11 | menuItems = [ 12 | { label: 'Home', value: 'home' }, 13 | { label: 'Profile', value: 'profile' }, 14 | { label: 'Settings', value: 'settings' }, 15 | ]; 16 | 17 | someFunction(item: any) { 18 | alert(item.label); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/menus/examples/icon-suffix-menu/icon-suffix-menu.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @for (item of menuItems; track item.value) { 5 | 10 | } 11 | 12 | 13 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/menus/examples/icon-suffix-menu/icon-suffix-menu.component.scss: -------------------------------------------------------------------------------- 1 | .menu { 2 | display: flex; 3 | gap: 8px; 4 | } 5 | 6 | button.selected { 7 | font-weight: bold; 8 | color: #1976d2; 9 | } 10 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/menus/examples/multi-layer-menu-example/multi-layer-menu-example.component.scss: -------------------------------------------------------------------------------- 1 | .menu { 2 | display: flex; 3 | gap: 8px; 4 | position: relative; 5 | } 6 | 7 | button.selected { 8 | font-weight: bold; 9 | color: #1976d2; 10 | } 11 | 12 | .submenu { 13 | display: flex; 14 | flex-direction: column; 15 | position: absolute; 16 | background: #fff; 17 | border: 1px solid #eee; 18 | margin-top: 4px; 19 | z-index: 1; 20 | } 21 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/menus/examples/search-menu-example/search-menu-example.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @for (item of filteredItems; track item.value) { 5 | 8 | } 9 | 10 | 11 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/menus/examples/search-menu-example/search-menu-example.component.scss: -------------------------------------------------------------------------------- 1 | .menu-search { 2 | display: flex; 3 | flex-direction: column; 4 | gap: 8px; 5 | width: 220px; 6 | } 7 | 8 | .menu { 9 | display: flex; 10 | flex-direction: column; 11 | gap: 4px; 12 | } 13 | 14 | button.selected { 15 | font-weight: bold; 16 | color: #1976d2; 17 | } 18 | 19 | input[type='text'] { 20 | padding: 4px 8px; 21 | border: 1px solid #ccc; 22 | border-radius: 4px; 23 | } 24 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/menus/examples/toggle-select-menu-example/toggle-select-menu-example.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @for (item of menuItems; track item.value) { 5 | 10 | } 11 | 12 | 13 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/menus/examples/toggle-select-menu-example/toggle-select-menu-example.component.scss: -------------------------------------------------------------------------------- 1 | .menu { 2 | display: flex; 3 | flex-direction: column; 4 | gap: 8px; 5 | } 6 | 7 | button.selected { 8 | font-weight: bold; 9 | color: #1976d2; 10 | } 11 | 12 | .checkbox { 13 | margin-right: 8px; 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/menus/menus.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | width: calc(100% - var(--sh-sidenav)); 9 | } 10 | 11 | h1 { 12 | font: var(--title-20B); 13 | } 14 | 15 | h3 { 16 | font: var(--paragraph-10); 17 | } 18 | 19 | .example { 20 | display: flex; 21 | flex-wrap: wrap; 22 | align-items: flex-start; 23 | justify-content: flex-start; 24 | gap: p2r(8); 25 | } 26 | 27 | .content { 28 | display: flex; 29 | flex-direction: column; 30 | width: 100%; 31 | gap: p2r(20); 32 | } 33 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/popovers/examples/button-popover/button-popover.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | hello im content 4 | 5 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/popovers/examples/button-popover/button-popover.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/popovers/examples/button-popover/button-popover.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { ShipPopoverComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'button-popover', 6 | standalone: true, 7 | imports: [ShipPopoverComponent], 8 | templateUrl: './button-popover.component.html', 9 | styleUrl: './button-popover.component.scss', 10 | }) 11 | export class ButtonPopoverComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/popovers/examples/sh-button-popover/sh-button-popover.component.html: -------------------------------------------------------------------------------- 1 | 2 | hello im a shButton trigger 3 | hello im content 4 | 5 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/popovers/examples/sh-button-popover/sh-button-popover.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/popovers/examples/sh-button-popover/sh-button-popover.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipPopoverComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'sh-button-popover', 6 | standalone: true, 7 | imports: [ShipPopoverComponent, ShipButtonComponent], 8 | templateUrl: './sh-button-popover.component.html', 9 | styleUrl: './sh-button-popover.component.scss', 10 | }) 11 | export class ShButtonPopoverComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/popovers/examples/trigger-attribute-popover/trigger-attribute-popover.component.html: -------------------------------------------------------------------------------- 1 | 2 |
hello im a div trigger
3 | hello im content 4 |
5 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/popovers/examples/trigger-attribute-popover/trigger-attribute-popover.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/popovers/examples/trigger-attribute-popover/trigger-attribute-popover.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { ShipPopoverComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'trigger-attribute-popover', 6 | standalone: true, 7 | imports: [ShipPopoverComponent], 8 | templateUrl: './trigger-attribute-popover.component.html', 9 | styleUrl: './trigger-attribute-popover.component.scss', 10 | }) 11 | export class TriggerAttributePopoverComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/popovers/popovers.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | width: calc(100% - var(--sh-sidenav)); 9 | } 10 | 11 | h1 { 12 | font: var(--title-20B); 13 | } 14 | 15 | h3 { 16 | font: var(--paragraph-10); 17 | } 18 | 19 | app-property-viewer { 20 | section { 21 | display: flex; 22 | flex-direction: column; 23 | align-items: flex-start; 24 | gap: p2r(8); 25 | } 26 | } 27 | 28 | .example { 29 | display: flex; 30 | flex-direction: column; 31 | gap: p2r(8); 32 | } 33 | 34 | .content { 35 | display: flex; 36 | flex-direction: column; 37 | width: 100%; 38 | gap: p2r(20); 39 | } 40 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/examples/base-progress-bar/base-progress-bar.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/examples/base-progress-bar/base-progress-bar.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/examples/base-progress-bar/base-progress-bar.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipProgressBarComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-base-progress-bar', 6 | standalone: true, 7 | imports: [ShipProgressBarComponent], 8 | templateUrl: './base-progress-bar.component.html', 9 | styleUrl: './base-progress-bar.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class BaseProgressBarComponent {} 13 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/examples/flat-progress-bar/flat-progress-bar.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/examples/flat-progress-bar/flat-progress-bar.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/examples/flat-progress-bar/flat-progress-bar.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipProgressBarComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-flat-progress-bar', 6 | standalone: true, 7 | imports: [ShipProgressBarComponent], 8 | templateUrl: './flat-progress-bar.component.html', 9 | styleUrl: './flat-progress-bar.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class FlatProgressBarComponent {} 13 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/examples/indeterminte-progress-bar/indeterminte-progress-bar.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/examples/indeterminte-progress-bar/indeterminte-progress-bar.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/examples/indeterminte-progress-bar/indeterminte-progress-bar.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipProgressBarComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-indeterminte-progress-bar', 6 | imports: [ShipProgressBarComponent], 7 | templateUrl: './indeterminte-progress-bar.component.html', 8 | styleUrl: './indeterminte-progress-bar.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class IndeterminteProgressBarComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/examples/outlined-progress-bar/outlined-progress-bar.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/examples/outlined-progress-bar/outlined-progress-bar.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/examples/outlined-progress-bar/outlined-progress-bar.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipProgressBarComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-outlined-progress-bar', 6 | standalone: true, 7 | imports: [ShipProgressBarComponent], 8 | templateUrl: './outlined-progress-bar.component.html', 9 | styleUrl: './outlined-progress-bar.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class OutlinedProgressBarComponent {} 13 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/examples/raised-progress-bar/raised-progress-bar.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/examples/raised-progress-bar/raised-progress-bar.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/examples/raised-progress-bar/raised-progress-bar.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipProgressBarComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-raised-progress-bar', 6 | standalone: true, 7 | imports: [ShipProgressBarComponent], 8 | templateUrl: './raised-progress-bar.component.html', 9 | styleUrl: './raised-progress-bar.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class RaisedProgressBarComponent {} 13 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/progress-bars/progress-bars.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | width: calc(100% - var(--sh-sidenav)); 9 | } 10 | 11 | h1 { 12 | font: var(--title-20B); 13 | } 14 | 15 | h3 { 16 | font: var(--paragraph-10); 17 | } 18 | 19 | .example { 20 | display: flex; 21 | flex-direction: column; 22 | gap: p2r(8); 23 | width: p2r(500); 24 | } 25 | 26 | .content { 27 | display: flex; 28 | flex-direction: column; 29 | width: 100%; 30 | gap: p2r(20); 31 | } 32 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/base-radio/base-radio.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/base-radio/base-radio.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/base-radio/base-radio.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipRadioComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-base-radio', 6 | standalone: true, 7 | imports: [ShipRadioComponent], 8 | templateUrl: './base-radio.component.html', 9 | styleUrl: './base-radio.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class BaseRadioComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/flat-radio/flat-radio.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/flat-radio/flat-radio.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/flat-radio/flat-radio.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipRadioComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-flat-radio', 6 | standalone: true, 7 | imports: [ShipRadioComponent], 8 | templateUrl: './flat-radio.component.html', 9 | styleUrl: './flat-radio.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class FlatRadioComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/outlined-radio/outlined-radio.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/outlined-radio/outlined-radio.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/outlined-radio/outlined-radio.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipRadioComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-outlined-radio', 6 | standalone: true, 7 | imports: [ShipRadioComponent], 8 | templateUrl: './outlined-radio.component.html', 9 | styleUrl: './outlined-radio.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class OutlinedRadioComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/radio-sandbox.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: 0; 8 | } 9 | 10 | .controls { 11 | display: flex; 12 | flex-direction: column; 13 | gap: p2r(8); 14 | border-bottom: 1px solid var(--base-4); 15 | padding: p2r(20); 16 | background-color: var(--base-2); 17 | } 18 | 19 | header { 20 | display: flex; 21 | flex-direction: column; 22 | gap: p2r(12); 23 | 24 | .row { 25 | display: flex; 26 | flex-wrap: wrap; 27 | gap: p2r(8); 28 | } 29 | } 30 | 31 | .sandbox { 32 | display: flex; 33 | gap: p2r(40); 34 | flex-wrap: wrap; 35 | padding: p2r(20); 36 | } 37 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/raised-radio/raised-radio.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/raised-radio/raised-radio.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/raised-radio/raised-radio.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipRadioComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-raised-radio', 6 | standalone: true, 7 | imports: [ShipRadioComponent], 8 | templateUrl: './raised-radio.component.html', 9 | styleUrl: './raised-radio.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class RaisedRadioComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/simple-radio/simple-radio.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/simple-radio/simple-radio.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/examples/simple-radio/simple-radio.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipRadioComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-simple-radio', 6 | standalone: true, 7 | imports: [ShipRadioComponent], 8 | templateUrl: './simple-radio.component.html', 9 | styleUrl: './simple-radio.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class SimpleRadioComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/radio-buttons/radio-buttons.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(40); 7 | padding: p2r(40); 8 | } 9 | 10 | .example { 11 | display: flex; 12 | gap: p2r(10); 13 | } 14 | 15 | .sandbox-example { 16 | margin-bottom: 2rem; 17 | } 18 | 19 | .content { 20 | display: flex; 21 | display: grid; 22 | grid-template-columns: 1fr 1fr; 23 | gap: p2r(40); 24 | } 25 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/always-show-indicator-range-slider/always-show-indicator-range-slider.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |

Selected: {{ value() }}

6 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/always-show-indicator-range-slider/always-show-indicator-range-slider.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/always-show-indicator-range-slider/always-show-indicator-range-slider.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { ShipRangeSliderComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-always-show-indicator-range-slider', 7 | standalone: true, 8 | imports: [FormsModule, ShipRangeSliderComponent], 9 | templateUrl: './always-show-indicator-range-slider.component.html', 10 | styleUrl: './always-show-indicator-range-slider.component.scss', 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class AlwaysShowIndicatorRangeSliderComponent { 14 | value = signal(33); 15 | } 16 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/base-range-slider/base-range-slider.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |

Selected: {{ value() }}

6 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/base-range-slider/base-range-slider.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/base-range-slider/base-range-slider.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { ShipRangeSliderComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-base-range-slider', 7 | standalone: true, 8 | imports: [FormsModule, ShipRangeSliderComponent], 9 | templateUrl: './base-range-slider.component.html', 10 | styleUrl: './base-range-slider.component.scss', 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class BaseRangeSliderComponent { 14 | value = signal(50); 15 | } 16 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/disabled-range-slider/disabled-range-slider.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |

Selected: {{ value() }}

6 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/disabled-range-slider/disabled-range-slider.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/disabled-range-slider/disabled-range-slider.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { ShipRangeSliderComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-disabled-range-slider', 7 | standalone: true, 8 | imports: [FormsModule, ShipRangeSliderComponent], 9 | templateUrl: './disabled-range-slider.component.html', 10 | styleUrl: './disabled-range-slider.component.scss', 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class DisabledRangeSliderComponent { 14 | value = signal(10); 15 | } 16 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/float-range-slider/float-range-slider.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |

Selected: {{ value() | number: '1.2-2' }}

6 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/float-range-slider/float-range-slider.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/float-range-slider/float-range-slider.component.ts: -------------------------------------------------------------------------------- 1 | import { DecimalPipe } from '@angular/common'; 2 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { ShipRangeSliderComponent } from 'ship-ui'; 5 | 6 | @Component({ 7 | selector: 'app-float-range-slider', 8 | standalone: true, 9 | imports: [FormsModule, ShipRangeSliderComponent, DecimalPipe], 10 | templateUrl: './float-range-slider.component.html', 11 | styleUrl: './float-range-slider.component.scss', 12 | changeDetection: ChangeDetectionStrategy.OnPush, 13 | }) 14 | export class FloatRangeSliderComponent { 15 | value = signal(0.12); 16 | } 17 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/range-slider-sandbox/range-slider-sandbox.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: block; 5 | } 6 | 7 | .controls { 8 | display: flex; 9 | flex-direction: column; 10 | gap: p2r(8); 11 | border-bottom: 1px solid var(--base-4); 12 | padding: p2r(20); 13 | background-color: var(--base-2); 14 | } 15 | 16 | div { 17 | padding: p2r(20); 18 | } 19 | 20 | .row { 21 | display: flex; 22 | padding: 0; 23 | gap: p2r(8); 24 | } 25 | 26 | .fields { 27 | display: grid; 28 | grid-template-columns: 1fr 1fr 1fr 1fr; 29 | padding: 0; 30 | gap: p2r(8); 31 | } 32 | 33 | .sandbox-example { 34 | display: flex; 35 | flex-direction: column; 36 | gap: p2r(8); 37 | padding: p2r(60 20); 38 | width: 100%; 39 | max-width: p2r(640); 40 | align-self: center; 41 | } 42 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/reactive-range-slider/reactive-range-slider.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |

Selected: {{ control.value }}

6 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/reactive-range-slider/reactive-range-slider.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/reactive-range-slider/reactive-range-slider.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { FormControl, ReactiveFormsModule } from '@angular/forms'; 3 | import { ShipRangeSliderComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-reactive-range-slider', 7 | standalone: true, 8 | imports: [ReactiveFormsModule, ShipRangeSliderComponent], 9 | templateUrl: './reactive-range-slider.component.html', 10 | styleUrl: './reactive-range-slider.component.scss', 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class ReactiveRangeSliderComponent { 14 | control = new FormControl(25); 15 | } 16 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/readonly-range-slider/readonly-range-slider.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |

Selected: {{ value() }}

6 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/readonly-range-slider/readonly-range-slider.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/readonly-range-slider/readonly-range-slider.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { ShipRangeSliderComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-readonly-range-slider', 7 | standalone: true, 8 | imports: [FormsModule, ShipRangeSliderComponent], 9 | templateUrl: './readonly-range-slider.component.html', 10 | styleUrl: './readonly-range-slider.component.scss', 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class ReadonlyRangeSliderComponent { 14 | value = signal(42); 15 | } 16 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/unit-range-slider/unit-range-slider.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |

Selected: {{ value() }}%

6 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/unit-range-slider/unit-range-slider.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/examples/unit-range-slider/unit-range-slider.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { ShipRangeSliderComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-unit-range-slider', 7 | standalone: true, 8 | imports: [FormsModule, ShipRangeSliderComponent], 9 | templateUrl: './unit-range-slider.component.html', 10 | styleUrl: './unit-range-slider.component.scss', 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class UnitRangeSliderComponent { 14 | value = signal(75); 15 | } 16 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/range-sliders/range-sliders.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | width: calc(100% - var(--sh-sidenav)); 9 | } 10 | 11 | h1 { 12 | font: var(--title-20B); 13 | } 14 | 15 | h3 { 16 | font: var(--paragraph-10); 17 | } 18 | 19 | .example { 20 | width: 100%; 21 | max-width: p2r(600); 22 | display: flex; 23 | flex-direction: column; 24 | gap: p2r(8); 25 | } 26 | 27 | .sandbox-example { 28 | .example { 29 | max-width: initial; 30 | } 31 | } 32 | 33 | .content { 34 | display: flex; 35 | flex-direction: column; 36 | width: 100%; 37 | gap: p2r(20); 38 | } 39 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/base-select/base-select.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | desktop-tower 4 | 5 | 6 | 7 | 8 |

Selected: {{ selected() }}

9 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/base-select/base-select.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/disabled-select/disabled-select.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

Selected: {{ selected() }}

7 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/disabled-select/disabled-select.component.scss: -------------------------------------------------------------------------------- 1 | .example { 2 | margin-bottom: 16px; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/disabled-select/disabled-select.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { ShipSelectComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-disabled-select', 7 | standalone: true, 8 | imports: [FormsModule, ShipSelectComponent], 9 | templateUrl: './disabled-select.component.html', 10 | styleUrl: './disabled-select.component.scss', 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class DisabledSelectComponent { 14 | options = signal([ 15 | { value: 'pizza', label: 'Pizza' }, 16 | { value: 'burger', label: 'Burger' }, 17 | { value: 'sushi', label: 'Sushi' }, 18 | ]); 19 | selected = signal('pizza'); 20 | } 21 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/inline-search-multiple-select/inline-search-multiple-select.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

Selected: {{ selected() | json }}

7 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/inline-search-multiple-select/inline-search-multiple-select.component.scss: -------------------------------------------------------------------------------- 1 | .example { 2 | margin-bottom: 16px; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/inline-search-select/inline-search-select.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

Selected: {{ selected() }}

7 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/inline-search-select/inline-search-select.component.scss: -------------------------------------------------------------------------------- 1 | .example { 2 | margin-bottom: 16px; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/lazy-search-multiple-select/lazy-search-multiple-select.component.html: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | @if (resource.isLoading()) { 13 |

Searching: {{ lazySearchOption() }}

14 | } @else { 15 |

Selected: {{ lazySearchOption() | json }}

16 | } 17 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/lazy-search-multiple-select/lazy-search-multiple-select.component.scss: -------------------------------------------------------------------------------- 1 | .example { 2 | margin-bottom: 16px; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/lazy-search-select/lazy-search-select.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | @if (resource.isLoading()) { 7 |

Searching: {{ lazySearchOption() }}

8 | } @else { 9 |

Selected: {{ lazySearchOption() }}

10 | } 11 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/lazy-search-select/lazy-search-select.component.scss: -------------------------------------------------------------------------------- 1 | .example { 2 | margin-bottom: 16px; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/multiple-select-as-text/multiple-select-as-text.component.html: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | 15 | 16 |

Selected: {{ selected() | json }}

17 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/multiple-select-as-text/multiple-select-as-text.component.scss: -------------------------------------------------------------------------------- 1 | .example { 2 | margin-bottom: 16px; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/multiple-select/multiple-select.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Selected: {{ selected() | json }}

8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/multiple-select/multiple-select.component.scss: -------------------------------------------------------------------------------- 1 | .example { 2 | margin-bottom: 16px; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/object-select/object-select.component.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 |

Selected: {{ selected() }}

12 |
{{ selectedObject() | json }}
13 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/object-select/object-select.component.scss: -------------------------------------------------------------------------------- 1 | .example { 2 | margin-bottom: 16px; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/option-template-select/option-template-select.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{ option.emoji }} {{ option.label }} 6 | 7 | 8 | 9 |

Selected: {{ selected() }}

10 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/option-template-select/option-template-select.component.scss: -------------------------------------------------------------------------------- 1 | .example { 2 | margin-bottom: 16px; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/placeholder-template-select/placeholder-template-select.component.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | 12 | {{ option.emoji }} {{ option.label }} 13 | 14 | 15 | 16 |
Hell im a custom placeholder template 🙂‍↔️🙂‍↔️
17 |
18 | 19 |

Selected: {{ selected() }}

20 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/placeholder-template-select/placeholder-template-select.component.scss: -------------------------------------------------------------------------------- 1 | .example { 2 | margin-bottom: 16px; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/reactive-select-disabled/reactive-select-disabled.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Selected: {{ control.value }}

8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/reactive-select-disabled/reactive-select-disabled.component.scss: -------------------------------------------------------------------------------- 1 | .example { 2 | margin-bottom: 16px; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/reactive-select/reactive-select-example.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Selected: {{ control.value }}

8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/reactive-select/reactive-select-example.component.scss: -------------------------------------------------------------------------------- 1 | .example { 2 | margin-bottom: 16px; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/readonly-select/readonly-select.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

Selected: {{ selected() }}

7 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/readonly-select/readonly-select.component.scss: -------------------------------------------------------------------------------- 1 | .example { 2 | margin-bottom: 16px; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/examples/readonly-select/readonly-select.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { ShipSelectComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-readonly-select', 7 | standalone: true, 8 | imports: [FormsModule, ShipSelectComponent], 9 | templateUrl: './readonly-select.component.html', 10 | styleUrl: './readonly-select.component.scss', 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class ReadonlySelectComponent { 14 | options = signal([ 15 | { value: 'pizza', label: 'Pizza' }, 16 | { value: 'burger', label: 'Burger' }, 17 | { value: 'sushi', label: 'Sushi' }, 18 | ]); 19 | selected = signal('pizza'); 20 | } 21 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/selects/selects.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(40); 7 | padding: p2r(40); 8 | } 9 | 10 | h3 { 11 | margin: 0; 12 | font: var(--title-30); 13 | } 14 | 15 | .example { 16 | display: flex; 17 | flex-direction: column; 18 | gap: p2r(20); 19 | } 20 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/sheets/sheets.component.html: -------------------------------------------------------------------------------- 1 | @for (variant of variants; track $index) { 2 |
3 |

{{ variant.length > 0 ? variant : 'Base' }}

4 | 5 | @for (color of colors; track $index) { 6 |
7 | circle 8 | hello im some content on a sheet 9 |
10 | } 11 |
12 | } 13 | 14 |
15 |

Dynamic

16 | 17 |
18 | circle 19 | hello im some content on a sheet 20 |
21 |
22 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/sheets/sheets.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(16); 7 | padding: p2r(40); 8 | } 9 | 10 | section { 11 | display: flex; 12 | flex-direction: column; 13 | gap: p2r(8); 14 | } 15 | 16 | div { 17 | padding: p2r(16); 18 | display: flex; 19 | align-items: center; 20 | gap: p2r(8); 21 | } 22 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/sheets/sheets.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { ShipIconComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-sheets', 7 | imports: [FormsModule, ShipIconComponent], 8 | templateUrl: './sheets.component.html', 9 | styleUrl: './sheets.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export default class SheetsComponent { 13 | colors = ['', 'primary', 'accent', 'warn', 'error', 'success']; 14 | variants = ['', 'simple', 'outlined', 'flat', 'raised']; 15 | 16 | dynamicColor = signal('#2f54eb'); 17 | } 18 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/sidenavs/examples/sandbox-sidenav/sandbox-sidenav.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { ShipButtonGroupComponent, ShipSidenavComponent, ShipSidenavType, ShipToggleComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-sandbox-sidenav', 7 | imports: [FormsModule, ShipSidenavComponent, ShipButtonGroupComponent, ShipToggleComponent], 8 | templateUrl: './sandbox-sidenav.component.html', 9 | styleUrl: './sandbox-sidenav.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class SandboxSidenavComponent { 13 | sidenavType = signal('simple'); 14 | isNavOpen = signal(false); 15 | disableDrag = signal(false); 16 | } 17 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/sidenavs/sidenavs.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | width: calc(100% - var(--sh-sidenav)); 9 | } 10 | 11 | h1 { 12 | font: var(--title-20B); 13 | } 14 | 15 | h3 { 16 | font: var(--paragraph-10); 17 | } 18 | 19 | .example { 20 | display: flex; 21 | flex-direction: column; 22 | gap: p2r(8); 23 | width: p2r(500); 24 | } 25 | 26 | .content { 27 | display: flex; 28 | flex-direction: column; 29 | width: 100%; 30 | gap: p2r(20); 31 | } 32 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/sidenavs/sidenavs.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { PreviewerComponent } from '../../previewer/previewer.component'; 3 | import { PropertyViewerComponent } from '../../property-viewer/property-viewer.component'; 4 | import { SandboxSidenavComponent } from './examples/sandbox-sidenav/sandbox-sidenav.component'; 5 | 6 | @Component({ 7 | selector: 'app-sidenavs', 8 | imports: [SandboxSidenavComponent, PreviewerComponent, PropertyViewerComponent], 9 | templateUrl: './sidenavs.component.html', 10 | styleUrl: './sidenavs.component.scss', 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export default class SidenavsComponent { 14 | sidenavType = signal('overlay'); 15 | } 16 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/sortables/examples/base-sortable/base-sortable.component.html: -------------------------------------------------------------------------------- 1 | 2 | @for (todo of todos(); track $index) { 3 |
4 | 5 | 6 | @if (todo.done) { 7 | {{ todo.title }} 8 | } @else { 9 | {{ todo.title }} 10 | } 11 |
12 | } 13 |
14 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/sortables/examples/base-sortable/base-sortable.component.scss: -------------------------------------------------------------------------------- 1 | .example { 2 | margin: 1rem 0; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/sortables/sortables.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(40); 7 | padding: p2r(40); 8 | } 9 | 10 | h3 { 11 | margin: 0; 12 | font: var(--title-30); 13 | } 14 | 15 | .example { 16 | display: flex; 17 | flex-direction: column; 18 | gap: p2r(20); 19 | } 20 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/spinners/examples/sandbox-spinner/sandbox-spinner.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: block; 5 | } 6 | 7 | .controls { 8 | display: flex; 9 | align-items: center; 10 | gap: p2r(16); 11 | padding: p2r(60 20); 12 | width: 100%; 13 | max-width: p2r(640); 14 | align-self: center; 15 | } 16 | 17 | sh-range-slider { 18 | width: p2r(320); 19 | } 20 | 21 | .content { 22 | display: flex; 23 | flex-direction: column; 24 | align-items: center; 25 | gap: p2r(16); 26 | } 27 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/spinners/examples/sandbox-spinner/sandbox-spinner.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { ShipRangeSliderComponent, ShipSpinnerComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-sandbox-spinner', 7 | imports: [FormsModule, ShipSpinnerComponent, ShipRangeSliderComponent], 8 | templateUrl: './sandbox-spinner.component.html', 9 | styleUrl: './sandbox-spinner.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class SandboxSpinnerComponent { 13 | value = signal(40); 14 | valueAsPixels = computed(() => `${this.value()}px`); 15 | 16 | thickness = signal(5); 17 | thicknessAsPixels = computed(() => `${this.thickness()}px`); 18 | } 19 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/spinners/spinners.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(40); 7 | padding: p2r(40); 8 | } 9 | 10 | h3 { 11 | margin: 0; 12 | font: var(--title-30); 13 | } 14 | 15 | .example { 16 | display: flex; 17 | flex-direction: column; 18 | gap: p2r(20); 19 | } 20 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/spinners/spinners.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { PreviewerComponent } from '../../previewer/previewer.component'; 3 | import { PropertyViewerComponent } from '../../property-viewer/property-viewer.component'; 4 | import { SandboxSpinnerComponent } from './examples/sandbox-spinner/sandbox-spinner.component'; 5 | 6 | @Component({ 7 | selector: 'app-spinners', 8 | imports: [SandboxSpinnerComponent, PropertyViewerComponent, PreviewerComponent], 9 | templateUrl: './spinners.component.html', 10 | styleUrl: './spinners.component.scss', 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export default class SpinnerComponent {} 14 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/examples/custom-stepper/custom-steppers.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | Step 1 5 |
6 |
7 | 8 | Step 2 9 |
10 |
11 | 12 | Step 3 13 |
14 |
15 | 16 | @let _activeStep = activeStep(); 17 | 18 |
19 | @if (_activeStep === 0) { 20 |
Step 1 Content
21 | } @else if (_activeStep === 1) { 22 |
Step 2 Content
23 | } @else if (_activeStep === 2) { 24 |
Step 3 Content
25 | } 26 |
27 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/examples/custom-stepper/custom-steppers.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | flex-direction: column; 4 | flex: 1 0; 5 | width: 100%; 6 | } 7 | 8 | .step-content { 9 | margin-top: 1rem; 10 | } 11 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/examples/custom-stepper/custom-steppers.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipRadioComponent, ShipStepperComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-custom-steppers', 6 | standalone: true, 7 | imports: [ShipStepperComponent, ShipRadioComponent], 8 | templateUrl: './custom-steppers.component.html', 9 | styleUrls: ['./custom-steppers.component.scss'], 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class CustomSteppersComponent { 13 | activeStep = signal(0); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/examples/default-stepper/default-steppers.component.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | 10 | 14 | 15 | 16 | @let _activeStep = activeStep(); 17 | 18 |
19 | @if (_activeStep === 0) { 20 |
Step 1 Content
21 | } @else if (_activeStep === 1) { 22 |
Step 2 Content
23 | } @else if (_activeStep === 2) { 24 |
Step 3 Content
25 | } 26 |
27 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/examples/default-stepper/default-steppers.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | flex-direction: column; 4 | flex: 1 0; 5 | width: 100%; 6 | } 7 | 8 | .step-content { 9 | margin-top: 1rem; 10 | } 11 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/examples/default-stepper/default-steppers.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipRadioComponent, ShipStepperComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-default-steppers', 6 | standalone: true, 7 | imports: [ShipStepperComponent, ShipRadioComponent], 8 | templateUrl: './default-steppers.component.html', 9 | styleUrls: ['./default-steppers.component.scss'], 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class DefaultStepperComponent { 13 | activeStep = signal(0); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/examples/router-stepper/router-steppers.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | Step 1 5 |
6 |
7 | 8 | Step 2 9 |
10 |
11 | 12 | Step 3 13 |
14 |
15 | 16 | Step 4 17 |
18 |
19 | 20 | Step 5 21 |
22 |
23 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/examples/router-stepper/router-steppers.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | flex-direction: column; 4 | flex: 1 0; 5 | width: 100%; 6 | } 7 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/examples/router-stepper/router-steppers.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { RouterLink, RouterLinkActive } from '@angular/router'; 3 | import { ShipRadioComponent, ShipStepperComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-router-steppers', 7 | standalone: true, 8 | imports: [ShipStepperComponent, ShipRadioComponent, RouterLink, RouterLinkActive], 9 | templateUrl: './router-steppers.component.html', 10 | styleUrl: './router-steppers.component.scss', 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class SteppersComponent {} 14 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/examples/stepper-sandbox/stepper-sandbox.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: 0; 8 | } 9 | 10 | .controls { 11 | display: flex; 12 | flex-direction: column; 13 | gap: p2r(8); 14 | border-bottom: 1px solid var(--base-4); 15 | padding: p2r(20); 16 | background-color: var(--base-2); 17 | } 18 | 19 | header { 20 | display: flex; 21 | flex-direction: column; 22 | gap: p2r(12); 23 | 24 | .row { 25 | display: flex; 26 | flex-wrap: wrap; 27 | gap: p2r(8); 28 | } 29 | } 30 | 31 | .sandbox { 32 | display: flex; 33 | flex-direction: column; 34 | padding: p2r(20); 35 | } 36 | 37 | .step-content { 38 | padding: p2r(20); 39 | } 40 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/step-1.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-step-1', 5 | imports: [], 6 | template: ` 7 |

step-1 works!

8 | `, 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export default class Step1Component {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/step-2.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-step-2', 5 | imports: [], 6 | template: ` 7 |

step-2 works!

8 | `, 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export default class Step2Component {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/step-3.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-step-3', 5 | imports: [], 6 | template: ` 7 |

step-3 works!

8 | `, 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export default class Step3Component {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/step-4.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-step-4', 5 | imports: [], 6 | template: ` 7 |

step-4 works!

8 | `, 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export default class Step4Component {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/step-5.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-step-5', 5 | imports: [], 6 | template: ` 7 |

step-5 works!

8 | `, 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export default class Step5Component {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/steppers/steppers.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | width: calc(100% - var(--sh-sidenav)); 9 | } 10 | 11 | h1 { 12 | font: var(--title-20B); 13 | } 14 | 15 | h3 { 16 | font: var(--paragraph-10); 17 | } 18 | 19 | .example { 20 | display: flex; 21 | flex-wrap: wrap; 22 | align-items: flex-start; 23 | justify-content: flex-start; 24 | gap: p2r(8); 25 | } 26 | 27 | .content { 28 | display: flex; 29 | flex-direction: column; 30 | width: 100%; 31 | gap: p2r(20); 32 | } 33 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tables/examples/base-table/base-table.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | @for (col of displayedColumns(); track col) { 4 | {{ col }} 5 | } 6 | 7 | 8 | @for (row of dataSource(); track $index) { 9 | 10 | @for (col of displayedColumns(); track col) { 11 | {{ row[col] }} 12 | } 13 | 14 | } 15 | 16 |
No data available
17 |
18 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tables/examples/multi-sticky-table/multi-sticky-table.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: block; 5 | } 6 | 7 | sh-table { 8 | // P2R is a helper function that converts pixels to rems 9 | max-height: p2r(500); 10 | max-width: p2r(640); 11 | } 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tables/examples/multi-table-header/multi-table-header.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | @for (col of displayedColumns(); track col) { 4 | {{ col }} 5 | } 6 | 7 | 8 | 9 | @for (col of displayedColumns(); track col) { 10 | {{ col }} 11 | } 12 | 13 | 14 | @for (row of dataSource(); track $index) { 15 | 16 | @for (col of displayedColumns(); track col) { 17 | {{ row[col] }} 18 | } 19 | 20 | } 21 | 22 |
No data available
23 |
24 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tables/examples/multi-table-header/multi-table-header.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: block; 5 | } 6 | 7 | sh-table { 8 | // P2R is a helper function that converts pixels to rems 9 | max-height: p2r(500); 10 | max-width: p2r(680); 11 | } 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tables/examples/resizing-table/resizing-table.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | @for (col of displayedColumns(); track col) { 4 | {{ col }} 5 | } 6 | 7 | 8 | @for (row of dataSource(); track $index) { 9 | 10 | @for (col of displayedColumns(); track col) { 11 | {{ row[col] }} 12 | } 13 | 14 | } 15 | 16 |
No data available
17 |
18 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tables/examples/resizing-table/resizing-table.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: block; 5 | } 6 | 7 | sh-table { 8 | // P2R is a helper function that converts pixels to rems 9 | max-height: p2r(500); 10 | max-width: p2r(680); 11 | } 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tables/tables.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | width: calc(100% - var(--sh-sidenav)); 9 | } 10 | 11 | h1 { 12 | font: var(--title-20B); 13 | } 14 | 15 | h3 { 16 | font: var(--paragraph-10); 17 | } 18 | 19 | .example { 20 | display: flex; 21 | flex-wrap: wrap; 22 | align-items: flex-start; 23 | justify-content: flex-start; 24 | gap: p2r(8); 25 | } 26 | 27 | .content { 28 | display: flex; 29 | flex-direction: column; 30 | width: 100%; 31 | gap: p2r(20); 32 | } 33 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tabs/examples/custom-tabs/custom-tabs.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | flex: 1 0; 7 | width: 100%; 8 | } 9 | 10 | .tab-content { 11 | padding: p2r(20); 12 | } 13 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tabs/examples/custom-tabs/custom-tabs.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipIconComponent, ShipTabsComponent } from 'ship-ui'; 3 | import TabComponent from '../../tab/tab.component'; 4 | 5 | @Component({ 6 | selector: 'app-custom-tabs', 7 | standalone: true, 8 | imports: [ShipTabsComponent, ShipIconComponent, TabComponent], 9 | templateUrl: './custom-tabs.component.html', 10 | styleUrls: ['./custom-tabs.component.scss'], 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class CustomTabsComponent { 14 | activeTab = signal('tab1'); 15 | } 16 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tabs/examples/default-tabs/default-tabs.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | flex: 1 0; 7 | width: 100%; 8 | } 9 | 10 | .tab-content { 11 | padding: p2r(20); 12 | } 13 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tabs/examples/default-tabs/default-tabs.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipIconComponent, ShipTabsComponent } from 'ship-ui'; 3 | import TabComponent from '../../tab/tab.component'; 4 | 5 | @Component({ 6 | selector: 'app-default-tabs', 7 | standalone: true, 8 | imports: [ShipTabsComponent, ShipIconComponent, TabComponent], 9 | templateUrl: './default-tabs.component.html', 10 | styleUrls: ['./default-tabs.component.scss'], 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class DefaultTabsComponent { 14 | activeTab = signal('tab1'); 15 | } 16 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tabs/examples/router-tabs/router-tabs.component.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 16 | 17 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tabs/examples/router-tabs/router-tabs.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | flex: 1 0; 7 | width: 100%; 8 | } 9 | 10 | .tab-content { 11 | padding: p2r(20); 12 | } 13 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tabs/examples/router-tabs/router-tabs.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { RouterLink, RouterLinkActive } from '@angular/router'; 3 | import { ShipIconComponent, ShipTabsComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-router-tabs', 7 | imports: [ShipTabsComponent, ShipIconComponent, RouterLinkActive, RouterLink], 8 | templateUrl: './router-tabs.component.html', 9 | styleUrl: './router-tabs.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class RouterTabsComponent {} 13 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tabs/examples/tabs-sandbox/tabs-sandbox.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: 0; 8 | } 9 | 10 | .controls { 11 | display: flex; 12 | flex-direction: column; 13 | gap: p2r(8); 14 | border-bottom: 1px solid var(--base-4); 15 | padding: p2r(20); 16 | background-color: var(--base-2); 17 | } 18 | 19 | header { 20 | display: flex; 21 | flex-direction: column; 22 | gap: p2r(12); 23 | 24 | .row { 25 | display: flex; 26 | flex-wrap: wrap; 27 | gap: p2r(8); 28 | } 29 | } 30 | 31 | .sandbox { 32 | display: flex; 33 | flex-direction: column; 34 | padding: p2r(20); 35 | } 36 | 37 | .tab-content { 38 | padding: p2r(20); 39 | } 40 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tabs/tab/tab.component.html: -------------------------------------------------------------------------------- 1 |

Tab with ID: {{ id() }}

2 | 3 | 4 | 5 | 6 |

Im a dialog

7 |
8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tabs/tab/tab.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tabs/tab/tab.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, input, TemplateRef, viewChild } from '@angular/core'; 2 | import { ShipButtonComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-tab', 6 | imports: [ShipButtonComponent], 7 | templateUrl: './tab.component.html', 8 | styleUrl: './tab.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export default class TabComponent { 12 | id = input.required(); 13 | 14 | myDialog = viewChild.required>('myDialog'); 15 | 16 | openDialog() {} 17 | } 18 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tabs/tabs.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: 40px; 7 | padding: 40px; 8 | } 9 | 10 | h3 { 11 | margin: 0; 12 | font: var(--title-30); 13 | } 14 | 15 | .example { 16 | display: flex; 17 | flex-direction: column; 18 | gap: 20px; 19 | max-width: 500px; 20 | width: 100%; 21 | } 22 | 23 | .content { 24 | display: flex; 25 | flex-direction: column; 26 | gap: p2r(20); 27 | } 28 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/base-toggle/base-toggle.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/base-toggle/base-toggle.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/base-toggle/base-toggle.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipToggleComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-base-toggle', 6 | standalone: true, 7 | imports: [ShipToggleComponent], 8 | templateUrl: './base-toggle.component.html', 9 | styleUrl: './base-toggle.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class BaseToggleComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/flat-toggle/flat-toggle.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/flat-toggle/flat-toggle.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/flat-toggle/flat-toggle.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipToggleComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-flat-toggle', 6 | standalone: true, 7 | imports: [ShipToggleComponent], 8 | templateUrl: './flat-toggle.component.html', 9 | styleUrl: './flat-toggle.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class FlatToggleComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/outlined-toggle/outlined-toggle.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/outlined-toggle/outlined-toggle.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/outlined-toggle/outlined-toggle.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipToggleComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-outlined-toggle', 6 | standalone: true, 7 | imports: [ShipToggleComponent], 8 | templateUrl: './outlined-toggle.component.html', 9 | styleUrl: './outlined-toggle.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class OutlinedToggleComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/raised-toggle/raised-toggle.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/raised-toggle/raised-toggle.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/raised-toggle/raised-toggle.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipToggleComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-raised-toggle', 6 | standalone: true, 7 | imports: [ShipToggleComponent], 8 | templateUrl: './raised-toggle.component.html', 9 | styleUrl: './raised-toggle.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class RaisedToggleComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/simple-toggle/simple-toggle.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/simple-toggle/simple-toggle.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/simple-toggle/simple-toggle.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; 2 | import { ShipToggleComponent } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-simple-toggle', 6 | standalone: true, 7 | imports: [ShipToggleComponent], 8 | templateUrl: './simple-toggle.component.html', 9 | styleUrl: './simple-toggle.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class SimpleToggleComponent { 13 | active = signal(false); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/examples/toggle-sandbox.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: 0; 8 | } 9 | 10 | .controls { 11 | display: flex; 12 | flex-direction: column; 13 | gap: p2r(8); 14 | border-bottom: 1px solid var(--base-4); 15 | padding: p2r(20); 16 | background-color: var(--base-2); 17 | } 18 | 19 | header { 20 | display: flex; 21 | flex-direction: column; 22 | gap: p2r(12); 23 | 24 | .row { 25 | display: flex; 26 | flex-wrap: wrap; 27 | gap: p2r(8); 28 | } 29 | } 30 | 31 | .sandbox { 32 | display: flex; 33 | gap: p2r(8); 34 | padding: p2r(60 20); 35 | width: 100%; 36 | max-width: p2r(640); 37 | align-self: center; 38 | } 39 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/toggles/toggles.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(40); 7 | padding: p2r(40); 8 | } 9 | 10 | .example { 11 | display: flex; 12 | gap: p2r(10); 13 | } 14 | 15 | .sandbox-example { 16 | margin-bottom: 2rem; 17 | } 18 | 19 | .content { 20 | display: flex; 21 | display: grid; 22 | grid-template-columns: 1fr 1fr; 23 | gap: p2r(40); 24 | } 25 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tooltips/examples/basic-tooltip copy/basic-tooltip.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipIconComponent, ShipTooltipDirective } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-basic-tooltip', 6 | imports: [ShipIconComponent, ShipButtonComponent, ShipTooltipDirective], 7 | templateUrl: './basic-tooltip.component.html', 8 | styleUrl: './basic-tooltip.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class BasicTooltipComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tooltips/examples/basic-tooltip/basic-tooltip.component.html: -------------------------------------------------------------------------------- 1 | 2 | circle 3 | 4 | 8 | 9 | 15 | 16 |
Hover this basic div
17 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tooltips/examples/basic-tooltip/basic-tooltip.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | gap: 1rem; 4 | align-items: center; 5 | flex-wrap: wrap; 6 | } 7 | 8 | div { 9 | padding: 0.5rem 1rem; 10 | border: 1px solid var(--sh-border-color); 11 | border-radius: var(--sh-border-radius); 12 | cursor: pointer; 13 | background: var(--sh-surface-color); 14 | } 15 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tooltips/examples/basic-tooltip/basic-tooltip.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipIconComponent, ShipTooltipDirective } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-basic-tooltip', 6 | imports: [ShipIconComponent, ShipButtonComponent, ShipTooltipDirective], 7 | templateUrl: './basic-tooltip.component.html', 8 | styleUrl: './basic-tooltip.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class BasicTooltipComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tooltips/examples/long-tooltip/long-tooltip.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | gap: 1rem; 4 | align-items: center; 5 | flex-wrap: wrap; 6 | } 7 | 8 | .long-tooltip-content { 9 | max-width: 300px; 10 | 11 | h4 { 12 | margin: 0 0 0.5rem 0; 13 | color: var(--sh-on-surface-color); 14 | } 15 | 16 | p { 17 | margin: 0 0 0.5rem 0; 18 | color: var(--sh-on-surface-color); 19 | line-height: 1.4; 20 | } 21 | 22 | ul { 23 | margin: 0; 24 | padding-left: 1rem; 25 | color: var(--sh-on-surface-color); 26 | 27 | li { 28 | margin-bottom: 0.25rem; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tooltips/examples/long-tooltip/long-tooltip.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipIconComponent, ShipTooltipDirective } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-long-tooltip', 6 | imports: [ShipIconComponent, ShipButtonComponent, ShipTooltipDirective], 7 | templateUrl: './long-tooltip.component.html', 8 | styleUrl: './long-tooltip.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class LongTooltipComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tooltips/examples/scrolled-tooltip/basic-tooltip.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipIconComponent, ShipTooltipDirective } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-basic-tooltip', 6 | imports: [ShipIconComponent, ShipButtonComponent, ShipTooltipDirective], 7 | templateUrl: './basic-tooltip.component.html', 8 | styleUrl: './basic-tooltip.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class BasicTooltipComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tooltips/examples/scrolled-tooltip/scrolled-tooltip.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | circle 4 | 5 | 9 | 10 | 16 | 17 | 18 |
Hover this basic div
19 |
20 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tooltips/examples/scrolled-tooltip/scrolled-tooltip.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | height: 500px; 6 | overflow: auto; 7 | border: 1px solid var(--base-4); 8 | border-radius: p2r(8); 9 | } 10 | 11 | div { 12 | padding: 0.5rem 1rem; 13 | border: 1px solid var(--sh-border-color); 14 | border-radius: var(--sh-border-radius); 15 | cursor: pointer; 16 | background: var(--sh-surface-color); 17 | } 18 | 19 | .scrolled-content { 20 | padding-top: 200px; 21 | min-height: 700px; 22 | display: flex; 23 | gap: 1rem; 24 | justify-content: flex-start; 25 | background-image: repeating-linear-gradient(0deg, #eee 0px 20px, transparent 20px 40px); 26 | } 27 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tooltips/examples/template-tooltip/template-tooltip.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | gap: 1rem; 4 | align-items: center; 5 | flex-wrap: wrap; 6 | } 7 | 8 | .tooltip-content { 9 | max-width: 250px; 10 | 11 | h4 { 12 | margin: 0 0 0.5rem 0; 13 | color: var(--sh-on-surface-color); 14 | } 15 | 16 | p { 17 | margin: 0 0 0.5rem 0; 18 | color: var(--sh-on-surface-color); 19 | } 20 | 21 | ul { 22 | margin: 0; 23 | padding-left: 1rem; 24 | color: var(--sh-on-surface-color); 25 | } 26 | 27 | .tooltip-actions { 28 | display: flex; 29 | gap: 0.5rem; 30 | margin-top: 0.5rem; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tooltips/examples/template-tooltip/template-tooltip.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipIconComponent, ShipTooltipDirective } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-template-tooltip', 6 | imports: [ShipIconComponent, ShipButtonComponent, ShipTooltipDirective], 7 | templateUrl: './template-tooltip.component.html', 8 | styleUrl: './template-tooltip.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class TemplateTooltipComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tooltips/examples/themed-tooltip/themed-tooltip.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: flex; 3 | gap: 1rem; 4 | align-items: center; 5 | flex-wrap: wrap; 6 | } 7 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tooltips/examples/themed-tooltip/themed-tooltip.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { ShipButtonComponent, ShipIconComponent, ShipTooltipDirective } from 'ship-ui'; 3 | 4 | @Component({ 5 | selector: 'app-themed-tooltip', 6 | imports: [ShipIconComponent, ShipButtonComponent, ShipTooltipDirective], 7 | templateUrl: './themed-tooltip.component.html', 8 | styleUrl: './themed-tooltip.component.scss', 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class ThemedTooltipComponent {} 12 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/tooltips/tooltips.component.scss: -------------------------------------------------------------------------------- 1 | @use 'helpers' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(20); 7 | padding: p2r(40); 8 | width: calc(100% - var(--sh-sidenav)); 9 | } 10 | 11 | h1 { 12 | font: var(--title-20B); 13 | } 14 | 15 | h3 { 16 | font: var(--paragraph-10); 17 | } 18 | 19 | .example { 20 | display: flex; 21 | flex-wrap: wrap; 22 | align-items: flex-start; 23 | justify-content: flex-start; 24 | gap: p2r(8); 25 | } 26 | 27 | .content { 28 | display: flex; 29 | flex-direction: column; 30 | width: 100%; 31 | gap: p2r(20); 32 | } 33 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/virtual-scrolls/virtual-scrolls.component.html: -------------------------------------------------------------------------------- 1 | 2 | @for (item of items(); track item.id) { 3 |
4 |
{{ item.name }} (ID: {{ item.id }})
5 | @if (item.showContent) { 6 |
7 | Lorem ipsum dolor sit amet consectetur adipisicing elit. Provident, excepturi deserunt dignissimos corrupti 8 | repellendus obcaecati. 9 |
10 | } 11 |
12 | } 13 |
14 | -------------------------------------------------------------------------------- /projects/design-system/src/app/ship/virtual-scrolls/virtual-scrolls.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | display: block; 3 | } 4 | 5 | .my-item { 6 | padding: 10px; 7 | border-bottom: 1px solid #ccc; 8 | } 9 | -------------------------------------------------------------------------------- /projects/design-system/src/app/typography/typography.component.scss: -------------------------------------------------------------------------------- 1 | @use '../../../../ship-ui/styles/helpers.scss' as *; 2 | 3 | :host { 4 | display: flex; 5 | flex-direction: column; 6 | gap: p2r(32); 7 | padding: p2r(40); 8 | } 9 | 10 | code { 11 | background: darken(var(--base-8), 70%); 12 | color: #fff; 13 | padding: p2r(40 40 40 24); 14 | border-radius: var(--shape-3); 15 | overflow: auto; 16 | white-space: pre; 17 | display: block; 18 | } 19 | 20 | .align { 21 | display: flex; 22 | flex-direction: column; 23 | gap: p2r(8); 24 | 25 | p { 26 | display: flex; 27 | align-items: center; 28 | gap: p2r(4); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /projects/design-system/src/app/typography/typography.component.ts: -------------------------------------------------------------------------------- 1 | import { JsonPipe } from '@angular/common'; 2 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 3 | import { ShipIconComponent } from 'ship-ui'; 4 | 5 | @Component({ 6 | selector: 'app-typography', 7 | imports: [JsonPipe, ShipIconComponent], 8 | templateUrl: './typography.component.html', 9 | styleUrl: './typography.component.scss', 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export default class TypographyComponent { 13 | someJson = { 14 | foo: 'bar', 15 | baz: 'qux', 16 | quux: 'quuux', 17 | corge: { 18 | grault: 1, 19 | garply: true, 20 | waldo: 'fred', 21 | }, 22 | }; 23 | } 24 | -------------------------------------------------------------------------------- /projects/design-system/src/environments/environment-token.ts: -------------------------------------------------------------------------------- 1 | import { InjectionToken } from '@angular/core'; 2 | import { environment } from './environment'; 3 | 4 | export const ENVIRONMENT_TOKEN = new InjectionToken('ENVIRONMENT'); 5 | -------------------------------------------------------------------------------- /projects/design-system/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true, 3 | }; 4 | -------------------------------------------------------------------------------- /projects/design-system/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: false, 3 | }; 4 | -------------------------------------------------------------------------------- /projects/design-system/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Ship 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /projects/design-system/src/main.server.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication, BootstrapContext } from '@angular/platform-browser'; 2 | import AppComponent from './app/app.component'; 3 | import { config } from './app/app.config.server'; 4 | 5 | const bootstrap = (context: BootstrapContext) => bootstrapApplication(AppComponent, config, context); 6 | 7 | export default bootstrap; 8 | -------------------------------------------------------------------------------- /projects/design-system/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import AppComponent from './app/app.component'; 3 | import { appConfig } from './app/app.config'; 4 | 5 | bootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err)); 6 | -------------------------------------------------------------------------------- /projects/design-system/src/styles.scss: -------------------------------------------------------------------------------- 1 | @use '../../ship-ui/styles/index.scss' with ( 2 | $useApexcharts: true, 3 | $useInterTight: true, 4 | $shipFormFieldShadow: true, 5 | $shipButtonShadow: true 6 | ); 7 | 8 | @use '../../ship-ui/styles/helpers.scss' as *; 9 | 10 | // Only for styling projected content 11 | app-property-viewer { 12 | h4 { 13 | font: var(--paragraph-20B); 14 | } 15 | 16 | p { 17 | color: var(--base-8); 18 | } 19 | 20 | code { 21 | color: var(--primary-12); 22 | background-color: var(--primary-4); 23 | padding: p2r(2 4); 24 | border-radius: var(--shape-1); 25 | } 26 | 27 | b, 28 | strong { 29 | color: var(--base-12); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /projects/design-system/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ 2 | /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ 3 | { 4 | "extends": "../../tsconfig.json", 5 | "compilerOptions": { 6 | "outDir": "../../out-tsc/app", 7 | "types": ["node"] 8 | }, 9 | "files": ["src/main.ts", "src/main.server.ts", "src/server.ts"], 10 | "include": ["src/**/*.d.ts"], 11 | "exclude": ["node_modules/@types/bun", "dist/**/*"] 12 | } 13 | -------------------------------------------------------------------------------- /projects/ship-ui/assets/fonts/InterTight-VariableFont_wght.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shipuicom/core/6de4218d5679c9e8440674dd1a9415fa04601197/projects/ship-ui/assets/fonts/InterTight-VariableFont_wght.woff2 -------------------------------------------------------------------------------- /projects/ship-ui/bin/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ 2 | /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ 3 | { 4 | "extends": "../../tsconfig.json", 5 | "compilerOptions": { 6 | "outDir": "../../out-tsc/app", 7 | "types": [] 8 | }, 9 | "files": [ 10 | "src/main.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /projects/ship-ui/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../dist/ship-ui", 4 | "lib": { 5 | "entryFile": "src/public-api.ts", 6 | "styleIncludePaths": ["styles"] 7 | }, 8 | "assets": ["styles/**/*", "assets/**/*", "bin/**/*"], 9 | "inlineStyleLanguage": "scss", 10 | "allowedNonPeerDependencies": ["subset-font", "@phosphor-icons/web", "glob"] 11 | } 12 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/directives/ship-prevent-wheel.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, HostListener } from '@angular/core'; 2 | 3 | @Directive({ 4 | selector: '[shPreventWheel]', 5 | standalone: true, 6 | }) 7 | export class ShipPreventWheelDirective { 8 | @HostListener('wheel', ['$event']) wheel(event: WheelEvent) { 9 | event.preventDefault(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/ship-alert/ship-alert.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { ShipAlertContainerComponent } from './ship-alert-container.component'; 3 | import { ShipAlertComponent } from './ship-alert.component'; 4 | 5 | @NgModule({ 6 | imports: [ShipAlertComponent, ShipAlertContainerComponent], 7 | exports: [ShipAlertComponent, ShipAlertContainerComponent], 8 | providers: [], 9 | }) 10 | export class ShipAlertModule {} 11 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/ship-button-group/ship-button-group.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'sh-button-group', 5 | imports: [], 6 | template: ` 7 | 8 | `, 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | host: { 11 | '[style.--btng-id]': 'id', 12 | }, 13 | }) 14 | export class ShipButtonGroupComponent { 15 | id = '--' + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 12); 16 | } 17 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/ship-card/ship-card.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core'; 2 | import { SHIP_CONFIG } from '../utilities/ship-config'; 3 | 4 | @Component({ 5 | selector: 'sh-card', 6 | imports: [], 7 | template: ` 8 | 9 | `, 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | host: { 12 | '[class]': 'class()', 13 | }, 14 | }) 15 | export class ShipCardComponent { 16 | #shConfig = inject(SHIP_CONFIG, { optional: true }); 17 | class = signal(this.#shConfig?.cardType ?? 'type-a'); 18 | } 19 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/ship-chip/ship-chip.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'sh-chip', 5 | imports: [], 6 | template: '
', 7 | changeDetection: ChangeDetectionStrategy.OnPush, 8 | host: { 9 | class: 'sh-sheet', 10 | }, 11 | }) 12 | export class ShipChipComponent {} 13 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/ship-divider/ship-divider.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'sh-divider', 5 | imports: [], 6 | template: ` 7 | 8 | `, 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class ShipDividerComponent {} 12 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/ship-event-card/ship-event-card.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'sh-event-card', 5 | imports: [], 6 | template: ` 7 |
8 | 9 |
10 | 11 |
12 | 13 | 14 |
15 | `, 16 | changeDetection: ChangeDetectionStrategy.OnPush, 17 | host: { 18 | class: 'sh-sheet', 19 | }, 20 | }) 21 | export class ShipEventCardComponent {} 22 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/ship-list/ship-list.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'sh-list', 5 | imports: [], 6 | template: ` 7 | 8 | `, 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class ShipListComponent {} 12 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/ship-progress-bar/ship-progress-bar.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, input } from '@angular/core'; 2 | 3 | export type ShipProgressBarMode = 'determinate' | 'indeterminate'; 4 | 5 | @Component({ 6 | selector: 'sh-progress-bar', 7 | imports: [], 8 | template: ` 9 |
10 | `, 11 | changeDetection: ChangeDetectionStrategy.OnPush, 12 | }) 13 | export class ShipProgressBarComponent { 14 | value = input(undefined); 15 | } 16 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/ship-radio/ship-radio.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { classMutationSignal } from '../utilities/class-mutation-signal'; 3 | 4 | @Component({ 5 | selector: 'sh-radio', 6 | imports: [], 7 | template: ` 8 |
9 | 10 | 11 | `, 12 | changeDetection: ChangeDetectionStrategy.OnPush, 13 | }) 14 | export class ShipRadioComponent { 15 | currentClassList = classMutationSignal(); 16 | } 17 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/ship-spinner/ship-spinner.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'sh-spinner', 5 | imports: [], 6 | template: ``, 7 | changeDetection: ChangeDetectionStrategy.OnPush, 8 | }) 9 | export class ShipSpinnerComponent {} 10 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/ship-stepper/ship-stepper.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'sh-stepper', 5 | imports: [], 6 | template: ` 7 | 8 | `, 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class ShipStepperComponent {} 12 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/ship-tabs/ship-tabs.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'sh-tabs', 5 | imports: [], 6 | template: ` 7 | 8 | `, 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | host: { 11 | '[style.--tabs-id]': 'id', 12 | }, 13 | }) 14 | export class ShipTabsComponent { 15 | id = '--' + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 12); 16 | } 17 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/ship-toggle/ship-toggle.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'sh-toggle', 5 | imports: [], 6 | template: ` 7 |
8 |
9 |
10 | 11 | 12 | `, 13 | changeDetection: ChangeDetectionStrategy.OnPush, 14 | }) 15 | export class ShipToggleComponent {} 16 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/utilities/random-id.ts: -------------------------------------------------------------------------------- 1 | export function generateUniqueId() { 2 | return Date.now().toString(36) + Math.random().toString(36).substring(2); 3 | } 4 | -------------------------------------------------------------------------------- /projects/ship-ui/src/lib/utilities/ship-config.ts: -------------------------------------------------------------------------------- 1 | import { InjectionToken } from '@angular/core'; 2 | 3 | export const SHIP_CONFIG = new InjectionToken('Ship UI Config'); 4 | 5 | interface ShipConfig { 6 | alertVariant?: '' | 'simple' | 'outlined' | 'flat' | 'raised'; 7 | cardType?: 'type-b'; 8 | dialogType?: 'type-b'; 9 | tableType?: 'type-b'; 10 | sidenavType?: 'overlay' | 'simple'; 11 | } 12 | -------------------------------------------------------------------------------- /projects/ship-ui/styles/components/ship-divider.component.scss: -------------------------------------------------------------------------------- 1 | @use '../helpers.scss' as *; 2 | 3 | $shipDivider: true !default; 4 | 5 | @if $shipDivider == true { 6 | sh-divider { 7 | --divider-c: var(--base-4); 8 | --divider-h: #{p2r(1)}; 9 | 10 | display: flex; 11 | gap: p2r(8); 12 | align-items: center; 13 | text-align: center; 14 | 15 | &:empty { 16 | gap: 0; 17 | } 18 | 19 | &::before, 20 | &::after { 21 | content: ''; 22 | background: var(--divider-c); 23 | height: var(--divider-h); 24 | flex: 1 0; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /projects/ship-ui/styles/components/ship-virtual-scroll.component.scss: -------------------------------------------------------------------------------- 1 | @use '../helpers.scss' as *; 2 | 3 | $shipVirtualScroll: false !default; 4 | 5 | @if $shipVirtualScroll == true { 6 | sh-virtual-scroll { 7 | overflow-y: auto; 8 | position: relative; 9 | display: block; 10 | height: 600px; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /projects/ship-ui/styles/core/core.scss: -------------------------------------------------------------------------------- 1 | @forward './core/variables'; 2 | @forward './core/layout'; 3 | @forward './core/loader'; 4 | @forward './core/typography'; 5 | -------------------------------------------------------------------------------- /projects/ship-ui/styles/core/core/loader.scss: -------------------------------------------------------------------------------- 1 | @use '../../helpers.scss' as *; 2 | 3 | .loader { 4 | width: p2r(48); 5 | height: p2r(48); 6 | display: grid; 7 | place-content: center; 8 | color: var(--base-8); 9 | } 10 | 11 | .loader, 12 | .loading { 13 | position: relative; 14 | 15 | &:after { 16 | content: ''; 17 | width: p2r(16); 18 | height: p2r(16); 19 | border: 2px solid var(--loader-c); 20 | border-bottom-color: transparent; 21 | border-radius: 50%; 22 | display: flex; 23 | box-sizing: border-box; 24 | animation: rotation 1s linear infinite; 25 | margin: auto; 26 | inset: 0; 27 | position: absolute; 28 | } 29 | } 30 | 31 | @keyframes rotation { 32 | 0% { 33 | transform: rotate(0deg); 34 | } 35 | 100% { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /projects/ship-ui/styles/core/fonts/_inter-tight.scss: -------------------------------------------------------------------------------- 1 | $useInterTight: true !default; 2 | 3 | @if ($useInterTight == true) { 4 | @font-face { 5 | font-family: 'Inter Tight'; 6 | src: url('/ship-ui-assets/fonts/InterTight-VariableFont_wght.woff2') format('woff2-variations'); 7 | font-weight: 100 900; 8 | font-stretch: 75% 125%; 9 | font-style: normal; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /projects/ship-ui/styles/core/helpers/fn/color-mix.scss: -------------------------------------------------------------------------------- 1 | @function lighten($color, $percentage) { 2 | @return color-mix(in srgb, $color, #fff $percentage); 3 | } 4 | 5 | @function darken($color, $percentage) { 6 | @return color-mix(in srgb, $color, #000 $percentage); 7 | } 8 | -------------------------------------------------------------------------------- /projects/ship-ui/styles/core/helpers/fn/dp.scss: -------------------------------------------------------------------------------- 1 | @use 'sass:list'; 2 | 3 | // Gutter 4 | $base-dp: 4px; 5 | 6 | @function dp($listTimes) { 7 | $new-dp-list: (); 8 | 9 | @each $times in $listTimes { 10 | $new-dp-list: list.append($new-dp-list, $times * $base-dp, 'space'); 11 | } 12 | 13 | @return $new-dp-list; 14 | } 15 | -------------------------------------------------------------------------------- /projects/ship-ui/styles/core/helpers/fn/p2r.scss: -------------------------------------------------------------------------------- 1 | @use 'sass:list' as list; 2 | @use 'sass:meta' as meta; 3 | @use 'sass:math' as math; // Include math module for division 4 | 5 | $base-font-size-in-px: 16 !default; 6 | 7 | @function p2r($pxValues) { 8 | $remValues: (); 9 | 10 | @each $pxValue in $pxValues { 11 | @if $pxValue == auto { 12 | $remValues: list.append($remValues, auto); 13 | } @else if meta.type-of($pxValue) != number { 14 | $pxValue: math.div($pxValue, 1px); 15 | } @else if $pxValue == 0 { 16 | $remValues: list.append($remValues, 0); 17 | } @else { 18 | $remValues: list.append($remValues, (math.div($pxValue, $base-font-size-in-px) * 1rem)); 19 | } 20 | } 21 | 22 | @return $remValues; 23 | } 24 | -------------------------------------------------------------------------------- /projects/ship-ui/styles/core/helpers/mixins/ellipsis.scss: -------------------------------------------------------------------------------- 1 | @mixin ellipsis() { 2 | overflow: hidden; 3 | white-space: nowrap; 4 | text-overflow: ellipsis; 5 | word-break: break-all; 6 | word-wrap: break-word; 7 | } 8 | -------------------------------------------------------------------------------- /projects/ship-ui/styles/core/helpers/mixins/overflow-scrolling.scss: -------------------------------------------------------------------------------- 1 | @mixin overflowScrolling($dir: y) { 2 | @if $dir == y { 3 | overflow-x: hidden; 4 | overflow-y: auto; 5 | -webkit-overflow-scrolling: auto; 6 | } 7 | 8 | @if $dir == x { 9 | overflow-x: auto; 10 | overflow-y: hidden; 11 | -webkit-overflow-scrolling: auto; 12 | } 13 | 14 | @if $dir == xy or $dir == yx { 15 | overflow: auto; 16 | -webkit-overflow-scrolling: auto; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /projects/ship-ui/styles/core/helpers/mixins/wrapper.scss: -------------------------------------------------------------------------------- 1 | @use '../mixins/breakpoint.scss' as *; 2 | @use '../fn/p2r.scss' as *; 3 | @use 'sass:math' as mat; 4 | 5 | @mixin wrapper($gap: p2r(32), $padding: p2r(32)) { 6 | display: flex; 7 | flex-direction: column; 8 | width: 100%; 9 | gap: $gap; 10 | padding: $padding; 11 | 12 | @include breakpoint(-milli) { 13 | gap: calc(#{$gap} / 2); 14 | padding: calc(#{$padding} / 2); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /projects/ship-ui/styles/core/polyfill/light-dark.scss: -------------------------------------------------------------------------------- 1 | @function light-dark($light, $dark) { 2 | @return var(--ship-light, $light) var(--ship-dark, $dark); 3 | } 4 | -------------------------------------------------------------------------------- /projects/ship-ui/styles/helpers.scss: -------------------------------------------------------------------------------- 1 | // Functions 2 | @forward './core/helpers/fn/p2r'; 3 | @forward './core/helpers/fn/color-mix'; 4 | 5 | // light-dark polyfill 6 | @forward './core/polyfill/light-dark.scss'; 7 | 8 | // Mixins 9 | @forward './core/helpers/mixins/breakpoint'; 10 | @forward './core/helpers/mixins/wrapper'; 11 | @forward './core/helpers/mixins/ellipsis'; 12 | @forward './core/helpers/mixins/overflow-scrolling'; 13 | @forward './core/helpers/mixins/scroll-shadows'; 14 | // @forward './core/helpers/mixins/border-gradient'; 15 | -------------------------------------------------------------------------------- /projects/ship-ui/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ 2 | /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ 3 | { 4 | "extends": "../../tsconfig.json", 5 | "compilerOptions": { 6 | "outDir": "../../out-tsc/lib", 7 | "declaration": true, 8 | "declarationMap": true, 9 | "inlineSources": true, 10 | "types": [] 11 | }, 12 | "exclude": ["**/*.spec.ts", "node_modules/@types/bun"] 13 | } 14 | -------------------------------------------------------------------------------- /projects/ship-ui/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ 2 | /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ 3 | { 4 | "extends": "./tsconfig.lib.json", 5 | "compilerOptions": { 6 | "declarationMap": false 7 | }, 8 | "angularCompilerOptions": { 9 | "compilationMode": "partial" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /projects/ship-ui/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ 2 | /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ 3 | { 4 | "extends": "../../tsconfig.json", 5 | "compilerOptions": { 6 | "outDir": "../../out-tsc/spec", 7 | "types": [] 8 | }, 9 | "include": ["**/*.spec.ts", "**/*.d.ts"], 10 | "exclude": ["node_modules/@types/bun"] 11 | } 12 | --------------------------------------------------------------------------------