@allsorter/ui-components 0.0.329 → 0.0.330

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/.storybook/main.ts +8 -1
  2. package/angular.json +36 -10
  3. package/bitbucket-pipelines.yml +15 -15
  4. package/documentation.json +540 -16
  5. package/ng-package.json +7 -0
  6. package/package.json +11 -8
  7. package/projects/allsorter-lib/.storybook/main.js +15 -0
  8. package/projects/allsorter-lib/README.md +63 -0
  9. package/projects/allsorter-lib/ng-package.json +7 -0
  10. package/projects/allsorter-lib/package.json +12 -0
  11. package/projects/allsorter-lib/src/lib/allsorter-lib.component.spec.ts +23 -0
  12. package/projects/allsorter-lib/src/lib/allsorter-lib.component.ts +15 -0
  13. package/projects/allsorter-lib/src/lib/allsorter-lib.service.spec.ts +16 -0
  14. package/projects/allsorter-lib/src/lib/allsorter-lib.service.ts +9 -0
  15. package/projects/allsorter-lib/src/lib/button/button.component.html +116 -0
  16. package/{src/app → projects/allsorter-lib/src/lib}/button/button.component.scss +15 -11
  17. package/{src/app → projects/allsorter-lib/src/lib}/button/button.module.ts +1 -1
  18. package/projects/allsorter-lib/src/lib/button/stories/button-gallery.stories.ts +155 -0
  19. package/{src → projects/allsorter-lib/src/lib/button}/stories/button-playground.stories.ts +12 -8
  20. package/projects/allsorter-lib/src/lib/input/input.component.css +58 -0
  21. package/projects/allsorter-lib/src/lib/input/input.component.spec.ts +60 -0
  22. package/{src → projects/allsorter-lib/src/lib/input}/stories/input-gallery.stories.ts +1 -1
  23. package/{src → projects/allsorter-lib/src/lib/input}/stories/input-playground.stories.ts +1 -1
  24. package/projects/allsorter-lib/src/public-api.ts +10 -0
  25. package/projects/allsorter-lib/tsconfig.lib.json +15 -0
  26. package/projects/allsorter-lib/tsconfig.lib.prod.json +11 -0
  27. package/projects/allsorter-lib/tsconfig.spec.json +15 -0
  28. package/tsconfig.json +5 -0
  29. package/src/app/button/button.component.html +0 -117
  30. package/src/app/input/input.component.css +0 -424
  31. package/src/app/input/input.component.spec.ts +0 -444
  32. package/src/public-api.ts +0 -9
  33. package/src/stories/button-gallery.stories.ts +0 -145
  34. package/src/styles/global-menu-overlay-styles.scss +0 -8
  35. /package/{src/app → projects/allsorter-lib/src/lib}/button/button.component.spec.ts +0 -0
  36. /package/{src/app → projects/allsorter-lib/src/lib}/button/button.component.ts +0 -0
  37. /package/{src/app → projects/allsorter-lib/src/lib}/input/input.component.html +0 -0
  38. /package/{src/app → projects/allsorter-lib/src/lib}/input/input.component.ts +0 -0
  39. /package/{src/app → projects/allsorter-lib/src/lib}/input/input.module.ts +0 -0
  40. /package/{src → projects/allsorter-lib/src/lib}/styles/typography-classes.scss +0 -0
@@ -1,12 +1,72 @@
1
1
  {
2
2
  "pipes": [],
3
3
  "interfaces": [],
4
- "injectables": [],
4
+ "injectables": [
5
+ {
6
+ "name": "AllsorterLibService",
7
+ "id": "injectable-AllsorterLibService-501f971c26600eed2bb6ef7e7c841db5a85088f33cc3075c403799f6718e3416b8a175b29933aba7fd3985a5be1c254eca05251e62806c4ca76cae2c439d7ba7",
8
+ "file": "projects/allsorter-lib/src/lib/allsorter-lib.service.ts",
9
+ "properties": [],
10
+ "methods": [],
11
+ "deprecated": false,
12
+ "deprecationMessage": "",
13
+ "description": "",
14
+ "rawdescription": "\n",
15
+ "sourceCode": "import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AllsorterLibService {\n\n constructor() { }\n}\n",
16
+ "constructorObj": {
17
+ "name": "constructor",
18
+ "description": "",
19
+ "deprecated": false,
20
+ "deprecationMessage": "",
21
+ "args": [],
22
+ "line": 6
23
+ },
24
+ "extends": [],
25
+ "type": "injectable"
26
+ }
27
+ ],
5
28
  "guards": [],
6
29
  "interceptors": [],
7
30
  "classes": [],
8
31
  "directives": [],
9
32
  "components": [
33
+ {
34
+ "name": "AllsorterLibComponent",
35
+ "id": "component-AllsorterLibComponent-97b338ab61f97d65ef635f2bdaf3bb50eb3bc8f12dfa1173b0e08a66802c464cb47df004f6766a5ab68b9e922167c2587ef98e1ade5f9cc4002fc98223c9b1f7",
36
+ "file": "projects/allsorter-lib/src/lib/allsorter-lib.component.ts",
37
+ "encapsulation": [],
38
+ "entryComponents": [],
39
+ "inputs": [],
40
+ "outputs": [],
41
+ "providers": [],
42
+ "selector": "lib-allsorter-lib",
43
+ "styleUrls": [],
44
+ "styles": [
45
+ ""
46
+ ],
47
+ "template": "<p>\n allsorter-lib works!\n</p>\n",
48
+ "templateUrl": [],
49
+ "viewProviders": [],
50
+ "hostDirectives": [],
51
+ "inputsClass": [],
52
+ "outputsClass": [],
53
+ "propertiesClass": [],
54
+ "methodsClass": [],
55
+ "deprecated": false,
56
+ "deprecationMessage": "",
57
+ "hostBindings": [],
58
+ "hostListeners": [],
59
+ "standalone": false,
60
+ "imports": [],
61
+ "description": "",
62
+ "rawdescription": "\n",
63
+ "type": "component",
64
+ "sourceCode": "import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-allsorter-lib',\n imports: [],\n template: `\n <p>\n allsorter-lib works!\n </p>\n `,\n styles: ``\n})\nexport class AllsorterLibComponent {\n\n}\n",
65
+ "assetsDirs": [],
66
+ "styleUrlsData": "",
67
+ "stylesData": "\n",
68
+ "extends": []
69
+ },
10
70
  {
11
71
  "name": "AppComponent",
12
72
  "id": "component-AppComponent-a7aea3f74502fe342ed545942aaddea376f531209a0e06c0e5cc330db64f8fb6b0b15dba35cc9c380ae8f514c7ca32fc545d9e36e392545cc209919b86174236",
@@ -66,7 +126,7 @@
66
126
  {
67
127
  "name": "ButtonComponent",
68
128
  "id": "component-ButtonComponent-9c9529bc461c96abb36c41a88cc1f0aa63abff53ba4f283eac31116bd9a2aa563d1e51277b0fed568e4f4f0e2d701f2967c8f8c80ee60e36cee99111e945eec8",
69
- "file": "src/app/button/button.component.ts",
129
+ "file": "projects/allsorter-lib/src/lib/button/button.component.ts",
70
130
  "encapsulation": [],
71
131
  "entryComponents": [],
72
132
  "inputs": [],
@@ -351,7 +411,7 @@
351
411
  "assetsDirs": [],
352
412
  "styleUrlsData": [
353
413
  {
354
- "data": "@import url(\"https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined\");\n@import \"../../styles/typography-classes.scss\";\n\n.material-icons-outlined {\n font-family: 'Material Icons Outlined';\n font-weight: normal;\n font-style: normal;\n /* These two preserve the standard Material Icons sizing/ligatures */\n font-feature-settings: 'liga';\n font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;\n /* everything else can stay at Angular’s defaults */\n/* Base Button Styling */\n}\n.mdc-button.btn {\n\n border-radius: 5px;\n display: flex;\n align-items: center;\n cursor: pointer;\n border: none;\n transition: background 0.2s, border 0.2s, transform 0.1s;\n\n min-width: auto !important;\n gap:8px;\n height:auto !important;\n}\n/* Button Categories primary*/ \n.mdc-button.btn-primary1 {\n background-color: #5473e8;\n color: white;\n}\n.mdc-button.btn-primary2 {\n background-color: #37c1ce;\n color: white;\n}\n.mdc-button.btn-secondary {\n background-color: #383B4A;\n color: white;\n}\n.mdc-button.btn-destructive {\n background-color: #E854A4;\n color: white;\n}\n.mdc-button.btn-gradient {\n background: linear-gradient(275deg, #5473E8 -36.22%, #37C1CE 100.04%);\n color: white;\n}\n\n/* Hover States */\n\n\n.mdc-button.btn-primary2:hover {\n background-color: #4bc7d3 !important;\n}\n\n.mdc-button.btn-primary2:active {\n background-color: #299da8 !important;\n}\n\n.mdc-button.btn-primary2:outlined {\n background-color: #fff;\n border-radius: 4px;\n border: 1px solid #37c1ce;\n}\n\n.mdc-button.btn-primary1:hover {\n background-color: #6581ea !important;\n}\n\n.mdc-button.btn-primary1:active {\n background-color: #1e46df !important;\n}\n\n.mdc-button.btn-primary1:outlined {\n background-color: #fff;\n border-radius: 4px;\n border: 1px solid #5473e8;\n}\n\n.mdc-button.btn-secondary:hover {\n background-color: #4B4F62 !important;\n }\n \n .mdc-button.btn-secondary:active {\n background-color: #252831 !important;\n }\n \n .mdc-button.btn-secondary:outlined {\n background-color: #fff;\n border-radius: 4px;\n border: 1px solid #383B4A;\n }\n\n\n .mdc-button.btn-destructive:hover {\n background-color: #EF87BF !important;\n }\n \n .mdc-button.btn-destructive:active {\n background-color: #E22A8E !important;\n }\n \n .mdc-button.btn-destructive:outlined {\n background-color: #fff;\n border-radius: 4px;\n border: 1px solid #E854A4;\n }\n\n .mdc-button.btn-gradient:hover {\n background: linear-gradient(275deg, #4A90E2 -36.22%, #2BBBAD 100.04%) !important;\n }\n \n .mdc-button.btn-gradient:active {\n background: linear-gradient(275deg, #42A5F5 -36.22%, #1E88E5 100.04%) !important;\n }\n\n \n\n\n/* Pressed States (pseudo-class for active) */\n\n\n/* Disabled State */\n.mdc-button.btn-disabled {\n border: none !important;\n background-color: #b0b0b0;\n color: #666;\n cursor: not-allowed;\n}\n\n/* Outlined State */\n.mdc-button.btn-outlined {\n background: transparent;\n border: 2px solid currentColor;\n}\n\n/* Category colours used by Storybook */\n.blue { background-color:#5473e8 !important; color:#fff; }\n.blue.btn-hover, .blue:hover { background-color:#6581ea !important; }\n.blue.btn-pressed, .blue:active { background-color:#1e46df !important; }\n\n.green { background-color:#37c1ce !important; color:#fff; }\n.green.btn-hover, .green:hover { background-color:#4bc7d3 !important; }\n.green.btn-pressed, .green:active { background-color:#299da8 !important; }\n\n.grey { background-color:#383B4A !important; color:#fff; }\n.grey.btn-hover, .grey:hover { background-color:#4B4F62 !important; }\n.grey.btn-pressed, .grey:active { background-color:#252831 !important; }\n\n.error { background-color:#E854A4 !important; color:#fff; }\n.error.btn-hover, .error:hover { background-color:#EF87BF !important; }\n.error.btn-pressed, .error:active { background-color:#E22A8E !important; }\n\n.gradient { background:linear-gradient(275deg, #5473E8 -36.22%, #37C1CE 100.04%); color:#fff; }\n.gradient.btn-hover, .gradient:hover { opacity:0.9; }\n.gradient.btn-pressed, .gradient:active { opacity:0.8; }\n\n\n/* Spacing between icon and label */\n.btn.custom-button > * + * {\n margin-left: 8px;\n}\n\n/* Fixed 20x20 icon size for label/two-icon buttons */\n.two-icon-label{\n padding:4px 12px !important;\n}\nbutton.two-icon-label .mat-icon {\n width: 20px !important;\n height: 20px !important;\n} \n\n\n/* etc. */\n@font-face {\n font-family: 'Material Icons';\n font-style: normal;\n font-weight: 400;\n src: url(https://fonts.gstatic.com/s/materialicons/v143/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.woff2) format('woff2');\n}\n\n.material-icons {\n font-family: 'Material Icons';\n font-weight: normal;\n font-style: normal;\n font-size: 24px;\n line-height: 1;\n letter-spacing: normal;\n text-transform: none;\n display: inline-block;\n white-space: nowrap;\n word-wrap: normal;\n direction: ltr;\n -webkit-font-feature-settings: 'liga';\n -webkit-font-smoothing: antialiased;\n}\n\n.left-icon{\n order:0;\n}\n\n.right-icon{\n order:2;\n}\n\nmat-icon.mat-icon {\n margin: 0 !important;\n padding: 0 !important;\n}\n\n/* ------------------------------------------------------------------\n Size utility classes\n------------------------------------------------------------------ */\n\n\n\n/* New naming convention */\n.size-header { font-size: 20px; padding: 4px 12px !important; }\n.size-xs { font-size: 12px; padding: 8px 12px !important; }\n.size-sm { font-size: 14px; padding: 8px 12px !important; }\n.size-base { font-size: 14px; padding: 10px 20px !important; }\n.size-l { font-size: 16px; padding: 12px 20px !important; }\n.size-xl{ font-size: 16px; padding: 14px 24px !important; }\n/* Reuse .size-xl for xl */\n\n/* Icon sizes for new naming */\n.size-header .mat-icon { width:20px; height:20px; font-size:20px; }\n.size-xs .mat-icon { width:16px; height:16px; font-size:16px; }\n.size-sm .mat-icon, .size-base .mat-icon { width:16px; height:16px; font-size:16px; }\n.size-l .mat-icon, .size-xl .mat-icon { width:20px; height:20px; font-size:20px; }\n\n/* Adjust gap for header size */\n.btn.size-header { gap:4px !important; padding: 4px 12px !important;}\n\n/* --------------------------------------------------\n Dropdown menu custom styling\n-------------------------------------------------- */\n::ng-deep .custom-dropdown-menu.mat-mdc-menu-panel,\n::ng-deep .custom-dropdown-menu.mat-menu-panel {\n padding: 0; /* remove default padding */\n border-radius: 8px; /* rounded corners */\n box-shadow: 0 2px 6px rgba(0,0,0,0.15);\n border: 1px solid rgba(0,0,0,0.12);\n}\n::ng-deep .custom-dropdown-menu .mat-mdc-menu-content,\n::ng-deep .custom-dropdown-menu .mat-menu-content{\n padding: 0;\n}\n::ng-deep .custom-dropdown-menu .mat-mdc-menu-item,\n::ng-deep .custom-dropdown-menu .mat-menu-item{\n font-family: 'Roboto', sans-serif;\n font-size: 16px;\n line-height: 24px;\n height: 56px;\n padding: 16px 24px;\n color:#47515E;\n}\n::ng-deep .custom-dropdown-menu .mat-mdc-menu-item:hover,\n::ng-deep .custom-dropdown-menu .mat-menu-item:hover{\n background: #F5F6F7;\n}\n/* subtle divider between items */\n::ng-deep .custom-dropdown-menu .mat-mdc-menu-item + .mat-mdc-menu-item,\n::ng-deep .custom-dropdown-menu .mat-menu-item + .mat-menu-item{\n border-top: 1px solid #EAECEE;\n}\n\n/* Force white background on Angular Material menu panel */\n::ng-deep .mat-mdc-menu-panel,\n::ng-deep .mat-menu-panel,\n::ng-deep .mdc-menu-surface {\n background-color: #ffffff !important;\n --mdc-theme-surface: #ffffff !important;\n --mdc-menu-container-color: #ffffff !important;\n}\n::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-content,\n::ng-deep .mat-menu-panel .mat-menu-content {\n background-color: #ffffff !important;\n}\n\n/* Ensure dropdown menu is above other elements */\n.cdk-overlay-pane{\n z-index:1000 !important;\n background:#fff !important;\n}\n::ng-deep .mat-mdc-menu-panel,\n::ng-deep .mat-menu-panel,\n::ng-deep .mdc-menu-surface,\n.cdk-overlay-pane .mat-mdc-menu-panel,\n.cdk-overlay-pane .mdc-menu-surface,\n.cdk-overlay-pane .mat-menu-panel{\n background-color:#ffffff !important;\n --mdc-theme-surface:#ffffff !important;\n --mdc-menu-container-color:#fff !important;\n}\n\n/* Make sure the Material menu panel itself is white (use ::ng-deep so rules pierce view encapsulation) */\n\n\n.mat-mdc-menu-panel,\n.mdc-menu-surface,\n.mat-menu-panel {\n --mdc-theme-surface: #ffffff !important; /* Material variable */\n background-color: #ffffff !important;\n}\n\n.cdk-overlay-pane .mat-mdc-menu-panel,\n.cdk-overlay-pane .mdc-menu-surface,\n.cdk-overlay-pane .mat-mdc-menu-panel { --mdc-menu-container-color:#fff !important; }\n\n.cdk-overlay-pane .mat-menu-panel,\n.cdk-overlay-pane .mat-mdc-menu-content,\n.cdk-overlay-pane .mat-menu-content {\n background: #fff !important;\n}\n\n\n/* Icon size helper */\n\n\n/* --------------------------------------------------\n Button types\n-------------------------------------------------- */\nbutton.icon-circle {\n width: auto !important;\n height: auto !important;\n border-radius: 50% !important;\n aspect-ratio: 1 / 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0 !important;\n min-width: 0 !important;\n justify-content: center;\n padding:6px !important;\n}\n.size-small.icon-circle { \n padding: 4px !important;\n }\n.size-medium.icon-circle { \n padding: 8px !important;\n}\n.size-base.icon-circle { \n padding: 10px !important;\n}\n.size-large.icon-circle { \n padding: 12px !important;\n}\n.size-xl.icon-circle { \n padding: 14px !important;\n}\n\n/* Circle button size overrides */\n.size-header.icon-circle { padding:4px !important; }\n.size-header.icon-circle .mat-icon { width:10px; height:10px; font-size:10px; }\n\n.size-xs.icon-circle { padding:4px !important; }\n.size-xs.icon-circle .mat-icon { width:12px; height:12px; font-size:12px; }\n\n.size-sm.icon-circle { padding:8px !important; }\n.size-sm.icon-circle .mat-icon { width:12px; height:12px; font-size:12px; }\n\n.size-base.icon-circle { padding:10px !important; }\n.size-base.icon-circle .mat-icon { width:14px; height:14px; font-size:14px; }\n\n.size-l.icon-circle { padding:12px !important; }\n.size-l.icon-circle .mat-icon { width:16px; height:16px; font-size:16px; }\n\n.size-xl.icon-circle { padding:14px !important; }\n.size-xl.icon-circle .mat-icon { width:16px; height:16px; font-size:16px; }\n\n/* icon-label and two-icon-label just rely on default flex behaviour */\n.icon-xs { \n /* width: 16px; height: 16px; */\n padding: 4px !important;\n }\n\n\n/* ------------------------------------------------------------------\n Color category classes (solid)\n------------------------------------------------------------------ */\n.mdc-button.blue { background-color: #5473E8; color: #fff; }\n.mdc-button.blue:hover { background-color: #6581EA; }\n.mdc-button.blue:active { background-color: #1E46DF; }\n\n.mdc-button.green { background-color: #37C1CE; color: #fff; }\n.mdc-button.green:hover { background-color: #4BC7D3; }\n.mdc-button.green:active { background-color: #299DA8; }\n\n.mdc-button.grey { background-color: #383B4A; color: #fff; }\n.mdc-button.grey:hover { background-color: #4B4F62; }\n.mdc-button.grey:active { background-color: #252831; }\n\n.mdc-button.error { background-color: #E854A4; color: #fff; }\n.mdc-button.error:hover { background-color: #EF87BF; }\n.mdc-button.error:active { background-color: #E22A8E; }\n\n.mdc-button.gradient {\n background: linear-gradient(275deg, #5473E8 -36.22%, #37C1CE 100.04%);\n color: #fff;\n}\n.mdc-button.gradient:hover {\n background: linear-gradient(0deg, rgba(250, 250, 253, 0.30) 0%, rgba(250, 250, 253, 0.30) 100%),\n linear-gradient(275deg, #2BBBAD 9.3%, #4A90E2 115.85%);\n}\n.mdc-button.gradient:active {\n background: linear-gradient(0deg, rgba(56, 59, 74, 0.50) 0%, rgba(56, 59, 74, 0.50) 100%),\n linear-gradient(275deg, #2BBBAD 9.3%, #4A90E2 115.85%);\n}\n\n.mdc-button.disabled,\n.mdc-button:disabled {\n background-color: #D1D3DB !important;\n color: #666 !important;\n cursor: not-allowed !important;\n}\n\n/* ------------------------------------------------------------------\n No-outline (outlined) variants\n------------------------------------------------------------------ */\n.mdc-button.blue-no-outline { background-color: #fff; color: #5473E8; border: 1px solid #5473E8; }\n.mdc-button.blue-no-outline:hover { background-color: #6581EA; color:#fff; }\n.mdc-button.blue-no-outline:active { background-color: #1E46DF; color:#fff; }\n\n.mdc-button.green-no-outline { background-color: #fff; color: #37C1CE; border: 1px solid #37C1CE; }\n.mdc-button.green-no-outline:hover { background-color: #4BC7D3; color:#fff; }\n.mdc-button.green-no-outline:active { background-color: #299DA8; color:#fff; }\n\n.mdc-button.grey-no-outline { background-color: #fff; color: #383B4A; border: 1px solid #383B4A; }\n.mdc-button.grey-no-outline:hover { background-color: #4B4F62; color:#fff; }\n.mdc-button.grey-no-outline:active { background-color: #252831; color:#fff; }\n\n.mdc-button.error-no-outline { background-color: #fff; color: #E854A4; border: 1px solid #E854A4; }\n.mdc-button.error-no-outline:hover { background-color: #EF87BF; color:#fff; }\n.mdc-button.error-no-outline:active { background-color: #E22A8E; color:#fff; }\n\n/*************Button Drop down design*********/\n::ng-deep .cdk-overlay-pane {\n border-radius: 6px !important;\n box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.15) !important;\n}\n\n::ng-deep .mat-mdc-menu-panel {\n padding: 4px 0 !important;\n background-color: white !important;\n min-width: 180px !important;\n border-radius: 6px !important;\n box-shadow: none !important; /* handled by cdk-overlay-pane */\n}\n\n::ng-deep .mat-mdc-menu-item {\n font-family: 'Roboto', sans-serif;\n font-size: 14px;\n color: #333;\n padding: 12px 16px;\n border-radius: 0 !important;\n transition: background 0.2s ease-in-out;\n}\n\n::ng-deep .mat-mdc-menu-item:hover {\n background-color: #f5f5f5 !important;\n}",
414
+ "data": "@import url(\"https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined\");\n@import \"../styles/typography-classes.scss\";\n \n.material-icons-outlined {\n font-family: 'Material Icons Outlined';\n font-weight: normal;\n font-style: normal;\n /* These two preserve the standard Material Icons sizing/ligatures */\n font-feature-settings: 'liga';\n font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;\n /* everything else can stay at Angular’s defaults */\n/* Base Button Styling */\n}\n.mdc-button.btn {\n\n border-radius: 5px;\n display: flex;\n align-items: center;\n cursor: pointer;\n border: none;\n transition: background 0.2s, border 0.2s, transform 0.1s;\n\n min-width: auto !important;\n gap:8px;\n height:auto !important;\n}\n/* Button Categories primary*/ \n.mdc-button.btn-primary1 {\n background-color: #5473e8;\n color: white;\n}\n.mdc-button.btn-primary2 {\n background-color: #37c1ce;\n color: white;\n}\n.mdc-button.btn-secondary {\n background-color: #383B4A;\n color: white;\n}\n.mdc-button.btn-destructive {\n background-color: #E854A4;\n color: white;\n}\n.mdc-button.btn-gradient {\n background: linear-gradient(275deg, #5473E8 -36.22%, #37C1CE 100.04%);\n color: white;\n}\n\n/* Hover States */\n\n\n.mdc-button.btn-primary2:hover {\n background-color: #4bc7d3 !important;\n}\n\n.mdc-button.btn-primary2:active {\n background-color: #299da8 !important;\n}\n\n.mdc-button.btn-primary2:outlined {\n background-color: #fff;\n border-radius: 4px;\n border: 1px solid #37c1ce;\n}\n\n.mdc-button.btn-primary1:hover {\n background-color: #6581ea !important;\n}\n\n.mdc-button.btn-primary1:active {\n background-color: #1e46df !important;\n}\n\n.mdc-button.btn-primary1:outlined {\n background-color: #fff;\n border-radius: 4px;\n border: 1px solid #5473e8;\n}\n\n.mdc-button.btn-secondary:hover {\n background-color: #4B4F62 !important;\n }\n \n .mdc-button.btn-secondary:active {\n background-color: #252831 !important;\n }\n \n .mdc-button.btn-secondary:outlined {\n background-color: #fff;\n border-radius: 4px;\n border: 1px solid #383B4A;\n }\n\n\n .mdc-button.btn-destructive:hover {\n background-color: #EF87BF !important;\n }\n \n .mdc-button.btn-destructive:active {\n background-color: #E22A8E !important;\n }\n \n .mdc-button.btn-destructive:outlined {\n background-color: #fff;\n border-radius: 4px;\n border: 1px solid #E854A4;\n }\n\n .mdc-button.btn-gradient:hover {\n background: linear-gradient(275deg, #4A90E2 -36.22%, #2BBBAD 100.04%) !important;\n }\n \n .mdc-button.btn-gradient:active {\n background: linear-gradient(275deg, #42A5F5 -36.22%, #1E88E5 100.04%) !important;\n }\n\n \n\n\n/* Pressed States (pseudo-class for active) */\n\n\n/* Disabled State */\n.mdc-button.btn-disabled {\n border: none !important;\n background-color: #b0b0b0;\n color: #666;\n cursor: not-allowed;\n}\n\n/* Outlined State */\n.mdc-button.btn-outlined {\n background: transparent;\n border: 2px solid currentColor;\n}\n\n/* Category colours used by Storybook */\n.blue { background-color:#5473e8 !important; color:#fff; }\n.blue.btn-hover, .blue:hover { background-color:#6581ea !important; }\n.blue.btn-pressed, .blue:active { background-color:#1e46df !important; }\n\n.green { background-color:#37c1ce !important; color:#fff; }\n.green.btn-hover, .green:hover { background-color:#4bc7d3 !important; }\n.green.btn-pressed, .green:active { background-color:#299da8 !important; }\n\n.grey { background-color:#383B4A !important; color:#fff; }\n.grey.btn-hover, .grey:hover { background-color:#4B4F62 !important; }\n.grey.btn-pressed, .grey:active { background-color:#252831 !important; }\n\n.error { background-color:#E854A4 !important; color:#fff; }\n.error.btn-hover, .error:hover { background-color:#EF87BF !important; }\n.error.btn-pressed, .error:active { background-color:#E22A8E !important; }\n\n.gradient { background:linear-gradient(275deg, #5473E8 -36.22%, #37C1CE 100.04%); color:#fff; }\n.gradient.btn-hover, .gradient:hover { opacity:0.9; }\n.gradient.btn-pressed, .gradient:active { opacity:0.8; }\n\n\n/* Spacing between icon and label */\n.btn.custom-button > * + * {\n margin-left: 8px;\n}\n\n/* Fixed 20x20 icon size for label/two-icon buttons */\n.two-icon-label{\n padding:4px 12px !important;\n}\nbutton.two-icon-label .mat-icon {\n width: 20px !important;\n height: 20px !important;\n} \n\n\n/* etc. */\n@font-face {\n font-family: 'Material Icons';\n font-style: normal;\n font-weight: 400;\n src: url(https://fonts.gstatic.com/s/materialicons/v143/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.woff2) format('woff2');\n}\n\n.material-icons {\n font-family: 'Material Icons';\n font-weight: normal;\n font-style: normal;\n font-size: 24px;\n line-height: 1;\n letter-spacing: normal;\n text-transform: none;\n display: inline-block;\n white-space: nowrap;\n word-wrap: normal;\n direction: ltr;\n -webkit-font-feature-settings: 'liga';\n -webkit-font-smoothing: antialiased;\n}\n\n.left-icon{\n order:0;\n}\n\n.right-icon{\n order:2;\n}\n\nmat-icon.mat-icon {\n margin: 0 !important;\n padding: 0 !important;\n}\n\n/* ------------------------------------------------------------------\n Size utility classes\n------------------------------------------------------------------ */\n\n\n\n/* New naming convention */\n.size-header { font-size: 20px; padding: 4px 12px !important; }\n.size-xs { font-size: 12px; padding: 8px 12px !important; }\n.size-sm { font-size: 14px; padding: 8px 12px !important; }\n.size-base { font-size: 14px; padding: 10px 20px !important; }\n.size-l { font-size: 16px; padding: 12px 20px !important; }\n.size-xl{ font-size: 16px; padding: 14px 24px !important; }\n/* Reuse .size-xl for xl */\n\n/* Icon sizes for new naming */\n.size-header .mat-icon { font-size:20px; }\n.size-xs .mat-icon { font-size:16px; }\n.size-sm .mat-icon, .size-base .mat-icon { font-size:16px; }\n.size-l .mat-icon, .size-xl .mat-icon { font-size:20px; }\n\n/* Adjust gap for header size */\n.btn.size-header { gap:4px !important; padding: 4px 12px !important;}\n\n/* --------------------------------------------------\n Dropdown menu custom styling\n-------------------------------------------------- */\n::ng-deep .custom-dropdown-menu.mat-mdc-menu-panel,\n::ng-deep .custom-dropdown-menu.mat-menu-panel {\n padding: 0; /* remove default padding */\n border-radius: 8px; /* rounded corners */\n box-shadow: 0 2px 6px rgba(0,0,0,0.15);\n border: 1px solid rgba(0,0,0,0.12);\n}\n::ng-deep .custom-dropdown-menu .mat-mdc-menu-content,\n::ng-deep .custom-dropdown-menu .mat-menu-content{\n padding: 0;\n}\n::ng-deep .custom-dropdown-menu .mat-mdc-menu-item,\n::ng-deep .custom-dropdown-menu .mat-menu-item{\n font-family: 'Roboto', sans-serif;\n font-size: 16px;\n line-height: 24px;\n height: 56px;\n padding: 16px 24px;\n color:#47515E;\n}\n::ng-deep .custom-dropdown-menu .mat-mdc-menu-item:hover,\n::ng-deep .custom-dropdown-menu .mat-menu-item:hover{\n background: #F5F6F7;\n}\n/* subtle divider between items */\n::ng-deep .custom-dropdown-menu .mat-mdc-menu-item + .mat-mdc-menu-item,\n::ng-deep .custom-dropdown-menu .mat-menu-item + .mat-menu-item{\n border-top: 1px solid #EAECEE;\n}\n\n/* Force white background on Angular Material menu panel */\n::ng-deep .mat-mdc-menu-panel,\n::ng-deep .mat-menu-panel,\n::ng-deep .mdc-menu-surface {\n background-color: #ffffff !important;\n --mdc-theme-surface: #ffffff !important;\n --mdc-menu-container-color: #ffffff !important;\n}\n::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-content,\n::ng-deep .mat-menu-panel .mat-menu-content {\n background-color: #ffffff !important;\n}\n\n/* Ensure dropdown menu is above other elements */\n.cdk-overlay-pane{\n z-index:1000 !important;\n background:#fff !important;\n}\n::ng-deep .mat-mdc-menu-panel,\n::ng-deep .mat-menu-panel,\n::ng-deep .mdc-menu-surface,\n.cdk-overlay-pane .mat-mdc-menu-panel,\n.cdk-overlay-pane .mdc-menu-surface,\n.cdk-overlay-pane .mat-menu-panel{\n background-color:#ffffff !important;\n --mdc-theme-surface:#ffffff !important;\n --mdc-menu-container-color:#fff !important;\n}\n\n/* Make sure the Material menu panel itself is white (use ::ng-deep so rules pierce view encapsulation) */\n\n\n.mat-mdc-menu-panel,\n.mdc-menu-surface,\n.mat-menu-panel {\n --mdc-theme-surface: #ffffff !important; /* Material variable */\n background-color: #ffffff !important;\n}\n\n.cdk-overlay-pane .mat-mdc-menu-panel,\n.cdk-overlay-pane .mdc-menu-surface,\n.cdk-overlay-pane .mat-mdc-menu-panel { --mdc-menu-container-color:#fff !important; }\n\n.cdk-overlay-pane .mat-menu-panel,\n.cdk-overlay-pane .mat-mdc-menu-content,\n.cdk-overlay-pane .mat-menu-content {\n background: #fff !important;\n}\n\n\n/* Icon size helper */\n\n\n/* --------------------------------------------------\n Button types\n-------------------------------------------------- */\nbutton.icon-circle {\n width: auto !important;\n height: auto !important;\n border-radius: 50% !important;\n aspect-ratio: 1 / 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0 !important;\n min-width: 0 !important;\n justify-content: center;\n padding:6px !important;\n}\n.size-small.icon-circle { \n padding: 4px !important;\n }\n.size-medium.icon-circle { \n padding: 8px !important;\n}\n.size-base.icon-circle { \n padding: 10px !important;\n}\n.size-large.icon-circle { \n padding: 12px !important;\n}\n.size-xl.icon-circle { \n padding: 14px !important;\n}\n\n/* Circle button size overrides */\n.size-header.icon-circle { padding:4px !important; }\n.size-header.icon-circle .mat-icon { width:10px; height:10px; font-size:10px; }\n\n.size-xs.icon-circle { padding:4px !important; }\n.size-xs.icon-circle .mat-icon { font-size:12px; }\n\n.size-sm.icon-circle { padding:8px !important; }\n.size-sm.icon-circle .mat-icon { font-size:12px; }\n\n.size-base.icon-circle { padding:10px !important; }\n.size-base.icon-circle .mat-icon { font-size:14px; }\n\n.size-l.icon-circle { padding:12px !important; }\n.size-l.icon-circle .mat-icon { font-size:16px; }\n\n.size-xl.icon-circle { padding:14px !important; }\n.size-xl.icon-circle .mat-icon { font-size:16px; }\n\n/* icon-label and two-icon-label just rely on default flex behaviour */\n.icon-xs { \n /* width: 16px; height: 16px; */\n padding: 4px !important;\n }\n\n\n/* ------------------------------------------------------------------\n Color category classes (solid)\n------------------------------------------------------------------ */\n.mdc-button.blue { background-color: #5473E8; color: #fff; }\n.mdc-button.blue:hover { background-color: #6581EA; }\n.mdc-button.blue:active { background-color: #1E46DF; }\n\n.mdc-button.green { background-color: #37C1CE; color: #fff; }\n.mdc-button.green:hover { background-color: #4BC7D3; }\n.mdc-button.green:active { background-color: #299DA8; }\n\n.mdc-button.grey { background-color: #383B4A; color: #fff; }\n.mdc-button.grey:hover { background-color: #4B4F62; }\n.mdc-button.grey:active { background-color: #252831; }\n\n.mdc-button.error { background-color: #E854A4; color: #fff; }\n.mdc-button.error:hover { background-color: #EF87BF; }\n.mdc-button.error:active { background-color: #E22A8E; }\n\n.mdc-button.gradient {\n background: linear-gradient(275deg, #5473E8 -36.22%, #37C1CE 100.04%);\n color: #fff;\n}\n.mdc-button.gradient:hover {\n background: linear-gradient(0deg, rgba(250, 250, 253, 0.30) 0%, rgba(250, 250, 253, 0.30) 100%),\n linear-gradient(275deg, #2BBBAD 9.3%, #4A90E2 115.85%);\n}\n.mdc-button.gradient:active {\n background: linear-gradient(0deg, rgba(56, 59, 74, 0.50) 0%, rgba(56, 59, 74, 0.50) 100%),\n linear-gradient(275deg, #2BBBAD 9.3%, #4A90E2 115.85%);\n}\n\n.mdc-button.disabled,\n.mdc-button:disabled {\n background-color: #D1D3DB !important;\n color: #666 !important;\n cursor: not-allowed !important;\n}\n\n/* ------------------------------------------------------------------\n No-outline (outlined) variants\n------------------------------------------------------------------ */\n.mdc-button.blue-no-outline { background-color: #fff; color: #5473E8; border: 1px solid #5473E8; }\n.mdc-button.blue-no-outline:hover { background-color: #6581EA; color:#fff; }\n.mdc-button.blue-no-outline:active { background-color: #1E46DF; color:#fff; }\n\n.mdc-button.green-no-outline { background-color: #fff; color: #37C1CE; border: 1px solid #37C1CE; }\n.mdc-button.green-no-outline:hover { background-color: #4BC7D3; color:#fff; }\n.mdc-button.green-no-outline:active { background-color: #299DA8; color:#fff; }\n\n.mdc-button.grey-no-outline { background-color: #fff; color: #383B4A; border: 1px solid #383B4A; }\n.mdc-button.grey-no-outline:hover { background-color: #4B4F62; color:#fff; }\n.mdc-button.grey-no-outline:active { background-color: #252831; color:#fff; }\n\n.mdc-button.error-no-outline { background-color: #fff; color: #E854A4; border: 1px solid #E854A4; }\n.mdc-button.error-no-outline:hover { background-color: #EF87BF; color:#fff; }\n.mdc-button.error-no-outline:active { background-color: #E22A8E; color:#fff; }\n\n/*************Button Drop down design*********/\n::ng-deep .cdk-overlay-pane {\n border-radius: 6px !important;\n box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.15) !important;\n}\n\n::ng-deep .mat-mdc-menu-panel {\n padding: 4px 0 !important;\n background-color: white !important;\n min-width: 180px !important;\n border-radius: 6px !important;\n box-shadow: none !important; /* handled by cdk-overlay-pane */\n}\n\n::ng-deep .mat-mdc-menu-item {\n font-family: 'Roboto', sans-serif;\n font-size: 14px;\n color: #333;\n padding: 12px 16px;\n border-radius: 0 !important;\n transition: background 0.2s ease-in-out;\n}\n\n::ng-deep .mat-mdc-menu-item:hover {\n background-color: #f5f5f5 !important;\n}\n\n.mat-mdc-unelevated-button>.mat-icon{\n line-height:18px !important\n}",
355
415
  "styleUrl": "./button.component.scss"
356
416
  }
357
417
  ],
@@ -370,12 +430,12 @@
370
430
  }
371
431
  }
372
432
  },
373
- "templateData": "<!-- Regular button types -->\n<ng-container *ngIf=\"buttonType !== 'dropdown'; else dropdownTpl\">\n <button\n mat-flat-button\n class=\"btn custom-button\" [class]=\"effectiveFontClass\"\n [ngClass]=\"{\n 'size-header': size === 'header' && !fontClass,\n 'size-xs': size === 'xs' && !fontClass,\n 'size-sm': size === 'sm' && !fontClass,\n 'size-base': size === 'base' && !fontClass,\n 'size-l': size === 'l' && !fontClass,\n 'size-xl': size === 'xl' && !fontClass,\n 'mat-raised-button': variant === 'raised',\n 'mat-flat-button': variant === 'flat',\n \n 'mat-stroked-button': variant === 'stroked',\n 'mat-fab': variant === 'fab',\n 'mat-icon-button': variant === 'icon',\n 'icon-circle': buttonType === 'icon-circle',\n 'icon-label': buttonType === 'icon-label',\n 'two-icon-label': buttonType === 'two-icon-label',\n 'blue': category === 'blue',\n 'green': category === 'green',\n 'grey': category === 'grey',\n 'error': category === 'error',\n 'gradient': category === 'gradient',\n 'blue-no-outline': category === 'blue-no-outline',\n 'green-no-outline': category === 'green-no-outline',\n 'grey-no-outline': category === 'grey-no-outline',\n 'error-no-outline': category === 'error-no-outline',\n 'btn-default': state === 'default',\n 'btn-hover': state === 'hover',\n 'btn-pressed': state === 'pressed',\n 'btn-disabled': state === 'disabled'\n }\"\n [ngStyle]=\"{ color: color }\"\n [disabled]=\"state === 'disabled'\"\n (click)=\"onClick.emit($event)\"\n (mouseenter)=\"onHover.emit($event)\"\n (mouseleave)=\"onMouseLeave.emit($event)\"\n [style.display]=\"'inline-flex'\"\n [style.align-items]=\"'center'\"\n [style.gap.px]=\"computeGap()\"\n >\n <!-- Left Icon (Only shown if leftIcon is set and not empty) -->\n <mat-icon *ngIf=\"leftIcon?.trim() as leftIconText\"\n [fontSet]=\"outlined ? 'material-icons-outlined' : 'material-icons'\"\n class=\"left-icon\">{{ leftIconText }}</mat-icon>\n <!-- Label (Only shown if iconOnly is false) -->\n <span *ngIf=\"!iconOnly\" class=\"button-label\" [ngStyle]=\"{ color: color }\">{{ label || '' }}</span>\n \n <!-- Right Icon (Only shown if rightIcon is set and not empty) -->\n <mat-icon *ngIf=\"rightIcon?.trim() as rightIconText\"\n [fontSet]=\"outlined ? 'material-icons-outlined' : 'material-icons'\"\n class=\"right-icon\">{{ rightIconText }}</mat-icon>\n </button>\n </ng-container>\n \n <!-- Dropdown button template -->\n <ng-template #dropdownTpl>\n <button\n mat-flat-button\n class=\"btn custom-button\" [class]=\"effectiveFontClass\"\n [ngClass]=\"{\n 'size-header': size === 'header' && !fontClass,\n 'size-xs': size === 'xs' && !fontClass,\n 'size-sm': size === 'sm' && !fontClass,\n 'size-base': size === 'base' && !fontClass,\n 'size-l': size === 'l' && !fontClass,\n 'size-xl': size === 'xl' && !fontClass,\n 'mat-raised-button': variant === 'raised',\n 'mat-flat-button': variant === 'flat',\n 'mat-stroked-button': variant === 'stroked',\n 'mat-fab': variant === 'fab',\n 'mat-icon-button': variant === 'icon',\n 'icon-label': true,\n 'blue': category === 'blue',\n 'green': category === 'green',\n 'grey': category === 'grey',\n 'error': category === 'error',\n 'gradient': category === 'gradient',\n 'blue-no-outline': category === 'blue-no-outline',\n 'green-no-outline': category === 'green-no-outline',\n 'grey-no-outline': category === 'grey-no-outline',\n 'error-no-outline': category === 'error-no-outline',\n 'btn-default': state === 'default',\n 'btn-hover': state === 'hover',\n 'btn-pressed': state === 'pressed',\n 'btn-disabled': state === 'disabled',\n \n }\"\n [ngStyle]=\"{ color: color }\"\n [disabled]=\"state === 'disabled'\"\n (mouseenter)=\"onHover.emit($event)\"\n (mouseleave)=\"onMouseLeave.emit($event)\"\n [style.display]=\"'inline-flex'\"\n [style.align-items]=\"'center'\"\n [style.gap.px]=\"computeGap()\"\n [matMenuTriggerFor]=\"menu\"\n >\n <!-- Left Icon (optional) -->\n <mat-icon *ngIf=\"leftIcon?.trim() as leftIconText\"\n [fontSet]=\"outlined ? 'material-icons-outlined' : 'material-icons'\"\n class=\"left-icon\">{{ leftIconText }}</mat-icon>\n <!-- Label -->\n <span *ngIf=\"!iconOnly\" class=\"button-label\" [ngStyle]=\"{ color: color }\">{{ label || '' }}</span>\n <!-- Dropdown Arrow Icon -->\n <mat-icon class=\"right-icon\">arrow_drop_down</mat-icon>\n </button>\n <!-- Mat Menu -->\n <mat-menu #menu=\"matMenu\" panelClass=\"custom-dropdown-menu\">\n <button mat-menu-item *ngFor=\"let opt of dropdownOptions\" (click)=\"selectOption(opt)\" [ngClass]=\"effectiveFontClass\">\n {{ opt.label || opt }}\n </button>\n </mat-menu>\n </ng-template>\n "
433
+ "templateData": "<!-- Regular button types -->\n<ng-container *ngIf=\"buttonType !== 'dropdown'; else dropdownTpl\">\n <button\n mat-flat-button\n class=\"btn custom-button\" [class]=\"effectiveFontClass\"\n [ngClass]=\"{\n 'size-header': size === 'header' && !fontClass,\n 'size-xs': size === 'xs' && !fontClass,\n 'size-sm': size === 'sm' && !fontClass,\n 'size-base': size === 'base' && !fontClass,\n 'size-l': size === 'l' && !fontClass,\n 'size-xl': size === 'xl' && !fontClass,\n 'mat-raised-button': variant === 'raised',\n 'mat-flat-button': variant === 'flat',\n \n 'mat-stroked-button': variant === 'stroked',\n 'mat-fab': variant === 'fab',\n 'mat-icon-button': variant === 'icon',\n 'icon-circle': buttonType === 'icon-circle',\n 'icon-label': buttonType === 'icon-label',\n 'two-icon-label': buttonType === 'two-icon-label',\n 'blue': category === 'blue',\n 'green': category === 'green',\n 'grey': category === 'grey',\n 'error': category === 'error',\n 'gradient': category === 'gradient',\n 'blue-no-outline': category === 'blue-no-outline',\n 'green-no-outline': category === 'green-no-outline',\n 'grey-no-outline': category === 'grey-no-outline',\n 'error-no-outline': category === 'error-no-outline',\n 'btn-default': state === 'default',\n 'btn-hover': state === 'hover',\n 'btn-pressed': state === 'pressed',\n 'btn-disabled': state === 'disabled'\n }\"\n [ngStyle]=\"{ color: color }\"\n [disabled]=\"state === 'disabled'\"\n (click)=\"onClick.emit($event)\"\n (mouseenter)=\"onHover.emit($event)\"\n (mouseleave)=\"onMouseLeave.emit($event)\"\n [style.display]=\"'inline-flex'\"\n [style.align-items]=\"'center'\"\n [style.gap.px]=\"computeGap()\"\n >\n <!-- Left Icon (Only shown if leftIcon is set and not empty) -->\n <mat-icon *ngIf=\"leftIcon?.trim() as leftIconText\"\n [fontSet]=\"outlined ? 'material-icons-outlined' : 'material-icons'\"\n class=\"left-icon\">{{ leftIconText }}</mat-icon>\n <!-- Label (Only shown if iconOnly is false) -->\n <span *ngIf=\"!iconOnly\" class=\"button-label\" [ngStyle]=\"{ color: color }\">{{ label || '' }}</span>\n \n <!-- Right Icon (Only shown if rightIcon is set and not empty) -->\n <mat-icon *ngIf=\"rightIcon?.trim() as rightIconText\"\n [fontSet]=\"outlined ? 'material-icons-outlined' : 'material-icons'\"\n class=\"right-icon\">{{ rightIconText }}</mat-icon>\n </button>\n </ng-container>\n \n <!-- Dropdown button template -->\n <ng-template #dropdownTpl>\n <button\n mat-flat-button\n class=\"btn custom-button\" [class]=\"effectiveFontClass\"\n [ngClass]=\"{\n 'size-header': size === 'header' && !fontClass,\n 'size-xs': size === 'xs' && !fontClass,\n 'size-sm': size === 'sm' && !fontClass,\n 'size-base': size === 'base' && !fontClass,\n 'size-l': size === 'l' && !fontClass,\n 'size-xl': size === 'xl' && !fontClass,\n 'mat-raised-button': variant === 'raised',\n 'mat-flat-button': variant === 'flat',\n 'mat-stroked-button': variant === 'stroked',\n 'mat-fab': variant === 'fab',\n 'mat-icon-button': variant === 'icon',\n 'icon-label': true,\n 'blue': category === 'blue',\n 'green': category === 'green',\n 'grey': category === 'grey',\n 'error': category === 'error',\n 'gradient': category === 'gradient',\n 'blue-no-outline': category === 'blue-no-outline',\n 'green-no-outline': category === 'green-no-outline',\n 'grey-no-outline': category === 'grey-no-outline',\n 'error-no-outline': category === 'error-no-outline',\n 'btn-default': state === 'default',\n 'btn-hover': state === 'hover',\n 'btn-pressed': state === 'pressed',\n 'btn-disabled': state === 'disabled',\n \n }\"\n [ngStyle]=\"{ color: color }\"\n [disabled]=\"state === 'disabled'\"\n (mouseenter)=\"onHover.emit($event)\"\n (mouseleave)=\"onMouseLeave.emit($event)\"\n [style.display]=\"'inline-flex'\"\n [style.align-items]=\"'center'\"\n [style.gap.px]=\"computeGap()\"\n [matMenuTriggerFor]=\"menu\"\n >\n <!-- Left Icon (optional) -->\n <mat-icon *ngIf=\"leftIcon?.trim() as leftIconText\"\n [fontSet]=\"outlined ? 'material-icons-outlined' : 'material-icons'\"\n class=\"left-icon\">{{ leftIconText }}</mat-icon>\n <!-- Label -->\n <span *ngIf=\"!iconOnly\" class=\"button-label\" [ngStyle]=\"{ color: color }\">{{ label || '' }}</span>\n <!-- Dropdown Arrow Icon -->\n <mat-icon class=\"right-icon\">arrow_drop_down</mat-icon>\n </button>\n <!-- Mat Menu -->\n <mat-menu #menu=\"matMenu\" panelClass=\"custom-dropdown-menu\">\n <button mat-menu-item *ngFor=\"let opt of dropdownOptions\" (click)=\"selectOption(opt)\" [ngClass]=\"effectiveFontClass\">\n {{ opt.label || opt }}\n </button>\n </mat-menu>\n </ng-template>"
374
434
  },
375
435
  {
376
436
  "name": "InputComponent",
377
437
  "id": "component-InputComponent-02d3f99d30f84b0b6339a285279e183f5ec7fbafacfbbc39cfca6afe2338d0a53cd25ee001b8c9c907893bb9ed2bcab5c781f83a299c6cf18f197c47534301f6",
378
- "file": "src/app/input/input.component.ts",
438
+ "file": "projects/allsorter-lib/src/lib/input/input.component.ts",
379
439
  "encapsulation": [],
380
440
  "entryComponents": [],
381
441
  "inputs": [],
@@ -884,13 +944,13 @@
884
944
  },
885
945
  {
886
946
  "name": "ButtonModule",
887
- "id": "module-ButtonModule-0b77917953933c9514df9b526b3c1831246480a1230e28320ea1c1e1b939fde519b593fb9ee1cfc1d720a0c692ed1deaa6b4607578584266f81781f309a8db6f",
947
+ "id": "module-ButtonModule-df66c621e67fe548f0a7f8dff7a2ec19bb2676f9e884f985797c4acf62256cd295a4776e497d7c8f6c4c138d96b105fae74a49fac57da601d03e85d2f74d5329",
888
948
  "description": "",
889
949
  "deprecationMessage": "",
890
950
  "deprecated": false,
891
- "file": "src/app/button/button.module.ts",
951
+ "file": "projects/allsorter-lib/src/lib/button/button.module.ts",
892
952
  "methods": [],
893
- "sourceCode": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonComponent } from './button.component';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@NgModule({\n declarations: [], // ✅ Ensure ButtonComponent is declared\n exports: [], // ✅ Export if used in other modules\n imports: [CommonModule, ButtonComponent], // ✅ Required for Angular directives like *ngIf, *ngFor\n})\nexport class ButtonModule {\n constructor(\n private iconRegistry: MatIconRegistry,\n private sanitizer: DomSanitizer\n ) {\n // register the CSS class alias so <mat-icon> knows about it…\n this.iconRegistry.registerFontClassAlias(\n 'material-symbols-outlined',\n 'material-symbols-outlined'\n );\n }\n}",
953
+ "sourceCode": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonComponent } from './button.component';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@NgModule({\n declarations: [], // ✅ Ensure ButtonComponent is declared\n exports: [], // ✅ Export if used in other modules\n imports: [CommonModule, ButtonComponent], // ✅ Required for Angular directives like *ngIf, *ngFor\n})\nexport class ButtonModule {\n constructor(\n private iconRegistry: MatIconRegistry,\n private sanitizer: DomSanitizer\n ) {\n // register the CSS class alias so <mat-icon> knows about it…\n this.iconRegistry.registerFontClassAlias(\n 'material-symbols-outlined',\n 'material-symbols-outlined'\n );\n }\n}\n",
894
954
  "children": [
895
955
  {
896
956
  "type": "providers",
@@ -928,7 +988,7 @@
928
988
  "description": "",
929
989
  "deprecationMessage": "",
930
990
  "deprecated": false,
931
- "file": "src/app/input/input.module.ts",
991
+ "file": "projects/allsorter-lib/src/lib/input/input.module.ts",
932
992
  "methods": [],
933
993
  "sourceCode": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { InputComponent } from './input.component';\n\n@NgModule({\n imports: [CommonModule, InputComponent],\n exports: [InputComponent],\n})\nexport class InputModule { }\n",
934
994
  "children": [
@@ -969,6 +1029,16 @@
969
1029
  ],
970
1030
  "miscellaneous": {
971
1031
  "variables": [
1032
+ {
1033
+ "name": "Default",
1034
+ "ctype": "miscellaneous",
1035
+ "subtype": "variable",
1036
+ "file": "projects/allsorter-lib/src/lib/button/stories/button-gallery.stories.ts",
1037
+ "deprecated": false,
1038
+ "deprecationMessage": "",
1039
+ "type": "Story",
1040
+ "defaultValue": "{\n name: 'Default',\n render: (args: any) => ({\n props: {\n ...args,\n leftIcon: args.showLeftIcon ? args.leftIcon : '',\n rightIcon: args.showRightIcon ? args.rightIcon : '',\n },\n template: `\n <al-button\n [category]=\"category\"\n [buttonType]=\"buttonType\"\n [label]=\"label\"\n [leftIcon]=\"leftIcon\"\n [rightIcon]=\"rightIcon\"\n [size]=\"size\"\n [outlined]=\"outlined\"\n [color]=\"color\"\n [dropdownOptions]=\"dropdownOptions\"\n ></al-button>\n `,\n }),\n}"
1041
+ },
972
1042
  {
973
1043
  "name": "environment",
974
1044
  "ctype": "miscellaneous",
@@ -988,12 +1058,179 @@
988
1058
  "deprecationMessage": "",
989
1059
  "type": "object",
990
1060
  "defaultValue": "{\n production: false,\n}"
1061
+ },
1062
+ {
1063
+ "name": "FullMatrix",
1064
+ "ctype": "miscellaneous",
1065
+ "subtype": "variable",
1066
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-gallery.stories.ts",
1067
+ "deprecated": false,
1068
+ "deprecationMessage": "",
1069
+ "type": "Story",
1070
+ "defaultValue": "{\n render: () => ({\n props: {\n categories: [\n { name: 'Primary Input', value: 'primary' },\n { name: 'Disabled State', value: 'disabled' },\n { name: 'Success State', value: 'success' },\n { name: 'Warn State', value: 'warn' },\n { name: 'Plain Input', value: 'plain' }\n ],\n sizes: ['header', 'xs', 'small', 'base', 'large'],\n options: ['Option 1', 'Option 2', 'Option 3'],\n },\n template: `\n <div style=\"display: flex; flex-direction: column; gap: 48px;\">\n <div *ngFor=\"let size of sizes\">\n <h3 style=\"margin-bottom: 24px; font-size: 20px; font-weight: 600;\">{{ size | titlecase }} Input Fields</h3>\n <div style=\"display: flex; flex-direction: row; gap: 24px; align-items: flex-start;\">\n <div *ngFor=\"let inputType of categories\">\n <h4 style=\"margin-bottom: 16px; font-size: 16px; font-weight: 500;\">{{ inputType.name }}</h4>\n <!-- Default state -->\n <al-input\n [label]=\"'Placeholder text'\"\n [placeholder]=\"'Placeholder'\"\n [value]=\"''\"\n [type]=\"'text'\"\n [disabled]=\"false\"\n [helperText]=\"false\"\n [helperTextLabel]=\"'Helper text'\"\n [leftIcon]=\"'person'\"\n [rightIcon]=\"''\"\n [size]=\"size\"\n [inputTypes]=\"inputType.value\"\n [dropDown]=\"size === 'large'\"\n [options]=\"options\"\n ></al-input>\n </div>\n </div>\n </div>\n </div>\n `,\n }),\n name: 'Full Variation Matrix',\n}"
1071
+ },
1072
+ {
1073
+ "name": "Gallery",
1074
+ "ctype": "miscellaneous",
1075
+ "subtype": "variable",
1076
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-gallery.stories.ts",
1077
+ "deprecated": false,
1078
+ "deprecationMessage": "",
1079
+ "type": "Story",
1080
+ "defaultValue": "{\n name: 'Gallery',\n render: (args: any) => ({\n props: args,\n template: `\n <al-input\n [label]=\"label\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [formControlName]=\"formControlName\"\n [type]=\"type\"\n [disabled]=\"disabled\"\n [helperText]=\"helperText\"\n [helperTextLabel]=\"helperTextLabel\"\n [leftIcon]=\"leftIcon\"\n [rightIcon]=\"rightIcon\"\n [dropDown]=\"dropDown\"\n [options]=\"options\"\n [size]=\"size\"\n [inputTypes]=\"inputTypes\"\n (valueChange)=\"value = $event\"\n ></al-input>\n `,\n }),\n}"
1081
+ },
1082
+ {
1083
+ "name": "meta",
1084
+ "ctype": "miscellaneous",
1085
+ "subtype": "variable",
1086
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-gallery.stories.ts",
1087
+ "deprecated": false,
1088
+ "deprecationMessage": "",
1089
+ "type": "Meta<InputComponent>",
1090
+ "defaultValue": "{\n tags: ['autodocs'],\n title: 'Components/Input/Gallery',\n component: InputComponent,\n argTypes: {\n label: { control: 'text' },\n placeholder: { control: 'text' },\n value: { control: 'text' },\n formControlName: { control: 'text' },\n type: {\n control: 'select',\n options: ['text', 'email', 'number', 'password', 'tel', 'url', 'date'],\n },\n disabled: { control: 'boolean' },\n helperText: { control: 'boolean' },\n helperTextLabel: { control: 'text' },\n leftIcon: { control: 'text' },\n rightIcon: { control: 'text' },\n dropDown: { control: 'boolean' },\n options: { control: 'object' },\n size: {\n control: 'radio',\n options: ['header', 'xs', 'small', 'base', 'large'],\n },\n inputTypes: {\n control: 'radio',\n options: ['primary', 'success', 'warn', 'disabled', 'plain'],\n },\n },\n args: {\n label: 'Placeholder text',\n placeholder: 'Type here...',\n value: '',\n formControlName: '',\n type: 'text',\n disabled: false,\n helperText: false,\n helperTextLabel: '',\n leftIcon: 'person',\n rightIcon: 'expand_more',\n dropDown: false,\n options: ['Option 1', 'Option 2', 'Option 3'],\n size: 'base',\n inputTypes: 'primary',\n },\n parameters: { controls: { expanded: true } },\n}"
1091
+ },
1092
+ {
1093
+ "name": "meta",
1094
+ "ctype": "miscellaneous",
1095
+ "subtype": "variable",
1096
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-playground.stories.ts",
1097
+ "deprecated": false,
1098
+ "deprecationMessage": "",
1099
+ "type": "Meta<InputComponent>",
1100
+ "defaultValue": "{\n title: 'Components/Input/Playground',\n component: InputComponent,\n argTypes: {\n label: { control: 'text' },\n placeholder: { control: 'text' },\n value: { control: 'text' },\n type: {\n control: 'select',\n options: ['text', 'email', 'number', 'password', 'tel', 'url', 'date'],\n },\n disabled: { control: 'boolean' },\n helperText: { control: 'boolean' },\n helperTextLabel: { control: 'text' },\n leftIcon: { control: 'text' },\n rightIcon: { control: 'text' },\n dropDown: { control: 'boolean' },\n options: { control: 'object' },\n size: {\n control: 'radio',\n options: ['xs', 'small', 'base', 'large', 'header'],\n },\n inputTypes: {\n control: 'select',\n options: ['primary', 'success', 'warn', 'disabled', 'plain'],\n },\n noBorder: { control: 'boolean' },\n },\n args: {\n label: 'Label',\n placeholder: 'Placeholder',\n value: '',\n type: 'text',\n disabled: false,\n helperText: false,\n helperTextLabel: '',\n leftIcon: '',\n rightIcon: '',\n dropDown: false,\n options: ['Option 1', 'Option 2', 'Option 3'],\n size: 'base',\n inputTypes: 'primary',\n noBorder: false,\n },\n}"
1101
+ },
1102
+ {
1103
+ "name": "meta",
1104
+ "ctype": "miscellaneous",
1105
+ "subtype": "variable",
1106
+ "file": "projects/allsorter-lib/src/lib/button/stories/button-gallery.stories.ts",
1107
+ "deprecated": false,
1108
+ "deprecationMessage": "",
1109
+ "type": "Meta<ButtonComponent>",
1110
+ "defaultValue": "{\n title: 'Components/Button/Gallery',\n component: ButtonComponent,\n tags: ['autodocs'],\n argTypes: {\n label: { control: 'text' },\n category: {\n control: 'select',\n options: [\n 'blue', 'green', 'grey', 'error', 'gradient',\n 'blue-no-outline', 'green-no-outline', 'grey-no-outline', 'error-no-outline',\n ],\n },\n size: {\n control: 'select',\n options: ['header', 'xs', 'sm', 'base', 'l', 'xl'],\n },\n buttonType: {\n control: 'select',\n options: ['icon-circle', 'icon-label', 'two-icon-label', 'dropdown'],\n },\n outlined: { control: 'boolean' },\n showLeftIcon: { control: 'boolean' },\n showRightIcon: { control: 'boolean' },\n leftIcon: { control: 'text' },\n rightIcon: { control: 'text' },\n dropdownOptions: { control: 'object' },\n color: { control: 'text' },\n },\n args: {\n size: 'sm',\n category: 'blue',\n outlined: false,\n buttonType: 'icon-label',\n label: 'Button text',\n showLeftIcon: true,\n showRightIcon: true,\n leftIcon: 'circle',\n rightIcon: 'circle',\n dropdownOptions: [\n { label: 'Create a merge commit', value: 'merge' },\n { label: 'Squash and merge', value: 'squash' },\n { label: 'Rebase and merge', value: 'rebase' },\n ],\n },\n parameters: { controls: { expanded: true } },\n}"
1111
+ },
1112
+ {
1113
+ "name": "meta",
1114
+ "ctype": "miscellaneous",
1115
+ "subtype": "variable",
1116
+ "file": "projects/allsorter-lib/src/lib/button/stories/button-playground.stories.ts",
1117
+ "deprecated": false,
1118
+ "deprecationMessage": "",
1119
+ "type": "Meta<ButtonComponent>",
1120
+ "defaultValue": "{\n title: 'Components/Button/Playground',\n component: ButtonComponent,\n argTypes: {\n label: { control: 'text' },\n category: {\n control: 'select',\n options: [\n 'blue', 'green', 'grey', 'error', 'gradient',\n 'blue-no-outline', 'green-no-outline', 'grey-no-outline', 'error-no-outline',\n ],\n },\n\n buttonType: {\n control: 'select',\n options: ['icon-circle', 'icon-label', 'two-icon-label', 'dropdown'],\n },\n size: {\n control: 'select',\n options: ['header','xs','sm','base','l','xl'],\n },\n leftIcon: {\n control: 'text',\n if: { arg: 'showLeftIcon', truthy: true },\n ifDisabled: { arg: 'showLeftIcon', truthy: false },\n },\n rightIcon: {\n control: 'text',\n if: { arg: 'showRightIcon', truthy: true },\n ifDisabled: { arg: 'showRightIcon', truthy: false },\n },\n outlined: { control: 'boolean' },\n iconOnly: { control: 'boolean' },\n showLeftIcon: { control: 'boolean' },\n showRightIcon: { control: 'boolean' },\n dropdownOptions: { control: 'object' },\n },\n args: {\n size: 'sm',\n category: 'blue',\n outlined: true,\n buttonType: 'icon-label',\n label: 'Button text',\n leftIcon: 'add',\n rightIcon: 'add',\n iconOnly: false,\n showLeftIcon: true,\n showRightIcon: true,\n dropdownOptions: [\n { label: 'Create a merge commit', value: 'merge' },\n { label: 'Squash and merge', value: 'squash' },\n { label: 'Rebase and merge', value: 'rebase' },\n ],\n },\n}"
1121
+ },
1122
+ {
1123
+ "name": "Playground",
1124
+ "ctype": "miscellaneous",
1125
+ "subtype": "variable",
1126
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-playground.stories.ts",
1127
+ "deprecated": false,
1128
+ "deprecationMessage": "",
1129
+ "type": "Story",
1130
+ "defaultValue": "{\n render: (args: any) => ({\n props: args,\n template: `\n <al-input\n [label]=\"label\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [type]=\"type\"\n [disabled]=\"disabled\"\n [helperText]=\"helperText\"\n [helperTextLabel]=\"helperTextLabel\"\n [icon]=\"icon\"\n [rightIcon]=\"rightIcon\"\n [dropDown]=\"dropDown\"\n [options]=\"options\"\n [size]=\"size\"\n [inputTypes]=\"inputTypes\"\n [noBorder]=\"noBorder\"\n (valueChange)=\"value = $event\"\n ></al-input>\n `,\n }),\n name: 'Playground',\n}"
1131
+ },
1132
+ {
1133
+ "name": "ReactiveFormsExample",
1134
+ "ctype": "miscellaneous",
1135
+ "subtype": "variable",
1136
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-playground.stories.ts",
1137
+ "deprecated": false,
1138
+ "deprecationMessage": "",
1139
+ "type": "Story",
1140
+ "defaultValue": "{\n render: (args: any) => {\n const fb = new FormBuilder();\n const form = fb.group({\n courseTitle: [''],\n courseDescription: [''],\n courseType: ['']\n });\n\n return {\n props: { ...args, form },\n template: `\n <form [formGroup]=\"form\">\n <div style=\"display: flex; flex-direction: column; gap: 20px;\">\n <al-input\n label=\"Course Title\"\n placeholder=\"Course Title\"\n formControlName=\"courseTitle\"\n [leftIcon]=\"leftIcon\"\n [size]=\"size\"\n [inputTypes]=\"inputTypes\"\n ></al-input>\n\n <al-input\n label=\"Course Description\"\n placeholder=\"Enter course description\"\n formControlName=\"courseDescription\"\n [leftIcon]=\"'description'\"\n [size]=\"size\"\n [inputTypes]=\"inputTypes\"\n ></al-input>\n\n <al-input\n label=\"Course Type\"\n placeholder=\"Select course type\"\n formControlName=\"courseType\"\n [dropDown]=\"true\"\n [options]=\"['Online', 'In-Person', 'Hybrid']\"\n [leftIcon]=\"'category'\"\n [rightIcon]=\"'expand_more'\"\n [size]=\"size\"\n [inputTypes]=\"inputTypes\"\n ></al-input>\n </div>\n\n <div style=\"margin-top: 20px; padding: 10px; background: #f5f5f5; border-radius: 4px;\">\n <strong>Form Values:</strong>\n <pre>{{ form.value | json }}</pre>\n </div>\n </form>\n `,\n imports: [ReactiveFormsModule]\n };\n },\n name: 'Reactive Forms Example',\n}"
1141
+ },
1142
+ {
1143
+ "name": "Variation",
1144
+ "ctype": "miscellaneous",
1145
+ "subtype": "variable",
1146
+ "file": "projects/allsorter-lib/src/lib/button/stories/button-gallery.stories.ts",
1147
+ "deprecated": false,
1148
+ "deprecationMessage": "",
1149
+ "type": "Story",
1150
+ "defaultValue": "{\n name: 'Variation',\n args: {\n category: 'blue',\n buttonType: 'icon-label',\n label: 'Button text',\n leftIcon: 'circle',\n rightIcon: 'circle',\n outlined: false,\n dropdownOptions: [\n { label: 'Create a merge commit', value: 'merge' },\n { label: 'Squash and merge', value: 'squash' },\n { label: 'Rebase and merge', value: 'rebase' },\n ],\n },\n argTypes: {\n category: {\n control: 'select',\n options: [\n 'blue', 'green', 'grey', 'error', 'gradient',\n 'blue-no-outline', 'green-no-outline', 'grey-no-outline', 'error-no-outline',\n ],\n },\n buttonType: {\n control: 'select',\n options: ['icon-label', 'two-icon-label', 'dropdown', 'icon-circle'],\n },\n },\n parameters: {\n docs: { disable: true }\n },\n render: (args: any) => ({\n props: {\n ...args,\n sizes: ['header', 'xs', 'sm', 'base', 'l', 'xl'],\n circleSizes: ['xs', 'sm', 'base', 'l', 'xl'],\n },\n template: `\n <div style=\"display: flex; flex-direction: column; gap: 24px;\">\n <div>\n <div style=\"font-weight: bold; margin-bottom: 8px;\">All Sizes ({{ category }}, {{ buttonType }})</div>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <ng-container *ngFor=\"let sz of sizes\">\n <al-button\n [category]=\"category\"\n [buttonType]=\"buttonType\"\n [label]=\"sz === 'header' ? '' : label\"\n [leftIcon]=\"leftIcon\"\n [rightIcon]=\"rightIcon\"\n [size]=\"sz\"\n [outlined]=\"outlined\"\n [dropdownOptions]=\"dropdownOptions\"\n style=\"margin-right: 8px;\"\n ></al-button>\n </ng-container>\n </div>\n </div>\n <hr />\n <div>\n <div style=\"font-weight: bold; margin-bottom: 8px;\">Circular Buttons (icon-circle)</div>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <ng-container *ngFor=\"let sz of circleSizes\">\n <al-button\n [category]=\"category\"\n [buttonType]=\"'icon-circle'\"\n [leftIcon]=\"'add'\"\n [size]=\"sz\"\n [outlined]=\"outlined\"\n style=\"margin-right: 8px;\"\n ></al-button>\n </ng-container>\n </div>\n </div>\n </div>\n `,\n }),\n}"
991
1151
  }
992
1152
  ],
993
1153
  "functions": [],
994
- "typealiases": [],
1154
+ "typealiases": [
1155
+ {
1156
+ "name": "Story",
1157
+ "ctype": "miscellaneous",
1158
+ "subtype": "typealias",
1159
+ "rawtype": "StoryObj<InputComponent>",
1160
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-gallery.stories.ts",
1161
+ "deprecated": false,
1162
+ "deprecationMessage": "",
1163
+ "description": "",
1164
+ "kind": 183
1165
+ },
1166
+ {
1167
+ "name": "Story",
1168
+ "ctype": "miscellaneous",
1169
+ "subtype": "typealias",
1170
+ "rawtype": "StoryObj<InputComponent>",
1171
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-playground.stories.ts",
1172
+ "deprecated": false,
1173
+ "deprecationMessage": "",
1174
+ "description": "",
1175
+ "kind": 183
1176
+ },
1177
+ {
1178
+ "name": "Story",
1179
+ "ctype": "miscellaneous",
1180
+ "subtype": "typealias",
1181
+ "rawtype": "StoryObj<ButtonComponent>",
1182
+ "file": "projects/allsorter-lib/src/lib/button/stories/button-gallery.stories.ts",
1183
+ "deprecated": false,
1184
+ "deprecationMessage": "",
1185
+ "description": "",
1186
+ "kind": 183
1187
+ },
1188
+ {
1189
+ "name": "Story",
1190
+ "ctype": "miscellaneous",
1191
+ "subtype": "typealias",
1192
+ "rawtype": "StoryObj<ButtonComponent>",
1193
+ "file": "projects/allsorter-lib/src/lib/button/stories/button-playground.stories.ts",
1194
+ "deprecated": false,
1195
+ "deprecationMessage": "",
1196
+ "description": "",
1197
+ "kind": 183
1198
+ }
1199
+ ],
995
1200
  "enumerations": [],
996
1201
  "groupedVariables": {
1202
+ "projects/allsorter-lib/src/lib/button/stories/button-gallery.stories.ts": [
1203
+ {
1204
+ "name": "Default",
1205
+ "ctype": "miscellaneous",
1206
+ "subtype": "variable",
1207
+ "file": "projects/allsorter-lib/src/lib/button/stories/button-gallery.stories.ts",
1208
+ "deprecated": false,
1209
+ "deprecationMessage": "",
1210
+ "type": "Story",
1211
+ "defaultValue": "{\n name: 'Default',\n render: (args: any) => ({\n props: {\n ...args,\n leftIcon: args.showLeftIcon ? args.leftIcon : '',\n rightIcon: args.showRightIcon ? args.rightIcon : '',\n },\n template: `\n <al-button\n [category]=\"category\"\n [buttonType]=\"buttonType\"\n [label]=\"label\"\n [leftIcon]=\"leftIcon\"\n [rightIcon]=\"rightIcon\"\n [size]=\"size\"\n [outlined]=\"outlined\"\n [color]=\"color\"\n [dropdownOptions]=\"dropdownOptions\"\n ></al-button>\n `,\n }),\n}"
1212
+ },
1213
+ {
1214
+ "name": "meta",
1215
+ "ctype": "miscellaneous",
1216
+ "subtype": "variable",
1217
+ "file": "projects/allsorter-lib/src/lib/button/stories/button-gallery.stories.ts",
1218
+ "deprecated": false,
1219
+ "deprecationMessage": "",
1220
+ "type": "Meta<ButtonComponent>",
1221
+ "defaultValue": "{\n title: 'Components/Button/Gallery',\n component: ButtonComponent,\n tags: ['autodocs'],\n argTypes: {\n label: { control: 'text' },\n category: {\n control: 'select',\n options: [\n 'blue', 'green', 'grey', 'error', 'gradient',\n 'blue-no-outline', 'green-no-outline', 'grey-no-outline', 'error-no-outline',\n ],\n },\n size: {\n control: 'select',\n options: ['header', 'xs', 'sm', 'base', 'l', 'xl'],\n },\n buttonType: {\n control: 'select',\n options: ['icon-circle', 'icon-label', 'two-icon-label', 'dropdown'],\n },\n outlined: { control: 'boolean' },\n showLeftIcon: { control: 'boolean' },\n showRightIcon: { control: 'boolean' },\n leftIcon: { control: 'text' },\n rightIcon: { control: 'text' },\n dropdownOptions: { control: 'object' },\n color: { control: 'text' },\n },\n args: {\n size: 'sm',\n category: 'blue',\n outlined: false,\n buttonType: 'icon-label',\n label: 'Button text',\n showLeftIcon: true,\n showRightIcon: true,\n leftIcon: 'circle',\n rightIcon: 'circle',\n dropdownOptions: [\n { label: 'Create a merge commit', value: 'merge' },\n { label: 'Squash and merge', value: 'squash' },\n { label: 'Rebase and merge', value: 'rebase' },\n ],\n },\n parameters: { controls: { expanded: true } },\n}"
1222
+ },
1223
+ {
1224
+ "name": "Variation",
1225
+ "ctype": "miscellaneous",
1226
+ "subtype": "variable",
1227
+ "file": "projects/allsorter-lib/src/lib/button/stories/button-gallery.stories.ts",
1228
+ "deprecated": false,
1229
+ "deprecationMessage": "",
1230
+ "type": "Story",
1231
+ "defaultValue": "{\n name: 'Variation',\n args: {\n category: 'blue',\n buttonType: 'icon-label',\n label: 'Button text',\n leftIcon: 'circle',\n rightIcon: 'circle',\n outlined: false,\n dropdownOptions: [\n { label: 'Create a merge commit', value: 'merge' },\n { label: 'Squash and merge', value: 'squash' },\n { label: 'Rebase and merge', value: 'rebase' },\n ],\n },\n argTypes: {\n category: {\n control: 'select',\n options: [\n 'blue', 'green', 'grey', 'error', 'gradient',\n 'blue-no-outline', 'green-no-outline', 'grey-no-outline', 'error-no-outline',\n ],\n },\n buttonType: {\n control: 'select',\n options: ['icon-label', 'two-icon-label', 'dropdown', 'icon-circle'],\n },\n },\n parameters: {\n docs: { disable: true }\n },\n render: (args: any) => ({\n props: {\n ...args,\n sizes: ['header', 'xs', 'sm', 'base', 'l', 'xl'],\n circleSizes: ['xs', 'sm', 'base', 'l', 'xl'],\n },\n template: `\n <div style=\"display: flex; flex-direction: column; gap: 24px;\">\n <div>\n <div style=\"font-weight: bold; margin-bottom: 8px;\">All Sizes ({{ category }}, {{ buttonType }})</div>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <ng-container *ngFor=\"let sz of sizes\">\n <al-button\n [category]=\"category\"\n [buttonType]=\"buttonType\"\n [label]=\"sz === 'header' ? '' : label\"\n [leftIcon]=\"leftIcon\"\n [rightIcon]=\"rightIcon\"\n [size]=\"sz\"\n [outlined]=\"outlined\"\n [dropdownOptions]=\"dropdownOptions\"\n style=\"margin-right: 8px;\"\n ></al-button>\n </ng-container>\n </div>\n </div>\n <hr />\n <div>\n <div style=\"font-weight: bold; margin-bottom: 8px;\">Circular Buttons (icon-circle)</div>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <ng-container *ngFor=\"let sz of circleSizes\">\n <al-button\n [category]=\"category\"\n [buttonType]=\"'icon-circle'\"\n [leftIcon]=\"'add'\"\n [size]=\"sz\"\n [outlined]=\"outlined\"\n style=\"margin-right: 8px;\"\n ></al-button>\n </ng-container>\n </div>\n </div>\n </div>\n `,\n }),\n}"
1232
+ }
1233
+ ],
997
1234
  "src/environments/environment.prod.ts": [
998
1235
  {
999
1236
  "name": "environment",
@@ -1017,28 +1254,166 @@
1017
1254
  "type": "object",
1018
1255
  "defaultValue": "{\n production: false,\n}"
1019
1256
  }
1257
+ ],
1258
+ "projects/allsorter-lib/src/lib/input/stories/input-gallery.stories.ts": [
1259
+ {
1260
+ "name": "FullMatrix",
1261
+ "ctype": "miscellaneous",
1262
+ "subtype": "variable",
1263
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-gallery.stories.ts",
1264
+ "deprecated": false,
1265
+ "deprecationMessage": "",
1266
+ "type": "Story",
1267
+ "defaultValue": "{\n render: () => ({\n props: {\n categories: [\n { name: 'Primary Input', value: 'primary' },\n { name: 'Disabled State', value: 'disabled' },\n { name: 'Success State', value: 'success' },\n { name: 'Warn State', value: 'warn' },\n { name: 'Plain Input', value: 'plain' }\n ],\n sizes: ['header', 'xs', 'small', 'base', 'large'],\n options: ['Option 1', 'Option 2', 'Option 3'],\n },\n template: `\n <div style=\"display: flex; flex-direction: column; gap: 48px;\">\n <div *ngFor=\"let size of sizes\">\n <h3 style=\"margin-bottom: 24px; font-size: 20px; font-weight: 600;\">{{ size | titlecase }} Input Fields</h3>\n <div style=\"display: flex; flex-direction: row; gap: 24px; align-items: flex-start;\">\n <div *ngFor=\"let inputType of categories\">\n <h4 style=\"margin-bottom: 16px; font-size: 16px; font-weight: 500;\">{{ inputType.name }}</h4>\n <!-- Default state -->\n <al-input\n [label]=\"'Placeholder text'\"\n [placeholder]=\"'Placeholder'\"\n [value]=\"''\"\n [type]=\"'text'\"\n [disabled]=\"false\"\n [helperText]=\"false\"\n [helperTextLabel]=\"'Helper text'\"\n [leftIcon]=\"'person'\"\n [rightIcon]=\"''\"\n [size]=\"size\"\n [inputTypes]=\"inputType.value\"\n [dropDown]=\"size === 'large'\"\n [options]=\"options\"\n ></al-input>\n </div>\n </div>\n </div>\n </div>\n `,\n }),\n name: 'Full Variation Matrix',\n}"
1268
+ },
1269
+ {
1270
+ "name": "Gallery",
1271
+ "ctype": "miscellaneous",
1272
+ "subtype": "variable",
1273
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-gallery.stories.ts",
1274
+ "deprecated": false,
1275
+ "deprecationMessage": "",
1276
+ "type": "Story",
1277
+ "defaultValue": "{\n name: 'Gallery',\n render: (args: any) => ({\n props: args,\n template: `\n <al-input\n [label]=\"label\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [formControlName]=\"formControlName\"\n [type]=\"type\"\n [disabled]=\"disabled\"\n [helperText]=\"helperText\"\n [helperTextLabel]=\"helperTextLabel\"\n [leftIcon]=\"leftIcon\"\n [rightIcon]=\"rightIcon\"\n [dropDown]=\"dropDown\"\n [options]=\"options\"\n [size]=\"size\"\n [inputTypes]=\"inputTypes\"\n (valueChange)=\"value = $event\"\n ></al-input>\n `,\n }),\n}"
1278
+ },
1279
+ {
1280
+ "name": "meta",
1281
+ "ctype": "miscellaneous",
1282
+ "subtype": "variable",
1283
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-gallery.stories.ts",
1284
+ "deprecated": false,
1285
+ "deprecationMessage": "",
1286
+ "type": "Meta<InputComponent>",
1287
+ "defaultValue": "{\n tags: ['autodocs'],\n title: 'Components/Input/Gallery',\n component: InputComponent,\n argTypes: {\n label: { control: 'text' },\n placeholder: { control: 'text' },\n value: { control: 'text' },\n formControlName: { control: 'text' },\n type: {\n control: 'select',\n options: ['text', 'email', 'number', 'password', 'tel', 'url', 'date'],\n },\n disabled: { control: 'boolean' },\n helperText: { control: 'boolean' },\n helperTextLabel: { control: 'text' },\n leftIcon: { control: 'text' },\n rightIcon: { control: 'text' },\n dropDown: { control: 'boolean' },\n options: { control: 'object' },\n size: {\n control: 'radio',\n options: ['header', 'xs', 'small', 'base', 'large'],\n },\n inputTypes: {\n control: 'radio',\n options: ['primary', 'success', 'warn', 'disabled', 'plain'],\n },\n },\n args: {\n label: 'Placeholder text',\n placeholder: 'Type here...',\n value: '',\n formControlName: '',\n type: 'text',\n disabled: false,\n helperText: false,\n helperTextLabel: '',\n leftIcon: 'person',\n rightIcon: 'expand_more',\n dropDown: false,\n options: ['Option 1', 'Option 2', 'Option 3'],\n size: 'base',\n inputTypes: 'primary',\n },\n parameters: { controls: { expanded: true } },\n}"
1288
+ }
1289
+ ],
1290
+ "projects/allsorter-lib/src/lib/input/stories/input-playground.stories.ts": [
1291
+ {
1292
+ "name": "meta",
1293
+ "ctype": "miscellaneous",
1294
+ "subtype": "variable",
1295
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-playground.stories.ts",
1296
+ "deprecated": false,
1297
+ "deprecationMessage": "",
1298
+ "type": "Meta<InputComponent>",
1299
+ "defaultValue": "{\n title: 'Components/Input/Playground',\n component: InputComponent,\n argTypes: {\n label: { control: 'text' },\n placeholder: { control: 'text' },\n value: { control: 'text' },\n type: {\n control: 'select',\n options: ['text', 'email', 'number', 'password', 'tel', 'url', 'date'],\n },\n disabled: { control: 'boolean' },\n helperText: { control: 'boolean' },\n helperTextLabel: { control: 'text' },\n leftIcon: { control: 'text' },\n rightIcon: { control: 'text' },\n dropDown: { control: 'boolean' },\n options: { control: 'object' },\n size: {\n control: 'radio',\n options: ['xs', 'small', 'base', 'large', 'header'],\n },\n inputTypes: {\n control: 'select',\n options: ['primary', 'success', 'warn', 'disabled', 'plain'],\n },\n noBorder: { control: 'boolean' },\n },\n args: {\n label: 'Label',\n placeholder: 'Placeholder',\n value: '',\n type: 'text',\n disabled: false,\n helperText: false,\n helperTextLabel: '',\n leftIcon: '',\n rightIcon: '',\n dropDown: false,\n options: ['Option 1', 'Option 2', 'Option 3'],\n size: 'base',\n inputTypes: 'primary',\n noBorder: false,\n },\n}"
1300
+ },
1301
+ {
1302
+ "name": "Playground",
1303
+ "ctype": "miscellaneous",
1304
+ "subtype": "variable",
1305
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-playground.stories.ts",
1306
+ "deprecated": false,
1307
+ "deprecationMessage": "",
1308
+ "type": "Story",
1309
+ "defaultValue": "{\n render: (args: any) => ({\n props: args,\n template: `\n <al-input\n [label]=\"label\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [type]=\"type\"\n [disabled]=\"disabled\"\n [helperText]=\"helperText\"\n [helperTextLabel]=\"helperTextLabel\"\n [icon]=\"icon\"\n [rightIcon]=\"rightIcon\"\n [dropDown]=\"dropDown\"\n [options]=\"options\"\n [size]=\"size\"\n [inputTypes]=\"inputTypes\"\n [noBorder]=\"noBorder\"\n (valueChange)=\"value = $event\"\n ></al-input>\n `,\n }),\n name: 'Playground',\n}"
1310
+ },
1311
+ {
1312
+ "name": "ReactiveFormsExample",
1313
+ "ctype": "miscellaneous",
1314
+ "subtype": "variable",
1315
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-playground.stories.ts",
1316
+ "deprecated": false,
1317
+ "deprecationMessage": "",
1318
+ "type": "Story",
1319
+ "defaultValue": "{\n render: (args: any) => {\n const fb = new FormBuilder();\n const form = fb.group({\n courseTitle: [''],\n courseDescription: [''],\n courseType: ['']\n });\n\n return {\n props: { ...args, form },\n template: `\n <form [formGroup]=\"form\">\n <div style=\"display: flex; flex-direction: column; gap: 20px;\">\n <al-input\n label=\"Course Title\"\n placeholder=\"Course Title\"\n formControlName=\"courseTitle\"\n [leftIcon]=\"leftIcon\"\n [size]=\"size\"\n [inputTypes]=\"inputTypes\"\n ></al-input>\n\n <al-input\n label=\"Course Description\"\n placeholder=\"Enter course description\"\n formControlName=\"courseDescription\"\n [leftIcon]=\"'description'\"\n [size]=\"size\"\n [inputTypes]=\"inputTypes\"\n ></al-input>\n\n <al-input\n label=\"Course Type\"\n placeholder=\"Select course type\"\n formControlName=\"courseType\"\n [dropDown]=\"true\"\n [options]=\"['Online', 'In-Person', 'Hybrid']\"\n [leftIcon]=\"'category'\"\n [rightIcon]=\"'expand_more'\"\n [size]=\"size\"\n [inputTypes]=\"inputTypes\"\n ></al-input>\n </div>\n\n <div style=\"margin-top: 20px; padding: 10px; background: #f5f5f5; border-radius: 4px;\">\n <strong>Form Values:</strong>\n <pre>{{ form.value | json }}</pre>\n </div>\n </form>\n `,\n imports: [ReactiveFormsModule]\n };\n },\n name: 'Reactive Forms Example',\n}"
1320
+ }
1321
+ ],
1322
+ "projects/allsorter-lib/src/lib/button/stories/button-playground.stories.ts": [
1323
+ {
1324
+ "name": "meta",
1325
+ "ctype": "miscellaneous",
1326
+ "subtype": "variable",
1327
+ "file": "projects/allsorter-lib/src/lib/button/stories/button-playground.stories.ts",
1328
+ "deprecated": false,
1329
+ "deprecationMessage": "",
1330
+ "type": "Meta<ButtonComponent>",
1331
+ "defaultValue": "{\n title: 'Components/Button/Playground',\n component: ButtonComponent,\n argTypes: {\n label: { control: 'text' },\n category: {\n control: 'select',\n options: [\n 'blue', 'green', 'grey', 'error', 'gradient',\n 'blue-no-outline', 'green-no-outline', 'grey-no-outline', 'error-no-outline',\n ],\n },\n\n buttonType: {\n control: 'select',\n options: ['icon-circle', 'icon-label', 'two-icon-label', 'dropdown'],\n },\n size: {\n control: 'select',\n options: ['header','xs','sm','base','l','xl'],\n },\n leftIcon: {\n control: 'text',\n if: { arg: 'showLeftIcon', truthy: true },\n ifDisabled: { arg: 'showLeftIcon', truthy: false },\n },\n rightIcon: {\n control: 'text',\n if: { arg: 'showRightIcon', truthy: true },\n ifDisabled: { arg: 'showRightIcon', truthy: false },\n },\n outlined: { control: 'boolean' },\n iconOnly: { control: 'boolean' },\n showLeftIcon: { control: 'boolean' },\n showRightIcon: { control: 'boolean' },\n dropdownOptions: { control: 'object' },\n },\n args: {\n size: 'sm',\n category: 'blue',\n outlined: true,\n buttonType: 'icon-label',\n label: 'Button text',\n leftIcon: 'add',\n rightIcon: 'add',\n iconOnly: false,\n showLeftIcon: true,\n showRightIcon: true,\n dropdownOptions: [\n { label: 'Create a merge commit', value: 'merge' },\n { label: 'Squash and merge', value: 'squash' },\n { label: 'Rebase and merge', value: 'rebase' },\n ],\n },\n}"
1332
+ }
1020
1333
  ]
1021
1334
  },
1022
1335
  "groupedFunctions": {},
1023
1336
  "groupedEnumerations": {},
1024
- "groupedTypeAliases": {}
1337
+ "groupedTypeAliases": {
1338
+ "projects/allsorter-lib/src/lib/input/stories/input-gallery.stories.ts": [
1339
+ {
1340
+ "name": "Story",
1341
+ "ctype": "miscellaneous",
1342
+ "subtype": "typealias",
1343
+ "rawtype": "StoryObj<InputComponent>",
1344
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-gallery.stories.ts",
1345
+ "deprecated": false,
1346
+ "deprecationMessage": "",
1347
+ "description": "",
1348
+ "kind": 183
1349
+ }
1350
+ ],
1351
+ "projects/allsorter-lib/src/lib/input/stories/input-playground.stories.ts": [
1352
+ {
1353
+ "name": "Story",
1354
+ "ctype": "miscellaneous",
1355
+ "subtype": "typealias",
1356
+ "rawtype": "StoryObj<InputComponent>",
1357
+ "file": "projects/allsorter-lib/src/lib/input/stories/input-playground.stories.ts",
1358
+ "deprecated": false,
1359
+ "deprecationMessage": "",
1360
+ "description": "",
1361
+ "kind": 183
1362
+ }
1363
+ ],
1364
+ "projects/allsorter-lib/src/lib/button/stories/button-gallery.stories.ts": [
1365
+ {
1366
+ "name": "Story",
1367
+ "ctype": "miscellaneous",
1368
+ "subtype": "typealias",
1369
+ "rawtype": "StoryObj<ButtonComponent>",
1370
+ "file": "projects/allsorter-lib/src/lib/button/stories/button-gallery.stories.ts",
1371
+ "deprecated": false,
1372
+ "deprecationMessage": "",
1373
+ "description": "",
1374
+ "kind": 183
1375
+ }
1376
+ ],
1377
+ "projects/allsorter-lib/src/lib/button/stories/button-playground.stories.ts": [
1378
+ {
1379
+ "name": "Story",
1380
+ "ctype": "miscellaneous",
1381
+ "subtype": "typealias",
1382
+ "rawtype": "StoryObj<ButtonComponent>",
1383
+ "file": "projects/allsorter-lib/src/lib/button/stories/button-playground.stories.ts",
1384
+ "deprecated": false,
1385
+ "deprecationMessage": "",
1386
+ "description": "",
1387
+ "kind": 183
1388
+ }
1389
+ ]
1390
+ }
1025
1391
  },
1026
1392
  "routes": [],
1027
1393
  "coverage": {
1028
- "count": 6,
1394
+ "count": 1,
1029
1395
  "status": "low",
1030
1396
  "files": [
1031
1397
  {
1032
- "filePath": "src/app/app.component.ts",
1398
+ "filePath": "projects/allsorter-lib/src/lib/allsorter-lib.component.ts",
1033
1399
  "type": "component",
1034
1400
  "linktype": "component",
1035
- "name": "AppComponent",
1401
+ "name": "AllsorterLibComponent",
1402
+ "coveragePercent": 0,
1403
+ "coverageCount": "0/1",
1404
+ "status": "low"
1405
+ },
1406
+ {
1407
+ "filePath": "projects/allsorter-lib/src/lib/allsorter-lib.service.ts",
1408
+ "type": "injectable",
1409
+ "linktype": "injectable",
1410
+ "name": "AllsorterLibService",
1036
1411
  "coveragePercent": 0,
1037
1412
  "coverageCount": "0/2",
1038
1413
  "status": "low"
1039
1414
  },
1040
1415
  {
1041
- "filePath": "src/app/button/button.component.ts",
1416
+ "filePath": "projects/allsorter-lib/src/lib/button/button.component.ts",
1042
1417
  "type": "component",
1043
1418
  "linktype": "component",
1044
1419
  "name": "ButtonComponent",
@@ -1047,7 +1422,67 @@
1047
1422
  "status": "medium"
1048
1423
  },
1049
1424
  {
1050
- "filePath": "src/app/input/input.component.ts",
1425
+ "filePath": "projects/allsorter-lib/src/lib/button/stories/button-gallery.stories.ts",
1426
+ "type": "variable",
1427
+ "linktype": "miscellaneous",
1428
+ "linksubtype": "variable",
1429
+ "name": "Default",
1430
+ "coveragePercent": 0,
1431
+ "coverageCount": "0/1",
1432
+ "status": "low"
1433
+ },
1434
+ {
1435
+ "filePath": "projects/allsorter-lib/src/lib/button/stories/button-gallery.stories.ts",
1436
+ "type": "variable",
1437
+ "linktype": "miscellaneous",
1438
+ "linksubtype": "variable",
1439
+ "name": "meta",
1440
+ "coveragePercent": 0,
1441
+ "coverageCount": "0/1",
1442
+ "status": "low"
1443
+ },
1444
+ {
1445
+ "filePath": "projects/allsorter-lib/src/lib/button/stories/button-gallery.stories.ts",
1446
+ "type": "variable",
1447
+ "linktype": "miscellaneous",
1448
+ "linksubtype": "variable",
1449
+ "name": "Variation",
1450
+ "coveragePercent": 0,
1451
+ "coverageCount": "0/1",
1452
+ "status": "low"
1453
+ },
1454
+ {
1455
+ "filePath": "projects/allsorter-lib/src/lib/button/stories/button-gallery.stories.ts",
1456
+ "type": "type alias",
1457
+ "linktype": "miscellaneous",
1458
+ "linksubtype": "typealias",
1459
+ "name": "Story",
1460
+ "coveragePercent": 0,
1461
+ "coverageCount": "0/1",
1462
+ "status": "low"
1463
+ },
1464
+ {
1465
+ "filePath": "projects/allsorter-lib/src/lib/button/stories/button-playground.stories.ts",
1466
+ "type": "variable",
1467
+ "linktype": "miscellaneous",
1468
+ "linksubtype": "variable",
1469
+ "name": "meta",
1470
+ "coveragePercent": 0,
1471
+ "coverageCount": "0/1",
1472
+ "status": "low"
1473
+ },
1474
+ {
1475
+ "filePath": "projects/allsorter-lib/src/lib/button/stories/button-playground.stories.ts",
1476
+ "type": "type alias",
1477
+ "linktype": "miscellaneous",
1478
+ "linksubtype": "typealias",
1479
+ "name": "Story",
1480
+ "coveragePercent": 0,
1481
+ "coverageCount": "0/1",
1482
+ "status": "low"
1483
+ },
1484
+ {
1485
+ "filePath": "projects/allsorter-lib/src/lib/input/input.component.ts",
1051
1486
  "type": "component",
1052
1487
  "linktype": "component",
1053
1488
  "name": "InputComponent",
@@ -1055,6 +1490,95 @@
1055
1490
  "coverageCount": "0/27",
1056
1491
  "status": "low"
1057
1492
  },
1493
+ {
1494
+ "filePath": "projects/allsorter-lib/src/lib/input/stories/input-gallery.stories.ts",
1495
+ "type": "variable",
1496
+ "linktype": "miscellaneous",
1497
+ "linksubtype": "variable",
1498
+ "name": "FullMatrix",
1499
+ "coveragePercent": 0,
1500
+ "coverageCount": "0/1",
1501
+ "status": "low"
1502
+ },
1503
+ {
1504
+ "filePath": "projects/allsorter-lib/src/lib/input/stories/input-gallery.stories.ts",
1505
+ "type": "variable",
1506
+ "linktype": "miscellaneous",
1507
+ "linksubtype": "variable",
1508
+ "name": "Gallery",
1509
+ "coveragePercent": 0,
1510
+ "coverageCount": "0/1",
1511
+ "status": "low"
1512
+ },
1513
+ {
1514
+ "filePath": "projects/allsorter-lib/src/lib/input/stories/input-gallery.stories.ts",
1515
+ "type": "variable",
1516
+ "linktype": "miscellaneous",
1517
+ "linksubtype": "variable",
1518
+ "name": "meta",
1519
+ "coveragePercent": 0,
1520
+ "coverageCount": "0/1",
1521
+ "status": "low"
1522
+ },
1523
+ {
1524
+ "filePath": "projects/allsorter-lib/src/lib/input/stories/input-gallery.stories.ts",
1525
+ "type": "type alias",
1526
+ "linktype": "miscellaneous",
1527
+ "linksubtype": "typealias",
1528
+ "name": "Story",
1529
+ "coveragePercent": 0,
1530
+ "coverageCount": "0/1",
1531
+ "status": "low"
1532
+ },
1533
+ {
1534
+ "filePath": "projects/allsorter-lib/src/lib/input/stories/input-playground.stories.ts",
1535
+ "type": "variable",
1536
+ "linktype": "miscellaneous",
1537
+ "linksubtype": "variable",
1538
+ "name": "meta",
1539
+ "coveragePercent": 0,
1540
+ "coverageCount": "0/1",
1541
+ "status": "low"
1542
+ },
1543
+ {
1544
+ "filePath": "projects/allsorter-lib/src/lib/input/stories/input-playground.stories.ts",
1545
+ "type": "variable",
1546
+ "linktype": "miscellaneous",
1547
+ "linksubtype": "variable",
1548
+ "name": "Playground",
1549
+ "coveragePercent": 0,
1550
+ "coverageCount": "0/1",
1551
+ "status": "low"
1552
+ },
1553
+ {
1554
+ "filePath": "projects/allsorter-lib/src/lib/input/stories/input-playground.stories.ts",
1555
+ "type": "variable",
1556
+ "linktype": "miscellaneous",
1557
+ "linksubtype": "variable",
1558
+ "name": "ReactiveFormsExample",
1559
+ "coveragePercent": 0,
1560
+ "coverageCount": "0/1",
1561
+ "status": "low"
1562
+ },
1563
+ {
1564
+ "filePath": "projects/allsorter-lib/src/lib/input/stories/input-playground.stories.ts",
1565
+ "type": "type alias",
1566
+ "linktype": "miscellaneous",
1567
+ "linksubtype": "typealias",
1568
+ "name": "Story",
1569
+ "coveragePercent": 0,
1570
+ "coverageCount": "0/1",
1571
+ "status": "low"
1572
+ },
1573
+ {
1574
+ "filePath": "src/app/app.component.ts",
1575
+ "type": "component",
1576
+ "linktype": "component",
1577
+ "name": "AppComponent",
1578
+ "coveragePercent": 0,
1579
+ "coverageCount": "0/2",
1580
+ "status": "low"
1581
+ },
1058
1582
  {
1059
1583
  "filePath": "src/environments/environment.prod.ts",
1060
1584
  "type": "variable",