@ship-ui/core 0.16.19 → 0.17.2

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.
@@ -0,0 +1,3484 @@
1
+ [
2
+ {
3
+ "name": "ShipTooltipWrapper",
4
+ "selector": "ship-tooltip-wrapper",
5
+ "path": "projects/ship-ui/src/lib/directives/ship-tooltip.directive.ts",
6
+ "description": "",
7
+ "inputs": [
8
+ {
9
+ "name": "isOpen",
10
+ "type": "boolean",
11
+ "description": "",
12
+ "defaultValue": "false"
13
+ }
14
+ ],
15
+ "outputs": [],
16
+ "cssVariables": [],
17
+ "examples": []
18
+ },
19
+ {
20
+ "name": "ShipFileDragDrop",
21
+ "selector": "[shDragDrop]",
22
+ "path": "projects/ship-ui/src/lib/directives/ship-file-drag-drop.directive.ts",
23
+ "description": "",
24
+ "inputs": [],
25
+ "outputs": [
26
+ {
27
+ "name": "filesDropped",
28
+ "type": "FileList",
29
+ "description": ""
30
+ }
31
+ ],
32
+ "cssVariables": [
33
+ {
34
+ "name": "--fu-bg-active",
35
+ "defaultValue": "rgba(0, 0, 0, 0.1)"
36
+ }
37
+ ],
38
+ "examples": []
39
+ },
40
+ {
41
+ "name": "ShipInputMask",
42
+ "selector": "[shInputMask]",
43
+ "path": "projects/ship-ui/src/lib/directives/ship-input-mask.ts",
44
+ "description": "",
45
+ "inputs": [
46
+ {
47
+ "name": "shInputMask",
48
+ "type": "string | MaskingFunction",
49
+ "description": "",
50
+ "defaultValue": "'(999"
51
+ }
52
+ ],
53
+ "outputs": [],
54
+ "cssVariables": [],
55
+ "examples": []
56
+ },
57
+ {
58
+ "name": "ShipPreventWheel",
59
+ "selector": "[shPreventWheel]",
60
+ "path": "projects/ship-ui/src/lib/directives/ship-prevent-wheel.directive.ts",
61
+ "description": "",
62
+ "inputs": [],
63
+ "outputs": [],
64
+ "cssVariables": [],
65
+ "examples": []
66
+ },
67
+ {
68
+ "name": "ShipSidenav",
69
+ "selector": "sh-sidenav",
70
+ "path": "projects/ship-ui/src/lib/ship-sidenav/ship-sidenav.ts",
71
+ "description": "### Variants\n\nSidenavs support multiple behaviors via the\n`variant`\nattribute:\n\n<li>\n**default**\n: Fixed position, non-toggleable.\n</li>\n<li>\n**simple**\n: Support for toggling width (e.g., icon-only vs. full expanded view).\n</li>\n<li>\n**overlay**\n: Overlays content when opened and supports swipe-to-close gestures.\n</li>\n\n### Drag Interaction\n\nUse the\n`disableDrag`\nattribute/binding to disable swipe gestures on the\n**overlay**\nvariant.",
72
+ "inputs": [
73
+ {
74
+ "name": "disableDrag",
75
+ "type": "boolean",
76
+ "description": "",
77
+ "defaultValue": "false"
78
+ },
79
+ {
80
+ "name": "isOpen",
81
+ "type": "boolean",
82
+ "description": "",
83
+ "defaultValue": "false"
84
+ }
85
+ ],
86
+ "outputs": [],
87
+ "cssVariables": [
88
+ {
89
+ "name": "--sidenav-width",
90
+ "defaultValue": "#{p2r(280)}"
91
+ },
92
+ {
93
+ "name": "--sidenav-wrap-w",
94
+ "defaultValue": "100vw"
95
+ },
96
+ {
97
+ "name": "--sidenav-wrap-h",
98
+ "defaultValue": "100vh"
99
+ }
100
+ ],
101
+ "examples": [
102
+ {
103
+ "name": "sandbox-sidenav",
104
+ "html": "<div class=\"controls\">\n <p>Controls</p>\n <header>\n <div class=\"row\">\n <sh-toggle [class.active]=\"isNavOpen()\" class=\"primary raised\">\n Open/Close\n <input type=\"checkbox\" [(ngModel)]=\"isNavOpen\" />\n </sh-toggle>\n\n <sh-button-group class=\"small\">\n <button [class.active]=\"sidenavType() === ''\" (click)=\"sidenavType.set('')\">Default</button>\n <button [class.active]=\"sidenavType() === 'overlay'\" (click)=\"sidenavType.set('overlay')\">Overlay</button>\n <button [class.active]=\"sidenavType() === 'simple'\" (click)=\"sidenavType.set('simple')\">Simple</button>\n </sh-button-group>\n </div>\n\n @if (sidenavType() === 'overlay') {\n <div class=\"row\">\n <sh-toggle [class.active]=\"disableDrag()\" class=\"primary raised\">\n Disable Drag\n <input type=\"checkbox\" [(ngModel)]=\"disableDrag\" />\n </sh-toggle>\n </div>\n }\n </header>\n</div>\n\n<div class=\"sandbox\">\n <sh-sidenav [class]=\"sidenavType()\" [(isOpen)]=\"isNavOpen\" [disableDrag]=\"disableDrag()\">\n <ng-container sidenav>sidenav</ng-container>\n\n <ng-container sidenav-closed-topbar><button (click)=\"isNavOpen.set(!isNavOpen())\">hello</button></ng-container>\n\n hello world\n </sh-sidenav>\n</div>\n",
105
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipButtonGroup, ShipSidenav, ShipSidenavType, ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-sandbox-sidenav',\n imports: [FormsModule, ShipSidenav, ShipButtonGroup, ShipToggle],\n templateUrl: './sandbox-sidenav.html',\n styleUrl: './sandbox-sidenav.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SandboxSidenav {\n sidenavType = signal<ShipSidenavType>('simple');\n isNavOpen = signal(false);\n disableDrag = signal(false);\n}\n"
106
+ }
107
+ ]
108
+ },
109
+ {
110
+ "name": "ShipCard",
111
+ "selector": "sh-card",
112
+ "path": "projects/ship-ui/src/lib/ship-card/ship-card.ts",
113
+ "description": "### Variants\n\nCard variants can be set using the\n`variant`\nattribute. Available options:\n**type-a**\n,\n**type-b**\n,\n**type-c**\n, and\n**default**\n.\n\n### Toggle Card\n\nUse\n`&lt;sh-toggle-card&gt;`\nfor collapsible content. Use the\n`disallowToggle`\nattribute or binding to keep the card open.",
114
+ "inputs": [
115
+ {
116
+ "name": "color",
117
+ "type": "ShipColor | null",
118
+ "description": "",
119
+ "defaultValue": "null",
120
+ "options": [
121
+ "primary",
122
+ "accent",
123
+ "warn",
124
+ "error",
125
+ "success"
126
+ ]
127
+ },
128
+ {
129
+ "name": "variant",
130
+ "type": "ShipCardVariant | null",
131
+ "description": "",
132
+ "defaultValue": "null",
133
+ "options": [
134
+ "type-a",
135
+ "type-b",
136
+ "type-c"
137
+ ]
138
+ }
139
+ ],
140
+ "outputs": [],
141
+ "cssVariables": [
142
+ {
143
+ "name": "--card-bg",
144
+ "defaultValue": "var(--base-1)"
145
+ },
146
+ {
147
+ "name": "--card-ibg",
148
+ "defaultValue": "var(--base-2)"
149
+ },
150
+ {
151
+ "name": "--card-bc",
152
+ "defaultValue": "var(--base-4)"
153
+ },
154
+ {
155
+ "name": "--card-sh",
156
+ "defaultValue": "var(--box-shadow-10)"
157
+ },
158
+ {
159
+ "name": "--card-p",
160
+ "defaultValue": "#{p2r(24)}"
161
+ },
162
+ {
163
+ "name": "--card-shp",
164
+ "defaultValue": "#{p2r(8)}"
165
+ }
166
+ ],
167
+ "examples": [
168
+ {
169
+ "name": "card-sandbox",
170
+ "html": "<div class=\"controls\">\n <header>\n <div class=\"column\">\n <p>Controls (sh-card)</p>\n <sh-button-group class=\"small\">\n <button [class.active]=\"cardType() === 'type-a'\" (click)=\"cardType.set('type-a')\">Type A</button>\n <button [class.active]=\"cardType() === 'type-b'\" (click)=\"cardType.set('type-b')\">Type B</button>\n <button [class.active]=\"cardType() === 'type-c'\" (click)=\"cardType.set('type-c')\">Type C</button>\n </sh-button-group>\n </div>\n\n <div class=\"column\">\n <p>Controls (sh-toggle-card)</p>\n <sh-toggle\n [class.active]=\"disallowToggle()\"\n color=\"primary\"\n variant=\"raised\"\n (click)=\"disallowToggle.set(!disallowToggle())\">\n Disallow Toggle\n </sh-toggle>\n </div>\n </header>\n</div>\n\n<div class=\"sandbox\">\n <sh-card [variant]=\"cardType()\">Hello world (sh-card)</sh-card>\n\n <sh-toggle-card [variant]=\"cardType()\" [disallowToggle]=\"disallowToggle()\">\n <ng-container title>Advanced options</ng-container>\n <p>Hello world (sh-toggle-card)</p>\n\n <p>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore\n magna aliqua.\n </p>\n\n <p>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore\n magna aliqua.\n </p>\n </sh-toggle-card>\n</div>\n",
171
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipButtonGroup, ShipCard, ShipToggle, ShipToggleCard } from 'ship-ui';\n\n@Component({\n selector: 'app-card-sandbox',\n imports: [ShipCard, ShipToggleCard, ShipButtonGroup, ShipToggle],\n templateUrl: './card-sandbox.html',\n styleUrl: './card-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CardSandbox {\n cardType = signal<'type-a' | 'type-b' | 'type-c'>('type-a');\n useToggleCard = signal<boolean>(false);\n disallowToggle = signal<boolean>(false);\n}\n"
172
+ },
173
+ {
174
+ "name": "toggle-card",
175
+ "html": "<sh-toggle-card>\n <ng-container title>Advanced options</ng-container>\n <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>\n</sh-toggle-card>\n",
176
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipToggleCard } from 'ship-ui';\n\n@Component({\n selector: 'app-toggle-card-example',\n standalone: true,\n imports: [ShipToggleCard],\n templateUrl: './toggle-card.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToggleCardExampleComponent {}\n"
177
+ },
178
+ {
179
+ "name": "type-a-card",
180
+ "html": "<sh-card variant=\"type-a\">hello world</sh-card>\n",
181
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipCard } from 'ship-ui';\n\n@Component({\n selector: 'app-type-a-card',\n standalone: true,\n imports: [ShipCard],\n templateUrl: './type-a-card.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TypeACardComponent {}\n"
182
+ },
183
+ {
184
+ "name": "type-b-card",
185
+ "html": "<sh-card variant=\"type-b\">hello world</sh-card>\n",
186
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipCard } from 'ship-ui';\n\n@Component({\n selector: 'app-type-b-card',\n standalone: true,\n imports: [ShipCard],\n templateUrl: './type-b-card.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TypeBCardComponent {}\n"
187
+ },
188
+ {
189
+ "name": "type-c-card",
190
+ "html": "<sh-card variant=\"type-c\">hello world</sh-card>\n",
191
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipCard } from 'ship-ui';\n\n@Component({\n selector: 'app-type-c-card',\n standalone: true,\n imports: [ShipCard],\n templateUrl: './type-c-card.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TypeCCardComponent {}\n"
192
+ },
193
+ {
194
+ "name": "toggle-card-disallowed",
195
+ "html": "<sh-toggle-card [disallowToggle]=\"true\">\n <ng-container title>Advanced options</ng-container>\n <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>\n</sh-toggle-card>\n",
196
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipToggleCard } from 'ship-ui';\n\n@Component({\n selector: 'app-toggle-card-disallowed-example',\n standalone: true,\n imports: [ShipToggleCard],\n templateUrl: './toggle-card-disallowed.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToggleCardDisallowedExampleComponent {}\n"
197
+ }
198
+ ]
199
+ },
200
+ {
201
+ "name": "ShipFormFieldExperimental",
202
+ "selector": "sh-form-field-experimental",
203
+ "path": "projects/ship-ui/src/lib/sh-form-field-experimental/sh-form-field-experimental.ts",
204
+ "description": "",
205
+ "inputs": [],
206
+ "outputs": [],
207
+ "cssVariables": [],
208
+ "examples": []
209
+ },
210
+ {
211
+ "name": "ShipEventCard",
212
+ "selector": "sh-event-card",
213
+ "path": "projects/ship-ui/src/lib/ship-event-card/ship-event-card.ts",
214
+ "description": "### Variants\n\nEvent card variants can be set using the\n`variant`\nattribute. Valid options are:\n**simple**\n,\n**outlined**\n,\n**flat**\n, and\n**raised**\n.\n\n### Colors\n\nColors can be set using the\n`color`\nattribute. Valid options are:\n**primary**\n,\n**accent**\n,\n**warn**\n,\n**error**\n, and\n**success**\n.\n\n:::info\nThis component utilizes the **Ship Sheet** utility for its visual structure. It supports standard sheet variations and is affected by global sheet variables.\n:::",
215
+ "inputs": [
216
+ {
217
+ "name": "color",
218
+ "type": "ShipColor | null",
219
+ "description": "",
220
+ "defaultValue": "null",
221
+ "options": [
222
+ "primary",
223
+ "accent",
224
+ "warn",
225
+ "error",
226
+ "success"
227
+ ]
228
+ },
229
+ {
230
+ "name": "variant",
231
+ "type": "ShipSheetVariant | null",
232
+ "description": "",
233
+ "defaultValue": "null",
234
+ "options": [
235
+ "simple",
236
+ "outlined",
237
+ "flat",
238
+ "raised"
239
+ ]
240
+ }
241
+ ],
242
+ "outputs": [],
243
+ "cssVariables": [
244
+ {
245
+ "name": "--btn-bs",
246
+ "defaultValue": "none"
247
+ }
248
+ ],
249
+ "examples": [
250
+ {
251
+ "name": "outlined-event-card",
252
+ "html": "<sh-event-card class=\"outlined\">\n <h3>Default</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"outlined primary\">\n <h3>Primary</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"outlined accent\">\n <h3>Accent</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"outlined warn\">\n <h3>Warn</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"outlined error\">\n <h3>Error</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"outlined success\">\n <h3>Success</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n",
253
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipButton, ShipEventCard } from 'ship-ui';\n\n@Component({\n selector: 'app-outlined-event-card',\n imports: [ShipEventCard, ShipButton],\n templateUrl: './outlined-event-card.html',\n styleUrl: './outlined-event-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OutlinedEventCard {}\n"
254
+ },
255
+ {
256
+ "name": "simple-event-card",
257
+ "html": "<sh-event-card class=\"simple\">\n <h3>Default</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"simple primary\">\n <h3>Primary</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"simple accent\">\n <h3>Accent</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"simple warn\">\n <h3>Warn</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"simple error\">\n <h3>Error</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"simple success\">\n <h3>Success</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n",
258
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipButton, ShipEventCard } from 'ship-ui';\n\n@Component({\n selector: 'app-simple-event-card',\n imports: [ShipEventCard, ShipButton],\n templateUrl: './simple-event-card.html',\n styleUrl: './simple-event-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SimpleEventCard {}\n"
259
+ },
260
+ {
261
+ "name": "raised-event-card",
262
+ "html": "<sh-event-card class=\"raised\">\n <h3>Default</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"raised primary\">\n <h3>Primary</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"raised accent\">\n <h3>Accent</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"raised warn\">\n <h3>Warn</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"raised error\">\n <h3>Error</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"raised success\">\n <h3>Success</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n",
263
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipButton, ShipEventCard } from 'ship-ui';\n\n@Component({\n selector: 'app-raised-event-card',\n imports: [ShipEventCard, ShipButton],\n templateUrl: './raised-event-card.html',\n styleUrl: './raised-event-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RaisedEventCard {}\n"
264
+ },
265
+ {
266
+ "name": "base-event-card",
267
+ "html": "<sh-event-card>\n <h3>Default</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"primary\">\n <h3>Primary</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"accent\">\n <h3>Accent</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"warn\">\n <h3>Warn</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"error\">\n <h3>Error</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"success\">\n <h3>Success</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n",
268
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipButton, ShipEventCard } from 'ship-ui';\n\n@Component({\n selector: 'app-base-event-card',\n imports: [ShipEventCard, ShipButton],\n templateUrl: './base-event-card.html',\n styleUrl: './base-event-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseEventCard {}\n"
269
+ },
270
+ {
271
+ "name": "event-card-sandbox",
272
+ "html": "<div class=\"controls\">\n <p>Controls</p>\n <header>\n <div class=\"row\">\n <sh-toggle\n [class.active]=\"useDynamicColor()\"\n class=\"primary raised\"\n (click)=\"useDynamicColor.set(!useDynamicColor())\">\n Use dynamic color\n </sh-toggle>\n\n @if (useDynamicColor()) {\n <input\n type=\"color\"\n [disabled]=\"!useDynamicColor()\"\n [ngModel]=\"dynamicColor()\"\n (ngModelChange)=\"dynamicColor.set($event)\" />\n }\n </div>\n\n @if (!useDynamicColor()) {\n <div class=\"row\">\n <sh-button-group class=\"small\">\n <button [class.active]=\"colorClass() === ''\" (click)=\"colorClass.set('')\">Default</button>\n <button [class.active]=\"colorClass() === 'primary'\" (click)=\"colorClass.set('primary')\">Primary</button>\n <button [class.active]=\"colorClass() === 'accent'\" (click)=\"colorClass.set('accent')\">Accent</button>\n <button [class.active]=\"colorClass() === 'warn'\" (click)=\"colorClass.set('warn')\">Warn</button>\n <button [class.active]=\"colorClass() === 'error'\" (click)=\"colorClass.set('error')\">Error</button>\n <button [class.active]=\"colorClass() === 'success'\" (click)=\"colorClass.set('success')\">Success</button>\n </sh-button-group>\n\n <sh-button-group class=\"small\">\n <button [class.active]=\"variationClass() === ''\" (click)=\"variationClass.set('')\">Default</button>\n <button [class.active]=\"variationClass() === 'simple'\" (click)=\"variationClass.set('simple')\">Simple</button>\n <button [class.active]=\"variationClass() === 'outlined'\" (click)=\"variationClass.set('outlined')\">\n Outlined\n </button>\n <button [class.active]=\"variationClass() === 'flat'\" (click)=\"variationClass.set('flat')\">Flat</button>\n <button [class.active]=\"variationClass() === 'raised'\" (click)=\"variationClass.set('raised')\">Raised</button>\n </sh-button-group>\n </div>\n }\n </header>\n</div>\n\n<div class=\"sandbox\">\n <sh-event-card [class]=\"exampleClass()\" [style.--sheet-c]=\"useDynamicColor() ? dynamicColor() : null\">\n Just text in the card\n </sh-event-card>\n\n <sh-event-card [class]=\"exampleClass()\" [style.--sheet-c]=\"useDynamicColor() ? dynamicColor() : null\">\n <h3>Card with title</h3>\n <p>and description</p>\n </sh-event-card>\n\n <sh-event-card [class]=\"exampleClass()\" [style.--sheet-c]=\"useDynamicColor() ? dynamicColor() : null\">\n <h3>Card with title</h3>\n <p>and description</p>\n\n <button shButton>Action 1</button>\n </sh-event-card>\n\n <sh-event-card [class]=\"exampleClass()\" [style.--sheet-c]=\"useDynamicColor() ? dynamicColor() : null\">\n Event card with just buttons projected as actions Event card with just buttons projected as actionsEvent card with\n just buttons projected as actionsEvent card with just buttons projected as actionsEvent card with just buttons\n projected as actionsEvent card with just buttons projected as actions\n\n <button shButton>Action 1</button>\n <button shButton>Action 2</button>\n </sh-event-card>\n\n <sh-event-card [class]=\"exampleClass()\" [style.--sheet-c]=\"useDynamicColor() ? dynamicColor() : null\">\n <h3>Card with title</h3>\n <p>and description</p>\n <button shButton>And a action button</button>\n </sh-event-card>\n</div>\n",
273
+ "ts": "import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipButton, ShipButtonGroup, ShipEventCard, ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-event-card-sandbox',\n imports: [FormsModule, ShipEventCard, ShipButton, ShipToggle, ShipButtonGroup],\n templateUrl: './event-card-sandbox.html',\n styleUrl: './event-card-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EventCardSandbox {\n colorClass = signal<'' | 'primary' | 'accent' | 'warn' | 'error' | 'success'>('primary');\n variationClass = signal<'' | 'simple' | 'outlined' | 'flat' | 'raised'>('simple');\n\n useDynamicColor = signal<boolean>(false);\n dynamicColor = signal<string>('#2f54eb');\n\n exampleClass = computed(() => {\n if (this.useDynamicColor()) return 'dynamic';\n\n return this.variationClass() + ' ' + this.colorClass();\n });\n}\n"
274
+ },
275
+ {
276
+ "name": "flat-event-card",
277
+ "html": "<sh-event-card class=\"flat\">\n <h3>Default</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"flat primary\">\n <h3>Primary</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"flat accent\">\n <h3>Accent</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"flat warn\">\n <h3>Warn</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"flat error\">\n <h3>Error</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n\n<sh-event-card class=\"flat success\">\n <h3>Success</h3>\n <p>and description</p>\n <button shButton>Action 1</button>\n</sh-event-card>\n",
278
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipButton, ShipEventCard } from 'ship-ui';\n\n@Component({\n selector: 'app-flat-event-card',\n imports: [ShipEventCard, ShipButton],\n templateUrl: './flat-event-card.html',\n styleUrl: './flat-event-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FlatEventCard {}\n"
279
+ }
280
+ ]
281
+ },
282
+ {
283
+ "name": "ShipFileUpload",
284
+ "selector": "sh-file-upload",
285
+ "path": "projects/ship-ui/src/lib/ship-file-upload/ship-file-upload.ts",
286
+ "description": "### Files\n\nSelected files are available via the\n`files`\nattribute. Use\n`[(files)]`\nfor two-way binding.\n\n### Selection\n\nCustomize selection behavior:\n\n<li>\n`multiple`\n: Allows selecting more than one file.\n</li>\n<li>\n`accept`\n: Restricts file types (e.g.,\n`accept=\".png,.jpg\"`\n).\n</li>\n\n### Text\n\nCustomize displayed labels:\n\n<li>\n`placeholder`\n: Text shown when empty.\n</li>\n<li>\n`overlayText`\n: Text shown during drag-and-drop.\n</li>",
287
+ "inputs": [
288
+ {
289
+ "name": "multiple",
290
+ "type": "boolean | null",
291
+ "description": ""
292
+ },
293
+ {
294
+ "name": "accept",
295
+ "type": "string | null",
296
+ "description": "",
297
+ "defaultValue": "null"
298
+ },
299
+ {
300
+ "name": "overlayText",
301
+ "type": "string",
302
+ "description": "",
303
+ "defaultValue": "'Drop files here'"
304
+ },
305
+ {
306
+ "name": "placeholder",
307
+ "type": "string",
308
+ "description": "",
309
+ "defaultValue": "'Click or drag files here'"
310
+ },
311
+ {
312
+ "name": "files",
313
+ "type": "File[]",
314
+ "description": "",
315
+ "defaultValue": "[]"
316
+ }
317
+ ],
318
+ "outputs": [],
319
+ "cssVariables": [
320
+ {
321
+ "name": "--fu-bg-active",
322
+ "defaultValue": "rgba(0, 0, 0, 0.1)"
323
+ }
324
+ ],
325
+ "examples": [
326
+ {
327
+ "name": "base-file-upload",
328
+ "html": "<sh-file-upload [(files)]=\"files\" accept=\".json,.png\" />\n",
329
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipFileUpload } from 'ship-ui';\n\n@Component({\n selector: 'app-base-file-upload',\n imports: [ShipFileUpload],\n templateUrl: './base-file-upload.html',\n styleUrl: './base-file-upload.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseFileUpload {\n files = signal<File[]>([]);\n}\n"
330
+ },
331
+ {
332
+ "name": "file-upload-sandbox",
333
+ "html": "<div class=\"controls\">\n <p>Controls</p>\n\n <div class=\"row\">\n <sh-form-field>\n <label>Accept</label>\n <input type=\"text\" [(ngModel)]=\"accept\" />\n </sh-form-field>\n\n <sh-form-field>\n <label>Placeholder</label>\n <input type=\"text\" [(ngModel)]=\"placeholder\" />\n </sh-form-field>\n\n <sh-form-field>\n <label>Overlay Text</label>\n <input type=\"text\" [(ngModel)]=\"overlayText\" />\n </sh-form-field>\n\n <sh-checkbox class=\"primary raised\" [class.active]=\"multiple()\" (click)=\"multiple.set(!multiple())\">\n Multiple\n </sh-checkbox>\n </div>\n</div>\n\n<div class=\"sandbox\">\n <sh-file-upload\n [(files)]=\"files\"\n [multiple]=\"multiple()\"\n [accept]=\"accept()\"\n [placeholder]=\"placeholder()\"\n [overlayText]=\"overlayText()\" />\n</div>\n\n<div class=\"files-list\">\n <h4>Selected Files</h4>\n <ul>\n @for (file of files(); track file.name) {\n <li>{{ file.name }}</li>\n }\n </ul>\n</div>\n",
334
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipCheckbox, ShipFileUpload, ShipFormField } from 'ship-ui';\n\n@Component({\n selector: 'app-file-upload-sandbox',\n standalone: true,\n imports: [FormsModule, ShipFileUpload, ShipCheckbox, ShipFormField],\n templateUrl: './file-upload-sandbox.html',\n styleUrl: './file-upload-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FileUploadSandbox {\n files = signal<File[]>([]);\n multiple = signal<boolean>(true);\n accept = signal<string>('.json,.png');\n placeholder = signal<string>('Click or drag files here');\n overlayText = signal<string>('Drop files here');\n}\n"
335
+ }
336
+ ]
337
+ },
338
+ {
339
+ "name": "ShipTabs",
340
+ "selector": "sh-tabs",
341
+ "path": "projects/ship-ui/src/lib/ship-tabs/ship-tabs.ts",
342
+ "description": "### Colors\n\nTab colors can be set using the\n`color`\nattribute. Available options are:\n**primary**\n,\n**accent**\n,\n**warn**\n,\n**error**\n, and\n**success**\n.",
343
+ "inputs": [
344
+ {
345
+ "name": "color",
346
+ "type": "ShipColor | null",
347
+ "description": "",
348
+ "defaultValue": "null",
349
+ "options": [
350
+ "primary",
351
+ "accent",
352
+ "warn",
353
+ "error",
354
+ "success"
355
+ ]
356
+ },
357
+ {
358
+ "name": "variant",
359
+ "type": "ShipSheetVariant | null",
360
+ "description": "",
361
+ "defaultValue": "null",
362
+ "options": [
363
+ "simple",
364
+ "outlined",
365
+ "flat",
366
+ "raised"
367
+ ]
368
+ }
369
+ ],
370
+ "outputs": [],
371
+ "cssVariables": [
372
+ {
373
+ "name": "--tabs-bc",
374
+ "defaultValue": "var(--base-4)"
375
+ },
376
+ {
377
+ "name": "--tabs-bg",
378
+ "defaultValue": "var(--base-1)"
379
+ },
380
+ {
381
+ "name": "--tabs-c",
382
+ "defaultValue": "var(--base-12)"
383
+ },
384
+ {
385
+ "name": "--tabs-c-hover",
386
+ "defaultValue": "var(--base-8)"
387
+ },
388
+ {
389
+ "name": "--tabs-c-active",
390
+ "defaultValue": "var(--base-12)"
391
+ },
392
+ {
393
+ "name": "--tabs-f",
394
+ "defaultValue": "var(--paragraph-30)"
395
+ },
396
+ {
397
+ "name": "--tabs-sel-bg",
398
+ "defaultValue": "var(--base-12)"
399
+ }
400
+ ],
401
+ "examples": [
402
+ {
403
+ "name": "tabs-sandbox",
404
+ "html": "<div class=\"controls\">\n <p>Controls</p>\n <header>\n <div class=\"row\">\n <sh-button-group class=\"small\">\n <button [class.active]=\"colorClass() === ''\" (click)=\"colorClass.set('')\">Default</button>\n <button [class.active]=\"colorClass() === 'primary'\" (click)=\"colorClass.set('primary')\">Primary</button>\n <button [class.active]=\"colorClass() === 'accent'\" (click)=\"colorClass.set('accent')\">Accent</button>\n <button [class.active]=\"colorClass() === 'warn'\" (click)=\"colorClass.set('warn')\">Warn</button>\n <button [class.active]=\"colorClass() === 'error'\" (click)=\"colorClass.set('error')\">Error</button>\n <button [class.active]=\"colorClass() === 'success'\" (click)=\"colorClass.set('success')\">Success</button>\n </sh-button-group>\n </div>\n </header>\n</div>\n\n<div class=\"sandbox\">\n <sh-tabs [color]=\"colorClass()\">\n <button tab [class.active]=\"activeTab() === 'tab1'\" (click)=\"activeTab.set('tab1')\">\n <sh-icon>spinner</sh-icon>\n Tab 1\n </button>\n <button tab [class.active]=\"activeTab() === 'tab2'\" (click)=\"activeTab.set('tab2')\">\n <sh-icon>hand-palm</sh-icon>\n Tab 2\n </button>\n <button tab [class.active]=\"activeTab() === 'tab3'\" (click)=\"activeTab.set('tab3')\">\n <sh-icon>check</sh-icon>\n Tab 3\n </button>\n </sh-tabs>\n\n @let _activeTab = activeTab();\n\n <div class=\"tab-content\">\n @if (_activeTab === 'tab1') {\n <app-tab [id]=\"_activeTab\"></app-tab>\n } @else if (_activeTab === 'tab2') {\n <app-tab [id]=\"_activeTab\"></app-tab>\n } @else if (_activeTab === 'tab3') {\n <app-tab [id]=\"_activeTab\"></app-tab>\n }\n </div>\n</div>\n",
405
+ "ts": "import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport { ShipButtonGroup, ShipIcon, ShipTabs } from 'ship-ui';\nimport Tab from '../../tab/tab';\n\n@Component({\n selector: 'app-tabs-sandbox',\n standalone: true,\n imports: [ShipTabs, ShipIcon, ShipButtonGroup, Tab],\n templateUrl: './tabs-sandbox.html',\n styleUrl: './tabs-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TabsSandbox {\n colorClass = signal<'' | 'primary' | 'accent' | 'warn' | 'error' | 'success'>('');\n tabsClass = computed(() => (this.colorClass() === '' ? '' : this.colorClass()));\n activeTab = signal('tab1');\n}\n"
406
+ },
407
+ {
408
+ "name": "custom-tabs",
409
+ "html": "<sh-tabs class=\"primary\">\n <div tab [class.active]=\"activeTab() === 'tab1'\" (click)=\"activeTab.set('tab1')\">\n <sh-icon>spinner</sh-icon>\n Tab 1\n </div>\n <div tab [class.active]=\"activeTab() === 'tab2'\" (click)=\"activeTab.set('tab2')\">\n <sh-icon>hand-palm</sh-icon>\n Tab 2\n </div>\n <div tab [class.active]=\"activeTab() === 'tab3'\" (click)=\"activeTab.set('tab3')\">\n <sh-icon>check</sh-icon>\n Tab 3\n </div>\n</sh-tabs>\n\n@let _activeTab = activeTab();\n\n<div class=\"tab-content\">\n @if (_activeTab === 'tab1') {\n <app-tab [id]=\"_activeTab\"></app-tab>\n } @else if (_activeTab === 'tab2') {\n <app-tab [id]=\"_activeTab\"></app-tab>\n } @else if (_activeTab === 'tab3') {\n <app-tab [id]=\"_activeTab\"></app-tab>\n }\n</div>\n",
410
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipIcon, ShipTabs } from 'ship-ui';\nimport Tab from '../../tab/tab';\n\n@Component({\n selector: 'app-custom-tabs',\n standalone: true,\n imports: [ShipTabs, ShipIcon, Tab],\n templateUrl: './custom-tabs.html',\n styleUrls: ['./custom-tabs.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CustomTabsComponent {\n activeTab = signal('tab1');\n}\n"
411
+ },
412
+ {
413
+ "name": "router-tabs",
414
+ "html": "<sh-tabs class=\"primary\">\n <button routerLink=\"/tabs/tab/1\" routerLinkActive=\"active\">\n <sh-icon>spinner</sh-icon>\n Tab 1\n </button>\n\n <button routerLink=\"/tabs/tab/2\" routerLinkActive=\"active\">\n <sh-icon>hand-palm</sh-icon>\n Tab 2\n </button>\n\n <button routerLink=\"/tabs/tab/3\" routerLinkActive=\"active\">\n <sh-icon>check</sh-icon>\n Tab 3\n </button>\n</sh-tabs>\n",
415
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { ShipIcon, ShipTabs } from 'ship-ui';\n\n@Component({\n selector: 'app-router-tabs',\n imports: [ShipTabs, ShipIcon, RouterLinkActive, RouterLink],\n templateUrl: './router-tabs.html',\n styleUrl: './router-tabs.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RouterTabsComponent {}\n"
416
+ },
417
+ {
418
+ "name": "default-tabs",
419
+ "html": "<sh-tabs color=\"primary\">\n <button [class.active]=\"activeTab() === 'tab1'\" (click)=\"activeTab.set('tab1')\">\n <sh-icon>spinner</sh-icon>\n Tab 1\n </button>\n <button [class.active]=\"activeTab() === 'tab2'\" (click)=\"activeTab.set('tab2')\">\n <sh-icon>hand-palm</sh-icon>\n Tab 2\n </button>\n <button [class.active]=\"activeTab() === 'tab3'\" (click)=\"activeTab.set('tab3')\">\n <sh-icon>check</sh-icon>\n Tab 3\n </button>\n</sh-tabs>\n\n@let _activeTab = activeTab();\n\n<div class=\"tab-content\">\n @if (_activeTab === 'tab1') {\n <app-tab [id]=\"_activeTab\"></app-tab>\n } @else if (_activeTab === 'tab2') {\n <app-tab [id]=\"_activeTab\"></app-tab>\n } @else if (_activeTab === 'tab3') {\n <app-tab [id]=\"_activeTab\"></app-tab>\n }\n</div>\n",
420
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipIcon, ShipTabs } from 'ship-ui';\nimport Tab from '../../tab/tab';\n\n@Component({\n selector: 'app-default-tabs',\n standalone: true,\n imports: [ShipTabs, ShipIcon, Tab],\n templateUrl: './default-tabs.html',\n styleUrls: ['./default-tabs.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DefaultTabsComponent {\n activeTab = signal('tab1');\n}\n"
421
+ }
422
+ ]
423
+ },
424
+ {
425
+ "name": "ShipVirtualScroll",
426
+ "selector": "sh-virtual-scroll",
427
+ "path": "projects/ship-ui/src/lib/ship-virtual-scroll/ship-virtual-scroll.component.ts",
428
+ "description": "",
429
+ "inputs": [],
430
+ "outputs": [],
431
+ "cssVariables": [],
432
+ "examples": []
433
+ },
434
+ {
435
+ "name": "ShipProgressBar",
436
+ "selector": "sh-progress-bar",
437
+ "path": "projects/ship-ui/src/lib/ship-progress-bar/ship-progress-bar.ts",
438
+ "description": "### Variants\n\nProgress bar variants can be set using the\n`variant`\nattribute. Available variants:\n**base**\n,\n**flat**\n,\n**outlined**\n, and\n**raised**\n.\n\n### Colors\n\nProgress bar colors can be set using the\n`color`\nattribute. Available colors:\n**primary**\n,\n**accent**\n,\n**warn**\n,\n**error**\n, and\n**success**\n.\n\n### Disabled\n\nThe progress bar can be disabled using the standard\n`disabled`\nattribute or\n`[disabled]`\nbinding.",
439
+ "inputs": [
440
+ {
441
+ "name": "value",
442
+ "type": "number | undefined",
443
+ "description": "",
444
+ "defaultValue": "undefined"
445
+ },
446
+ {
447
+ "name": "color",
448
+ "type": "ShipColor | null",
449
+ "description": "",
450
+ "defaultValue": "null",
451
+ "options": [
452
+ "primary",
453
+ "accent",
454
+ "warn",
455
+ "error",
456
+ "success"
457
+ ]
458
+ },
459
+ {
460
+ "name": "variant",
461
+ "type": "ShipSheetVariant | null",
462
+ "description": "",
463
+ "defaultValue": "null",
464
+ "options": [
465
+ "simple",
466
+ "outlined",
467
+ "flat",
468
+ "raised"
469
+ ]
470
+ }
471
+ ],
472
+ "outputs": [],
473
+ "cssVariables": [
474
+ {
475
+ "name": "--pb-h",
476
+ "defaultValue": "#{p2r(8)}"
477
+ },
478
+ {
479
+ "name": "--pb-b",
480
+ "defaultValue": "var(--base-4)"
481
+ },
482
+ {
483
+ "name": "--pb-bg",
484
+ "defaultValue": "var(--base-2)"
485
+ },
486
+ {
487
+ "name": "--pb-br",
488
+ "defaultValue": "var(--shape-2)"
489
+ },
490
+ {
491
+ "name": "--pbt-bg",
492
+ "defaultValue": "var(--base-6)"
493
+ },
494
+ {
495
+ "name": "--pbt-br",
496
+ "defaultValue": "inherit"
497
+ }
498
+ ],
499
+ "examples": [
500
+ {
501
+ "name": "flat-progress-bar",
502
+ "html": "<sh-progress-bar variant=\"flat\" [value]=\"10\" />\n<sh-progress-bar variant=\"flat\" color=\"primary\" [value]=\"25\" />\n<sh-progress-bar variant=\"flat\" color=\"accent\" [value]=\"50\" />\n<sh-progress-bar variant=\"flat\" color=\"warn\" [value]=\"75\" />\n<sh-progress-bar variant=\"flat\" color=\"error\" [value]=\"90\" />\n<sh-progress-bar variant=\"flat\" color=\"success\" [value]=\"100\" />\n",
503
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipProgressBar } from 'ship-ui';\n\n@Component({\n selector: 'app-flat-progress-bar',\n standalone: true,\n imports: [ShipProgressBar],\n templateUrl: './flat-progress-bar.html',\n styleUrl: './flat-progress-bar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FlatProgressBar {}\n"
504
+ },
505
+ {
506
+ "name": "indeterminte-progress-bar",
507
+ "html": "<sh-progress-bar class=\"indeterminate\" />\n<sh-progress-bar class=\"indeterminate\" color=\"primary\" />\n<sh-progress-bar class=\"indeterminate\" color=\"accent\" />\n<sh-progress-bar class=\"indeterminate\" color=\"warn\" />\n<sh-progress-bar class=\"indeterminate\" color=\"error\" />\n<sh-progress-bar class=\"indeterminate\" color=\"success\" />\n",
508
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipProgressBar } from 'ship-ui';\n\n@Component({\n selector: 'app-indeterminte-progress-bar',\n imports: [ShipProgressBar],\n templateUrl: './indeterminte-progress-bar.html',\n styleUrl: './indeterminte-progress-bar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IndeterminteProgressBar {}\n"
509
+ },
510
+ {
511
+ "name": "outlined-progress-bar",
512
+ "html": "<sh-progress-bar variant=\"outlined\" [value]=\"10\" />\n<sh-progress-bar variant=\"outlined\" color=\"primary\" [value]=\"25\" />\n<sh-progress-bar variant=\"outlined\" color=\"accent\" [value]=\"50\" />\n<sh-progress-bar variant=\"outlined\" color=\"warn\" [value]=\"75\" />\n<sh-progress-bar variant=\"outlined\" color=\"error\" [value]=\"90\" />\n<sh-progress-bar variant=\"outlined\" color=\"success\" [value]=\"100\" />\n",
513
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipProgressBar } from 'ship-ui';\n\n@Component({\n selector: 'app-outlined-progress-bar',\n standalone: true,\n imports: [ShipProgressBar],\n templateUrl: './outlined-progress-bar.html',\n styleUrl: './outlined-progress-bar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OutlinedProgressBar {}\n"
514
+ },
515
+ {
516
+ "name": "base-progress-bar",
517
+ "html": "<sh-progress-bar [value]=\"10\" />\n<sh-progress-bar color=\"primary\" [value]=\"25\" />\n<sh-progress-bar color=\"accent\" [value]=\"50\" />\n<sh-progress-bar color=\"warn\" [value]=\"75\" />\n<sh-progress-bar color=\"error\" [value]=\"90\" />\n<sh-progress-bar color=\"success\" [value]=\"100\" />\n",
518
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipProgressBar } from 'ship-ui';\n\n@Component({\n selector: 'app-base-progress-bar',\n standalone: true,\n imports: [ShipProgressBar],\n templateUrl: './base-progress-bar.html',\n styleUrl: './base-progress-bar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseProgressBar {}\n"
519
+ },
520
+ {
521
+ "name": "raised-progress-bar",
522
+ "html": "<sh-progress-bar variant=\"raised\" [value]=\"10\" />\n<sh-progress-bar variant=\"raised\" color=\"primary\" [value]=\"25\" />\n<sh-progress-bar variant=\"raised\" color=\"accent\" [value]=\"50\" />\n<sh-progress-bar variant=\"raised\" color=\"warn\" [value]=\"75\" />\n<sh-progress-bar variant=\"raised\" color=\"error\" [value]=\"90\" />\n<sh-progress-bar variant=\"raised\" color=\"success\" [value]=\"100\" />\n",
523
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipProgressBar } from 'ship-ui';\n\n@Component({\n selector: 'app-raised-progress-bar',\n standalone: true,\n imports: [ShipProgressBar],\n templateUrl: './raised-progress-bar.html',\n styleUrl: './raised-progress-bar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RaisedProgressBar {}\n"
524
+ }
525
+ ]
526
+ },
527
+ {
528
+ "name": "ShipSortable",
529
+ "selector": "[shSortable]",
530
+ "path": "projects/ship-ui/src/lib/ship-sortable/ship-sortable.ts",
531
+ "description": "### Enable Sorting\n\nApply the\n`shSortable`\ndirective to a\n`sh-list`\nor any container element to enable drag-and-drop reordering.\n\n### Event Handling\n\nListen to the\n`afterDrop`\nevent to update your data source when an item is moved:\n`(afterDrop)=\"reorder($event)\"`\n.\n\n### Handles\n\nAdd the\n`sort-handle`\nattribute to a specific element within a sortable item to limit dragging to that specific area.",
532
+ "inputs": [],
533
+ "outputs": [
534
+ {
535
+ "name": "afterDrop",
536
+ "type": "AfterDropResponse",
537
+ "description": ""
538
+ }
539
+ ],
540
+ "cssVariables": [],
541
+ "examples": [
542
+ {
543
+ "name": "base-sortable",
544
+ "html": "<sh-list shSortable (afterDrop)=\"reorderTodo($event)\">\n @for (todo of todos(); track $index) {\n <div item [draggable]=\"true\" [class.active]=\"todo.done\" (click)=\"toggleTodo($index)\">\n <sh-checkbox [class.active]=\"todo.done\" class=\"primary raised\" />\n\n @if (todo.done) {\n <s>{{ todo.title }}</s>\n } @else {\n {{ todo.title }}\n }\n </div>\n }\n</sh-list>\n",
545
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { AfterDropResponse, moveIndex, ShipCheckbox, ShipList, ShipSortable } from 'ship-ui';\n\nconst TODOS = [\n {\n title: 'Simple sorting of list',\n done: true,\n },\n {\n title: 'Sorting animation',\n done: true,\n },\n {\n title: 'Support sortable handle',\n done: true,\n },\n {\n title: 'Support gap in sorting list ',\n done: true,\n },\n {\n title: 'Support placeholder',\n done: true,\n },\n {\n title: 'Support animation only when dragging',\n done: true,\n },\n {\n title: 'Support multiple lists',\n done: false,\n },\n {\n title: 'Support draggable grids',\n done: false,\n },\n];\n\ntype Todo = (typeof TODOS)[0];\n\n@Component({\n selector: 'app-base-sortable',\n standalone: true,\n imports: [ShipList, ShipSortable, ShipCheckbox],\n templateUrl: './base-sortable.html',\n styleUrl: './base-sortable.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseSortable {\n todos = signal(TODOS);\n\n toggleTodo(index: number) {\n this.todos.update((todos) => {\n todos[index].done = !todos[index].done;\n\n return todos;\n });\n }\n\n reorderTodo(event: AfterDropResponse) {\n this.todos.update((arr) => moveIndex<Todo>(arr, event));\n }\n}\n"
546
+ }
547
+ ]
548
+ },
549
+ {
550
+ "name": "GridSortable",
551
+ "selector": "[shGridSortable]",
552
+ "path": "projects/ship-ui/src/lib/ship-sortable/grid-sortable.ts",
553
+ "description": "### Enable Sorting\n\nApply the\n`shSortable`\ndirective to a\n`sh-list`\nor any container element to enable drag-and-drop reordering.\n\n### Event Handling\n\nListen to the\n`afterDrop`\nevent to update your data source when an item is moved:\n`(afterDrop)=\"reorder($event)\"`\n.\n\n### Handles\n\nAdd the\n`sort-handle`\nattribute to a specific element within a sortable item to limit dragging to that specific area.",
554
+ "inputs": [],
555
+ "outputs": [],
556
+ "cssVariables": [],
557
+ "examples": [
558
+ {
559
+ "name": "base-sortable",
560
+ "html": "<sh-list shSortable (afterDrop)=\"reorderTodo($event)\">\n @for (todo of todos(); track $index) {\n <div item [draggable]=\"true\" [class.active]=\"todo.done\" (click)=\"toggleTodo($index)\">\n <sh-checkbox [class.active]=\"todo.done\" class=\"primary raised\" />\n\n @if (todo.done) {\n <s>{{ todo.title }}</s>\n } @else {\n {{ todo.title }}\n }\n </div>\n }\n</sh-list>\n",
561
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { AfterDropResponse, moveIndex, ShipCheckbox, ShipList, ShipSortable } from 'ship-ui';\n\nconst TODOS = [\n {\n title: 'Simple sorting of list',\n done: true,\n },\n {\n title: 'Sorting animation',\n done: true,\n },\n {\n title: 'Support sortable handle',\n done: true,\n },\n {\n title: 'Support gap in sorting list ',\n done: true,\n },\n {\n title: 'Support placeholder',\n done: true,\n },\n {\n title: 'Support animation only when dragging',\n done: true,\n },\n {\n title: 'Support multiple lists',\n done: false,\n },\n {\n title: 'Support draggable grids',\n done: false,\n },\n];\n\ntype Todo = (typeof TODOS)[0];\n\n@Component({\n selector: 'app-base-sortable',\n standalone: true,\n imports: [ShipList, ShipSortable, ShipCheckbox],\n templateUrl: './base-sortable.html',\n styleUrl: './base-sortable.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseSortable {\n todos = signal(TODOS);\n\n toggleTodo(index: number) {\n this.todos.update((todos) => {\n todos[index].done = !todos[index].done;\n\n return todos;\n });\n }\n\n reorderTodo(event: AfterDropResponse) {\n this.todos.update((arr) => moveIndex<Todo>(arr, event));\n }\n}\n"
562
+ }
563
+ ]
564
+ },
565
+ {
566
+ "name": "ShipFormField",
567
+ "selector": "sh-form-field",
568
+ "path": "projects/ship-ui/src/lib/ship-form-field/ship-form-field.ts",
569
+ "description": "### label\n\nOptional label for the form field. Can include icons or other elements.\n\n### prefix/suffix\n\nProject content before or after the input using\n`prefix`\nor\n`suffix`\nslots.\n\n### placeholder\n\nPlaceholder text for the input or textarea.\n\n### boxPref/boxSuffix\n\nProject content before or after the input but inside a box style\n`boxPrefix`\nor\n`boxSuffix`\nslots.\n\n### hint\n\nOptional hint text shown below the input.\n\n### error\n\nOptional error text shown below the input when in error state.\n\n### disabled\n\nDisables the input or textarea.\n\n### size/class\n\nUse\n`small`\n,\n`autosize`\n,\n`center`\nclasses for different layouts.",
570
+ "inputs": [
571
+ {
572
+ "name": "color",
573
+ "type": "ShipColor | null",
574
+ "description": "",
575
+ "defaultValue": "null",
576
+ "options": [
577
+ "primary",
578
+ "accent",
579
+ "warn",
580
+ "error",
581
+ "success"
582
+ ]
583
+ },
584
+ {
585
+ "name": "variant",
586
+ "type": "ShipSheetVariant | null",
587
+ "description": "",
588
+ "defaultValue": "null",
589
+ "options": [
590
+ "simple",
591
+ "outlined",
592
+ "flat",
593
+ "raised"
594
+ ]
595
+ },
596
+ {
597
+ "name": "size",
598
+ "type": "ShipSize | null",
599
+ "description": "",
600
+ "defaultValue": "null",
601
+ "options": [
602
+ "small"
603
+ ]
604
+ },
605
+ {
606
+ "name": "readonly",
607
+ "type": "boolean",
608
+ "description": "",
609
+ "defaultValue": "false"
610
+ }
611
+ ],
612
+ "outputs": [],
613
+ "cssVariables": [
614
+ {
615
+ "name": "--ff-space",
616
+ "defaultValue": "#{p2r(7 10)}"
617
+ },
618
+ {
619
+ "name": "--ff-input-space",
620
+ "defaultValue": "#{p2r(6 10)}"
621
+ },
622
+ {
623
+ "name": "--ff-f",
624
+ "defaultValue": "var(--paragraph-40B)"
625
+ },
626
+ {
627
+ "name": "--ff-s",
628
+ "defaultValue": "var(--shape-2)"
629
+ },
630
+ {
631
+ "name": "--ff-bc",
632
+ "defaultValue": "var(--base-4)"
633
+ },
634
+ {
635
+ "name": "--ff-boxfix-bg",
636
+ "defaultValue": "var(--base-2)"
637
+ },
638
+ {
639
+ "name": "--ff-suffix-bg",
640
+ "defaultValue": "transparent"
641
+ },
642
+ {
643
+ "name": "--ff-ic",
644
+ "defaultValue": "var(--base-11)"
645
+ },
646
+ {
647
+ "name": "--ff-bg",
648
+ "defaultValue": "var(--base-1)"
649
+ },
650
+ {
651
+ "name": "--ff-spinner-size",
652
+ "defaultValue": "#{p2r(20)}"
653
+ },
654
+ {
655
+ "name": "--ff-spinner-thickness",
656
+ "defaultValue": "#{p2r(2)}"
657
+ },
658
+ {
659
+ "name": "--ff-mw",
660
+ "defaultValue": "auto"
661
+ },
662
+ {
663
+ "name": "--ff-bs",
664
+ "defaultValue": "var(--box-shadow-10)"
665
+ },
666
+ {
667
+ "name": "--spinner-size",
668
+ "defaultValue": "var(--ff-spinner-size)"
669
+ },
670
+ {
671
+ "name": "--spinner-thickness",
672
+ "defaultValue": "var(--ff-spinner-thickness)"
673
+ }
674
+ ],
675
+ "examples": [
676
+ {
677
+ "name": "experimental-form-field",
678
+ "html": "<section>\n <sh-form-field-experimental>\n <label>ReactiveFormsField: {{ reactiveFormValue() }}</label>\n <input placeholder=\"Placeholder no label...\" type=\"text\" [formControl]=\"reactiveFormControl\" />\n </sh-form-field-experimental>\n\n <sh-form-field-experimental>\n <label>NgModel: {{ ngModelControl() }}</label>\n <input placeholder=\"Placeholder no label...\" type=\"text\" [(ngModel)]=\"ngModelControl\" />\n </sh-form-field-experimental>\n</section>\n",
679
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { ShipFormFieldExperimental } from 'ship-ui';\n\n@Component({\n selector: 'app-experimental-form-field',\n imports: [ShipFormFieldExperimental, FormsModule, ReactiveFormsModule],\n templateUrl: './experimental-form-field.html',\n styleUrl: './experimental-form-field.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class ExperimentalFormField {\n reactiveFormControl = new FormControl('reactive hello');\n ngModelControl = signal('yellow');\n\n reactiveFormValue = toSignal(this.reactiveFormControl.valueChanges);\n\n ngOnInit() {\n setTimeout(() => {\n this.reactiveFormControl.setValue('123 reactive');\n this.ngModelControl.set('678 ngModel');\n }, 5000);\n }\n}\n"
680
+ },
681
+ {
682
+ "name": "base-form-field",
683
+ "html": "<sh-form-field>\n <input placeholder=\"Placeholder no label...\" type=\"text\" />\n <div boxPrefix>\n Hello\n <sh-icon>circle</sh-icon>\n </div>\n\n <div boxSuffix>hello 123</div>\n</sh-form-field>\n\n<sh-form-field>\n <input placeholder=\"Placeholder no label...\" />\n <sh-icon prefix>circle</sh-icon>\n\n <ng-container suffix>hello 123</ng-container>\n</sh-form-field>\n\n<sh-form-field variant=\"autosize\">\n <input type=\"time\" />\n <div boxPrefix>\n <sh-icon>clock</sh-icon>\n </div>\n</sh-form-field>\n\n<sh-form-field>\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input placeholder=\"Placeholder...\" />\n</sh-form-field>\n\n<sh-form-field>\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input placeholder=\"Placeholder...\" />\n <sh-icon prefix>circle</sh-icon>\n <sh-icon>circle</sh-icon>\n</sh-form-field>\n\n<sh-icon>circle</sh-icon>\n\n<sh-form-field>\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input [formControl]=\"disabledCtrl\" placeholder=\"Placeholder...\" />\n <sh-icon prefix>circle</sh-icon>\n <sh-icon>circle</sh-icon>\n</sh-form-field>\n\n<sh-form-field>\n <label>\n Label\n <sh-icon>question</sh-icon>\n <sh-icon class=\"error\" shTooltip=\"hello world\">acorn-bold</sh-icon>\n </label>\n <input [formControl]=\"baseCtrl\" placeholder=\"Placeholder...\" #input />\n <span hint>Hint</span>\n\n <span hint>{{ baseCtrl.value?.length ?? 0 }}/10</span>\n\n @if ((baseCtrl.value?.length ?? 0) > 10) {\n <span error>Write a message in this alert area</span>\n }\n</sh-form-field>\n\n<sh-form-field>\n <label>\n Error without hint\n <sh-icon>question</sh-icon>\n </label>\n\n <input placeholder=\"Placeholder with error ...\" [formControl]=\"errorCtrl1\" />\n\n <sh-icon prefix>circle</sh-icon>\n <sh-icon suffix>circle</sh-icon>\n\n @if (errorCtrl1.invalid && errorCtrl1.touched) {\n <span error>Write a message in this alert area</span>\n }\n</sh-form-field>\n\n<sh-form-field>\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n\n <input placeholder=\"Placeholder with error ...\" [formControl]=\"errorCtrl\" />\n\n <sh-icon prefix>circle</sh-icon>\n <sh-icon suffix>circle</sh-icon>\n\n @if (errorCtrl.invalid && errorCtrl.touched) {\n <span error>Write a message in this alert area</span>\n }\n\n <span hint>{{ errorCtrl.value?.length ?? 0 }}/10</span>\n</sh-form-field>\n\n<sh-form-field variant=\"autosize\" size=\"center\">\n <label>\n Number without suffix auto\n <sh-icon>question</sh-icon>\n </label>\n <input type=\"number\" placeholder=\"0\" />\n <sh-icon prefix>circle</sh-icon>\n <span textPrefix>Hello</span>\n</sh-form-field>\n\n<sh-form-field variant=\"autosize\" size=\"center\">\n <label>\n Number without suffix\n <sh-icon>question</sh-icon>\n </label>\n <input type=\"number\" placeholder=\"0\" />\n</sh-form-field>\n\n<sh-form-field variant=\"auto-width\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input type=\"number\" placeholder=\"0\" />\n <sh-icon prefix>circle</sh-icon>\n <span textPrefix>Hello</span>\n <span textSuffix>.00</span>\n</sh-form-field>\n\n<sh-form-field>\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input type=\"number\" placeholder=\"0\" />\n <span textPrefix>$&nbsp;</span>\n <span textSuffix>.00</span>\n</sh-form-field>\n\n<sh-form-field>\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input [formControl]=\"disabledCtrl\" type=\"number\" placeholder=\"0\" />\n <span textPrefix>$&nbsp;</span>\n <span textSuffix>.00</span>\n</sh-form-field>\n\n<sh-form-field>\n <label>Textarea</label>\n <textarea></textarea>\n</sh-form-field>\n\n<sh-form-field>\n <label>Textarea</label>\n <textarea>\nwith some value very long text with some value very long text with some value very long text with some value very long text with some value very long text </textarea\n >\n</sh-form-field>\n\n<sh-form-field>\n <label>Textarea</label>\n <textarea [formControl]=\"disabledCtrl\"></textarea>\n</sh-form-field>\n",
684
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { ShipFormField, ShipIcon, ShipTooltip } from 'ship-ui';\n\n@Component({\n selector: 'app-base-form-field',\n imports: [ShipFormField, ShipIcon, ShipTooltip, FormsModule, ReactiveFormsModule],\n templateUrl: './base-form-field.html',\n styleUrl: './base-form-field.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseFormFieldComponent {\n baseCtrl = new FormControl('');\n disabledCtrl = new FormControl({ value: '', disabled: true });\n errorCtrl = new FormControl('', [Validators.required]);\n errorCtrl1 = new FormControl('', [Validators.required, Validators.minLength(10)]);\n\n ngOnInit() {\n this.errorCtrl.markAsTouched();\n this.errorCtrl.markAsDirty();\n }\n}\n"
685
+ },
686
+ {
687
+ "name": "form-field-sandbox",
688
+ "html": "<div class=\"controls\">\n <div class=\"row\">\n <sh-checkbox color=\"primary\" variant=\"raised\" [class.active]=\"showLabel()\" (click)=\"showLabel.set(!showLabel())\">\n Label\n </sh-checkbox>\n <sh-checkbox color=\"primary\" variant=\"raised\" [class.active]=\"showPrefix()\" (click)=\"showPrefix.set(!showPrefix())\">\n Prefix\n </sh-checkbox>\n <sh-checkbox color=\"primary\" variant=\"raised\" [class.active]=\"showSuffix()\" (click)=\"showSuffix.set(!showSuffix())\">\n Suffix\n </sh-checkbox>\n <sh-checkbox color=\"primary\" variant=\"raised\" [class.active]=\"showHint()\" (click)=\"showHint.set(!showHint())\">\n Hint\n </sh-checkbox>\n <sh-checkbox color=\"primary\" variant=\"raised\" [class.active]=\"showError()\" (click)=\"showError.set(!showError())\">\n Error\n </sh-checkbox>\n <sh-checkbox color=\"primary\" variant=\"raised\" [class.active]=\"disabled()\" (click)=\"disabled.set(!disabled())\">\n Disabled\n </sh-checkbox>\n </div>\n\n <div class=\"row\">\n <sh-button-group class=\"small\">\n <button type=\"button\" [class.active]=\"inputType() === 'text'\" (click)=\"inputType.set('text')\">Text</button>\n <button type=\"button\" [class.active]=\"inputType() === 'number'\" (click)=\"inputType.set('number')\">Number</button>\n <button type=\"button\" [class.active]=\"inputType() === 'textarea'\" (click)=\"inputType.set('textarea')\">\n Textarea\n </button>\n </sh-button-group>\n\n <sh-button-group class=\"small\">\n <button type=\"button\" [class.active]=\"size() === ''\" (click)=\"size.set('')\">Default</button>\n <button type=\"button\" [class.active]=\"size() === 'small'\" (click)=\"size.set('small')\">Small</button>\n <button type=\"button\" [class.active]=\"size() === 'autosize'\" (click)=\"size.set('autosize')\">Autosize</button>\n <button type=\"button\" [class.active]=\"size() === 'center'\" (click)=\"size.set('center')\">Center</button>\n </sh-button-group>\n </div>\n <div class=\"row\">\n @if (showLabel()) {\n <sh-form-field><input [(ngModel)]=\"label\" placeholder=\"Label text\" /></sh-form-field>\n }\n @if (showPrefix()) {\n <sh-form-field><input [(ngModel)]=\"prefix\" placeholder=\"Prefix content\" /></sh-form-field>\n }\n @if (showSuffix()) {\n <sh-form-field><input [(ngModel)]=\"suffix\" placeholder=\"Suffix content\" /></sh-form-field>\n }\n @if (showHint()) {\n <sh-form-field><input [(ngModel)]=\"hint\" placeholder=\"Hint text\" /></sh-form-field>\n }\n @if (showError()) {\n <sh-form-field><input [(ngModel)]=\"error\" placeholder=\"Error text\" /></sh-form-field>\n }\n <sh-form-field><input [(ngModel)]=\"placeholder\" placeholder=\"Placeholder\" /></sh-form-field>\n </div>\n</div>\n\n<div class=\"sandbox\">\n <sh-form-field [variant]=\"size()\">\n @if (showLabel()) {\n <label>{{ label() }}</label>\n }\n @if (showPrefix()) {\n <ng-container prefix>{{ prefix() }}</ng-container>\n }\n @if (showSuffix()) {\n <ng-container suffix>{{ suffix() }}</ng-container>\n }\n @if (inputType() === 'text') {\n <input [placeholder]=\"placeholder()\" [(ngModel)]=\"value\" [disabled]=\"disabled()\" />\n } @else if (inputType() === 'number') {\n <input type=\"number\" [placeholder]=\"placeholder()\" [(ngModel)]=\"value\" [disabled]=\"disabled()\" />\n } @else if (inputType() === 'textarea') {\n <textarea [placeholder]=\"placeholder()\" [(ngModel)]=\"value\" [disabled]=\"disabled()\"></textarea>\n }\n @if (showHint()) {\n <span hint>{{ hint() }}</span>\n }\n @if (showError()) {\n <span error>{{ error() }}</span>\n }\n </sh-form-field>\n</div>\n",
689
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipButtonGroup, ShipCheckbox, ShipFormField } from 'ship-ui';\n\n@Component({\n selector: 'app-form-field-sandbox',\n standalone: true,\n imports: [FormsModule, ShipFormField, ShipButtonGroup, ShipCheckbox],\n templateUrl: './form-field-sandbox.html',\n styleUrl: './form-field-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormFieldSandbox {\n label = signal<string>('Label');\n showLabel = signal<boolean>(true);\n prefix = signal<string>('');\n showPrefix = signal<boolean>(false);\n suffix = signal<string>('');\n showSuffix = signal<boolean>(false);\n placeholder = signal<string>('Placeholder...');\n hint = signal<string>('');\n showHint = signal<boolean>(false);\n error = signal<string>('');\n showError = signal<boolean>(false);\n disabled = signal<boolean>(false);\n inputType = signal<'text' | 'number' | 'textarea'>('text');\n size = signal<string>(''); // '', 'small', 'autosize', etc.\n value = signal<string>('');\n}\n"
690
+ },
691
+ {
692
+ "name": "small-form-field",
693
+ "html": "<sh-form-field class=\"small\">\n <input placeholder=\"Placeholder no label...\" />\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input placeholder=\"Placeholder...\" />\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input placeholder=\"Placeholder...\" />\n <sh-icon prefix>circle</sh-icon>\n <sh-icon>circle</sh-icon>\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input [formControl]=\"disabledCtrl\" placeholder=\"Placeholder...\" />\n <sh-icon prefix>circle</sh-icon>\n <sh-icon>circle</sh-icon>\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input [formControl]=\"baseCtrl\" placeholder=\"Placeholder...\" #input />\n <span hint>Hint</span>\n\n <span hint>{{ baseCtrl.value?.length ?? 0 }}/10</span>\n\n @if ((baseCtrl.value?.length ?? 0) > 10) {\n <span error>Write a message in this alert area</span>\n }\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n\n <input placeholder=\"Placeholder with error ...\" [formControl]=\"errorCtrl\" />\n\n <sh-icon prefix>circle</sh-icon>\n <sh-icon suffix>circle</sh-icon>\n\n @if (errorCtrl.invalid && errorCtrl.touched) {\n <span error>Write a message in this alert area</span>\n }\n\n <span hint>{{ errorCtrl.value?.length ?? 0 }}/10</span>\n</sh-form-field>\n\n<sh-form-field class=\"small center autosize\">\n <label>\n Number without suffix\n <sh-icon>question</sh-icon>\n </label>\n <input type=\"number\" placeholder=\"0\" />\n <sh-icon prefix>circle</sh-icon>\n <span textPrefix>Hello</span>\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input type=\"number\" placeholder=\"0\" />\n <sh-icon prefix>circle</sh-icon>\n <span textPrefix>Hello</span>\n <span textSuffix>.00</span>\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input type=\"number\" placeholder=\"0\" />\n <span textPrefix>$&nbsp;</span>\n <span textSuffix>.00</span>\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input [formControl]=\"disabledCtrl\" type=\"number\" placeholder=\"0\" />\n <span textPrefix>$&nbsp;</span>\n <span textSuffix>.00</span>\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>Textarea</label>\n <textarea></textarea>\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>Textarea</label>\n <textarea>\nwith some value very long text with some value very long text with some value very long text with some value very long text with some value very long text </textarea\n >\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>Textarea</label>\n <textarea [formControl]=\"disabledCtrl\"></textarea>\n</sh-form-field>\n",
694
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { ShipFormField, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-small-form-field',\n imports: [ShipFormField, ShipIcon, FormsModule, ReactiveFormsModule],\n templateUrl: './small-form-field.html',\n styleUrl: './small-form-field.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SmallFormField {\n baseCtrl = new FormControl('');\n disabledCtrl = new FormControl({ value: '', disabled: true });\n errorCtrl = new FormControl('', [Validators.required]);\n errorCtrl1 = new FormControl('', [Validators.required, Validators.minLength(10)]);\n\n ngOnInit() {\n this.errorCtrl.markAsTouched();\n this.errorCtrl.markAsDirty();\n }\n}\n"
695
+ }
696
+ ]
697
+ },
698
+ {
699
+ "name": "ShipFormFieldPopover",
700
+ "selector": "sh-form-field-popover",
701
+ "path": "projects/ship-ui/src/lib/ship-form-field/ship-form-field-popover.ts",
702
+ "description": "### label\n\nOptional label for the form field. Can include icons or other elements.\n\n### prefix/suffix\n\nProject content before or after the input using\n`prefix`\nor\n`suffix`\nslots.\n\n### placeholder\n\nPlaceholder text for the input or textarea.\n\n### boxPref/boxSuffix\n\nProject content before or after the input but inside a box style\n`boxPrefix`\nor\n`boxSuffix`\nslots.\n\n### hint\n\nOptional hint text shown below the input.\n\n### error\n\nOptional error text shown below the input when in error state.\n\n### disabled\n\nDisables the input or textarea.\n\n### size/class\n\nUse\n`small`\n,\n`autosize`\n,\n`center`\nclasses for different layouts.",
703
+ "inputs": [
704
+ {
705
+ "name": "isOpen",
706
+ "type": "boolean",
707
+ "description": "",
708
+ "defaultValue": "false"
709
+ }
710
+ ],
711
+ "outputs": [
712
+ {
713
+ "name": "closed",
714
+ "type": "void",
715
+ "description": ""
716
+ }
717
+ ],
718
+ "cssVariables": [],
719
+ "examples": [
720
+ {
721
+ "name": "experimental-form-field",
722
+ "html": "<section>\n <sh-form-field-experimental>\n <label>ReactiveFormsField: {{ reactiveFormValue() }}</label>\n <input placeholder=\"Placeholder no label...\" type=\"text\" [formControl]=\"reactiveFormControl\" />\n </sh-form-field-experimental>\n\n <sh-form-field-experimental>\n <label>NgModel: {{ ngModelControl() }}</label>\n <input placeholder=\"Placeholder no label...\" type=\"text\" [(ngModel)]=\"ngModelControl\" />\n </sh-form-field-experimental>\n</section>\n",
723
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { ShipFormFieldExperimental } from 'ship-ui';\n\n@Component({\n selector: 'app-experimental-form-field',\n imports: [ShipFormFieldExperimental, FormsModule, ReactiveFormsModule],\n templateUrl: './experimental-form-field.html',\n styleUrl: './experimental-form-field.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class ExperimentalFormField {\n reactiveFormControl = new FormControl('reactive hello');\n ngModelControl = signal('yellow');\n\n reactiveFormValue = toSignal(this.reactiveFormControl.valueChanges);\n\n ngOnInit() {\n setTimeout(() => {\n this.reactiveFormControl.setValue('123 reactive');\n this.ngModelControl.set('678 ngModel');\n }, 5000);\n }\n}\n"
724
+ },
725
+ {
726
+ "name": "base-form-field",
727
+ "html": "<sh-form-field>\n <input placeholder=\"Placeholder no label...\" type=\"text\" />\n <div boxPrefix>\n Hello\n <sh-icon>circle</sh-icon>\n </div>\n\n <div boxSuffix>hello 123</div>\n</sh-form-field>\n\n<sh-form-field>\n <input placeholder=\"Placeholder no label...\" />\n <sh-icon prefix>circle</sh-icon>\n\n <ng-container suffix>hello 123</ng-container>\n</sh-form-field>\n\n<sh-form-field variant=\"autosize\">\n <input type=\"time\" />\n <div boxPrefix>\n <sh-icon>clock</sh-icon>\n </div>\n</sh-form-field>\n\n<sh-form-field>\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input placeholder=\"Placeholder...\" />\n</sh-form-field>\n\n<sh-form-field>\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input placeholder=\"Placeholder...\" />\n <sh-icon prefix>circle</sh-icon>\n <sh-icon>circle</sh-icon>\n</sh-form-field>\n\n<sh-icon>circle</sh-icon>\n\n<sh-form-field>\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input [formControl]=\"disabledCtrl\" placeholder=\"Placeholder...\" />\n <sh-icon prefix>circle</sh-icon>\n <sh-icon>circle</sh-icon>\n</sh-form-field>\n\n<sh-form-field>\n <label>\n Label\n <sh-icon>question</sh-icon>\n <sh-icon class=\"error\" shTooltip=\"hello world\">acorn-bold</sh-icon>\n </label>\n <input [formControl]=\"baseCtrl\" placeholder=\"Placeholder...\" #input />\n <span hint>Hint</span>\n\n <span hint>{{ baseCtrl.value?.length ?? 0 }}/10</span>\n\n @if ((baseCtrl.value?.length ?? 0) > 10) {\n <span error>Write a message in this alert area</span>\n }\n</sh-form-field>\n\n<sh-form-field>\n <label>\n Error without hint\n <sh-icon>question</sh-icon>\n </label>\n\n <input placeholder=\"Placeholder with error ...\" [formControl]=\"errorCtrl1\" />\n\n <sh-icon prefix>circle</sh-icon>\n <sh-icon suffix>circle</sh-icon>\n\n @if (errorCtrl1.invalid && errorCtrl1.touched) {\n <span error>Write a message in this alert area</span>\n }\n</sh-form-field>\n\n<sh-form-field>\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n\n <input placeholder=\"Placeholder with error ...\" [formControl]=\"errorCtrl\" />\n\n <sh-icon prefix>circle</sh-icon>\n <sh-icon suffix>circle</sh-icon>\n\n @if (errorCtrl.invalid && errorCtrl.touched) {\n <span error>Write a message in this alert area</span>\n }\n\n <span hint>{{ errorCtrl.value?.length ?? 0 }}/10</span>\n</sh-form-field>\n\n<sh-form-field variant=\"autosize\" size=\"center\">\n <label>\n Number without suffix auto\n <sh-icon>question</sh-icon>\n </label>\n <input type=\"number\" placeholder=\"0\" />\n <sh-icon prefix>circle</sh-icon>\n <span textPrefix>Hello</span>\n</sh-form-field>\n\n<sh-form-field variant=\"autosize\" size=\"center\">\n <label>\n Number without suffix\n <sh-icon>question</sh-icon>\n </label>\n <input type=\"number\" placeholder=\"0\" />\n</sh-form-field>\n\n<sh-form-field variant=\"auto-width\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input type=\"number\" placeholder=\"0\" />\n <sh-icon prefix>circle</sh-icon>\n <span textPrefix>Hello</span>\n <span textSuffix>.00</span>\n</sh-form-field>\n\n<sh-form-field>\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input type=\"number\" placeholder=\"0\" />\n <span textPrefix>$&nbsp;</span>\n <span textSuffix>.00</span>\n</sh-form-field>\n\n<sh-form-field>\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input [formControl]=\"disabledCtrl\" type=\"number\" placeholder=\"0\" />\n <span textPrefix>$&nbsp;</span>\n <span textSuffix>.00</span>\n</sh-form-field>\n\n<sh-form-field>\n <label>Textarea</label>\n <textarea></textarea>\n</sh-form-field>\n\n<sh-form-field>\n <label>Textarea</label>\n <textarea>\nwith some value very long text with some value very long text with some value very long text with some value very long text with some value very long text </textarea\n >\n</sh-form-field>\n\n<sh-form-field>\n <label>Textarea</label>\n <textarea [formControl]=\"disabledCtrl\"></textarea>\n</sh-form-field>\n",
728
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { ShipFormField, ShipIcon, ShipTooltip } from 'ship-ui';\n\n@Component({\n selector: 'app-base-form-field',\n imports: [ShipFormField, ShipIcon, ShipTooltip, FormsModule, ReactiveFormsModule],\n templateUrl: './base-form-field.html',\n styleUrl: './base-form-field.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseFormFieldComponent {\n baseCtrl = new FormControl('');\n disabledCtrl = new FormControl({ value: '', disabled: true });\n errorCtrl = new FormControl('', [Validators.required]);\n errorCtrl1 = new FormControl('', [Validators.required, Validators.minLength(10)]);\n\n ngOnInit() {\n this.errorCtrl.markAsTouched();\n this.errorCtrl.markAsDirty();\n }\n}\n"
729
+ },
730
+ {
731
+ "name": "form-field-sandbox",
732
+ "html": "<div class=\"controls\">\n <div class=\"row\">\n <sh-checkbox color=\"primary\" variant=\"raised\" [class.active]=\"showLabel()\" (click)=\"showLabel.set(!showLabel())\">\n Label\n </sh-checkbox>\n <sh-checkbox color=\"primary\" variant=\"raised\" [class.active]=\"showPrefix()\" (click)=\"showPrefix.set(!showPrefix())\">\n Prefix\n </sh-checkbox>\n <sh-checkbox color=\"primary\" variant=\"raised\" [class.active]=\"showSuffix()\" (click)=\"showSuffix.set(!showSuffix())\">\n Suffix\n </sh-checkbox>\n <sh-checkbox color=\"primary\" variant=\"raised\" [class.active]=\"showHint()\" (click)=\"showHint.set(!showHint())\">\n Hint\n </sh-checkbox>\n <sh-checkbox color=\"primary\" variant=\"raised\" [class.active]=\"showError()\" (click)=\"showError.set(!showError())\">\n Error\n </sh-checkbox>\n <sh-checkbox color=\"primary\" variant=\"raised\" [class.active]=\"disabled()\" (click)=\"disabled.set(!disabled())\">\n Disabled\n </sh-checkbox>\n </div>\n\n <div class=\"row\">\n <sh-button-group class=\"small\">\n <button type=\"button\" [class.active]=\"inputType() === 'text'\" (click)=\"inputType.set('text')\">Text</button>\n <button type=\"button\" [class.active]=\"inputType() === 'number'\" (click)=\"inputType.set('number')\">Number</button>\n <button type=\"button\" [class.active]=\"inputType() === 'textarea'\" (click)=\"inputType.set('textarea')\">\n Textarea\n </button>\n </sh-button-group>\n\n <sh-button-group class=\"small\">\n <button type=\"button\" [class.active]=\"size() === ''\" (click)=\"size.set('')\">Default</button>\n <button type=\"button\" [class.active]=\"size() === 'small'\" (click)=\"size.set('small')\">Small</button>\n <button type=\"button\" [class.active]=\"size() === 'autosize'\" (click)=\"size.set('autosize')\">Autosize</button>\n <button type=\"button\" [class.active]=\"size() === 'center'\" (click)=\"size.set('center')\">Center</button>\n </sh-button-group>\n </div>\n <div class=\"row\">\n @if (showLabel()) {\n <sh-form-field><input [(ngModel)]=\"label\" placeholder=\"Label text\" /></sh-form-field>\n }\n @if (showPrefix()) {\n <sh-form-field><input [(ngModel)]=\"prefix\" placeholder=\"Prefix content\" /></sh-form-field>\n }\n @if (showSuffix()) {\n <sh-form-field><input [(ngModel)]=\"suffix\" placeholder=\"Suffix content\" /></sh-form-field>\n }\n @if (showHint()) {\n <sh-form-field><input [(ngModel)]=\"hint\" placeholder=\"Hint text\" /></sh-form-field>\n }\n @if (showError()) {\n <sh-form-field><input [(ngModel)]=\"error\" placeholder=\"Error text\" /></sh-form-field>\n }\n <sh-form-field><input [(ngModel)]=\"placeholder\" placeholder=\"Placeholder\" /></sh-form-field>\n </div>\n</div>\n\n<div class=\"sandbox\">\n <sh-form-field [variant]=\"size()\">\n @if (showLabel()) {\n <label>{{ label() }}</label>\n }\n @if (showPrefix()) {\n <ng-container prefix>{{ prefix() }}</ng-container>\n }\n @if (showSuffix()) {\n <ng-container suffix>{{ suffix() }}</ng-container>\n }\n @if (inputType() === 'text') {\n <input [placeholder]=\"placeholder()\" [(ngModel)]=\"value\" [disabled]=\"disabled()\" />\n } @else if (inputType() === 'number') {\n <input type=\"number\" [placeholder]=\"placeholder()\" [(ngModel)]=\"value\" [disabled]=\"disabled()\" />\n } @else if (inputType() === 'textarea') {\n <textarea [placeholder]=\"placeholder()\" [(ngModel)]=\"value\" [disabled]=\"disabled()\"></textarea>\n }\n @if (showHint()) {\n <span hint>{{ hint() }}</span>\n }\n @if (showError()) {\n <span error>{{ error() }}</span>\n }\n </sh-form-field>\n</div>\n",
733
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipButtonGroup, ShipCheckbox, ShipFormField } from 'ship-ui';\n\n@Component({\n selector: 'app-form-field-sandbox',\n standalone: true,\n imports: [FormsModule, ShipFormField, ShipButtonGroup, ShipCheckbox],\n templateUrl: './form-field-sandbox.html',\n styleUrl: './form-field-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormFieldSandbox {\n label = signal<string>('Label');\n showLabel = signal<boolean>(true);\n prefix = signal<string>('');\n showPrefix = signal<boolean>(false);\n suffix = signal<string>('');\n showSuffix = signal<boolean>(false);\n placeholder = signal<string>('Placeholder...');\n hint = signal<string>('');\n showHint = signal<boolean>(false);\n error = signal<string>('');\n showError = signal<boolean>(false);\n disabled = signal<boolean>(false);\n inputType = signal<'text' | 'number' | 'textarea'>('text');\n size = signal<string>(''); // '', 'small', 'autosize', etc.\n value = signal<string>('');\n}\n"
734
+ },
735
+ {
736
+ "name": "small-form-field",
737
+ "html": "<sh-form-field class=\"small\">\n <input placeholder=\"Placeholder no label...\" />\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input placeholder=\"Placeholder...\" />\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input placeholder=\"Placeholder...\" />\n <sh-icon prefix>circle</sh-icon>\n <sh-icon>circle</sh-icon>\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input [formControl]=\"disabledCtrl\" placeholder=\"Placeholder...\" />\n <sh-icon prefix>circle</sh-icon>\n <sh-icon>circle</sh-icon>\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input [formControl]=\"baseCtrl\" placeholder=\"Placeholder...\" #input />\n <span hint>Hint</span>\n\n <span hint>{{ baseCtrl.value?.length ?? 0 }}/10</span>\n\n @if ((baseCtrl.value?.length ?? 0) > 10) {\n <span error>Write a message in this alert area</span>\n }\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n\n <input placeholder=\"Placeholder with error ...\" [formControl]=\"errorCtrl\" />\n\n <sh-icon prefix>circle</sh-icon>\n <sh-icon suffix>circle</sh-icon>\n\n @if (errorCtrl.invalid && errorCtrl.touched) {\n <span error>Write a message in this alert area</span>\n }\n\n <span hint>{{ errorCtrl.value?.length ?? 0 }}/10</span>\n</sh-form-field>\n\n<sh-form-field class=\"small center autosize\">\n <label>\n Number without suffix\n <sh-icon>question</sh-icon>\n </label>\n <input type=\"number\" placeholder=\"0\" />\n <sh-icon prefix>circle</sh-icon>\n <span textPrefix>Hello</span>\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input type=\"number\" placeholder=\"0\" />\n <sh-icon prefix>circle</sh-icon>\n <span textPrefix>Hello</span>\n <span textSuffix>.00</span>\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input type=\"number\" placeholder=\"0\" />\n <span textPrefix>$&nbsp;</span>\n <span textSuffix>.00</span>\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>\n Label\n <sh-icon>question</sh-icon>\n </label>\n <input [formControl]=\"disabledCtrl\" type=\"number\" placeholder=\"0\" />\n <span textPrefix>$&nbsp;</span>\n <span textSuffix>.00</span>\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>Textarea</label>\n <textarea></textarea>\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>Textarea</label>\n <textarea>\nwith some value very long text with some value very long text with some value very long text with some value very long text with some value very long text </textarea\n >\n</sh-form-field>\n\n<sh-form-field class=\"small\">\n <label>Textarea</label>\n <textarea [formControl]=\"disabledCtrl\"></textarea>\n</sh-form-field>\n",
738
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { ShipFormField, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-small-form-field',\n imports: [ShipFormField, ShipIcon, FormsModule, ReactiveFormsModule],\n templateUrl: './small-form-field.html',\n styleUrl: './small-form-field.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SmallFormField {\n baseCtrl = new FormControl('');\n disabledCtrl = new FormControl({ value: '', disabled: true });\n errorCtrl = new FormControl('', [Validators.required]);\n errorCtrl1 = new FormControl('', [Validators.required, Validators.minLength(10)]);\n\n ngOnInit() {\n this.errorCtrl.markAsTouched();\n this.errorCtrl.markAsDirty();\n }\n}\n"
739
+ }
740
+ ]
741
+ },
742
+ {
743
+ "name": "ShipRangeSlider",
744
+ "selector": "sh-range-slider",
745
+ "path": "projects/ship-ui/src/lib/ship-range-slider/ship-range-slider.ts",
746
+ "description": "### Binding\n\nTwo-way bindable value. Use\n`[(ngModel)]`\nor\n`[formControl]`\n.\n\n### Constraints\n\nSet the range limits and increments using the\n`min`\n,\n`max`\n, and\n`step`\nattributes.\n\n### Visuals\n\nCustomize the look and feel:\n\n<li>\n`color`\n:\n**primary**\n,\n**accent**\n,\n**warn**\n,\n**success**\n, or\n**error**\n.\n</li>\n<li>\n`variant`\n:\n**base**\n,\n**thick**\n,\n**outlined**\n,\n**flat**\n, or\n**raised**\n.\n</li>\n<li>\n`sharp`\n: Use sharp corners instead of rounded.\n</li>\n<li>\n`always-show`\n: Keep the value indicator visible at all times.\n</li>\n\n### Unit\n\nSpecify a suffix for the value display using the\n`unit`\nattribute (e.g.,\n`unit=\"%\"`\n).\n\n### Disabled\n\nThe slider can be disabled using the standard\n`disabled`\nattribute or\n`[disabled]`\nbinding.",
747
+ "inputs": [
748
+ {
749
+ "name": "unit",
750
+ "type": "string",
751
+ "description": "",
752
+ "defaultValue": "''"
753
+ },
754
+ {
755
+ "name": "value",
756
+ "type": "number",
757
+ "description": "",
758
+ "defaultValue": "this.#initialDefaultValue"
759
+ }
760
+ ],
761
+ "outputs": [],
762
+ "cssVariables": [
763
+ {
764
+ "name": "--rs-h",
765
+ "defaultValue": "#{p2r(40)}"
766
+ },
767
+ {
768
+ "name": "--rs-f",
769
+ "defaultValue": "var(--paragraph-30)"
770
+ },
771
+ {
772
+ "name": "--rs-unit-g",
773
+ "defaultValue": "#{p2r(12)}"
774
+ },
775
+ {
776
+ "name": "--rs-unit-c",
777
+ "defaultValue": "var(--base-8)"
778
+ },
779
+ {
780
+ "name": "--rst",
781
+ "defaultValue": "var(--base-3)"
782
+ },
783
+ {
784
+ "name": "--rst-bc",
785
+ "defaultValue": "var(--base-1)"
786
+ },
787
+ {
788
+ "name": "--rst-bg",
789
+ "defaultValue": "var(--base-4)"
790
+ },
791
+ {
792
+ "name": "--rst-h",
793
+ "defaultValue": "#{p2r(8)}"
794
+ },
795
+ {
796
+ "name": "--rst-s",
797
+ "defaultValue": "calc(var(--shape-2) / 2)"
798
+ },
799
+ {
800
+ "name": "--rs-thumb-c",
801
+ "defaultValue": "var(--base-8)"
802
+ },
803
+ {
804
+ "name": "--rs-thumb-bc",
805
+ "defaultValue": "var(--base-1)"
806
+ },
807
+ {
808
+ "name": "--rs-thumb-value-bg",
809
+ "defaultValue": "var(--base-4)"
810
+ },
811
+ {
812
+ "name": "--rs-thumb-arrow",
813
+ "defaultValue": "var(--rs-thumb-value-bg)"
814
+ },
815
+ {
816
+ "name": "--rs-thumb-value-c",
817
+ "defaultValue": "var(--base-8)"
818
+ },
819
+ {
820
+ "name": "--rs-thumb-si",
821
+ "defaultValue": "#{p2r(16)}"
822
+ },
823
+ {
824
+ "name": "--rs-thumb-w",
825
+ "defaultValue": "var(--rs-thumb-si)"
826
+ },
827
+ {
828
+ "name": "--rs-thumb-s",
829
+ "defaultValue": "calc(var(--rs-thumb-w) / 2)"
830
+ }
831
+ ],
832
+ "examples": [
833
+ {
834
+ "name": "base-range-slider",
835
+ "html": "<sh-range-slider>\n <label for=\"range-slider\">Select a value:</label>\n <input id=\"range-slider\" type=\"range\" min=\"0\" max=\"100\" [(ngModel)]=\"value\" />\n</sh-range-slider>\n<p>Selected: {{ value() }}</p>\n",
836
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipRangeSlider } from 'ship-ui';\n\n@Component({\n selector: 'app-base-range-slider',\n standalone: true,\n imports: [FormsModule, ShipRangeSlider],\n templateUrl: './base-range-slider.html',\n styleUrl: './base-range-slider.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseRangeSlider {\n value = signal(50);\n}\n"
837
+ },
838
+ {
839
+ "name": "disabled-range-slider",
840
+ "html": "<sh-range-slider>\n <label for=\"disabled-range-slider\">Disabled value:</label>\n <input id=\"disabled-range-slider\" type=\"range\" min=\"0\" max=\"100\" [(ngModel)]=\"value\" disabled />\n</sh-range-slider>\n<p>Selected: {{ value() }}</p>\n",
841
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipRangeSlider } from 'ship-ui';\n\n@Component({\n selector: 'app-disabled-range-slider',\n standalone: true,\n imports: [FormsModule, ShipRangeSlider],\n templateUrl: './disabled-range-slider.html',\n styleUrl: './disabled-range-slider.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DisabledRangeSlider {\n value = signal(10);\n}\n"
842
+ },
843
+ {
844
+ "name": "range-slider-sandbox",
845
+ "html": "<div class=\"controls\">\n <div class=\"row\">\n <sh-toggle class=\"primary raised\" [class.active]=\"disabled()\" (click)=\"disabled.set(!disabled())\">\n Disabled\n </sh-toggle>\n <sh-toggle class=\"primary raised\" [class.active]=\"readonly()\" (click)=\"readonly.set(!readonly())\">\n Read-only\n </sh-toggle>\n\n @if (variation() !== 'thick') {\n <sh-toggle class=\"primary raised\" [class.active]=\"alwaysShow()\" (click)=\"alwaysShow.set(!alwaysShow())\">\n Always show value indicator\n </sh-toggle>\n }\n <sh-toggle class=\"primary raised\" [class.active]=\"sharp()\" (click)=\"sharp.set(!sharp())\">Sharp</sh-toggle>\n </div>\n\n <sh-button-group>\n <button [class.active]=\"color() === 'primary'\" (click)=\"color.set('primary')\">Primary</button>\n <button [class.active]=\"color() === 'accent'\" (click)=\"color.set('accent')\">Accent</button>\n <button [class.active]=\"color() === 'warn'\" (click)=\"color.set('warn')\">Warn</button>\n <button [class.active]=\"color() === 'error'\" (click)=\"color.set('error')\">Error</button>\n <button [class.active]=\"color() === 'success'\" (click)=\"color.set('success')\">Success</button>\n </sh-button-group>\n\n <sh-button-group>\n <button [class.active]=\"variation() === 'base'\" (click)=\"variation.set('base')\">Base</button>\n <button [class.active]=\"variation() === 'thick'\" (click)=\"variation.set('thick')\">Thick</button>\n <button [class.active]=\"variation() === 'outlined'\" (click)=\"variation.set('outlined')\">Outlined</button>\n <button [class.active]=\"variation() === 'flat'\" (click)=\"variation.set('flat')\">Flat</button>\n <button [class.active]=\"variation() === 'raised'\" (click)=\"variation.set('raised')\">Raised</button>\n </sh-button-group>\n\n <div class=\"fields\">\n <sh-form-field>\n <label>Unit</label>\n <input type=\"text\" [(ngModel)]=\"unit\" />\n </sh-form-field>\n\n <sh-form-field>\n <label>Min</label>\n <input type=\"text\" [(ngModel)]=\"min\" />\n </sh-form-field>\n\n <sh-form-field>\n <label>Max</label>\n <input type=\"text\" [(ngModel)]=\"max\" />\n </sh-form-field>\n\n <sh-form-field>\n <label>Step</label>\n <input type=\"text\" [(ngModel)]=\"step\" />\n </sh-form-field>\n </div>\n</div>\n\n<div class=\"sandbox-example\">\n <sh-range-slider\n [unit]=\"unit()\"\n [class]=\"color() + ' ' + variation()\"\n [class.sharp]=\"sharp()\"\n [class.always-show]=\"alwaysShow()\">\n <input\n type=\"range\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [(ngModel)]=\"value\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\" />\n </sh-range-slider>\n <p>Selected: {{ value() }}</p>\n</div>\n",
846
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipButtonGroup, ShipFormField, ShipRangeSlider, ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-range-slider-sandbox',\n standalone: true,\n imports: [FormsModule, ShipRangeSlider, ShipButtonGroup, ShipToggle, ShipFormField],\n templateUrl: './range-slider-sandbox.html',\n styleUrl: './range-slider-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RangeSliderSandbox {\n value = signal(50);\n min = signal(0);\n max = signal(100);\n step = signal(1);\n disabled = signal(false);\n readonly = signal(false);\n alwaysShow = signal(false);\n sharp = signal(false);\n unit = signal('%');\n color = signal<'primary' | 'accent' | 'warn' | 'success' | 'error'>('primary');\n variation = signal<'base' | 'thick' | 'outlined' | 'flat' | 'raised'>('base');\n}\n"
847
+ },
848
+ {
849
+ "name": "always-show-indicator-range-slider",
850
+ "html": "<sh-range-slider class=\"always-show\">\n <label for=\"always-show-indicator-range-slider\">Always show indicator:</label>\n <input id=\"always-show-indicator-range-slider\" type=\"range\" min=\"0\" max=\"100\" [(ngModel)]=\"value\" />\n</sh-range-slider>\n<p>Selected: {{ value() }}</p>\n",
851
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipRangeSlider } from 'ship-ui';\n\n@Component({\n selector: 'app-always-show-indicator-range-slider',\n standalone: true,\n imports: [FormsModule, ShipRangeSlider],\n templateUrl: './always-show-indicator-range-slider.html',\n styleUrl: './always-show-indicator-range-slider.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AlwaysShowIndicatorRangeSlider {\n value = signal(33);\n}\n"
852
+ },
853
+ {
854
+ "name": "readonly-range-slider",
855
+ "html": "<sh-range-slider>\n <label for=\"readonly-range-slider\">Readonly value:</label>\n <input id=\"readonly-range-slider\" type=\"range\" min=\"0\" max=\"100\" [(ngModel)]=\"value\" readonly />\n</sh-range-slider>\n<p>Selected: {{ value() }}</p>\n",
856
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipRangeSlider } from 'ship-ui';\n\n@Component({\n selector: 'app-readonly-range-slider',\n standalone: true,\n imports: [FormsModule, ShipRangeSlider],\n templateUrl: './readonly-range-slider.html',\n styleUrl: './readonly-range-slider.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ReadonlyRangeSlider {\n value = signal(42);\n}\n"
857
+ },
858
+ {
859
+ "name": "float-range-slider",
860
+ "html": "<sh-range-slider>\n <label for=\"float-range-slider\">Decimal value:</label>\n <input id=\"float-range-slider\" type=\"range\" min=\"0\" max=\"1\" step=\"0.01\" [(ngModel)]=\"value\" />\n</sh-range-slider>\n<p>Selected: {{ value() | number: '1.2-2' }}</p>\n",
861
+ "ts": "import { DecimalPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipRangeSlider } from 'ship-ui';\n\n@Component({\n selector: 'app-float-range-slider',\n standalone: true,\n imports: [FormsModule, ShipRangeSlider, DecimalPipe],\n templateUrl: './float-range-slider.html',\n styleUrl: './float-range-slider.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FloatRangeSlider {\n value = signal(0.12);\n}\n"
862
+ },
863
+ {
864
+ "name": "reactive-range-slider",
865
+ "html": "<sh-range-slider>\n <label for=\"range-slider\">Select a value (Reactive Form):</label>\n <input id=\"range-slider\" type=\"range\" min=\"0\" max=\"100\" [formControl]=\"control\" />\n</sh-range-slider>\n<p>Selected: {{ control.value }}</p>\n",
866
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ShipRangeSlider } from 'ship-ui';\n\n@Component({\n selector: 'app-reactive-range-slider',\n standalone: true,\n imports: [ReactiveFormsModule, ShipRangeSlider],\n templateUrl: './reactive-range-slider.html',\n styleUrl: './reactive-range-slider.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ReactiveRangeSlider {\n control = new FormControl(25);\n}\n"
867
+ },
868
+ {
869
+ "name": "unit-range-slider",
870
+ "html": "<sh-range-slider unit=\"%\">\n <label for=\"unit-range-slider\">Value with unit:</label>\n <input id=\"unit-range-slider\" type=\"range\" min=\"0\" max=\"100\" [(ngModel)]=\"value\" />\n</sh-range-slider>\n<p>Selected: {{ value() }}%</p>\n",
871
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipRangeSlider } from 'ship-ui';\n\n@Component({\n selector: 'app-unit-range-slider',\n standalone: true,\n imports: [FormsModule, ShipRangeSlider],\n templateUrl: './unit-range-slider.html',\n styleUrl: './unit-range-slider.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UnitRangeSlider {\n value = signal(75);\n}\n"
872
+ }
873
+ ]
874
+ },
875
+ {
876
+ "name": "ShipResize",
877
+ "selector": "[shResize]",
878
+ "path": "projects/ship-ui/src/lib/ship-table/ship-table.ts",
879
+ "description": "### Data & Loading\n\nProvide data via\n`[data]`\nand toggle a loading state using the\n`loading`\nattribute.\n\n### Sorting\n\nEnable sorting by applying\n`shSort`\nto header cells. Track the active column with\n`sortByColumn`\n(two-way bindable).\n\n### Resizing\n\nApply the\n`shResize`\ndirective to header cells to allow column width adjustment. Available inputs:\n`resizable`\n,\n`minWidth`\n, and\n`maxWidth`\n.\n\n### Sticky Columns\n\nUse the\n`shStickyColumns`\nattribute (\n**start**\nor\n**end**\n) or apply\n`.sticky`\n/\n`.sticky-end`\nclasses to header cells to pin columns.\n\n### Column Sizing\n\nUse the\n`size`\nattribute on\n`&lt;th&gt;`\nelements to set initial or fixed widths (e.g.,\n`size=\"1fr\"`\n,\n`size=\"200px\"`\n).",
880
+ "inputs": [
881
+ {
882
+ "name": "resizable",
883
+ "type": "boolean",
884
+ "description": "",
885
+ "defaultValue": "true"
886
+ },
887
+ {
888
+ "name": "minWidth",
889
+ "type": "number",
890
+ "description": "",
891
+ "defaultValue": "50"
892
+ },
893
+ {
894
+ "name": "maxWidth",
895
+ "type": "number | null",
896
+ "description": "",
897
+ "defaultValue": "null"
898
+ },
899
+ {
900
+ "name": "shSort",
901
+ "type": "string",
902
+ "description": ""
903
+ },
904
+ {
905
+ "name": "shStickyColumns",
906
+ "type": "'start' | 'end' | (string & {})",
907
+ "description": "",
908
+ "defaultValue": "'start'"
909
+ },
910
+ {
911
+ "name": "loading",
912
+ "type": "boolean",
913
+ "description": "",
914
+ "defaultValue": "false"
915
+ },
916
+ {
917
+ "name": "data",
918
+ "type": "any",
919
+ "description": "",
920
+ "defaultValue": "[]"
921
+ },
922
+ {
923
+ "name": "color",
924
+ "type": "ShipColor | null",
925
+ "description": "",
926
+ "defaultValue": "null",
927
+ "options": [
928
+ "primary",
929
+ "accent",
930
+ "warn",
931
+ "error",
932
+ "success"
933
+ ]
934
+ },
935
+ {
936
+ "name": "variant",
937
+ "type": "ShipTableVariant | null",
938
+ "description": "",
939
+ "defaultValue": "null",
940
+ "options": [
941
+ "type-a",
942
+ "type-b"
943
+ ]
944
+ },
945
+ {
946
+ "name": "sortByColumn",
947
+ "type": "string | null",
948
+ "description": "",
949
+ "defaultValue": "null"
950
+ }
951
+ ],
952
+ "outputs": [
953
+ {
954
+ "name": "dataChange",
955
+ "type": "any",
956
+ "description": ""
957
+ }
958
+ ],
959
+ "cssVariables": [
960
+ {
961
+ "name": "--table-bc",
962
+ "defaultValue": "var(--base-4)"
963
+ },
964
+ {
965
+ "name": "--table-th-bg",
966
+ "defaultValue": "var(--base-1)"
967
+ },
968
+ {
969
+ "name": "--table-tr-bg",
970
+ "defaultValue": "var(--base-1)"
971
+ },
972
+ {
973
+ "name": "--table-td-bg",
974
+ "defaultValue": "var(--base-1)"
975
+ },
976
+ {
977
+ "name": "--table-th-c",
978
+ "defaultValue": "var(--base-8)"
979
+ },
980
+ {
981
+ "name": "--table-th-f",
982
+ "defaultValue": "var(--paragraph-30)"
983
+ },
984
+ {
985
+ "name": "--table-td-c",
986
+ "defaultValue": "var(--base-8)"
987
+ },
988
+ {
989
+ "name": "--table-td-f",
990
+ "defaultValue": "var(--paragraph-30)"
991
+ },
992
+ {
993
+ "name": "--table-th-p",
994
+ "defaultValue": "#{p2r(0 20)}"
995
+ },
996
+ {
997
+ "name": "--table-td-p",
998
+ "defaultValue": "#{p2r(0 20)}"
999
+ },
1000
+ {
1001
+ "name": "--table-th-mh",
1002
+ "defaultValue": "#{p2r(48)}"
1003
+ },
1004
+ {
1005
+ "name": "--table-td-mh",
1006
+ "defaultValue": "#{p2r(78)}"
1007
+ },
1008
+ {
1009
+ "name": "--table-th-g",
1010
+ "defaultValue": "#{p2r(4)}"
1011
+ },
1012
+ {
1013
+ "name": "--table-td-g",
1014
+ "defaultValue": "#{p2r(8)}"
1015
+ },
1016
+ {
1017
+ "name": "--table-ws",
1018
+ "defaultValue": "nowrap"
1019
+ },
1020
+ {
1021
+ "name": "--table-th-bw",
1022
+ "defaultValue": "0"
1023
+ },
1024
+ {
1025
+ "name": "--table-td-bw",
1026
+ "defaultValue": "#{p2r(1 0 0)}"
1027
+ },
1028
+ {
1029
+ "name": "--table-columns",
1030
+ "defaultValue": "1fr 1fr 1fr max-content"
1031
+ },
1032
+ {
1033
+ "name": "--table-sticky-bw",
1034
+ "defaultValue": "#{p2r(1)}"
1035
+ },
1036
+ {
1037
+ "name": "--caret-color",
1038
+ "defaultValue": "var(--base-10)"
1039
+ },
1040
+ {
1041
+ "name": "--caret-size",
1042
+ "defaultValue": "#{p2r(6)}"
1043
+ }
1044
+ ],
1045
+ "examples": [
1046
+ {
1047
+ "name": "resizing-table",
1048
+ "html": "<sh-table [data]=\"dataSource()\" [variant]=\"variant()\">\n <tr thead>\n @for (col of displayedColumns(); track col) {\n <th shResize>{{ col }}</th>\n }\n </tr>\n\n @for (row of dataSource(); track $index) {\n <tr>\n @for (col of displayedColumns(); track col) {\n <td>{{ row[col] }}</td>\n }\n </tr>\n }\n\n <div table-no-rows>No data available</div>\n</sh-table>\n",
1049
+ "ts": "import { ChangeDetectionStrategy, Component, input, signal } from '@angular/core';\nimport { ShipResize, ShipTable, ShipTableVariant } from 'ship-ui';\n\nconst ELEMENT_DATA = [\n { position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H' },\n { position: 2, name: 'Helium', weight: 4.0026, symbol: 'He' },\n { position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li' },\n { position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be' },\n { position: 5, name: 'Boron', weight: 10.811, symbol: 'B' },\n { position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C' },\n { position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N' },\n { position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O' },\n { position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F' },\n { position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne' },\n];\nconst COLUMNS = ['position', 'name', 'weight', 'symbol'] as const;\n\n@Component({\n selector: 'resizing-table',\n standalone: true,\n imports: [ShipTable, ShipResize],\n templateUrl: './resizing-table.html',\n styleUrl: './resizing-table.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ResizingTable {\n variant = input<ShipTableVariant | null>(null);\n displayedColumns = signal([...COLUMNS]);\n dataSource = signal([...ELEMENT_DATA]);\n}\n"
1050
+ },
1051
+ {
1052
+ "name": "base-table",
1053
+ "html": "<sh-table [data]=\"dataSource()\" [loading]=\"isLoading()\" [variant]=\"variant()\">\n <button actionbar>hello</button>\n\n <tr thead>\n @for (col of displayedColumns(); track col) {\n <th>{{ col }}</th>\n }\n </tr>\n\n @for (row of dataSource(); track $index) {\n <tr>\n @for (col of displayedColumns(); track col) {\n <td>{{ row[col] }}</td>\n }\n </tr>\n }\n\n <div table-no-rows>No data available</div>\n</sh-table>\n",
1054
+ "ts": "import { ChangeDetectionStrategy, Component, input, signal } from '@angular/core';\nimport { ShipTable } from 'ship-ui';\n\nconst ELEMENT_DATA = [\n { position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H' },\n { position: 2, name: 'Helium', weight: 4.0026, symbol: 'He' },\n { position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li' },\n { position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be' },\n { position: 5, name: 'Boron', weight: 10.811, symbol: 'B' },\n { position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C' },\n { position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N' },\n { position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O' },\n { position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F' },\n { position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne' },\n];\nconst COLUMNS = ['position', 'name', 'weight', 'symbol'] as const;\n\n@Component({\n selector: 'base-table',\n standalone: true,\n imports: [ShipTable],\n templateUrl: './base-table.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseTableComponent {\n variant = input<string | null>(null);\n displayedColumns = signal([...COLUMNS]);\n dataSource = signal([...ELEMENT_DATA]);\n isLoading = signal(true);\n\n ngOnInit() {\n setTimeout(() => {\n this.isLoading.set(false);\n }, 450);\n }\n}\n"
1055
+ },
1056
+ {
1057
+ "name": "toggle-row-table",
1058
+ "html": "<sh-table [data]=\"dataSource()\" [loading]=\"isLoading()\" [variant]=\"variant()\">\n <tr>\n @for (col of displayedColumns(); track col) {\n <th>{{ col }}</th>\n }\n </tr>\n\n @for (row of dataSource(); track $index) {\n <tr (click)=\"toggleRow($index)\">\n @for (col of displayedColumns(); track col) {\n <td>\n @if ($first) {\n <button shButton class=\"small primary raised\">\n @if ($index === openRowIndex()) {\n <sh-icon>caret-up</sh-icon>\n } @else {\n <sh-icon>caret-down</sh-icon>\n }\n </button>\n }\n\n {{ row[col] }}\n </td>\n }\n </tr>\n\n @if ($index === openRowIndex()) {\n <tr>\n <td class=\"span-all\" [style.background-color]=\"'red'\">hi im a secondary row and i can be styled differently</td>\n </tr>\n }\n }\n\n <div table-no-rows>No data available</div>\n</sh-table>\n",
1059
+ "ts": "import { ChangeDetectionStrategy, Component, input, signal } from '@angular/core';\nimport { ShipButton, ShipIcon, ShipTable } from 'ship-ui';\n\nconst ELEMENT_DATA = [\n { position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H' },\n { position: 2, name: 'Helium', weight: 4.0026, symbol: 'He' },\n { position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li' },\n { position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be' },\n { position: 5, name: 'Boron', weight: 10.811, symbol: 'B' },\n { position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C' },\n { position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N' },\n { position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O' },\n { position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F' },\n { position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne' },\n];\nconst COLUMNS = ['position', 'name', 'weight', 'symbol'] as const;\n\n@Component({\n selector: 'toggle-row-table',\n standalone: true,\n imports: [ShipTable, ShipIcon, ShipButton],\n templateUrl: './toggle-row-table.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToggleRowTable {\n variant = input<string | null>(null);\n displayedColumns = signal([...COLUMNS]);\n dataSource = signal([...ELEMENT_DATA]);\n isLoading = signal(true);\n openRowIndex = signal<number | null>(null);\n\n ngOnInit() {\n setTimeout(() => {\n this.isLoading.set(false);\n }, 450);\n }\n\n toggleRow(index: number) {\n this.openRowIndex.set(this.openRowIndex() === index ? null : index);\n }\n}\n"
1060
+ },
1061
+ {
1062
+ "name": "sorting-table",
1063
+ "html": "<pre>Sort column by: {{ sortByColumn() }}</pre>\n\n<sh-table [data]=\"dataSource()\" [(sortByColumn)]=\"sortByColumn\" [variant]=\"variant()\">\n <tr>\n @for (col of displayedColumns(); track col) {\n <th [shSort]=\"col\">\n {{ col }}\n\n @if (sortByColumn() === col) {\n <sh-icon>caret-up</sh-icon>\n }\n @if (sortByColumn() === `-${col}`) {\n <sh-icon>caret-down</sh-icon>\n }\n </th>\n }\n </tr>\n\n @for (row of dataSource(); track $index) {\n <tr>\n @for (col of displayedColumns(); track col) {\n <td>{{ row[col] }}</td>\n }\n </tr>\n }\n\n <div table-no-rows>No data available</div>\n</sh-table>\n",
1064
+ "ts": "import { ChangeDetectionStrategy, Component, input, signal } from '@angular/core';\nimport { ShipIcon, ShipSort, ShipTable, ShipTableVariant } from 'ship-ui';\n\nconst ELEMENT_DATA = [\n { position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H' },\n { position: 2, name: 'Helium', weight: 4.0026, symbol: 'He' },\n { position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li' },\n { position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be' },\n { position: 5, name: 'Boron', weight: 10.811, symbol: 'B' },\n { position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C' },\n { position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N' },\n { position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O' },\n { position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F' },\n { position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne' },\n];\nconst COLUMNS = ['position', 'name', 'weight', 'symbol'] as const;\n\n@Component({\n selector: 'sorting-table',\n standalone: true,\n imports: [ShipTable, ShipSort, ShipIcon],\n templateUrl: './sorting-table.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SortingTable {\n variant = input<ShipTableVariant | null>(null);\n displayedColumns = signal([...COLUMNS]);\n dataSource = signal([...ELEMENT_DATA]);\n sortByColumn = signal<string | null>(null);\n}\n"
1065
+ },
1066
+ {
1067
+ "name": "multi-table-header",
1068
+ "html": "<sh-table [data]=\"dataSource()\" [variant]=\"variant()\">\n <tr thead class=\"sticky\">\n @for (col of displayedColumns(); track col) {\n <th>{{ col }}</th>\n }\n </tr>\n\n <tr thead class=\"sticky\">\n @for (col of displayedColumns(); track col) {\n <th>{{ col }}</th>\n }\n </tr>\n\n @for (row of dataSource(); track $index) {\n <tr [class.sticky]=\"$index % 3 === 2\">\n @for (col of displayedColumns(); track col) {\n <td>{{ row[col] }}</td>\n }\n </tr>\n }\n\n <div table-no-rows>No data available</div>\n</sh-table>\n",
1069
+ "ts": "import { ChangeDetectionStrategy, Component, input, signal } from '@angular/core';\nimport { ShipTable } from 'ship-ui';\n\nconst ELEMENT_DATA = [\n { position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H' },\n { position: 2, name: 'Helium', weight: 4.0026, symbol: 'He' },\n { position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li' },\n { position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be' },\n { position: 5, name: 'Boron', weight: 10.811, symbol: 'B' },\n { position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C' },\n { position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N' },\n { position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O' },\n { position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F' },\n { position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne' },\n];\nconst COLUMNS = ['position', 'name', 'weight', 'symbol'] as const;\n\n@Component({\n selector: 'multi-table-header',\n standalone: true,\n imports: [ShipTable],\n templateUrl: './multi-table-header.html',\n styleUrl: './multi-table-header.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MultiTableHeader {\n variant = input<string | null>(null);\n displayedColumns = signal([...COLUMNS]);\n dataSource = signal([...ELEMENT_DATA]);\n}\n"
1070
+ },
1071
+ {
1072
+ "name": "multi-sticky-table",
1073
+ "html": "<sh-table [data]=\"dataSource()\" [loading]=\"isLoading()\" [variant]=\"variant()\">\n <tr class=\"sticky\" thead>\n <div shStickyColumns>\n <th>im sticky</th>\n <th>im sticky</th>\n </div>\n\n @for (col of displayedColumns(); track col) {\n <th>{{ col }}</th>\n }\n\n <div shStickyColumns=\"end\">\n <th>im sticky end</th>\n <th>im sticky end</th>\n </div>\n </tr>\n\n @for (row of dataSource(); track $index) {\n <tr [class.sticky]=\"$index % 3 === 0\">\n <div shStickyColumns>\n <td>im sticky</td>\n <td>im sticky</td>\n </div>\n\n @for (col of displayedColumns(); track col) {\n <td>{{ row[col] }}</td>\n }\n\n <div shStickyColumns=\"end\">\n <td>im sticky end</td>\n <td>im sticky end</td>\n </div>\n </tr>\n }\n <div table-no-rows>No data available</div>\n</sh-table>\n",
1074
+ "ts": "import { ChangeDetectionStrategy, Component, input, signal } from '@angular/core';\nimport { ShipStickyColumns, ShipTable, ShipTableVariant } from 'ship-ui';\n\nconst ELEMENT_DATA = [\n { position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H' },\n { position: 2, name: 'Helium', weight: 4.0026, symbol: 'He' },\n { position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li' },\n { position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be' },\n { position: 5, name: 'Boron', weight: 10.811, symbol: 'B' },\n { position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C' },\n { position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N' },\n { position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O' },\n { position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F' },\n { position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne' },\n { position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H' },\n { position: 2, name: 'Helium', weight: 4.0026, symbol: 'He' },\n { position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li' },\n { position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be' },\n { position: 5, name: 'Boron', weight: 10.811, symbol: 'B' },\n { position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C' },\n { position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N' },\n { position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O' },\n { position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F' },\n { position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne' },\n { position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H' },\n { position: 2, name: 'Helium', weight: 4.0026, symbol: 'He' },\n { position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li' },\n { position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be' },\n { position: 5, name: 'Boron', weight: 10.811, symbol: 'B' },\n { position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C' },\n { position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N' },\n { position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O' },\n { position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F' },\n { position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne' },\n { position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H' },\n { position: 2, name: 'Helium', weight: 4.0026, symbol: 'He' },\n { position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li' },\n { position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be' },\n { position: 5, name: 'Boron', weight: 10.811, symbol: 'B' },\n { position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C' },\n { position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N' },\n { position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O' },\n { position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F' },\n { position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne' },\n { position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H' },\n { position: 2, name: 'Helium', weight: 4.0026, symbol: 'He' },\n { position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li' },\n { position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be' },\n { position: 5, name: 'Boron', weight: 10.811, symbol: 'B' },\n { position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C' },\n { position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N' },\n { position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O' },\n { position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F' },\n { position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne' },\n];\nconst COLUMNS = ['position', 'name', 'weight', 'symbol'] as const;\n\n@Component({\n selector: 'multi-sticky-table',\n standalone: true,\n imports: [ShipTable, ShipStickyColumns],\n templateUrl: './multi-sticky-table.html',\n styleUrl: './multi-sticky-table.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MultiStickyTable {\n variant = input<ShipTableVariant | null>(null);\n displayedColumns = signal([...COLUMNS]);\n dataSource = signal([...ELEMENT_DATA]);\n sortByColumn = signal<string | null>(null);\n isLoading = signal(false);\n}\n"
1075
+ }
1076
+ ]
1077
+ },
1078
+ {
1079
+ "name": "ShipTableFilterBar",
1080
+ "selector": "sh-table-filter-bar",
1081
+ "path": "projects/ship-ui/src/lib/ship-table-filter-bar/ship-table-filter-bar.ts",
1082
+ "description": "",
1083
+ "inputs": [],
1084
+ "outputs": [],
1085
+ "cssVariables": [],
1086
+ "examples": []
1087
+ },
1088
+ {
1089
+ "name": "ShipSpinner",
1090
+ "selector": "sh-spinner",
1091
+ "path": "projects/ship-ui/src/lib/ship-spinner/ship-spinner.component.ts",
1092
+ "description": "### Size & Thickness\n\nCustomize the spinner appearance using CSS variables:\n`--spinner-size`\nand\n`--spinner-thickness`\n.\n\n### Colors\n\nSpinner colors can be set using the\n`color`\nattribute. Valid options are:\n**primary**\n,\n**accent**\n,\n**warn**\n,\n**error**\n, and\n**success**\n.",
1093
+ "inputs": [
1094
+ {
1095
+ "name": "color",
1096
+ "type": "ShipColor | null",
1097
+ "description": "",
1098
+ "defaultValue": "null",
1099
+ "options": [
1100
+ "primary",
1101
+ "accent",
1102
+ "warn",
1103
+ "error",
1104
+ "success"
1105
+ ]
1106
+ }
1107
+ ],
1108
+ "outputs": [],
1109
+ "cssVariables": [
1110
+ {
1111
+ "name": "--spinner-c",
1112
+ "defaultValue": "var(--base-8)"
1113
+ },
1114
+ {
1115
+ "name": "--spinner-size",
1116
+ "defaultValue": "#{p2r(40)}"
1117
+ },
1118
+ {
1119
+ "name": "--spinner-thickness",
1120
+ "defaultValue": "#{p2r(5)}"
1121
+ }
1122
+ ],
1123
+ "examples": [
1124
+ {
1125
+ "name": "sandbox-spinner",
1126
+ "html": "<div class=\"controls\">\n <sh-range-slider class=\"primary raised\" unit=\"px\">\n <label for=\"range-slider\">Set spinner size</label>\n <input id=\"range-slider\" type=\"range\" step=\"2\" min=\"24\" max=\"120\" [(ngModel)]=\"value\" />\n </sh-range-slider>\n\n <sh-range-slider class=\"primary raised\" unit=\"px\">\n <label for=\"range-slider\">Spinner thickness</label>\n <input id=\"range-slider\" type=\"range\" step=\"1\" min=\"1\" max=\"10\" [(ngModel)]=\"thickness\" />\n </sh-range-slider>\n</div>\n\n<div class=\"content\">\n <sh-spinner [style.--spinner-thickness]=\"thicknessAsPixels()\" [style.--spinner-size]=\"valueAsPixels()\"></sh-spinner>\n <sh-spinner\n [style.--spinner-thickness]=\"thicknessAsPixels()\"\n [style.--spinner-size]=\"valueAsPixels()\"\n color=\"primary\"></sh-spinner>\n <sh-spinner\n [style.--spinner-thickness]=\"thicknessAsPixels()\"\n [style.--spinner-size]=\"valueAsPixels()\"\n color=\"accent\"></sh-spinner>\n <sh-spinner\n [style.--spinner-thickness]=\"thicknessAsPixels()\"\n [style.--spinner-size]=\"valueAsPixels()\"\n color=\"warn\"></sh-spinner>\n <sh-spinner\n [style.--spinner-thickness]=\"thicknessAsPixels()\"\n [style.--spinner-size]=\"valueAsPixels()\"\n color=\"error\"></sh-spinner>\n <sh-spinner\n [style.--spinner-thickness]=\"thicknessAsPixels()\"\n [style.--spinner-size]=\"valueAsPixels()\"\n color=\"success\"></sh-spinner>\n</div>\n",
1127
+ "ts": "import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipRangeSlider, ShipSpinner } from 'ship-ui';\n\n@Component({\n selector: 'app-sandbox-spinner',\n imports: [FormsModule, ShipSpinner, ShipRangeSlider],\n templateUrl: './sandbox-spinner.html',\n styleUrl: './sandbox-spinner.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SandboxSpinner {\n value = signal(40);\n valueAsPixels = computed(() => `${this.value()}px`);\n\n thickness = signal(5);\n thicknessAsPixels = computed(() => `${this.thickness()}px`);\n}\n"
1128
+ }
1129
+ ]
1130
+ },
1131
+ {
1132
+ "name": "ShipStepper",
1133
+ "selector": "sh-stepper",
1134
+ "path": "projects/ship-ui/src/lib/ship-stepper/ship-stepper.ts",
1135
+ "description": "### Colors\n\nStepper colors can be set using the\n`color`\nattribute. Available options are:\n**primary**\n,\n**accent**\n,\n**warn**\n,\n**error**\n, and\n**success**\n.",
1136
+ "inputs": [
1137
+ {
1138
+ "name": "color",
1139
+ "type": "ShipColor | null",
1140
+ "description": "",
1141
+ "defaultValue": "null",
1142
+ "options": [
1143
+ "primary",
1144
+ "accent",
1145
+ "warn",
1146
+ "error",
1147
+ "success"
1148
+ ]
1149
+ }
1150
+ ],
1151
+ "outputs": [],
1152
+ "cssVariables": [
1153
+ {
1154
+ "name": "--step-track-bg",
1155
+ "defaultValue": "var(--base-3)"
1156
+ },
1157
+ {
1158
+ "name": "--step-c",
1159
+ "defaultValue": "var(--base-6)"
1160
+ },
1161
+ {
1162
+ "name": "--step-radio-cbg",
1163
+ "defaultValue": "var(--base-1)"
1164
+ },
1165
+ {
1166
+ "name": "--step-radio-c",
1167
+ "defaultValue": "var(--base-g2)"
1168
+ },
1169
+ {
1170
+ "name": "--step-active-c",
1171
+ "defaultValue": "var(--base-8)"
1172
+ },
1173
+ {
1174
+ "name": "--radiod-o",
1175
+ "defaultValue": "1"
1176
+ },
1177
+ {
1178
+ "name": "--radiod-c",
1179
+ "defaultValue": "var(--step-radio-cbg)"
1180
+ }
1181
+ ],
1182
+ "examples": [
1183
+ {
1184
+ "name": "custom-stepper",
1185
+ "html": "<sh-stepper>\n <div step [class.active]=\"activeStep() === 0\" (click)=\"activeStep.set(0)\">\n <sh-radio />\n Step 1\n </div>\n <div step [class.active]=\"activeStep() === 1\" (click)=\"activeStep.set(1)\">\n <sh-radio />\n Step 2\n </div>\n <div step [class.active]=\"activeStep() === 2\" (click)=\"activeStep.set(2)\">\n <sh-radio />\n Step 3\n </div>\n</sh-stepper>\n\n@let _activeStep = activeStep();\n\n<div class=\"step-content\">\n @if (_activeStep === 0) {\n <div>Step 1 Content</div>\n } @else if (_activeStep === 1) {\n <div>Step 2 Content</div>\n } @else if (_activeStep === 2) {\n <div>Step 3 Content</div>\n }\n</div>\n",
1186
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipRadio, ShipStepper } from 'ship-ui';\n\n@Component({\n selector: 'app-custom-steppers',\n standalone: true,\n imports: [ShipStepper, ShipRadio],\n templateUrl: './custom-steppers.html',\n styleUrls: ['./custom-steppers.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CustomSteppersComponent {\n activeStep = signal(0);\n}\n"
1187
+ },
1188
+ {
1189
+ "name": "router-stepper",
1190
+ "html": "<sh-stepper class=\"primary\">\n <div step routerLink=\"/steppers/step-1\" routerLinkActive=\"active\">\n <sh-radio />\n Step 1\n </div>\n <div step routerLink=\"/steppers/step-2\" routerLinkActive=\"active\">\n <sh-radio />\n Step 2\n </div>\n <div step routerLink=\"/steppers/step-3\" routerLinkActive=\"active\">\n <sh-radio />\n Step 3\n </div>\n <div step routerLink=\"/steppers/step-4\" routerLinkActive=\"active\">\n <sh-radio />\n Step 4\n </div>\n <div step routerLink=\"/steppers/step-5\" routerLinkActive=\"active\">\n <sh-radio />\n Step 5\n </div>\n</sh-stepper>\n",
1191
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { ShipRadio, ShipStepper } from 'ship-ui';\n\n@Component({\n selector: 'app-router-steppers',\n standalone: true,\n imports: [ShipStepper, ShipRadio, RouterLink, RouterLinkActive],\n templateUrl: './router-steppers.html',\n styleUrl: './router-steppers.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class Steppers {}\n"
1192
+ },
1193
+ {
1194
+ "name": "default-stepper",
1195
+ "html": "<sh-stepper>\n <button [class.active]=\"activeStep() === 0\" (click)=\"activeStep.set(0)\">\n <sh-radio />\n Step 1\n </button>\n <button [class.active]=\"activeStep() === 1\" (click)=\"activeStep.set(1)\">\n <sh-radio />\n Step 2\n </button>\n <button [class.active]=\"activeStep() === 2\" (click)=\"activeStep.set(2)\">\n <sh-radio />\n Step 3\n </button>\n</sh-stepper>\n\n@let _activeStep = activeStep();\n\n<div class=\"step-content\">\n @if (_activeStep === 0) {\n <div>Step 1 Content</div>\n } @else if (_activeStep === 1) {\n <div>Step 2 Content</div>\n } @else if (_activeStep === 2) {\n <div>Step 3 Content</div>\n }\n</div>\n",
1196
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipRadio, ShipStepper } from 'ship-ui';\n\n@Component({\n selector: 'app-default-steppers',\n standalone: true,\n imports: [ShipStepper, ShipRadio],\n templateUrl: './default-steppers.html',\n styleUrls: ['./default-steppers.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DefaultStepperComponent {\n activeStep = signal(0);\n}\n"
1197
+ },
1198
+ {
1199
+ "name": "stepper-sandbox",
1200
+ "html": "<div class=\"controls\">\n <p>Controls</p>\n <header>\n <div class=\"row\">\n <sh-button-group class=\"small\">\n <button [class.active]=\"colorClass() === ''\" (click)=\"colorClass.set('')\">Default</button>\n <button [class.active]=\"colorClass() === 'primary'\" (click)=\"colorClass.set('primary')\">Primary</button>\n <button [class.active]=\"colorClass() === 'accent'\" (click)=\"colorClass.set('accent')\">Accent</button>\n <button [class.active]=\"colorClass() === 'warn'\" (click)=\"colorClass.set('warn')\">Warn</button>\n <button [class.active]=\"colorClass() === 'error'\" (click)=\"colorClass.set('error')\">Error</button>\n <button [class.active]=\"colorClass() === 'success'\" (click)=\"colorClass.set('success')\">Success</button>\n </sh-button-group>\n </div>\n </header>\n</div>\n\n<div class=\"sandbox\">\n <sh-stepper [color]=\"colorClass()\">\n <div step [class.active]=\"activeStep() === 0\" (click)=\"activeStep.set(0)\">\n <sh-radio />\n Step 1\n </div>\n <div step [class.active]=\"activeStep() === 1\" (click)=\"activeStep.set(1)\">\n <sh-radio />\n Step 2\n </div>\n <div step [class.active]=\"activeStep() === 2\" (click)=\"activeStep.set(2)\">\n <sh-radio />\n Step 3\n </div>\n </sh-stepper>\n\n @let _activeStep = activeStep();\n\n <div class=\"step-content\">\n @if (_activeStep === 0) {\n <div>Step 1 Content</div>\n } @else if (_activeStep === 1) {\n <div>Step 2 Content</div>\n } @else if (_activeStep === 2) {\n <div>Step 3 Content</div>\n }\n </div>\n</div>\n",
1201
+ "ts": "import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport { ShipButtonGroup, ShipRadio, ShipStepper } from 'ship-ui';\n\n@Component({\n selector: 'app-stepper-sandbox',\n standalone: true,\n imports: [ShipStepper, ShipRadio, ShipButtonGroup],\n templateUrl: './stepper-sandbox.html',\n styleUrl: './stepper-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StepperSandbox {\n colorClass = signal<'' | 'primary' | 'accent' | 'warn' | 'error' | 'success'>('');\n stepperClass = computed(() => (this.colorClass() === '' ? '' : this.colorClass()));\n activeStep = signal(0);\n}\n"
1202
+ }
1203
+ ]
1204
+ },
1205
+ {
1206
+ "name": "ShipChip",
1207
+ "selector": "sh-chip",
1208
+ "path": "projects/ship-ui/src/lib/ship-chip/ship-chip.ts",
1209
+ "description": "### Variants\n\nChip variants can be set using the\n`variant`\nattribute. Valid options are:\n**simple**\n,\n**outlined**\n,\n**flat**\n, and\n**raised**\n.\n\n### Sizes\n\nChip sizes can be set using the\n`size`\nattribute. For example:\n`size=\"small\"`\n.\n\n### Colors\n\nChip colors can be set using the\n`color`\nattribute. Valid options are:\n**primary**\n,\n**accent**\n,\n**warn**\n,\n**error**\n, and\n**success**\n.\n\n### Dynamic Coloring\n\nYou can set a custom color using the CSS variable\n`--chip-c`\ntogether with the\n`dynamic`\ninput (as an attribute or binding). This is ideal for tagging purposes where you need a wide range of colors.\n\n### Icons\n\nChips can contain icons using the\n`sh-icon`\ncomponent. Use the\n`suffix`\nattribute for trailing icons.\n\n### Readonly\n\nThe chip can be set to readonly through the\n`readonly`\ninput (adds the\n`readonly`\nclass).\n\n### Disabled\n\nThe chip can be disabled using the standard\n`disabled`\nattribute or\n`[disabled]`\nbinding.\n\n:::info\nThis component utilizes the **Ship Sheet** utility for its visual structure. It supports standard sheet variations and is affected by global sheet variables.\n:::",
1210
+ "inputs": [
1211
+ {
1212
+ "name": "color",
1213
+ "type": "ShipColor | null",
1214
+ "description": "",
1215
+ "defaultValue": "null",
1216
+ "options": [
1217
+ "primary",
1218
+ "accent",
1219
+ "warn",
1220
+ "error",
1221
+ "success"
1222
+ ]
1223
+ },
1224
+ {
1225
+ "name": "variant",
1226
+ "type": "ShipSheetVariant | null",
1227
+ "description": "",
1228
+ "defaultValue": "null",
1229
+ "options": [
1230
+ "simple",
1231
+ "outlined",
1232
+ "flat",
1233
+ "raised"
1234
+ ]
1235
+ },
1236
+ {
1237
+ "name": "size",
1238
+ "type": "ShipSize | null",
1239
+ "description": "",
1240
+ "defaultValue": "null",
1241
+ "options": [
1242
+ "small"
1243
+ ]
1244
+ },
1245
+ {
1246
+ "name": "sharp",
1247
+ "type": "boolean | undefined",
1248
+ "description": "",
1249
+ "defaultValue": "undefined"
1250
+ },
1251
+ {
1252
+ "name": "dynamic",
1253
+ "type": "boolean | undefined",
1254
+ "description": "",
1255
+ "defaultValue": "undefined"
1256
+ },
1257
+ {
1258
+ "name": "readonly",
1259
+ "type": "boolean",
1260
+ "description": "",
1261
+ "defaultValue": "false"
1262
+ }
1263
+ ],
1264
+ "outputs": [],
1265
+ "cssVariables": [
1266
+ {
1267
+ "name": "--chip-h",
1268
+ "defaultValue": "#{p2r(32)}"
1269
+ },
1270
+ {
1271
+ "name": "--chip-s",
1272
+ "defaultValue": "calc(var(--chip-h) / 2)"
1273
+ },
1274
+ {
1275
+ "name": "--sheet-c",
1276
+ "defaultValue": "var(--chip-c)"
1277
+ },
1278
+ {
1279
+ "name": "--sheet-s",
1280
+ "defaultValue": "var(--chip-s)"
1281
+ },
1282
+ {
1283
+ "name": "--chip-bs",
1284
+ "defaultValue": "var(--box-shadow-10)"
1285
+ }
1286
+ ],
1287
+ "examples": [
1288
+ {
1289
+ "name": "base-chip",
1290
+ "html": "<sh-chip>\n <sh-icon>circle</sh-icon>\n</sh-chip>\n\n<sh-chip>\n <sh-icon>circle</sh-icon>\n Basic\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip color=\"primary\">\n <sh-icon>circle</sh-icon>\n Primary\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip color=\"accent\">\n <sh-icon>circle</sh-icon>\n Accent\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip color=\"warn\">\n <sh-icon>circle</sh-icon>\n Warn\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip color=\"error\">\n <sh-icon>circle</sh-icon>\n Error\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip color=\"success\">\n <sh-icon>circle</sh-icon>\n Success\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip disabled>\n <sh-icon>circle</sh-icon>\n Disabled\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n",
1291
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipChip, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-base-chip',\n imports: [ShipIcon, ShipChip],\n templateUrl: './base-chip.html',\n styleUrl: './base-chip.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseChip {}\n"
1292
+ },
1293
+ {
1294
+ "name": "flat-chip",
1295
+ "html": "<sh-chip variant=\"flat\">\n <sh-icon>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"flat\">\n <sh-icon>circle</sh-icon>\n Basic\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"flat\" color=\"primary\">\n <sh-icon>circle</sh-icon>\n Primary\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"flat\" color=\"accent\">\n <sh-icon>circle</sh-icon>\n Accent\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"flat\" color=\"warn\">\n <sh-icon>circle</sh-icon>\n Warn\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"flat\" color=\"error\">\n <sh-icon>circle</sh-icon>\n Error\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"flat\" color=\"success\">\n <sh-icon>circle</sh-icon>\n Success\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip disabled variant=\"flat\">\n <sh-icon>circle</sh-icon>\n Disabled\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n",
1296
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipChip, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-flat-chip',\n imports: [ShipIcon, ShipChip],\n templateUrl: './flat-chip.html',\n styleUrl: './flat-chip.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FlatChip {}\n"
1297
+ },
1298
+ {
1299
+ "name": "chip-sandbox",
1300
+ "html": "<div class=\"controls\">\n <p>Controls</p>\n <header>\n <div class=\"row\">\n <sh-toggle [class.active]=\"isSmall()\" color=\"primary\" variant=\"raised\" (click)=\"isSmall.set(!isSmall())\">\n Small\n </sh-toggle>\n <sh-toggle [class.active]=\"isSharp()\" color=\"primary\" variant=\"raised\" (click)=\"isSharp.set(!isSharp())\">\n Sharp\n </sh-toggle>\n <sh-toggle [class.active]=\"isDynamic()\" color=\"primary\" variant=\"raised\" (click)=\"isDynamic.set(!isDynamic())\">\n Dynamic coloring\n </sh-toggle>\n </div>\n\n <div class=\"row\">\n @if (isDynamic()) {\n <div>\n <p>It's not great at colors to light, we're working on a better css based color algorithm.</p>\n <br />\n <sh-color-picker\n [renderingType]=\"'hsl'\"\n [showDarkColors]=\"true\"\n [selectedColor]=\"selectedColor()\"\n (currentColor)=\"currentColor.set($event)\" />\n </div>\n } @else {\n <sh-button-group class=\"small\">\n <button [class.active]=\"colorClass() === ''\" (click)=\"colorClass.set('')\">Default</button>\n <button [class.active]=\"colorClass() === 'primary'\" (click)=\"colorClass.set('primary')\">Primary</button>\n <button [class.active]=\"colorClass() === 'accent'\" (click)=\"colorClass.set('accent')\">Accent</button>\n <button [class.active]=\"colorClass() === 'warn'\" (click)=\"colorClass.set('warn')\">Warn</button>\n <button [class.active]=\"colorClass() === 'error'\" (click)=\"colorClass.set('error')\">Error</button>\n <button [class.active]=\"colorClass() === 'success'\" (click)=\"colorClass.set('success')\">Success</button>\n </sh-button-group>\n\n <sh-button-group class=\"small\">\n <button [class.active]=\"variationClass() === ''\" (click)=\"variationClass.set('')\">Default</button>\n <button [class.active]=\"variationClass() === 'simple'\" (click)=\"variationClass.set('simple')\">Simple</button>\n <button [class.active]=\"variationClass() === 'outlined'\" (click)=\"variationClass.set('outlined')\">\n Outlined\n </button>\n <button [class.active]=\"variationClass() === 'flat'\" (click)=\"variationClass.set('flat')\">Flat</button>\n <button [class.active]=\"variationClass() === 'raised'\" (click)=\"variationClass.set('raised')\">Raised</button>\n </sh-button-group>\n }\n </div>\n </header>\n</div>\n\n<div class=\"sandbox\">\n <sh-chip\n [color]=\"colorClass()\"\n [variant]=\"variationClass()\"\n [size]=\"sizeClass()\"\n [sharp]=\"isSharp()\"\n [dynamic]=\"isDynamic()\"\n [style.--chip-c]=\"isDynamic() ? currentColor()?.hsl : undefined\">\n <sh-icon>circle</sh-icon>\n </sh-chip>\n\n <sh-chip\n [color]=\"colorClass()\"\n [variant]=\"variationClass()\"\n [size]=\"sizeClass()\"\n [sharp]=\"isSharp()\"\n [dynamic]=\"isDynamic()\"\n [style.--chip-c]=\"isDynamic() ? currentColor()?.hsl : undefined\">\n <span>Chip</span>\n <sh-icon>circle</sh-icon>\n </sh-chip>\n\n <sh-chip\n [color]=\"colorClass()\"\n [variant]=\"variationClass()\"\n [size]=\"sizeClass()\"\n [sharp]=\"isSharp()\"\n [dynamic]=\"isDynamic()\"\n [style.--chip-c]=\"isDynamic() ? currentColor()?.hsl : undefined\">\n <sh-icon>circle</sh-icon>\n <span>Chip</span>\n </sh-chip>\n\n <sh-chip\n [color]=\"colorClass()\"\n [variant]=\"variationClass()\"\n [size]=\"sizeClass()\"\n [sharp]=\"isSharp()\"\n [dynamic]=\"isDynamic()\"\n [style.--chip-c]=\"isDynamic() ? currentColor()?.hsl : undefined\">\n <sh-icon>circle</sh-icon>\n <span>Chip</span>\n <sh-icon>circle</sh-icon>\n </sh-chip>\n\n <sh-chip\n [color]=\"colorClass()\"\n [variant]=\"variationClass()\"\n [size]=\"sizeClass()\"\n [sharp]=\"isSharp()\"\n [dynamic]=\"isDynamic()\"\n [style.--chip-c]=\"isDynamic() ? currentColor()?.hsl : undefined\">\n <sh-icon>circle</sh-icon>\n </sh-chip>\n\n <sh-chip\n [color]=\"colorClass()\"\n [variant]=\"variationClass()\"\n [size]=\"sizeClass()\"\n [sharp]=\"isSharp()\"\n [dynamic]=\"isDynamic()\"\n [style.--chip-c]=\"isDynamic() ? currentColor()?.hsl : undefined\">\n <sh-icon>circle</sh-icon>\n </sh-chip>\n\n <sh-chip\n [color]=\"colorClass()\"\n [variant]=\"variationClass()\"\n [size]=\"sizeClass()\"\n [sharp]=\"isSharp()\"\n [dynamic]=\"isDynamic()\"\n [style.--chip-c]=\"isDynamic() ? currentColor()?.hsl : undefined\">\n <span>Chip</span>\n </sh-chip>\n</div>\n",
1301
+ "ts": "import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport { ShipButtonGroup, ShipChip, ShipColorPicker, ShipIcon, ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-chip-sandbox',\n imports: [ShipIcon, ShipChip, ShipButtonGroup, ShipToggle, ShipColorPicker],\n templateUrl: './chip-sandbox.html',\n styleUrl: './chip-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChipSandbox {\n isSmall = signal<boolean>(false);\n isSharp = signal<boolean>(false);\n isDynamic = signal<boolean>(false);\n hasIcon = signal<boolean>(true);\n hasSuffixIcon = signal<boolean>(true);\n hasText = signal<boolean>(true);\n\n colorClass = signal<'' | 'primary' | 'accent' | 'warn' | 'error' | 'success'>('primary');\n variationClass = signal<'' | 'simple' | 'outlined' | 'flat' | 'raised'>('raised');\n sizeClass = computed(() => (this.isSmall() ? 'small' : ''));\n\n // Color picker\n selectedColor = signal<[number, number, number]>([60, 131, 246]);\n currentColor = signal<{ rgb: string; hex: string; hsl: string; hue: number; saturation: number } | null>(null);\n\n // colorEffect = effect(() => {\n // if (this.isDynamic()) {\n // this.currentColor.set({\n // rgb: 'rgb(132,156,255)',\n // hex: '#849cff',\n // hsl: 'hsl(228, 100%, 76%)',\n // hue: 228,\n // saturation: 100,\n // });\n // }\n // });\n}\n"
1302
+ },
1303
+ {
1304
+ "name": "simple-chip",
1305
+ "html": "<sh-chip variant=\"simple\">\n <sh-icon>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"simple\">\n <sh-icon>circle</sh-icon>\n Basic\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"simple\" color=\"primary\">\n <sh-icon>circle</sh-icon>\n Primary\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"simple\" color=\"accent\">\n <sh-icon>circle</sh-icon>\n Accent\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"simple\" color=\"warn\">\n <sh-icon>circle</sh-icon>\n Warn\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"simple\" color=\"error\">\n <sh-icon>circle</sh-icon>\n Error\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"simple\" color=\"success\">\n <sh-icon>circle</sh-icon>\n Success\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip disabled variant=\"simple\">\n <sh-icon>circle</sh-icon>\n Disabled\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n",
1306
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipChip, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-simple-chip',\n imports: [ShipIcon, ShipChip],\n templateUrl: './simple-chip.html',\n styleUrl: './simple-chip.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SimpleChip {}\n"
1307
+ },
1308
+ {
1309
+ "name": "raised-chip",
1310
+ "html": "<sh-chip variant=\"raised\">\n <sh-icon>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"raised\">\n <sh-icon>circle</sh-icon>\n Basic\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"raised\" color=\"primary\">\n <sh-icon>circle</sh-icon>\n Primary\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"raised\" color=\"accent\">\n <sh-icon>circle</sh-icon>\n Accent\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"raised\" color=\"warn\">\n <sh-icon>circle</sh-icon>\n Warn\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"raised\" color=\"error\">\n <sh-icon>circle</sh-icon>\n Error\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"raised\" color=\"success\">\n <sh-icon>circle</sh-icon>\n Success\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip disabled variant=\"raised\">\n <sh-icon>circle</sh-icon>\n Disabled\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n",
1311
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipChip, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-raised-chip',\n imports: [ShipIcon, ShipChip],\n templateUrl: './raised-chip.html',\n styleUrl: './raised-chip.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RaisedChip {}\n"
1312
+ },
1313
+ {
1314
+ "name": "outlined-chip",
1315
+ "html": "<sh-chip variant=\"outlined\">\n <sh-icon>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"outlined\">\n <sh-icon>circle</sh-icon>\n Basic\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"outlined\" color=\"primary\">\n <sh-icon>circle</sh-icon>\n Primary\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"outlined\" color=\"accent\">\n <sh-icon>circle</sh-icon>\n Accent\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"outlined\" color=\"warn\">\n <sh-icon>circle</sh-icon>\n Warn\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"outlined\" color=\"error\">\n <sh-icon>circle</sh-icon>\n Error\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip variant=\"outlined\" color=\"success\">\n <sh-icon>circle</sh-icon>\n Success\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n\n<sh-chip disabled variant=\"outlined\">\n <sh-icon>circle</sh-icon>\n Disabled\n <sh-icon suffix>circle</sh-icon>\n</sh-chip>\n",
1316
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipChip, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-outlined-chip',\n imports: [ShipIcon, ShipChip],\n templateUrl: './outlined-chip.html',\n styleUrl: './outlined-chip.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OutlinedChip {}\n"
1317
+ }
1318
+ ]
1319
+ },
1320
+ {
1321
+ "name": "ShipThemeToggle",
1322
+ "selector": "ship-theme-toggle",
1323
+ "path": "projects/ship-ui/src/lib/ship-theme-toggle/ship-theme-toggle.ts",
1324
+ "description": "",
1325
+ "inputs": [],
1326
+ "outputs": [],
1327
+ "cssVariables": [],
1328
+ "examples": []
1329
+ },
1330
+ {
1331
+ "name": "ChildComponent",
1332
+ "selector": "app-child",
1333
+ "path": "projects/ship-ui/src/lib/utilities/create-input-example.component.ts",
1334
+ "description": "",
1335
+ "inputs": [],
1336
+ "outputs": [],
1337
+ "cssVariables": [],
1338
+ "examples": []
1339
+ },
1340
+ {
1341
+ "name": "ShipList",
1342
+ "selector": "sh-list",
1343
+ "path": "projects/ship-ui/src/lib/ship-list/ship-list.ts",
1344
+ "description": "### item\n\nAdd the\n`item`\nattribute to a child element of\n`sh-list`\nto make it a list item.\n\n### action\n\nAdd the\n`action`\nattribute to a child element of\n`sh-list`\nto make it an actionable item (e.g., clickable).\n\n### suffix\n\nAdd the\n`suffix`\nattribute to an element inside a list item to align it to the right.",
1345
+ "inputs": [],
1346
+ "outputs": [],
1347
+ "cssVariables": [
1348
+ {
1349
+ "name": "--list-s",
1350
+ "defaultValue": "var(--shape-2)"
1351
+ },
1352
+ {
1353
+ "name": "--list-active-bg",
1354
+ "defaultValue": "var(--base-1)"
1355
+ },
1356
+ {
1357
+ "name": "--list-color",
1358
+ "defaultValue": "var(--base-9)"
1359
+ },
1360
+ {
1361
+ "name": "--list-active-bs",
1362
+ "defaultValue": "none"
1363
+ },
1364
+ {
1365
+ "name": "--list-item-b",
1366
+ "defaultValue": "1px solid transparent"
1367
+ },
1368
+ {
1369
+ "name": "--list-item-active-b",
1370
+ "defaultValue": "1px solid --list-active-bg"
1371
+ },
1372
+ {
1373
+ "name": "--list-p",
1374
+ "defaultValue": "#{p2r(20 16)}"
1375
+ },
1376
+ {
1377
+ "name": "--list-item-p",
1378
+ "defaultValue": "#{p2r(8 12)}"
1379
+ },
1380
+ {
1381
+ "name": "--list-item-gap",
1382
+ "defaultValue": "#{p2r(8)}"
1383
+ }
1384
+ ],
1385
+ "examples": [
1386
+ {
1387
+ "name": "base-list-example",
1388
+ "html": "<sh-list class=\"primary\">\n <h3 title>Basic</h3>\n <div item>\n <sh-icon>circle</sh-icon>\n Simple item\n <span suffix>⌘O</span>\n </div>\n <div item>\n <sh-icon>circle</sh-icon>\n Another simple item\n <span suffix>⌘O</span>\n </div>\n <div action [class.active]=\"active()\" (click)=\"active.set(!active())\">\n <sh-icon>circle</sh-icon>\n Actionable item\n <span suffix>⌘O</span>\n </div>\n <div item (click)=\"checkbox1.setValue(!checkbox1.value)\">\n <sh-icon>circle</sh-icon>\n Checkbox item with reactive form control\n <sh-checkbox suffix>\n <input type=\"checkbox\" [formControl]=\"checkbox1\" />\n </sh-checkbox>\n </div>\n <div item (click)=\"checkbox2.set(!checkbox2())\">\n <sh-checkbox>\n <input type=\"checkbox\" [ngModel]=\"checkbox2()\" />\n </sh-checkbox>\n Checkbox item with ngModel\n </div>\n</sh-list>\n",
1389
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { ShipCheckbox, ShipIcon, ShipList } from 'ship-ui';\n\n@Component({\n selector: 'base-list-example',\n standalone: true,\n imports: [FormsModule, ReactiveFormsModule, ShipList, ShipIcon, ShipCheckbox],\n templateUrl: './base-list-example.html',\n styleUrls: ['./base-list-example.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseListExample {\n active = signal(false);\n checkbox1 = new FormControl(false);\n checkbox2 = signal(false);\n}\n"
1390
+ }
1391
+ ]
1392
+ },
1393
+ {
1394
+ "name": "ShipMenu",
1395
+ "selector": "sh-menu",
1396
+ "path": "projects/ship-ui/src/lib/ship-menu/ship-menu.ts",
1397
+ "description": "### Searchable\n\nEnable a wildcard search input to filter menu options using the\n`searchable`\nattribute.\n\n### Behavior\n\nCustomize menu interaction:\n\n<li>\n`asMultiLayer`\n: Enables nested menu support.\n</li>\n<li>\n`closeOnClick`\n: Determines if the menu closes when an option is selected (default: true).\n</li>\n<li>\n`disabled`\n: Disables the menu trigger and content.\n</li>\n\n### Slots\n\nAdd a\n`suffix`\nattribute to an element inside a menu option to display hotkeys, icons, or secondary information at the trailing\nend.",
1398
+ "inputs": [
1399
+ {
1400
+ "name": "asMultiLayer",
1401
+ "type": "boolean",
1402
+ "description": "",
1403
+ "defaultValue": "false"
1404
+ },
1405
+ {
1406
+ "name": "openIndicator",
1407
+ "type": "any",
1408
+ "description": "",
1409
+ "defaultValue": "false"
1410
+ },
1411
+ {
1412
+ "name": "disabled",
1413
+ "type": "boolean",
1414
+ "description": "",
1415
+ "defaultValue": "false"
1416
+ },
1417
+ {
1418
+ "name": "customOptionElementSelectors",
1419
+ "type": "string[]",
1420
+ "description": "",
1421
+ "defaultValue": "['button']"
1422
+ },
1423
+ {
1424
+ "name": "keepClickedOptionActive",
1425
+ "type": "boolean",
1426
+ "description": "",
1427
+ "defaultValue": "false"
1428
+ },
1429
+ {
1430
+ "name": "closeOnClick",
1431
+ "type": "boolean",
1432
+ "description": "",
1433
+ "defaultValue": "true"
1434
+ },
1435
+ {
1436
+ "name": "searchable",
1437
+ "type": "boolean",
1438
+ "description": "",
1439
+ "defaultValue": "false"
1440
+ },
1441
+ {
1442
+ "name": "isOpen",
1443
+ "type": "boolean",
1444
+ "description": "",
1445
+ "defaultValue": "false"
1446
+ }
1447
+ ],
1448
+ "outputs": [
1449
+ {
1450
+ "name": "closed",
1451
+ "type": "boolean",
1452
+ "description": ""
1453
+ }
1454
+ ],
1455
+ "cssVariables": [
1456
+ {
1457
+ "name": "--menu-mh",
1458
+ "defaultValue": "#{p2r(320)}"
1459
+ }
1460
+ ],
1461
+ "examples": [
1462
+ {
1463
+ "name": "icon-suffix-menu",
1464
+ "html": "<sh-menu>\n <button shButton class=\"outlined\">Open menu</button>\n <ng-container menu>\n @for (item of menuItems; track item.value) {\n <button (click)=\"select(item)\" [class.selected]=\"selected() === item.value\">\n <sh-icon>circle</sh-icon>\n {{ item.label }}\n <span suffix>{{ item.hotkey }}</span>\n </button>\n }\n </ng-container>\n</sh-menu>\n",
1465
+ "ts": "import { Component, signal } from '@angular/core';\nimport { ShipButton, ShipIcon, ShipMenu } from 'ship-ui';\n\n@Component({\n selector: 'sh-icon-suffix-menu',\n templateUrl: './icon-suffix-menu.html',\n styleUrls: ['./icon-suffix-menu.scss'],\n imports: [ShipMenu, ShipIcon, ShipButton],\n})\nexport class IconSuffixMenu {\n menuItems = [\n { label: 'Home', value: 'home', hotkey: '⌘L' },\n { label: 'Profile', value: 'profile', hotkey: '⌘K' },\n { label: 'Settings', value: 'settings', hotkey: '⌘J' },\n ];\n\n selected = signal<string | null>(null);\n\n select(item: any) {\n this.selected.set(item.value);\n }\n}\n"
1466
+ },
1467
+ {
1468
+ "name": "search-menu-example",
1469
+ "html": "<sh-menu [searchable]=\"true\">\n <button shButton class=\"outlined\">Open searchable menu</button>\n <ng-container menu>\n @for (item of filteredItems; track item.value) {\n <button (click)=\"select(item)\" [class.selected]=\"selected === item.value\">\n <p>\n hello world\n <br />\n {{ item.label }}\n </p>\n </button>\n }\n </ng-container>\n</sh-menu>\n",
1470
+ "ts": "import { Component } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipButton, ShipMenu } from 'ship-ui';\n\n@Component({\n selector: 'sh-search-menu-example',\n templateUrl: './search-menu-example.html',\n styleUrls: ['./search-menu-example.scss'],\n imports: [FormsModule, ShipMenu, ShipButton],\n standalone: true,\n})\nexport class SearchMenuExample {\n menuItems = [\n { label: 'Dashboard', value: 'dashboard' },\n { label: 'Users', value: 'users' },\n { label: 'Settings', value: 'settings' },\n { label: 'Billing', value: 'billing' },\n { label: 'Support', value: 'support' },\n ];\n search = '';\n selected: string | null = null;\n\n get filteredItems() {\n return this.menuItems.filter((item) => item.label.toLowerCase().includes(this.search.toLowerCase()));\n }\n\n select(item: any) {\n this.selected = item.value;\n }\n}\n"
1471
+ },
1472
+ {
1473
+ "name": "multi-layer-menu-example",
1474
+ "html": "<sh-menu [asMultiLayer]=\"true\">\n <button shButton class=\"outlined\">Open multi-layer menu</button>\n <ng-container menu>\n @for (item of menu; track $index) {\n @if (item.children) {\n <sh-menu [asMultiLayer]=\"true\">\n <button>{{ item.label }}</button>\n <ng-container menu>\n @for (sub of item.children; track sub.value) {\n <button (click)=\"select(sub)\" [class.selected]=\"selected === sub.value\">\n {{ sub.label }}\n </button>\n }\n </ng-container>\n </sh-menu>\n } @else {\n <button (click)=\"select(item)\" [class.selected]=\"selected === item.value\">\n {{ item.label }}\n </button>\n }\n }\n </ng-container>\n</sh-menu>\n",
1475
+ "ts": "import { Component } from '@angular/core';\nimport { ShipButton, ShipMenu } from 'ship-ui';\n\n@Component({\n selector: 'sh-multi-layer-menu-example',\n templateUrl: './multi-layer-menu-example.html',\n styleUrls: ['./multi-layer-menu-example.scss'],\n imports: [ShipMenu, ShipButton],\n standalone: true,\n})\nexport class MultiLayerMenuExample {\n menu = [\n {\n label: 'File',\n children: [\n { label: 'New', value: 'new' },\n { label: 'Open', value: 'open' },\n { label: 'Exit', value: 'exit' },\n ],\n },\n {\n label: 'Edit',\n children: [\n { label: 'Undo', value: 'undo' },\n { label: 'Redo', value: 'redo' },\n ],\n },\n { label: 'Help', value: 'help' },\n ];\n selected: string | null = null;\n openSubmenu: number | null = null;\n\n select(item: any) {\n this.selected = item.value;\n }\n\n toggleSubmenu(idx: number) {\n this.openSubmenu = this.openSubmenu === idx ? null : idx;\n }\n}\n"
1476
+ },
1477
+ {
1478
+ "name": "toggle-select-menu-example",
1479
+ "html": "<sh-menu>\n <button shButton class=\"outlined\">Open toggle select menu</button>\n <ng-container menu>\n @for (item of menuItems; track item.value) {\n <button (click)=\"toggle($event, item)\">\n <sh-checkbox [class.active]=\"isSelected(item)\" class=\"primary raised\">\n {{ item.label }}\n </sh-checkbox>\n </button>\n }\n </ng-container>\n</sh-menu>\n",
1480
+ "ts": "import { Component } from '@angular/core';\nimport { ShipButton, ShipCheckbox, ShipMenu } from 'ship-ui';\n\n@Component({\n selector: 'sh-toggle-select-menu-example',\n templateUrl: './toggle-select-menu-example.html',\n styleUrls: ['./toggle-select-menu-example.scss'],\n imports: [ShipMenu, ShipButton, ShipCheckbox],\n standalone: true,\n})\nexport class ToggleSelectMenuExample {\n menuItems = [\n { label: 'Email Notifications', value: 'email' },\n { label: 'SMS Alerts', value: 'sms' },\n { label: 'Push Notifications', value: 'push' },\n ];\n selected: Set<string> = new Set();\n\n toggle($event: MouseEvent, item: any) {\n $event.stopPropagation();\n\n if (this.selected.has(item.value)) {\n this.selected.delete(item.value);\n } else {\n this.selected.add(item.value);\n }\n // Force change detection for Set\n this.selected = new Set(this.selected);\n }\n\n isSelected(item: any) {\n return this.selected.has(item.value);\n }\n}\n"
1481
+ },
1482
+ {
1483
+ "name": "base-menu-example",
1484
+ "html": "<sh-menu>\n <button shButton class=\"outlined\">Open menu</button>\n <ng-container menu>\n @for (item of menuItems; track item.value) {\n <button (click)=\"someFunction(item)\">\n {{ item.label }}\n </button>\n }\n </ng-container>\n</sh-menu>\n",
1485
+ "ts": "import { Component } from '@angular/core';\nimport { ShipButton, ShipMenu } from 'ship-ui';\n\n@Component({\n selector: 'base-menu-example',\n templateUrl: './base-menu-example.html',\n styleUrls: ['./base-menu-example.scss'],\n imports: [ShipMenu, ShipButton],\n})\nexport class BaseMenuExample {\n menuItems = [\n { label: 'Home', value: 'home' },\n { label: 'Profile', value: 'profile' },\n { label: 'Settings', value: 'settings' },\n ];\n\n someFunction(item: any) {\n alert(item.label);\n }\n}\n"
1486
+ }
1487
+ ]
1488
+ },
1489
+ {
1490
+ "name": "ShipAlert",
1491
+ "selector": "sh-alert",
1492
+ "path": "projects/ship-ui/src/lib/ship-alert/ship-alert.ts",
1493
+ "description": "### Variants\n\nAlert variants can be set using the\n`variant`\nattribute. Valid options are:\n**simple**\n,\n**outlined**\n,\n**flat**\n, and\n**raised**\n.\n\n### Colors\n\nAlert colors can be set using the\n`color`\nattribute. Valid options are:\n**primary**\n,\n**accent**\n,\n**warn**\n,\n**error**\n, and\n**success**\n.\n\n:::info\nThis component utilizes the **Ship Sheet** utility for its visual structure. It supports standard sheet variations and is affected by global sheet variables.\n:::",
1494
+ "inputs": [
1495
+ {
1496
+ "name": "color",
1497
+ "type": "ShipColor | null",
1498
+ "description": "",
1499
+ "defaultValue": "null",
1500
+ "options": [
1501
+ "primary",
1502
+ "accent",
1503
+ "warn",
1504
+ "error",
1505
+ "success"
1506
+ ]
1507
+ },
1508
+ {
1509
+ "name": "variant",
1510
+ "type": "ShipSheetVariant | null",
1511
+ "description": "",
1512
+ "defaultValue": "null",
1513
+ "options": [
1514
+ "simple",
1515
+ "outlined",
1516
+ "flat",
1517
+ "raised"
1518
+ ]
1519
+ },
1520
+ {
1521
+ "name": "alertService",
1522
+ "type": "ShipAlertService | null",
1523
+ "description": "",
1524
+ "defaultValue": "null"
1525
+ },
1526
+ {
1527
+ "name": "id",
1528
+ "type": "string | null",
1529
+ "description": "",
1530
+ "defaultValue": "null"
1531
+ }
1532
+ ],
1533
+ "outputs": [],
1534
+ "cssVariables": [
1535
+ {
1536
+ "name": "--alert-ad",
1537
+ "defaultValue": "400ms"
1538
+ },
1539
+ {
1540
+ "name": "--alert-bs",
1541
+ "defaultValue": "var(--box-shadow-10)"
1542
+ },
1543
+ {
1544
+ "name": "--alert-p",
1545
+ "defaultValue": "#{p2r(8)}"
1546
+ },
1547
+ {
1548
+ "name": "--sheet-c",
1549
+ "defaultValue": "#fff"
1550
+ }
1551
+ ],
1552
+ "examples": [
1553
+ {
1554
+ "name": "flat-alert",
1555
+ "html": "<!-- Using attribute inputs -->\n<sh-alert variant=\"flat\">Flat alert</sh-alert>\n<sh-alert variant=\"flat\" color=\"primary\">Primary flat alert</sh-alert>\n<sh-alert variant=\"flat\" color=\"accent\">Accent flat alert</sh-alert>\n<sh-alert variant=\"flat\" color=\"warn\">Warn flat alert</sh-alert>\n<sh-alert variant=\"flat\" color=\"error\">Error flat alert</sh-alert>\n<sh-alert variant=\"flat\" color=\"success\">\n Success flat alert\n <p>with a paragraph</p>\n</sh-alert>\n\n<!-- Alternative: Using CSS classes -->\n<!--\n<sh-alert class=\"flat\">Flat alert</sh-alert>\n<sh-alert class=\"flat primary\">Primary flat alert</sh-alert>\n-->\n",
1556
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipAlert } from 'ship-ui';\n\n@Component({\n selector: 'app-flat-alert',\n standalone: true,\n imports: [ShipAlert],\n templateUrl: './flat-alert.html',\n styleUrl: './flat-alert.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FlatAlert {\n active = signal(false);\n}\n"
1557
+ },
1558
+ {
1559
+ "name": "simple-alert",
1560
+ "html": "<!-- Using attribute inputs -->\n<sh-alert variant=\"simple\">Simple alert</sh-alert>\n<sh-alert variant=\"simple\" color=\"primary\">Primary simple alert</sh-alert>\n<sh-alert variant=\"simple\" color=\"accent\">Accent simple alert</sh-alert>\n<sh-alert variant=\"simple\" color=\"warn\">Warn simple alert</sh-alert>\n<sh-alert variant=\"simple\" color=\"error\">Error simple alert</sh-alert>\n<sh-alert variant=\"simple\" color=\"success\">\n Success simple alert\n <p>with a paragraph</p>\n</sh-alert>\n\n<!-- Alternative: Using CSS classes -->\n<!--\n<sh-alert class=\"simple\">Simple alert</sh-alert>\n<sh-alert class=\"simple primary\">Primary simple alert</sh-alert>\n-->\n",
1561
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipAlert } from 'ship-ui';\n\n@Component({\n selector: 'app-simple-alert',\n standalone: true,\n imports: [ShipAlert],\n templateUrl: './simple-alert.html',\n styleUrl: './simple-alert.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SimpleAlert {\n active = signal(false);\n}\n"
1562
+ },
1563
+ {
1564
+ "name": "base-alert",
1565
+ "html": "<!-- Using attribute inputs -->\n<sh-alert>Base alert</sh-alert>\n<sh-alert color=\"primary\">Primary alert</sh-alert>\n<sh-alert color=\"accent\">Accent alert</sh-alert>\n<sh-alert color=\"warn\">Warn alert</sh-alert>\n<sh-alert color=\"error\">Error alert</sh-alert>\n<sh-alert color=\"success\">Success alert</sh-alert>\n<sh-alert color=\"success\">\n Success alert\n <p>with a paragraph</p>\n</sh-alert>\n\n<sh-alert color=\"primary\">\n Success alert\n <button shButton color=\"primary\" variant=\"outlined\" size=\"small\">Button</button>\n</sh-alert>\n\n<sh-alert color=\"primary\">\n Success alert\n <p>with a paragraph</p>\n <button shButton color=\"primary\" variant=\"outlined\" size=\"small\">Button</button>\n</sh-alert>\n\n<!-- Alternative: Using CSS classes -->\n<!--\n<sh-alert class=\"primary\">Primary alert</sh-alert>\n<sh-alert class=\"accent\">Accent alert</sh-alert>\n<button shButton class=\"outlined primary small\">Button</button>\n-->\n",
1566
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipAlert, ShipButton } from 'ship-ui';\n\n@Component({\n selector: 'app-base-alert',\n standalone: true,\n imports: [ShipAlert, ShipButton],\n templateUrl: './base-alert.html',\n styleUrl: './base-alert.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseAlert {\n active = signal(false);\n}\n"
1567
+ },
1568
+ {
1569
+ "name": "raised-alert",
1570
+ "html": "<!-- Using attribute inputs -->\n<sh-alert variant=\"raised\">Raised alert</sh-alert>\n<sh-alert variant=\"raised\" color=\"primary\">Primary raised alert</sh-alert>\n<sh-alert variant=\"raised\" color=\"accent\">Accent raised alert</sh-alert>\n<sh-alert variant=\"raised\" color=\"warn\">Warn raised alert</sh-alert>\n<sh-alert variant=\"raised\" color=\"error\">Error raised alert</sh-alert>\n<sh-alert variant=\"raised\" color=\"success\">\n Success raised alert\n <p>with a paragraph</p>\n</sh-alert>\n\n<!-- Alternative: Using CSS classes -->\n<!--\n<sh-alert class=\"raised\">Raised alert</sh-alert>\n<sh-alert class=\"raised primary\">Primary raised alert</sh-alert>\n-->\n",
1571
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipAlert } from 'ship-ui';\n\n@Component({\n selector: 'app-raised-alert',\n standalone: true,\n imports: [ShipAlert],\n templateUrl: './raised-alert.html',\n styleUrl: './raised-alert.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RaisedAlert {\n active = signal(false);\n}\n"
1572
+ },
1573
+ {
1574
+ "name": "outlined-alert",
1575
+ "html": "<!-- Using attribute inputs -->\n<sh-alert variant=\"outlined\">Outlined alert</sh-alert>\n<sh-alert variant=\"outlined\" color=\"primary\">Primary outlined alert</sh-alert>\n<sh-alert variant=\"outlined\" color=\"accent\">Accent outlined alert</sh-alert>\n<sh-alert variant=\"outlined\" color=\"warn\">Warn outlined alert</sh-alert>\n<sh-alert variant=\"outlined\" color=\"error\">Error outlined alert</sh-alert>\n<sh-alert variant=\"outlined\" color=\"success\">\n Success outlined alert\n <p>with a paragraph</p>\n</sh-alert>\n\n<!-- Alternative: Using CSS classes -->\n<!--\n<sh-alert class=\"outlined\">Outlined alert</sh-alert>\n<sh-alert class=\"outlined primary\">Primary outlined alert</sh-alert>\n-->\n",
1576
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipAlert } from 'ship-ui';\n\n@Component({\n selector: 'app-outlined-alert',\n standalone: true,\n imports: [ShipAlert],\n templateUrl: './outlined-alert.html',\n styleUrl: './outlined-alert.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OutlinedAlert {\n active = signal(false);\n}\n"
1577
+ }
1578
+ ]
1579
+ },
1580
+ {
1581
+ "name": "ShipAlertContainer",
1582
+ "selector": "ship-alert-container",
1583
+ "path": "projects/ship-ui/src/lib/ship-alert/ship-alert-container.ts",
1584
+ "description": "### Variants\n\nAlert variants can be set using the\n`variant`\nattribute. Valid options are:\n**simple**\n,\n**outlined**\n,\n**flat**\n, and\n**raised**\n.\n\n### Colors\n\nAlert colors can be set using the\n`color`\nattribute. Valid options are:\n**primary**\n,\n**accent**\n,\n**warn**\n,\n**error**\n, and\n**success**\n.",
1585
+ "inputs": [
1586
+ {
1587
+ "name": "inline",
1588
+ "type": "string | null",
1589
+ "description": "",
1590
+ "defaultValue": "null"
1591
+ }
1592
+ ],
1593
+ "outputs": [],
1594
+ "cssVariables": [],
1595
+ "examples": [
1596
+ {
1597
+ "name": "flat-alert",
1598
+ "html": "<!-- Using attribute inputs -->\n<sh-alert variant=\"flat\">Flat alert</sh-alert>\n<sh-alert variant=\"flat\" color=\"primary\">Primary flat alert</sh-alert>\n<sh-alert variant=\"flat\" color=\"accent\">Accent flat alert</sh-alert>\n<sh-alert variant=\"flat\" color=\"warn\">Warn flat alert</sh-alert>\n<sh-alert variant=\"flat\" color=\"error\">Error flat alert</sh-alert>\n<sh-alert variant=\"flat\" color=\"success\">\n Success flat alert\n <p>with a paragraph</p>\n</sh-alert>\n\n<!-- Alternative: Using CSS classes -->\n<!--\n<sh-alert class=\"flat\">Flat alert</sh-alert>\n<sh-alert class=\"flat primary\">Primary flat alert</sh-alert>\n-->\n",
1599
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipAlert } from 'ship-ui';\n\n@Component({\n selector: 'app-flat-alert',\n standalone: true,\n imports: [ShipAlert],\n templateUrl: './flat-alert.html',\n styleUrl: './flat-alert.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FlatAlert {\n active = signal(false);\n}\n"
1600
+ },
1601
+ {
1602
+ "name": "simple-alert",
1603
+ "html": "<!-- Using attribute inputs -->\n<sh-alert variant=\"simple\">Simple alert</sh-alert>\n<sh-alert variant=\"simple\" color=\"primary\">Primary simple alert</sh-alert>\n<sh-alert variant=\"simple\" color=\"accent\">Accent simple alert</sh-alert>\n<sh-alert variant=\"simple\" color=\"warn\">Warn simple alert</sh-alert>\n<sh-alert variant=\"simple\" color=\"error\">Error simple alert</sh-alert>\n<sh-alert variant=\"simple\" color=\"success\">\n Success simple alert\n <p>with a paragraph</p>\n</sh-alert>\n\n<!-- Alternative: Using CSS classes -->\n<!--\n<sh-alert class=\"simple\">Simple alert</sh-alert>\n<sh-alert class=\"simple primary\">Primary simple alert</sh-alert>\n-->\n",
1604
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipAlert } from 'ship-ui';\n\n@Component({\n selector: 'app-simple-alert',\n standalone: true,\n imports: [ShipAlert],\n templateUrl: './simple-alert.html',\n styleUrl: './simple-alert.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SimpleAlert {\n active = signal(false);\n}\n"
1605
+ },
1606
+ {
1607
+ "name": "base-alert",
1608
+ "html": "<!-- Using attribute inputs -->\n<sh-alert>Base alert</sh-alert>\n<sh-alert color=\"primary\">Primary alert</sh-alert>\n<sh-alert color=\"accent\">Accent alert</sh-alert>\n<sh-alert color=\"warn\">Warn alert</sh-alert>\n<sh-alert color=\"error\">Error alert</sh-alert>\n<sh-alert color=\"success\">Success alert</sh-alert>\n<sh-alert color=\"success\">\n Success alert\n <p>with a paragraph</p>\n</sh-alert>\n\n<sh-alert color=\"primary\">\n Success alert\n <button shButton color=\"primary\" variant=\"outlined\" size=\"small\">Button</button>\n</sh-alert>\n\n<sh-alert color=\"primary\">\n Success alert\n <p>with a paragraph</p>\n <button shButton color=\"primary\" variant=\"outlined\" size=\"small\">Button</button>\n</sh-alert>\n\n<!-- Alternative: Using CSS classes -->\n<!--\n<sh-alert class=\"primary\">Primary alert</sh-alert>\n<sh-alert class=\"accent\">Accent alert</sh-alert>\n<button shButton class=\"outlined primary small\">Button</button>\n-->\n",
1609
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipAlert, ShipButton } from 'ship-ui';\n\n@Component({\n selector: 'app-base-alert',\n standalone: true,\n imports: [ShipAlert, ShipButton],\n templateUrl: './base-alert.html',\n styleUrl: './base-alert.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseAlert {\n active = signal(false);\n}\n"
1610
+ },
1611
+ {
1612
+ "name": "raised-alert",
1613
+ "html": "<!-- Using attribute inputs -->\n<sh-alert variant=\"raised\">Raised alert</sh-alert>\n<sh-alert variant=\"raised\" color=\"primary\">Primary raised alert</sh-alert>\n<sh-alert variant=\"raised\" color=\"accent\">Accent raised alert</sh-alert>\n<sh-alert variant=\"raised\" color=\"warn\">Warn raised alert</sh-alert>\n<sh-alert variant=\"raised\" color=\"error\">Error raised alert</sh-alert>\n<sh-alert variant=\"raised\" color=\"success\">\n Success raised alert\n <p>with a paragraph</p>\n</sh-alert>\n\n<!-- Alternative: Using CSS classes -->\n<!--\n<sh-alert class=\"raised\">Raised alert</sh-alert>\n<sh-alert class=\"raised primary\">Primary raised alert</sh-alert>\n-->\n",
1614
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipAlert } from 'ship-ui';\n\n@Component({\n selector: 'app-raised-alert',\n standalone: true,\n imports: [ShipAlert],\n templateUrl: './raised-alert.html',\n styleUrl: './raised-alert.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RaisedAlert {\n active = signal(false);\n}\n"
1615
+ },
1616
+ {
1617
+ "name": "outlined-alert",
1618
+ "html": "<!-- Using attribute inputs -->\n<sh-alert variant=\"outlined\">Outlined alert</sh-alert>\n<sh-alert variant=\"outlined\" color=\"primary\">Primary outlined alert</sh-alert>\n<sh-alert variant=\"outlined\" color=\"accent\">Accent outlined alert</sh-alert>\n<sh-alert variant=\"outlined\" color=\"warn\">Warn outlined alert</sh-alert>\n<sh-alert variant=\"outlined\" color=\"error\">Error outlined alert</sh-alert>\n<sh-alert variant=\"outlined\" color=\"success\">\n Success outlined alert\n <p>with a paragraph</p>\n</sh-alert>\n\n<!-- Alternative: Using CSS classes -->\n<!--\n<sh-alert class=\"outlined\">Outlined alert</sh-alert>\n<sh-alert class=\"outlined primary\">Primary outlined alert</sh-alert>\n-->\n",
1619
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipAlert } from 'ship-ui';\n\n@Component({\n selector: 'app-outlined-alert',\n standalone: true,\n imports: [ShipAlert],\n templateUrl: './outlined-alert.html',\n styleUrl: './outlined-alert.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OutlinedAlert {\n active = signal(false);\n}\n"
1620
+ }
1621
+ ]
1622
+ },
1623
+ {
1624
+ "name": "ShipDatepickerInput",
1625
+ "selector": "sh-datepicker-input",
1626
+ "path": "projects/ship-ui/src/lib/ship-datepicker/ship-datepicker-input.ts",
1627
+ "description": "### Selection\n\nSelected values are available via\n`date`\nand\n`endDate`\n. Use\n`[(date)]`\nand\n`[(endDate)]`\nfor two-way binding.\n\n### Configuration\n\nCustomize the picker behavior:\n\n<li>\n`asRange`\n: Enable range selection mode.\n</li>\n<li>\n`monthsToShow`\n: Set the number of months displayed (default: 1).\n</li>\n<li>\n`startOfWeek`\n: Specify the first day of the week (0-6).\n</li>\n<li>\n`weekdayLabels`\n: Provide custom labels for week days.\n</li>\n\n### Input Display\n\nCustomize how dates appear in inputs:\n\n<li>\n`masking`\n: Set the date format mask (e.g.,\n`'mediumDate'`\n).\n</li>\n<li>\n`size`\n: Use the\n`small`\nattribute/class for a compact input.\n</li>\n\n### Interaction\n\n<li>\n`closed`\n: Event emitted when the picker is dismissed.\n</li>\n<li>\n`disabled`\n: Standard attribute to disable interaction.\n</li>",
1628
+ "inputs": [
1629
+ {
1630
+ "name": "masking",
1631
+ "type": "any",
1632
+ "description": "",
1633
+ "defaultValue": "'mediumDate'"
1634
+ },
1635
+ {
1636
+ "name": "isOpen",
1637
+ "type": "boolean",
1638
+ "description": "",
1639
+ "defaultValue": "false"
1640
+ }
1641
+ ],
1642
+ "outputs": [
1643
+ {
1644
+ "name": "closed",
1645
+ "type": "Date | null",
1646
+ "description": ""
1647
+ }
1648
+ ],
1649
+ "cssVariables": [],
1650
+ "examples": [
1651
+ {
1652
+ "name": "input-datepicker-ngmodel",
1653
+ "html": "<div class=\"row\">\n <sh-datepicker-input class=\"primary sharp\">\n <label>Date (ngModel)</label>\n <input type=\"text\" [(ngModel)]=\"date\" />\n </sh-datepicker-input>\n\n <sh-form-field class=\"autosize\">\n <input type=\"time\" [(ngModel)]=\"time\" step=\"300\" />\n <div boxPrefix>\n <sh-icon>clock</sh-icon>\n </div>\n </sh-form-field>\n</div>\n\n<p>Selected: {{ date() | date: 'medium' }}</p>\n<!-- <p>{{ date() }}</p>\n<p>{{ time() }}</p> -->\n",
1654
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, effect, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipDatepickerInput, ShipFormField, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-input-datepicker-ngmodel',\n standalone: true,\n imports: [FormsModule, ShipDatepickerInput, ShipFormField, ShipIcon, DatePipe],\n templateUrl: './input-datepicker-ngmodel.html',\n styleUrl: './input-datepicker-ngmodel.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InputDatepickerNgModelComponent {\n date = signal<Date | null>(new Date());\n time = signal<`${string}:${string}` | null>(\n `${this.date()?.getHours() ?? '00'}:${this.date()?.getMinutes() ?? '00'}`\n );\n\n timeEffect = effect(() => {\n const time = this.time();\n\n if (time === null) return;\n\n const [hours, minutes, seconds] = time.split(':');\n\n this.date.update((x) => {\n if (!x) return x;\n\n const newDate = new Date(x);\n newDate.setHours(parseInt(hours ?? '0'), parseInt(minutes ?? '0'), parseInt(seconds ?? '0'));\n\n return newDate;\n });\n });\n}\n"
1655
+ },
1656
+ {
1657
+ "name": "datepicker-sandbox",
1658
+ "html": "<div class=\"controls\">\n <sh-toggle class=\"raised primary\" [class.active]=\"disabled()\" (click)=\"disabled.set(!disabled())\">Disabled</sh-toggle>\n <sh-toggle class=\"raised primary\" [class.active]=\"sharp()\" (click)=\"sharp.set(!sharp())\">Sharp</sh-toggle>\n\n <sh-button-group>\n <button [class.active]=\"colors() === ''\" (click)=\"colors.set('')\">Base</button>\n <button [class.active]=\"colors() === 'primary'\" (click)=\"colors.set('primary')\">Primary</button>\n <button [class.active]=\"colors() === 'accent'\" (click)=\"colors.set('accent')\">Accent</button>\n <button [class.active]=\"colors() === 'warn'\" (click)=\"colors.set('warn')\">Warn</button>\n <button [class.active]=\"colors() === 'error'\" (click)=\"colors.set('error')\">Error</button>\n <button [class.active]=\"colors() === 'success'\" (click)=\"colors.set('success')\">Success</button>\n </sh-button-group>\n</div>\n\n<div class=\"content\">\n <sh-datepicker class=\"raised\" [class]=\"exampleClass()\" [(date)]=\"date\" [disabled]=\"disabled()\" />\n\n <p>Selected date: {{ date() | date: 'mediumDate' }}</p>\n</div>\n",
1659
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipButtonGroup, ShipDatepicker, ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-datepicker-sandbox',\n standalone: true,\n imports: [FormsModule, ShipDatepicker, ShipToggle, ShipButtonGroup, DatePipe],\n templateUrl: './datepicker-sandbox.html',\n styleUrl: './datepicker-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DatepickerSandbox {\n date = signal<Date | null>(new Date());\n disabled = signal(false);\n sharp = signal(false);\n colors = signal<'' | 'primary' | 'accent' | 'warn' | 'error' | 'success'>('primary');\n\n exampleClass = computed(() => this.colors() + ' ' + (this.sharp() ? 'sharp' : ''));\n}\n"
1660
+ },
1661
+ {
1662
+ "name": "range-datepicker",
1663
+ "html": "<label for=\"range-datepicker\">Select a date range:</label>\n<sh-datepicker [(date)]=\"startDate\" [(endDate)]=\"endDate\" [asRange]=\"true\"></sh-datepicker>\n<p>Start: {{ startDate() ? (startDate() | date: 'mediumDate') : 'None' }}</p>\n<p>End: {{ endDate() ? (endDate() | date: 'mediumDate') : 'None' }}</p>\n",
1664
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipDatepicker } from 'ship-ui';\n\n@Component({\n selector: 'app-range-datepicker',\n standalone: true,\n imports: [FormsModule, ShipDatepicker, DatePipe],\n templateUrl: './range-datepicker.html',\n styleUrl: './range-datepicker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RangeDatepicker {\n startDate = signal<Date | null>(null);\n endDate = signal<Date | null>(null);\n}\n"
1665
+ },
1666
+ {
1667
+ "name": "range-input-datepicker",
1668
+ "html": "<sh-daterange-input>\n <label>Date Range (Reactive Form)</label>\n <input type=\"text\" [formControl]=\"startDate\" placeholder=\"Start date\" />\n <input type=\"text\" [formControl]=\"endDate\" placeholder=\"End date\" />\n <sh-icon suffix>calendar</sh-icon>\n</sh-daterange-input>\n<p>Start: {{ startDate.value | date: 'mediumDate' }}</p>\n<p>End: {{ endDate.value | date: 'mediumDate' }}</p>\n",
1669
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ShipDaterangeInput, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-range-input-datepicker',\n standalone: true,\n imports: [ReactiveFormsModule, ShipDaterangeInput, ShipIcon, DatePipe],\n templateUrl: './range-input-datepicker.html',\n styleUrl: './range-input-datepicker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RangeInputDatepicker {\n startDate = new FormControl(new Date());\n endDate = new FormControl(new Date(Date.now() + 86400000)); // Tomorrow\n}\n"
1670
+ },
1671
+ {
1672
+ "name": "base-datepicker",
1673
+ "html": "<label for=\"datepicker\">Select a date:</label>\n<sh-datepicker [(date)]=\"selectedDate\"></sh-datepicker>\n<p>Selected: {{ selectedDate() | date: 'mediumDate' }}</p>\n",
1674
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipDatepicker } from 'ship-ui';\n\n@Component({\n selector: 'app-base-datepicker',\n standalone: true,\n imports: [FormsModule, ShipDatepicker, DatePipe],\n templateUrl: './base-datepicker.html',\n styleUrl: './base-datepicker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseDatepicker {\n selectedDate = signal(new Date());\n}\n"
1675
+ },
1676
+ {
1677
+ "name": "input-datepicker-reactive",
1678
+ "html": "<sh-datepicker-input>\n <label>Date (Reactive Form)</label>\n <input type=\"text\" [formControl]=\"dateControl\" />\n</sh-datepicker-input>\n<p>Selected: {{ dateControl.value | date: 'mediumDate' }}</p>\n",
1679
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ShipDatepickerInput } from 'ship-ui';\n\n@Component({\n selector: 'app-input-datepicker-reactive',\n standalone: true,\n imports: [ReactiveFormsModule, ShipDatepickerInput, DatePipe],\n templateUrl: './input-datepicker-reactive.html',\n styleUrl: './input-datepicker-reactive.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InputDatepickerReactive {\n dateControl = new FormControl(new Date());\n}\n"
1680
+ },
1681
+ {
1682
+ "name": "range-datepicker-sandbox",
1683
+ "html": "<div class=\"controls\">\n <sh-toggle [class.active]=\"disabled()\" (click)=\"disabled.set(!disabled())\">Disabled</sh-toggle>\n\n <sh-button-group>\n <button [class.active]=\"colors() === ''\" (click)=\"colors.set('')\">Base</button>\n <button [class.active]=\"colors() === 'primary'\" (click)=\"colors.set('primary')\">Primary</button>\n <button [class.active]=\"colors() === 'accent'\" (click)=\"colors.set('accent')\">Accent</button>\n <button [class.active]=\"colors() === 'warn'\" (click)=\"colors.set('warn')\">Warn</button>\n <button [class.active]=\"colors() === 'error'\" (click)=\"colors.set('error')\">Error</button>\n <button [class.active]=\"colors() === 'success'\" (click)=\"colors.set('success')\">Success</button>\n </sh-button-group>\n\n <sh-range-slider min=\"1\" max=\"3\">\n <label>Months to show</label>\n <input type=\"range\" [(ngModel)]=\"monthsToShow\" min=\"1\" max=\"12\" />\n </sh-range-slider>\n</div>\n\n<div class=\"content\">\n <sh-datepicker\n [class]=\"colors()\"\n [(date)]=\"startDate\"\n [(endDate)]=\"endDate\"\n [asRange]=\"true\"\n [monthsToShow]=\"monthsToShow()\"></sh-datepicker>\n <p>Start: {{ startDate() | date: 'mediumDate' }}</p>\n <p>End: {{ endDate() | date: 'mediumDate' }}</p>\n</div>\n",
1684
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipButtonGroup, ShipDatepicker, ShipRangeSlider, ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-range-datepicker-sandbox',\n standalone: true,\n imports: [FormsModule, ShipDatepicker, ShipToggle, ShipRangeSlider, ShipButtonGroup, DatePipe],\n templateUrl: './range-datepicker-sandbox.html',\n styleUrl: './range-datepicker-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RangeDatepickerSandbox {\n colors = signal<'' | 'primary' | 'accent' | 'warn' | 'error' | 'success'>('primary');\n startDate = signal<Date | null>(new Date());\n endDate = signal<Date | null>(new Date(Date.now() + 86400000));\n disabled = signal(false);\n monthsToShow = signal(2);\n}\n"
1685
+ }
1686
+ ]
1687
+ },
1688
+ {
1689
+ "name": "ShipDatepicker",
1690
+ "selector": "sh-datepicker",
1691
+ "path": "projects/ship-ui/src/lib/ship-datepicker/ship-datepicker.ts",
1692
+ "description": "### Selection\n\nSelected values are available via\n`date`\nand\n`endDate`\n. Use\n`[(date)]`\nand\n`[(endDate)]`\nfor two-way binding.\n\n### Configuration\n\nCustomize the picker behavior:\n\n<li>\n`asRange`\n: Enable range selection mode.\n</li>\n<li>\n`monthsToShow`\n: Set the number of months displayed (default: 1).\n</li>\n<li>\n`startOfWeek`\n: Specify the first day of the week (0-6).\n</li>\n<li>\n`weekdayLabels`\n: Provide custom labels for week days.\n</li>\n\n### Input Display\n\nCustomize how dates appear in inputs:\n\n<li>\n`masking`\n: Set the date format mask (e.g.,\n`'mediumDate'`\n).\n</li>\n<li>\n`size`\n: Use the\n`small`\nattribute/class for a compact input.\n</li>\n\n### Interaction\n\n<li>\n`closed`\n: Event emitted when the picker is dismissed.\n</li>\n<li>\n`disabled`\n: Standard attribute to disable interaction.\n</li>",
1693
+ "inputs": [
1694
+ {
1695
+ "name": "asRange",
1696
+ "type": "boolean",
1697
+ "description": "",
1698
+ "defaultValue": "false"
1699
+ },
1700
+ {
1701
+ "name": "monthsToShow",
1702
+ "type": "number",
1703
+ "description": "",
1704
+ "defaultValue": "1"
1705
+ },
1706
+ {
1707
+ "name": "disabled",
1708
+ "type": "boolean",
1709
+ "description": "",
1710
+ "defaultValue": "false"
1711
+ },
1712
+ {
1713
+ "name": "startOfWeek",
1714
+ "type": "number",
1715
+ "description": "",
1716
+ "defaultValue": "1"
1717
+ },
1718
+ {
1719
+ "name": "weekdayLabels",
1720
+ "type": "string[]",
1721
+ "description": "",
1722
+ "defaultValue": "['Su'"
1723
+ },
1724
+ {
1725
+ "name": "date",
1726
+ "type": "Date | null",
1727
+ "description": "",
1728
+ "defaultValue": "null"
1729
+ },
1730
+ {
1731
+ "name": "endDate",
1732
+ "type": "Date | null",
1733
+ "description": "",
1734
+ "defaultValue": "null"
1735
+ }
1736
+ ],
1737
+ "outputs": [],
1738
+ "cssVariables": [
1739
+ {
1740
+ "name": "--dp-width",
1741
+ "defaultValue": "#{p2r(240)}"
1742
+ },
1743
+ {
1744
+ "name": "--dp-sel-s",
1745
+ "defaultValue": "var(--shape-1)"
1746
+ },
1747
+ {
1748
+ "name": "--dp-ar",
1749
+ "defaultValue": "1/0.8"
1750
+ },
1751
+ {
1752
+ "name": "--dp-day-g",
1753
+ "defaultValue": "#{p2r(8 0)}"
1754
+ },
1755
+ {
1756
+ "name": "--dp-sel-bg",
1757
+ "defaultValue": "var(--base-8)"
1758
+ },
1759
+ {
1760
+ "name": "--dp-sel-bw",
1761
+ "defaultValue": "0"
1762
+ },
1763
+ {
1764
+ "name": "--dp-sel-bc",
1765
+ "defaultValue": "transparent"
1766
+ },
1767
+ {
1768
+ "name": "--dp-sel-c",
1769
+ "defaultValue": "#fff"
1770
+ },
1771
+ {
1772
+ "name": "--dp-day-c",
1773
+ "defaultValue": "var(--base-8)"
1774
+ },
1775
+ {
1776
+ "name": "--dp-day-f",
1777
+ "defaultValue": "var(--paragraph-20)"
1778
+ }
1779
+ ],
1780
+ "examples": [
1781
+ {
1782
+ "name": "input-datepicker-ngmodel",
1783
+ "html": "<div class=\"row\">\n <sh-datepicker-input class=\"primary sharp\">\n <label>Date (ngModel)</label>\n <input type=\"text\" [(ngModel)]=\"date\" />\n </sh-datepicker-input>\n\n <sh-form-field class=\"autosize\">\n <input type=\"time\" [(ngModel)]=\"time\" step=\"300\" />\n <div boxPrefix>\n <sh-icon>clock</sh-icon>\n </div>\n </sh-form-field>\n</div>\n\n<p>Selected: {{ date() | date: 'medium' }}</p>\n<!-- <p>{{ date() }}</p>\n<p>{{ time() }}</p> -->\n",
1784
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, effect, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipDatepickerInput, ShipFormField, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-input-datepicker-ngmodel',\n standalone: true,\n imports: [FormsModule, ShipDatepickerInput, ShipFormField, ShipIcon, DatePipe],\n templateUrl: './input-datepicker-ngmodel.html',\n styleUrl: './input-datepicker-ngmodel.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InputDatepickerNgModelComponent {\n date = signal<Date | null>(new Date());\n time = signal<`${string}:${string}` | null>(\n `${this.date()?.getHours() ?? '00'}:${this.date()?.getMinutes() ?? '00'}`\n );\n\n timeEffect = effect(() => {\n const time = this.time();\n\n if (time === null) return;\n\n const [hours, minutes, seconds] = time.split(':');\n\n this.date.update((x) => {\n if (!x) return x;\n\n const newDate = new Date(x);\n newDate.setHours(parseInt(hours ?? '0'), parseInt(minutes ?? '0'), parseInt(seconds ?? '0'));\n\n return newDate;\n });\n });\n}\n"
1785
+ },
1786
+ {
1787
+ "name": "datepicker-sandbox",
1788
+ "html": "<div class=\"controls\">\n <sh-toggle class=\"raised primary\" [class.active]=\"disabled()\" (click)=\"disabled.set(!disabled())\">Disabled</sh-toggle>\n <sh-toggle class=\"raised primary\" [class.active]=\"sharp()\" (click)=\"sharp.set(!sharp())\">Sharp</sh-toggle>\n\n <sh-button-group>\n <button [class.active]=\"colors() === ''\" (click)=\"colors.set('')\">Base</button>\n <button [class.active]=\"colors() === 'primary'\" (click)=\"colors.set('primary')\">Primary</button>\n <button [class.active]=\"colors() === 'accent'\" (click)=\"colors.set('accent')\">Accent</button>\n <button [class.active]=\"colors() === 'warn'\" (click)=\"colors.set('warn')\">Warn</button>\n <button [class.active]=\"colors() === 'error'\" (click)=\"colors.set('error')\">Error</button>\n <button [class.active]=\"colors() === 'success'\" (click)=\"colors.set('success')\">Success</button>\n </sh-button-group>\n</div>\n\n<div class=\"content\">\n <sh-datepicker class=\"raised\" [class]=\"exampleClass()\" [(date)]=\"date\" [disabled]=\"disabled()\" />\n\n <p>Selected date: {{ date() | date: 'mediumDate' }}</p>\n</div>\n",
1789
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipButtonGroup, ShipDatepicker, ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-datepicker-sandbox',\n standalone: true,\n imports: [FormsModule, ShipDatepicker, ShipToggle, ShipButtonGroup, DatePipe],\n templateUrl: './datepicker-sandbox.html',\n styleUrl: './datepicker-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DatepickerSandbox {\n date = signal<Date | null>(new Date());\n disabled = signal(false);\n sharp = signal(false);\n colors = signal<'' | 'primary' | 'accent' | 'warn' | 'error' | 'success'>('primary');\n\n exampleClass = computed(() => this.colors() + ' ' + (this.sharp() ? 'sharp' : ''));\n}\n"
1790
+ },
1791
+ {
1792
+ "name": "range-datepicker",
1793
+ "html": "<label for=\"range-datepicker\">Select a date range:</label>\n<sh-datepicker [(date)]=\"startDate\" [(endDate)]=\"endDate\" [asRange]=\"true\"></sh-datepicker>\n<p>Start: {{ startDate() ? (startDate() | date: 'mediumDate') : 'None' }}</p>\n<p>End: {{ endDate() ? (endDate() | date: 'mediumDate') : 'None' }}</p>\n",
1794
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipDatepicker } from 'ship-ui';\n\n@Component({\n selector: 'app-range-datepicker',\n standalone: true,\n imports: [FormsModule, ShipDatepicker, DatePipe],\n templateUrl: './range-datepicker.html',\n styleUrl: './range-datepicker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RangeDatepicker {\n startDate = signal<Date | null>(null);\n endDate = signal<Date | null>(null);\n}\n"
1795
+ },
1796
+ {
1797
+ "name": "range-input-datepicker",
1798
+ "html": "<sh-daterange-input>\n <label>Date Range (Reactive Form)</label>\n <input type=\"text\" [formControl]=\"startDate\" placeholder=\"Start date\" />\n <input type=\"text\" [formControl]=\"endDate\" placeholder=\"End date\" />\n <sh-icon suffix>calendar</sh-icon>\n</sh-daterange-input>\n<p>Start: {{ startDate.value | date: 'mediumDate' }}</p>\n<p>End: {{ endDate.value | date: 'mediumDate' }}</p>\n",
1799
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ShipDaterangeInput, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-range-input-datepicker',\n standalone: true,\n imports: [ReactiveFormsModule, ShipDaterangeInput, ShipIcon, DatePipe],\n templateUrl: './range-input-datepicker.html',\n styleUrl: './range-input-datepicker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RangeInputDatepicker {\n startDate = new FormControl(new Date());\n endDate = new FormControl(new Date(Date.now() + 86400000)); // Tomorrow\n}\n"
1800
+ },
1801
+ {
1802
+ "name": "base-datepicker",
1803
+ "html": "<label for=\"datepicker\">Select a date:</label>\n<sh-datepicker [(date)]=\"selectedDate\"></sh-datepicker>\n<p>Selected: {{ selectedDate() | date: 'mediumDate' }}</p>\n",
1804
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipDatepicker } from 'ship-ui';\n\n@Component({\n selector: 'app-base-datepicker',\n standalone: true,\n imports: [FormsModule, ShipDatepicker, DatePipe],\n templateUrl: './base-datepicker.html',\n styleUrl: './base-datepicker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseDatepicker {\n selectedDate = signal(new Date());\n}\n"
1805
+ },
1806
+ {
1807
+ "name": "input-datepicker-reactive",
1808
+ "html": "<sh-datepicker-input>\n <label>Date (Reactive Form)</label>\n <input type=\"text\" [formControl]=\"dateControl\" />\n</sh-datepicker-input>\n<p>Selected: {{ dateControl.value | date: 'mediumDate' }}</p>\n",
1809
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ShipDatepickerInput } from 'ship-ui';\n\n@Component({\n selector: 'app-input-datepicker-reactive',\n standalone: true,\n imports: [ReactiveFormsModule, ShipDatepickerInput, DatePipe],\n templateUrl: './input-datepicker-reactive.html',\n styleUrl: './input-datepicker-reactive.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InputDatepickerReactive {\n dateControl = new FormControl(new Date());\n}\n"
1810
+ },
1811
+ {
1812
+ "name": "range-datepicker-sandbox",
1813
+ "html": "<div class=\"controls\">\n <sh-toggle [class.active]=\"disabled()\" (click)=\"disabled.set(!disabled())\">Disabled</sh-toggle>\n\n <sh-button-group>\n <button [class.active]=\"colors() === ''\" (click)=\"colors.set('')\">Base</button>\n <button [class.active]=\"colors() === 'primary'\" (click)=\"colors.set('primary')\">Primary</button>\n <button [class.active]=\"colors() === 'accent'\" (click)=\"colors.set('accent')\">Accent</button>\n <button [class.active]=\"colors() === 'warn'\" (click)=\"colors.set('warn')\">Warn</button>\n <button [class.active]=\"colors() === 'error'\" (click)=\"colors.set('error')\">Error</button>\n <button [class.active]=\"colors() === 'success'\" (click)=\"colors.set('success')\">Success</button>\n </sh-button-group>\n\n <sh-range-slider min=\"1\" max=\"3\">\n <label>Months to show</label>\n <input type=\"range\" [(ngModel)]=\"monthsToShow\" min=\"1\" max=\"12\" />\n </sh-range-slider>\n</div>\n\n<div class=\"content\">\n <sh-datepicker\n [class]=\"colors()\"\n [(date)]=\"startDate\"\n [(endDate)]=\"endDate\"\n [asRange]=\"true\"\n [monthsToShow]=\"monthsToShow()\"></sh-datepicker>\n <p>Start: {{ startDate() | date: 'mediumDate' }}</p>\n <p>End: {{ endDate() | date: 'mediumDate' }}</p>\n</div>\n",
1814
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipButtonGroup, ShipDatepicker, ShipRangeSlider, ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-range-datepicker-sandbox',\n standalone: true,\n imports: [FormsModule, ShipDatepicker, ShipToggle, ShipRangeSlider, ShipButtonGroup, DatePipe],\n templateUrl: './range-datepicker-sandbox.html',\n styleUrl: './range-datepicker-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RangeDatepickerSandbox {\n colors = signal<'' | 'primary' | 'accent' | 'warn' | 'error' | 'success'>('primary');\n startDate = signal<Date | null>(new Date());\n endDate = signal<Date | null>(new Date(Date.now() + 86400000));\n disabled = signal(false);\n monthsToShow = signal(2);\n}\n"
1815
+ }
1816
+ ]
1817
+ },
1818
+ {
1819
+ "name": "ShipDaterangeInput",
1820
+ "selector": "sh-daterange-input",
1821
+ "path": "projects/ship-ui/src/lib/ship-datepicker/ship-daterange-input.ts",
1822
+ "description": "### Selection\n\nSelected values are available via\n`date`\nand\n`endDate`\n. Use\n`[(date)]`\nand\n`[(endDate)]`\nfor two-way binding.\n\n### Configuration\n\nCustomize the picker behavior:\n\n<li>\n`asRange`\n: Enable range selection mode.\n</li>\n<li>\n`monthsToShow`\n: Set the number of months displayed (default: 1).\n</li>\n<li>\n`startOfWeek`\n: Specify the first day of the week (0-6).\n</li>\n<li>\n`weekdayLabels`\n: Provide custom labels for week days.\n</li>\n\n### Input Display\n\nCustomize how dates appear in inputs:\n\n<li>\n`masking`\n: Set the date format mask (e.g.,\n`'mediumDate'`\n).\n</li>\n<li>\n`size`\n: Use the\n`small`\nattribute/class for a compact input.\n</li>\n\n### Interaction\n\n<li>\n`closed`\n: Event emitted when the picker is dismissed.\n</li>\n<li>\n`disabled`\n: Standard attribute to disable interaction.\n</li>",
1823
+ "inputs": [
1824
+ {
1825
+ "name": "monthsToShow",
1826
+ "type": "number",
1827
+ "description": "",
1828
+ "defaultValue": "1"
1829
+ },
1830
+ {
1831
+ "name": "masking",
1832
+ "type": "any",
1833
+ "description": "",
1834
+ "defaultValue": "'mediumDate'"
1835
+ },
1836
+ {
1837
+ "name": "isOpen",
1838
+ "type": "boolean",
1839
+ "description": "",
1840
+ "defaultValue": "false"
1841
+ }
1842
+ ],
1843
+ "outputs": [
1844
+ {
1845
+ "name": "closed",
1846
+ "type": "{ start: Date | null; end: Date | null }",
1847
+ "description": ""
1848
+ }
1849
+ ],
1850
+ "cssVariables": [],
1851
+ "examples": [
1852
+ {
1853
+ "name": "input-datepicker-ngmodel",
1854
+ "html": "<div class=\"row\">\n <sh-datepicker-input class=\"primary sharp\">\n <label>Date (ngModel)</label>\n <input type=\"text\" [(ngModel)]=\"date\" />\n </sh-datepicker-input>\n\n <sh-form-field class=\"autosize\">\n <input type=\"time\" [(ngModel)]=\"time\" step=\"300\" />\n <div boxPrefix>\n <sh-icon>clock</sh-icon>\n </div>\n </sh-form-field>\n</div>\n\n<p>Selected: {{ date() | date: 'medium' }}</p>\n<!-- <p>{{ date() }}</p>\n<p>{{ time() }}</p> -->\n",
1855
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, effect, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipDatepickerInput, ShipFormField, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-input-datepicker-ngmodel',\n standalone: true,\n imports: [FormsModule, ShipDatepickerInput, ShipFormField, ShipIcon, DatePipe],\n templateUrl: './input-datepicker-ngmodel.html',\n styleUrl: './input-datepicker-ngmodel.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InputDatepickerNgModelComponent {\n date = signal<Date | null>(new Date());\n time = signal<`${string}:${string}` | null>(\n `${this.date()?.getHours() ?? '00'}:${this.date()?.getMinutes() ?? '00'}`\n );\n\n timeEffect = effect(() => {\n const time = this.time();\n\n if (time === null) return;\n\n const [hours, minutes, seconds] = time.split(':');\n\n this.date.update((x) => {\n if (!x) return x;\n\n const newDate = new Date(x);\n newDate.setHours(parseInt(hours ?? '0'), parseInt(minutes ?? '0'), parseInt(seconds ?? '0'));\n\n return newDate;\n });\n });\n}\n"
1856
+ },
1857
+ {
1858
+ "name": "datepicker-sandbox",
1859
+ "html": "<div class=\"controls\">\n <sh-toggle class=\"raised primary\" [class.active]=\"disabled()\" (click)=\"disabled.set(!disabled())\">Disabled</sh-toggle>\n <sh-toggle class=\"raised primary\" [class.active]=\"sharp()\" (click)=\"sharp.set(!sharp())\">Sharp</sh-toggle>\n\n <sh-button-group>\n <button [class.active]=\"colors() === ''\" (click)=\"colors.set('')\">Base</button>\n <button [class.active]=\"colors() === 'primary'\" (click)=\"colors.set('primary')\">Primary</button>\n <button [class.active]=\"colors() === 'accent'\" (click)=\"colors.set('accent')\">Accent</button>\n <button [class.active]=\"colors() === 'warn'\" (click)=\"colors.set('warn')\">Warn</button>\n <button [class.active]=\"colors() === 'error'\" (click)=\"colors.set('error')\">Error</button>\n <button [class.active]=\"colors() === 'success'\" (click)=\"colors.set('success')\">Success</button>\n </sh-button-group>\n</div>\n\n<div class=\"content\">\n <sh-datepicker class=\"raised\" [class]=\"exampleClass()\" [(date)]=\"date\" [disabled]=\"disabled()\" />\n\n <p>Selected date: {{ date() | date: 'mediumDate' }}</p>\n</div>\n",
1860
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipButtonGroup, ShipDatepicker, ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-datepicker-sandbox',\n standalone: true,\n imports: [FormsModule, ShipDatepicker, ShipToggle, ShipButtonGroup, DatePipe],\n templateUrl: './datepicker-sandbox.html',\n styleUrl: './datepicker-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DatepickerSandbox {\n date = signal<Date | null>(new Date());\n disabled = signal(false);\n sharp = signal(false);\n colors = signal<'' | 'primary' | 'accent' | 'warn' | 'error' | 'success'>('primary');\n\n exampleClass = computed(() => this.colors() + ' ' + (this.sharp() ? 'sharp' : ''));\n}\n"
1861
+ },
1862
+ {
1863
+ "name": "range-datepicker",
1864
+ "html": "<label for=\"range-datepicker\">Select a date range:</label>\n<sh-datepicker [(date)]=\"startDate\" [(endDate)]=\"endDate\" [asRange]=\"true\"></sh-datepicker>\n<p>Start: {{ startDate() ? (startDate() | date: 'mediumDate') : 'None' }}</p>\n<p>End: {{ endDate() ? (endDate() | date: 'mediumDate') : 'None' }}</p>\n",
1865
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipDatepicker } from 'ship-ui';\n\n@Component({\n selector: 'app-range-datepicker',\n standalone: true,\n imports: [FormsModule, ShipDatepicker, DatePipe],\n templateUrl: './range-datepicker.html',\n styleUrl: './range-datepicker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RangeDatepicker {\n startDate = signal<Date | null>(null);\n endDate = signal<Date | null>(null);\n}\n"
1866
+ },
1867
+ {
1868
+ "name": "range-input-datepicker",
1869
+ "html": "<sh-daterange-input>\n <label>Date Range (Reactive Form)</label>\n <input type=\"text\" [formControl]=\"startDate\" placeholder=\"Start date\" />\n <input type=\"text\" [formControl]=\"endDate\" placeholder=\"End date\" />\n <sh-icon suffix>calendar</sh-icon>\n</sh-daterange-input>\n<p>Start: {{ startDate.value | date: 'mediumDate' }}</p>\n<p>End: {{ endDate.value | date: 'mediumDate' }}</p>\n",
1870
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ShipDaterangeInput, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-range-input-datepicker',\n standalone: true,\n imports: [ReactiveFormsModule, ShipDaterangeInput, ShipIcon, DatePipe],\n templateUrl: './range-input-datepicker.html',\n styleUrl: './range-input-datepicker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RangeInputDatepicker {\n startDate = new FormControl(new Date());\n endDate = new FormControl(new Date(Date.now() + 86400000)); // Tomorrow\n}\n"
1871
+ },
1872
+ {
1873
+ "name": "base-datepicker",
1874
+ "html": "<label for=\"datepicker\">Select a date:</label>\n<sh-datepicker [(date)]=\"selectedDate\"></sh-datepicker>\n<p>Selected: {{ selectedDate() | date: 'mediumDate' }}</p>\n",
1875
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipDatepicker } from 'ship-ui';\n\n@Component({\n selector: 'app-base-datepicker',\n standalone: true,\n imports: [FormsModule, ShipDatepicker, DatePipe],\n templateUrl: './base-datepicker.html',\n styleUrl: './base-datepicker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseDatepicker {\n selectedDate = signal(new Date());\n}\n"
1876
+ },
1877
+ {
1878
+ "name": "input-datepicker-reactive",
1879
+ "html": "<sh-datepicker-input>\n <label>Date (Reactive Form)</label>\n <input type=\"text\" [formControl]=\"dateControl\" />\n</sh-datepicker-input>\n<p>Selected: {{ dateControl.value | date: 'mediumDate' }}</p>\n",
1880
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ShipDatepickerInput } from 'ship-ui';\n\n@Component({\n selector: 'app-input-datepicker-reactive',\n standalone: true,\n imports: [ReactiveFormsModule, ShipDatepickerInput, DatePipe],\n templateUrl: './input-datepicker-reactive.html',\n styleUrl: './input-datepicker-reactive.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InputDatepickerReactive {\n dateControl = new FormControl(new Date());\n}\n"
1881
+ },
1882
+ {
1883
+ "name": "range-datepicker-sandbox",
1884
+ "html": "<div class=\"controls\">\n <sh-toggle [class.active]=\"disabled()\" (click)=\"disabled.set(!disabled())\">Disabled</sh-toggle>\n\n <sh-button-group>\n <button [class.active]=\"colors() === ''\" (click)=\"colors.set('')\">Base</button>\n <button [class.active]=\"colors() === 'primary'\" (click)=\"colors.set('primary')\">Primary</button>\n <button [class.active]=\"colors() === 'accent'\" (click)=\"colors.set('accent')\">Accent</button>\n <button [class.active]=\"colors() === 'warn'\" (click)=\"colors.set('warn')\">Warn</button>\n <button [class.active]=\"colors() === 'error'\" (click)=\"colors.set('error')\">Error</button>\n <button [class.active]=\"colors() === 'success'\" (click)=\"colors.set('success')\">Success</button>\n </sh-button-group>\n\n <sh-range-slider min=\"1\" max=\"3\">\n <label>Months to show</label>\n <input type=\"range\" [(ngModel)]=\"monthsToShow\" min=\"1\" max=\"12\" />\n </sh-range-slider>\n</div>\n\n<div class=\"content\">\n <sh-datepicker\n [class]=\"colors()\"\n [(date)]=\"startDate\"\n [(endDate)]=\"endDate\"\n [asRange]=\"true\"\n [monthsToShow]=\"monthsToShow()\"></sh-datepicker>\n <p>Start: {{ startDate() | date: 'mediumDate' }}</p>\n <p>End: {{ endDate() | date: 'mediumDate' }}</p>\n</div>\n",
1885
+ "ts": "import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipButtonGroup, ShipDatepicker, ShipRangeSlider, ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-range-datepicker-sandbox',\n standalone: true,\n imports: [FormsModule, ShipDatepicker, ShipToggle, ShipRangeSlider, ShipButtonGroup, DatePipe],\n templateUrl: './range-datepicker-sandbox.html',\n styleUrl: './range-datepicker-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RangeDatepickerSandbox {\n colors = signal<'' | 'primary' | 'accent' | 'warn' | 'error' | 'success'>('primary');\n startDate = signal<Date | null>(new Date());\n endDate = signal<Date | null>(new Date(Date.now() + 86400000));\n disabled = signal(false);\n monthsToShow = signal(2);\n}\n"
1886
+ }
1887
+ ]
1888
+ },
1889
+ {
1890
+ "name": "ShipButtonGroup",
1891
+ "selector": "sh-button-group",
1892
+ "path": "projects/ship-ui/src/lib/ship-button-group/ship-button-group.ts",
1893
+ "description": "### Variants\n\nButton groups support different layouts via the\n`variant`\nattribute. Valid options:\n**default**\nand\n**type-b**\n.\n\n### Sizes\n\nUse the\n`size`\nattribute to change the scale of the group, e.g.,\n`size=\"small\"`\n.\n\n### Active State\n\nApply the\n`active`\nattribute or class to a button within the group to highlight it as the current selection.",
1894
+ "inputs": [
1895
+ {
1896
+ "name": "color",
1897
+ "type": "ShipColor | null",
1898
+ "description": "",
1899
+ "defaultValue": "null",
1900
+ "options": [
1901
+ "primary",
1902
+ "accent",
1903
+ "warn",
1904
+ "error",
1905
+ "success"
1906
+ ]
1907
+ },
1908
+ {
1909
+ "name": "variant",
1910
+ "type": "ShipButtonGroupVariant | null",
1911
+ "description": "",
1912
+ "defaultValue": "null",
1913
+ "options": [
1914
+ "type-a",
1915
+ "type-b"
1916
+ ]
1917
+ },
1918
+ {
1919
+ "name": "size",
1920
+ "type": "ShipSize | null",
1921
+ "description": "",
1922
+ "defaultValue": "null",
1923
+ "options": [
1924
+ "small"
1925
+ ]
1926
+ }
1927
+ ],
1928
+ "outputs": [],
1929
+ "cssVariables": [
1930
+ {
1931
+ "name": "--btng-bg",
1932
+ "defaultValue": "var(--base-1)"
1933
+ },
1934
+ {
1935
+ "name": "--btng-item-bg",
1936
+ "defaultValue": "var(--base-3)"
1937
+ },
1938
+ {
1939
+ "name": "--btng-c",
1940
+ "defaultValue": "var(--base-12)"
1941
+ },
1942
+ {
1943
+ "name": "--btng-ic",
1944
+ "defaultValue": "var(--base-12)"
1945
+ },
1946
+ {
1947
+ "name": "--btng-bc",
1948
+ "defaultValue": "var(--base-4)"
1949
+ },
1950
+ {
1951
+ "name": "--btng-h",
1952
+ "defaultValue": "#{p2r(40)}"
1953
+ },
1954
+ {
1955
+ "name": "--btng-p",
1956
+ "defaultValue": "#{p2r(0 12)}"
1957
+ },
1958
+ {
1959
+ "name": "--btng-s",
1960
+ "defaultValue": "var(--shape-2)"
1961
+ },
1962
+ {
1963
+ "name": "--btng-f",
1964
+ "defaultValue": "var(--paragraph-30)"
1965
+ },
1966
+ {
1967
+ "name": "--btng-s-a",
1968
+ "defaultValue": "var(--shape-2)"
1969
+ }
1970
+ ],
1971
+ "examples": [
1972
+ {
1973
+ "name": "base-button-group",
1974
+ "html": "<sh-button-group [class.small]=\"small()\" [class]=\"type()\">\n @for (item of items(); track $index) {\n <button [class.active]=\"activeIndex() === $index\" (click)=\"updateActiveIndex($index)\">\n <sh-icon>circle</sh-icon>\n Hello\n </button>\n }\n</sh-button-group>\n",
1975
+ "ts": "import { ChangeDetectionStrategy, Component, input, signal } from '@angular/core';\nimport { ShipButtonGroup, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-base-button-group',\n imports: [ShipButtonGroup, ShipIcon],\n templateUrl: './base-button-group.html',\n styleUrl: './base-button-group.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseButtonGroup {\n small = input<boolean>(false);\n type = input<'' | 'type-b'>('');\n activeIndex = signal<number | null>(null);\n\n items = signal(new Array(5).fill(0));\n\n updateActiveIndex(newIndex: number) {\n this.activeIndex.set(newIndex === this.activeIndex() ? null : newIndex);\n }\n}\n"
1976
+ }
1977
+ ]
1978
+ },
1979
+ {
1980
+ "name": "ShipPopover",
1981
+ "selector": "sh-popover",
1982
+ "path": "projects/ship-ui/src/lib/ship-popover/ship-popover.ts",
1983
+ "description": "### Hover Trigger\n\nUse the\n`onHover`\nattribute or binding to open the popover on hover instead of click.\n\n### Nesting\n\nUse the\n`asMultiLayer`\nattribute to enable nested popover support.\n\n### Customization\n\nThe\n`options`\nattribute accepts a configuration object with:\n`width`\n,\n`height`\n,\n`closeOnButton`\n, and\n`closeOnEsc`\n.",
1984
+ "inputs": [
1985
+ {
1986
+ "name": "asMultiLayer",
1987
+ "type": "boolean",
1988
+ "description": "",
1989
+ "defaultValue": "false"
1990
+ },
1991
+ {
1992
+ "name": "disableOpenByClick",
1993
+ "type": "boolean",
1994
+ "description": "",
1995
+ "defaultValue": "false"
1996
+ },
1997
+ {
1998
+ "name": "options",
1999
+ "type": "Partial<ShipPopoverOptions>",
2000
+ "description": ""
2001
+ },
2002
+ {
2003
+ "name": "isOpen",
2004
+ "type": "boolean",
2005
+ "description": "",
2006
+ "defaultValue": "false"
2007
+ }
2008
+ ],
2009
+ "outputs": [
2010
+ {
2011
+ "name": "closed",
2012
+ "type": "void",
2013
+ "description": ""
2014
+ }
2015
+ ],
2016
+ "cssVariables": [
2017
+ {
2018
+ "name": "--po-d",
2019
+ "defaultValue": "block"
2020
+ }
2021
+ ],
2022
+ "examples": [
2023
+ {
2024
+ "name": "sh-button-popover",
2025
+ "html": "<sh-popover>\n <a shButton>hello im a shButton trigger</a>\n hello im content\n</sh-popover>\n",
2026
+ "ts": "import { Component } from '@angular/core';\nimport { ShipButton, ShipPopover } from 'ship-ui';\n\n@Component({\n selector: 'sh-button-popover',\n standalone: true,\n imports: [ShipPopover, ShipButton],\n templateUrl: './sh-button-popover.html',\n styleUrl: './sh-button-popover.scss',\n})\nexport class ShButtonPopover {}\n"
2027
+ },
2028
+ {
2029
+ "name": "trigger-attribute-popover",
2030
+ "html": "<sh-popover>\n <div trigger>hello im a div trigger</div>\n hello im content\n</sh-popover>\n",
2031
+ "ts": "import { Component } from '@angular/core';\nimport { ShipPopover } from 'ship-ui';\n\n@Component({\n selector: 'trigger-attribute-popover',\n standalone: true,\n imports: [ShipPopover],\n templateUrl: './trigger-attribute-popover.html',\n styleUrl: './trigger-attribute-popover.scss',\n})\nexport class TriggerAttributePopover {}\n"
2032
+ },
2033
+ {
2034
+ "name": "button-popover",
2035
+ "html": "<sh-popover>\n <button>hello im a trigger plain button trigger</button>\n hello im content\n</sh-popover>\n",
2036
+ "ts": "import { Component } from '@angular/core';\nimport { ShipPopover } from 'ship-ui';\n\n@Component({\n selector: 'button-popover',\n standalone: true,\n imports: [ShipPopover],\n templateUrl: './button-popover.html',\n styleUrl: './button-popover.scss',\n})\nexport class ButtonPopover {}\n"
2037
+ }
2038
+ ]
2039
+ },
2040
+ {
2041
+ "name": "ShipButton",
2042
+ "selector": "[shButton]",
2043
+ "path": "projects/ship-ui/src/lib/ship-button/ship-button.ts",
2044
+ "description": "### Variants\n\nButton variants can be set using the\n`variant`\nattribute. Valid options are:\n**simple**\n,\n**outlined**\n,\n**flat**\n, and\n**raised**\n.\n\n### Sizes\n\nButton sizes can be set using the\n`size`\nattribute. For example:\n`size=\"small\"`\n.\n\n### Colors\n\nButton colors can be set using the\n`color`\nattribute. Valid options are:\n**primary**\n,\n**accent**\n,\n**warn**\n,\n**error**\n, and\n**success**\n.\n\n### Loading\n\nThe button can be set to loading state by adding the\n`loading`\nclass.\n\n### Readonly\n\nThe button can be set to readonly through the\n`readonly`\ninput (adds the\n`readonly`\nclass) or the standard\n`readonly`\nattribute.\n\n### Rotate icon\n\nIcons within the button can be rotated by adding the\n`rotated-icon`\nclass.\n\n### Disabled\n\nThe button can be disabled using the standard\n`disabled`\nattribute or\n`[disabled]`\nbinding.\n\n:::info\nThis component utilizes the **Ship Sheet** utility for its visual structure. It supports standard sheet variations and is affected by global sheet variables.\n:::",
2045
+ "inputs": [
2046
+ {
2047
+ "name": "color",
2048
+ "type": "ShipColor | null",
2049
+ "description": "",
2050
+ "defaultValue": "null",
2051
+ "options": [
2052
+ "primary",
2053
+ "accent",
2054
+ "warn",
2055
+ "error",
2056
+ "success"
2057
+ ]
2058
+ },
2059
+ {
2060
+ "name": "variant",
2061
+ "type": "ShipSheetVariant | null",
2062
+ "description": "",
2063
+ "defaultValue": "null",
2064
+ "options": [
2065
+ "simple",
2066
+ "outlined",
2067
+ "flat",
2068
+ "raised"
2069
+ ]
2070
+ },
2071
+ {
2072
+ "name": "size",
2073
+ "type": "ShipButtonSize | null",
2074
+ "description": "",
2075
+ "defaultValue": "null",
2076
+ "options": [
2077
+ "small",
2078
+ "xsmall"
2079
+ ]
2080
+ },
2081
+ {
2082
+ "name": "readonly",
2083
+ "type": "boolean",
2084
+ "description": "",
2085
+ "defaultValue": "false"
2086
+ }
2087
+ ],
2088
+ "outputs": [],
2089
+ "cssVariables": [
2090
+ {
2091
+ "name": "--btn-h",
2092
+ "defaultValue": "#{p2r(40)}"
2093
+ },
2094
+ {
2095
+ "name": "--btn-f",
2096
+ "defaultValue": "var(--paragraph-20)"
2097
+ },
2098
+ {
2099
+ "name": "--btn-a-opacity",
2100
+ "defaultValue": "0.05"
2101
+ },
2102
+ {
2103
+ "name": "--btn-bs",
2104
+ "defaultValue": "var(--box-shadow-10)"
2105
+ },
2106
+ {
2107
+ "name": "--btn-ir",
2108
+ "defaultValue": "180deg"
2109
+ }
2110
+ ],
2111
+ "examples": [
2112
+ {
2113
+ "name": "flat-button",
2114
+ "html": "<button shButton variant=\"flat\">\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"flat\">\n <sh-icon>circle</sh-icon>\n Basic\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"flat\" color=\"primary\">\n <sh-icon>circle</sh-icon>\n Primary\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"flat\" color=\"accent\">\n <sh-icon>circle</sh-icon>\n Accent\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"flat\" color=\"warn\">\n <sh-icon>circle</sh-icon>\n Warn\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"flat\" color=\"error\">\n <sh-icon>circle</sh-icon>\n Error\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"flat\" color=\"success\">\n <sh-icon>circle</sh-icon>\n Success\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"flat\" disabled>\n <sh-icon>circle</sh-icon>\n Disabled\n <sh-icon>circle</sh-icon>\n</button>\n\n<a shButton variant=\"flat\" href=\"https://www.google.com/\" target=\"_blank\">Link</a>\n",
2115
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipButton, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-flat-button',\n imports: [ShipIcon, ShipButton],\n templateUrl: './flat-button.html',\n styleUrl: './flat-button.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FlatButton {}\n"
2116
+ },
2117
+ {
2118
+ "name": "raised-button",
2119
+ "html": "<button shButton variant=\"raised\">\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"raised\">\n <sh-icon>circle</sh-icon>\n Basic\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"raised\" color=\"primary\">\n <sh-icon>circle</sh-icon>\n Primary\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"raised\" color=\"accent\">\n <sh-icon>circle</sh-icon>\n Accent\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"raised\" color=\"warn\">\n <sh-icon>circle</sh-icon>\n Warn\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"raised\" color=\"error\">\n <sh-icon>circle</sh-icon>\n Error\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"raised\" color=\"success\">\n <sh-icon>circle</sh-icon>\n Success\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"raised\" disabled>\n <sh-icon>circle</sh-icon>\n Disabled\n <sh-icon>circle</sh-icon>\n</button>\n<a shButton variant=\"raised\" href=\"https://www.google.com/\" target=\"_blank\">Link</a>\n",
2120
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipButton, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-raised-button',\n imports: [ShipIcon, ShipButton],\n templateUrl: './raised-button.html',\n styleUrl: './raised-button.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RaisedButton {}\n"
2121
+ },
2122
+ {
2123
+ "name": "simple-button",
2124
+ "html": "<button shButton variant=\"simple\">\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"simple\">\n <sh-icon>circle</sh-icon>\n Basic\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"simple\" color=\"primary\">\n <sh-icon>circle</sh-icon>\n Primary\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"simple\" color=\"accent\">\n <sh-icon>circle</sh-icon>\n Accent\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"simple\" color=\"warn\">\n <sh-icon>circle</sh-icon>\n Warn\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"simple\" color=\"error\">\n <sh-icon>circle</sh-icon>\n Error\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"simple\" color=\"success\">\n <sh-icon>circle</sh-icon>\n Success\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"simple\" disabled>\n <sh-icon>circle</sh-icon>\n Disabled\n <sh-icon>circle</sh-icon>\n</button>\n\n<a shButton variant=\"simple\" href=\"https://www.google.com/\" target=\"_blank\">Link</a>\n",
2125
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipButton, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-simple-button',\n imports: [ShipIcon, ShipButton],\n templateUrl: './simple-button.html',\n styleUrl: './simple-button.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SimpleButton {}\n"
2126
+ },
2127
+ {
2128
+ "name": "outlined-button",
2129
+ "html": "<button shButton variant=\"outlined\">\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"outlined\">\n <sh-icon>circle</sh-icon>\n Basic\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"outlined\" color=\"primary\">\n <sh-icon>circle</sh-icon>\n Primary\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"outlined\" color=\"accent\">\n <sh-icon>circle</sh-icon>\n Accent\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"outlined\" color=\"warn\">\n <sh-icon>circle</sh-icon>\n Warn\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"outlined\" color=\"error\">\n <sh-icon>circle</sh-icon>\n Error\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"outlined\" color=\"success\">\n <sh-icon>circle</sh-icon>\n Success\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton variant=\"outlined\" disabled>\n <sh-icon>circle</sh-icon>\n Disabled\n <sh-icon>circle</sh-icon>\n</button>\n\n<a shButton variant=\"outlined\" href=\"https://www.google.com/\" target=\"_blank\">Link</a>\n",
2130
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipButton, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-outlined-button',\n imports: [ShipIcon, ShipButton],\n templateUrl: './outlined-button.html',\n styleUrl: './outlined-button.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OutlinedButton {}\n"
2131
+ },
2132
+ {
2133
+ "name": "base-button",
2134
+ "html": "<!-- Using attribute inputs -->\n<button shButton>\n <sh-icon>caret-down</sh-icon>\n</button>\n\n<button shButton>\n <sh-icon>caret-down</sh-icon>\n</button>\n\n<button shButton>\n <sh-icon>circle</sh-icon>\n Default\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton color=\"primary\">\n <sh-icon>circle</sh-icon>\n Primary\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton color=\"accent\">\n <sh-icon>circle</sh-icon>\n Accent\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton color=\"warn\">\n <sh-icon>circle</sh-icon>\n Warn\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton color=\"error\">\n <sh-icon>circle</sh-icon>\n Error\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton color=\"success\">\n <sh-icon>circle</sh-icon>\n success\n <sh-icon>circle</sh-icon>\n</button>\n\n<button shButton disabled>\n <sh-icon>circle</sh-icon>\n Disabled\n <sh-icon>circle</sh-icon>\n</button>\n\n<a shButton href=\"https://www.google.com/\" target=\"_blank\">Link</a>\n\n<!-- Alternative: Using CSS classes -->\n<!--\n<button shButton class=\"primary\">Primary</button>\n<button shButton class=\"raised primary\">Raised Primary</button>\n-->\n",
2135
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipButton, ShipIcon } from 'ship-ui';\n\n@Component({\n selector: 'app-base-button',\n imports: [ShipIcon, ShipButton],\n templateUrl: './base-button.html',\n styleUrl: './base-button.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseButton {}\n"
2136
+ },
2137
+ {
2138
+ "name": "button-sandbox",
2139
+ "html": "<div class=\"controls\">\n <p>Controls</p>\n <header>\n <div class=\"row\">\n <!-- <sh-toggle [class.active]=\"isSmall()\" class=\"primary raised\" (click)=\"isSmall.set(!isSmall())\">Small</sh-toggle> -->\n\n <sh-button-group class=\"small type-b\">\n <button [class.active]=\"sizeClass() === ''\" (click)=\"sizeClass.set('')\">Normal</button>\n <button [class.active]=\"sizeClass() === 'small'\" (click)=\"sizeClass.set('small')\">Small</button>\n <button [class.active]=\"sizeClass() === 'xsmall'\" (click)=\"sizeClass.set('xsmall')\">XSmall</button>\n </sh-button-group>\n\n <sh-toggle [class.active]=\"isRotated()\" color=\"primary\" variant=\"raised\" (click)=\"isRotated.set(!isRotated())\">\n Rotated\n </sh-toggle>\n <sh-toggle [class.active]=\"isLoading()\" color=\"primary\" variant=\"raised\" (click)=\"isLoading.set(!isLoading())\">\n Loading\n </sh-toggle>\n <sh-toggle [class.active]=\"isDisabled()\" color=\"primary\" variant=\"raised\" (click)=\"isDisabled.set(!isDisabled())\">\n Disabled\n </sh-toggle>\n <sh-toggle [class.active]=\"isReadonly()\" color=\"primary\" variant=\"raised\" (click)=\"isReadonly.set(!isReadonly())\">\n Readonly\n </sh-toggle>\n </div>\n\n <div class=\"row\">\n <sh-button-group class=\"small type-b\">\n <button [class.active]=\"colorClass() === ''\" (click)=\"colorClass.set('')\">Default</button>\n <button [class.active]=\"colorClass() === 'primary'\" (click)=\"colorClass.set('primary')\">Primary</button>\n <button [class.active]=\"colorClass() === 'accent'\" (click)=\"colorClass.set('accent')\">Accent</button>\n <button [class.active]=\"colorClass() === 'warn'\" (click)=\"colorClass.set('warn')\">Warn</button>\n <button [class.active]=\"colorClass() === 'error'\" (click)=\"colorClass.set('error')\">Error</button>\n <button [class.active]=\"colorClass() === 'success'\" (click)=\"colorClass.set('success')\">Success</button>\n </sh-button-group>\n\n <sh-button-group class=\"small type-b\">\n <button [class.active]=\"variationClass() === ''\" (click)=\"variationClass.set('')\">Default</button>\n <button [class.active]=\"variationClass() === 'simple'\" (click)=\"variationClass.set('simple')\">Simple</button>\n <button [class.active]=\"variationClass() === 'outlined'\" (click)=\"variationClass.set('outlined')\">\n Outlined\n </button>\n <button [class.active]=\"variationClass() === 'flat'\" (click)=\"variationClass.set('flat')\">Flat</button>\n <button [class.active]=\"variationClass() === 'raised'\" (click)=\"variationClass.set('raised')\">Raised</button>\n </sh-button-group>\n </div>\n </header>\n</div>\n\n<div class=\"sandbox\">\n <button\n shButton\n [color]=\"colorClass()\"\n [variant]=\"variationClass()\"\n [size]=\"sizeClass()\"\n [class.loading]=\"isLoading()\"\n [class.rotated-icon]=\"isRotated()\"\n [disabled]=\"isDisabled()\"\n [attr.readonly]=\"isReadonly() ? true : null\">\n <sh-icon>caret-down</sh-icon>\n </button>\n\n <button\n shButton\n [color]=\"colorClass()\"\n [variant]=\"variationClass()\"\n [size]=\"sizeClass()\"\n [class.loading]=\"isLoading()\"\n [class.rotated-icon]=\"isRotated()\"\n [disabled]=\"isDisabled()\"\n [attr.readonly]=\"isReadonly() ? true : null\">\n <sh-icon>caret-down</sh-icon>\n Default\n <sh-icon>caret-down</sh-icon>\n </button>\n\n <button\n shButton\n [color]=\"colorClass()\"\n [variant]=\"variationClass()\"\n [size]=\"sizeClass()\"\n [class.loading]=\"isLoading()\"\n [class.rotated-icon]=\"isRotated()\"\n [disabled]=\"isDisabled()\"\n [attr.readonly]=\"isReadonly() ? true : null\">\n <sh-icon>caret-down</sh-icon>\n Primary\n </button>\n\n <button\n shButton\n [color]=\"colorClass()\"\n [variant]=\"variationClass()\"\n [size]=\"sizeClass()\"\n [class.loading]=\"isLoading()\"\n [class.rotated-icon]=\"isRotated()\"\n [disabled]=\"isDisabled()\"\n [attr.readonly]=\"isReadonly() ? true : null\">\n Primary\n <sh-icon>caret-down</sh-icon>\n </button>\n</div>\n",
2140
+ "ts": "import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport { ShipButton, ShipButtonGroup, ShipIcon, ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-button-sandbox',\n imports: [ShipButton, ShipButtonGroup, ShipIcon, ShipToggle],\n templateUrl: './button-sandbox.html',\n styleUrl: './button-sandbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ButtonSandbox {\n isSmall = signal<boolean>(false);\n isRotated = signal<boolean>(false);\n isLoading = signal<boolean>(false);\n isDisabled = signal<boolean>(false);\n isReadonly = signal<boolean>(false);\n\n sizeClass = signal<'' | 'small' | 'xsmall'>('');\n colorClass = signal<'' | 'primary' | 'accent' | 'warn' | 'error' | 'success'>('primary');\n variationClass = signal<'' | 'simple' | 'outlined' | 'flat' | 'raised'>('raised');\n exampleClass = computed(() => this.colorClass() + ' ' + this.variationClass() + ' ' + this.sizeClass());\n}\n"
2141
+ }
2142
+ ]
2143
+ },
2144
+ {
2145
+ "name": "ShipDivider",
2146
+ "selector": "sh-divider",
2147
+ "path": "projects/ship-ui/src/lib/ship-divider/ship-divider.ts",
2148
+ "description": "### Orientation\n\nUse the\n`&lt;sh-divider&gt;`\nelement to visually separate sections. By default, it is horizontal.\n\n### Content\n\nYou can place text or icons inside the divider tags to create a divider with integrated content:\n`&lt;sh-divider&gt;OR&lt;/sh-divider&gt;`\n.",
2149
+ "inputs": [],
2150
+ "outputs": [],
2151
+ "cssVariables": [
2152
+ {
2153
+ "name": "--divider-c",
2154
+ "defaultValue": "var(--base-4)"
2155
+ },
2156
+ {
2157
+ "name": "--divider-h",
2158
+ "defaultValue": "#{p2r(1)}"
2159
+ }
2160
+ ],
2161
+ "examples": [
2162
+ {
2163
+ "name": "base-divider",
2164
+ "html": "<div>Above the divider</div>\n<sh-divider></sh-divider>\n<div>Below the divider</div>\n",
2165
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipDivider } from 'ship-ui';\n\n@Component({\n selector: 'app-base-divider',\n standalone: true,\n imports: [ShipDivider],\n templateUrl: './base-divider.html',\n styleUrl: './base-divider.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseDivider {}\n"
2166
+ },
2167
+ {
2168
+ "name": "text-divider",
2169
+ "html": "<div>Above the divider</div>\n<sh-divider>Text in divider</sh-divider>\n<div>Below the divider</div>\n",
2170
+ "ts": "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ShipDivider } from 'ship-ui';\n\n@Component({\n selector: 'app-text-divider',\n standalone: true,\n imports: [ShipDivider],\n templateUrl: './text-divider.html',\n styleUrl: './text-divider.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TextDividerComponent {}\n"
2171
+ }
2172
+ ]
2173
+ },
2174
+ {
2175
+ "name": "ShipColorPicker",
2176
+ "selector": "sh-color-picker",
2177
+ "path": "projects/ship-ui/src/lib/ship-color-picker/ship-color-picker.ts",
2178
+ "description": "",
2179
+ "inputs": [
2180
+ {
2181
+ "name": "showDarkColors",
2182
+ "type": "any",
2183
+ "description": "",
2184
+ "defaultValue": "false"
2185
+ },
2186
+ {
2187
+ "name": "renderingType",
2188
+ "type": "'hsl' | 'grid' | 'hue' | 'rgb' | 'saturation'",
2189
+ "description": "",
2190
+ "defaultValue": "'hsl'"
2191
+ },
2192
+ {
2193
+ "name": "gridSize",
2194
+ "type": "any",
2195
+ "description": "",
2196
+ "defaultValue": "20"
2197
+ },
2198
+ {
2199
+ "name": "hue",
2200
+ "type": "any",
2201
+ "description": "",
2202
+ "defaultValue": "0"
2203
+ },
2204
+ {
2205
+ "name": "direction",
2206
+ "type": "'horizontal' | 'vertical'",
2207
+ "description": "",
2208
+ "defaultValue": "'horizontal'"
2209
+ },
2210
+ {
2211
+ "name": "selectedColor",
2212
+ "type": "[R, G, B]",
2213
+ "description": "",
2214
+ "defaultValue": "[255"
2215
+ }
2216
+ ],
2217
+ "outputs": [
2218
+ {
2219
+ "name": "currentColor",
2220
+ "type": "{ rgb: string; hex: string; hsl: string; hue: number; saturation: number }",
2221
+ "description": ""
2222
+ }
2223
+ ],
2224
+ "cssVariables": [],
2225
+ "examples": [
2226
+ {
2227
+ "name": "base-color-picker",
2228
+ "html": "<sh-button-group>\n <button [class.active]=\"renderingType() === 'hsl'\" (click)=\"renderingType.set('hsl')\">\n <sh-icon>circle</sh-icon>\n HSL Wheel\n </button>\n <button [class.active]=\"renderingType() === 'rgb'\" (click)=\"renderingType.set('rgb')\">\n <sh-icon>circle</sh-icon>\n RGB\n </button>\n <button [class.active]=\"renderingType() === 'grid'\" (click)=\"renderingType.set('grid')\">\n <sh-icon>circle</sh-icon>\n Grid\n </button>\n <button [class.active]=\"renderingType() === 'hue'\" (click)=\"renderingType.set('hue')\">\n <sh-icon>circle</sh-icon>\n Hue\n </button>\n <button [class.active]=\"renderingType() === 'saturation'\" (click)=\"renderingType.set('saturation')\">\n <sh-icon>circle</sh-icon>\n Saturation\n </button>\n</sh-button-group>\n\n@if (renderingType() === 'hsl') {\n <sh-toggle [class.active]=\"showDarkColors()\" class=\"primary raised\" (click)=\"showDarkColors.set(!showDarkColors())\">\n Show dark colors\n </sh-toggle>\n}\n\n@if (renderingType() === 'grid' || renderingType() === 'rgb') {\n <!-- <sh-range-slider unit=\"%\" class=\"primary raised\">\n <label>ngModel</label>\n <input type=\"range\" min=\"0\" [max]=\"360\" [(ngModel)]=\"gridHue\" />\n</sh-range-slider>\n -->\n\n <sh-color-picker renderingType=\"hue\" (currentColor)=\"selectedHue.set($event.hue)\"></sh-color-picker>\n}\n\n@if (renderingType() === 'hue') {\n <sh-toggle [class.active]=\"direction()\" class=\"primary raised\" (click)=\"direction.set(!direction())\">\n Direction\n </sh-toggle>\n}\n\n@if (renderingType() === 'saturation') {\n <sh-toggle [class.active]=\"direction()\" class=\"primary raised\" (click)=\"direction.set(!direction())\">\n Direction\n </sh-toggle>\n}\n\n<sh-color-picker\n [renderingType]=\"renderingType()\"\n [showDarkColors]=\"showDarkColors()\"\n [direction]=\"direction() ? 'vertical' : 'horizontal'\"\n [hue]=\"selectedHue()\"\n (currentColor)=\"currentColor.set($event)\"></sh-color-picker>\n\n<div class=\"colors\">\n <div class=\"swatch\" [style.background]=\"currentColor()?.hex\"></div>\n\n <div class=\"color-text\">\n <p>RGB: {{ currentColor()?.rgb }}</p>\n <p>HEX: {{ currentColor()?.hex }}</p>\n <p>HSL: {{ currentColor()?.hsl }}</p>\n <p>Hue: {{ currentColor()?.hue }}</p>\n <p>Saturation: {{ currentColor()?.saturation }}</p>\n </div>\n</div>\n<!-- <pre>{{ currentColor() | json }}</pre> -->\n",
2229
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipButtonGroup, ShipColorPicker, ShipIcon, ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-base-color-picker',\n imports: [ShipColorPicker, ShipButtonGroup, ShipIcon, ShipToggle],\n templateUrl: './base-color-picker.html',\n styleUrl: './base-color-picker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseColorPicker {\n renderingType = signal<'hsl' | 'rgb' | 'grid' | 'hue' | 'saturation'>('hsl');\n aColor = signal<[number, number, number]>([255, 255, 255]);\n currentColor = signal<{ rgb: string; hex: string; hsl: string; hue: number; saturation: number } | null>(null);\n showDarkColors = signal(false);\n direction = signal(false);\n selectedHue = signal(0);\n}\n"
2230
+ }
2231
+ ]
2232
+ },
2233
+ {
2234
+ "name": "ShipDialog",
2235
+ "selector": "sh-dialog",
2236
+ "path": "projects/ship-ui/src/lib/ship-dialog/ship-dialog.ts",
2237
+ "description": "### Customization\n\nThe\n`options`\nattribute accepts a configuration object for:\n`width`\n,\n`height`\n,\n`maxWidth`\n,\n`maxHeight`\n,\n`closeOnButton`\n,\n`closeOnEsc`\n, and\n`closeOnOutsideClick`\n.\n\n### Variants\n\nDialogs support multiple layouts via the\n`variant`\nattribute. Valid options:\n**default**\nand\n**type-b**\n.\n\n### Slots\n\nStructure your dialog content using the\n`header`\n,\n`content`\n, and\n`footer`\nattributes on container elements.",
2238
+ "inputs": [
2239
+ {
2240
+ "name": "options",
2241
+ "type": "Partial<ShipDialogOptions>",
2242
+ "description": ""
2243
+ },
2244
+ {
2245
+ "name": "isOpen",
2246
+ "type": "boolean",
2247
+ "description": "",
2248
+ "defaultValue": "false"
2249
+ }
2250
+ ],
2251
+ "outputs": [
2252
+ {
2253
+ "name": "closed",
2254
+ "type": "void",
2255
+ "description": ""
2256
+ }
2257
+ ],
2258
+ "cssVariables": [
2259
+ {
2260
+ "name": "--dialog-p",
2261
+ "defaultValue": "#{p2r(16)}"
2262
+ },
2263
+ {
2264
+ "name": "--dialog-g",
2265
+ "defaultValue": "#{p2r(8)}"
2266
+ },
2267
+ {
2268
+ "name": "--dialog-bg",
2269
+ "defaultValue": "var(--base-1)"
2270
+ },
2271
+ {
2272
+ "name": "--dialog-s",
2273
+ "defaultValue": "var(--shape-2)"
2274
+ },
2275
+ {
2276
+ "name": "--dialog-inner-s",
2277
+ "defaultValue": "var(--shape-2)"
2278
+ }
2279
+ ],
2280
+ "examples": [
2281
+ {
2282
+ "name": "basic-dynamic-dialog",
2283
+ "html": "<button shButton (click)=\"openDialog()\">Open Basic Dialog</button>\n",
2284
+ "ts": "import { Component, inject, input, signal } from '@angular/core';\nimport { ShipButton, ShipDialogService } from 'ship-ui';\n\n@Component({\n selector: 'basic-dynamic-dialog',\n standalone: true,\n imports: [ShipButton],\n templateUrl: './basic-dynamic-dialog.html',\n styleUrl: './basic-dynamic-dialog.scss',\n})\nexport class BasicDynamicDialog {\n #dialog = inject(ShipDialogService);\n\n type = input<string>();\n\n openDialog() {\n const dialogRef = this.#dialog.open(SimpleDialogContentComponent, {\n data: { message: 'hllo', yellow: true, hello: true },\n class: this.type() ?? '',\n });\n }\n}\n\n@Component({\n selector: 'simple-dialog-content',\n standalone: true,\n template: `\n <div style=\"padding: 2rem;\">Hello from a basic dialog!</div>\n `,\n})\nclass SimpleDialogContentComponent {\n hello = signal<string>('hello');\n data = input<{ message: string; yellow: boolean; hello: boolean }>();\n // closed = output<string>();\n}\n"
2285
+ },
2286
+ {
2287
+ "name": "dialog-as-component",
2288
+ "html": "<button shButton (click)=\"openDialog()\" [class.type]=\"type()\">Open dialog as component</button>\n\n<sh-dialog [(isOpen)]=\"isOpen\" (closed)=\"close()\">hello im dialog content</sh-dialog>\n",
2289
+ "ts": "import { ChangeDetectionStrategy, Component, input, signal } from '@angular/core';\nimport { ShipButton, ShipDialog } from 'ship-ui';\n\n@Component({\n selector: 'app-dialog-as-component',\n imports: [ShipDialog, ShipButton],\n templateUrl: './dialog-as-component.html',\n styleUrl: './dialog-as-component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DialogAsComponent {\n type = input<string>();\n\n isOpen = signal(false);\n\n openDialog() {\n this.isOpen.set(true);\n }\n\n close() {\n this.isOpen.set(false);\n }\n}\n"
2290
+ },
2291
+ {
2292
+ "name": "data-passing-dialog",
2293
+ "html": "<button shButton (click)=\"openDialog()\">Open Data Passing hi Dialog</button>\n",
2294
+ "ts": "import { Component, inject, input, output } from '@angular/core';\nimport { ShipButton, ShipDialogService } from 'ship-ui';\n\n@Component({\n selector: 'data-passing-dialog',\n standalone: true,\n imports: [ShipButton],\n templateUrl: './data-passing-dialog.html',\n styleUrl: './data-passing-dialog.scss',\n})\nexport class DataPassingDialog {\n #dialog = inject(ShipDialogService);\n\n type = input<string>();\n\n openDialog() {\n const dialogRef = this.#dialog.open(DataDialogContent, {\n class: this.type() ?? '',\n data: { message: 'Hello from parent!' },\n closed: (result: any) => {\n console.log('Dialog function closed with: \\t' + result);\n },\n });\n\n dialogRef.component.closed.subscribe((res) => {\n console.log('Dialog component closed: \\t', res);\n });\n\n dialogRef.closed.subscribe((res) => {\n console.log('Dialog ref closed: \\t', res);\n });\n }\n}\n\n@Component({\n selector: 'data-dialog-content',\n standalone: true,\n imports: [ShipButton],\n templateUrl: './data-dialog-content.html',\n styleUrl: './data-dialog-content.scss',\n})\nclass DataDialogContent {\n data = input<{ message: string }>();\n closed = output<string>();\n\n closeWithValue() {\n console.log('closeWithValue');\n this.closed.emit('Some value from dialog');\n }\n}\n"
2295
+ },
2296
+ {
2297
+ "name": "header-footer-dialog",
2298
+ "html": "<button shButton (click)=\"openDialog()\">Open Header/Footer Dialog</button>\n",
2299
+ "ts": "import { Component, inject, input, output, signal } from '@angular/core';\nimport { ShipButton, ShipDialogService } from 'ship-ui';\n\n@Component({\n selector: 'header-footer-dialog',\n standalone: true,\n imports: [ShipButton],\n templateUrl: './header-footer-dialog.html',\n styleUrl: './header-footer-dialog.scss',\n})\nexport class HeaderFooterDialog {\n #dialog = inject(ShipDialogService);\n\n type = input<string>();\n\n openDialog() {\n this.#dialog.open(HeaderFooterDialogContent, {\n class: this.type() ?? '',\n });\n }\n}\n\n@Component({\n selector: 'header-footer-dialog-content',\n standalone: true,\n imports: [ShipButton],\n templateUrl: './header-footer-dialog-content.html',\n styleUrl: './header-footer-dialog-content.scss',\n})\nclass HeaderFooterDialogContent {\n closed = output<boolean>();\n\n stickyHeader = signal(false);\n stickyFooter = signal(false);\n}\n"
2300
+ }
2301
+ ]
2302
+ },
2303
+ {
2304
+ "name": "ShipToggle",
2305
+ "selector": "sh-toggle",
2306
+ "path": "projects/ship-ui/src/lib/ship-toggle/ship-toggle.ts",
2307
+ "description": "### Variants\n\nToggle variants can be set using the\n`variant`\nattribute. Valid options are:\n**simple**\n,\n**outlined**\n,\n**flat**\n, and\n**raised**\n.\n\n### Colors\n\nToggle colors can be set using the\n`color`\nattribute. Valid options are:\n**primary**\n,\n**accent**\n,\n**warn**\n,\n**error**\n, and\n**success**\n.\n\n### Readonly\n\nThe toggle can be set to readonly through the\n`readonly`\ninput (adds the\n`readonly`\nclass).\n\n### Disabled\n\nThe toggle can be disabled using the standard\n`disabled`\nattribute or\n`[disabled]`\nbinding.",
2308
+ "inputs": [
2309
+ {
2310
+ "name": "color",
2311
+ "type": "ShipColor | null",
2312
+ "description": "",
2313
+ "defaultValue": "null",
2314
+ "options": [
2315
+ "primary",
2316
+ "accent",
2317
+ "warn",
2318
+ "error",
2319
+ "success"
2320
+ ]
2321
+ },
2322
+ {
2323
+ "name": "variant",
2324
+ "type": "ShipSheetVariant | null",
2325
+ "description": "",
2326
+ "defaultValue": "null",
2327
+ "options": [
2328
+ "simple",
2329
+ "outlined",
2330
+ "flat",
2331
+ "raised"
2332
+ ]
2333
+ },
2334
+ {
2335
+ "name": "readonly",
2336
+ "type": "boolean",
2337
+ "description": "",
2338
+ "defaultValue": "false"
2339
+ }
2340
+ ],
2341
+ "outputs": [],
2342
+ "cssVariables": [
2343
+ {
2344
+ "name": "--toggle-bg",
2345
+ "defaultValue": "var(--base-4)"
2346
+ },
2347
+ {
2348
+ "name": "--toggle-b",
2349
+ "defaultValue": "0"
2350
+ },
2351
+ {
2352
+ "name": "--togglek-bg",
2353
+ "defaultValue": "var(--base-2)"
2354
+ },
2355
+ {
2356
+ "name": "--togglek-bs",
2357
+ "defaultValue": "var(--box-shadow-20)"
2358
+ }
2359
+ ],
2360
+ "examples": [
2361
+ {
2362
+ "name": "simple-toggle",
2363
+ "html": "<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"simple\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"simple\" color=\"primary\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"simple\" color=\"accent\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"simple\" color=\"warn\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"simple\" color=\"error\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"simple\" color=\"success\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"simple\" disabled />\n",
2364
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-simple-toggle',\n standalone: true,\n imports: [ShipToggle],\n templateUrl: './simple-toggle.html',\n styleUrl: './simple-toggle.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SimpleToggle {\n active = signal(false);\n}\n"
2365
+ },
2366
+ {
2367
+ "name": "raised-toggle",
2368
+ "html": "<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"raised\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"raised\" color=\"primary\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"raised\" color=\"accent\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"raised\" color=\"warn\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"raised\" color=\"error\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"raised\" color=\"success\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"raised\" disabled />\n",
2369
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-raised-toggle',\n standalone: true,\n imports: [ShipToggle],\n templateUrl: './raised-toggle.html',\n styleUrl: './raised-toggle.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RaisedToggle {\n active = signal(false);\n}\n"
2370
+ },
2371
+ {
2372
+ "name": "flat-toggle",
2373
+ "html": "<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"flat\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"flat\" color=\"primary\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"flat\" color=\"accent\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"flat\" color=\"warn\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"flat\" color=\"error\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"flat\" color=\"success\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"flat\" disabled />\n",
2374
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-flat-toggle',\n standalone: true,\n imports: [ShipToggle],\n templateUrl: './flat-toggle.html',\n styleUrl: './flat-toggle.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FlatToggle {\n active = signal(false);\n}\n"
2375
+ },
2376
+ {
2377
+ "name": "outlined-toggle",
2378
+ "html": "<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"outlined\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"outlined\" color=\"primary\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"outlined\" color=\"accent\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"outlined\" color=\"warn\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"outlined\" color=\"error\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"outlined\" color=\"success\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" variant=\"outlined\" disabled />\n",
2379
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-outlined-toggle',\n standalone: true,\n imports: [ShipToggle],\n templateUrl: './outlined-toggle.html',\n styleUrl: './outlined-toggle.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OutlinedToggle {\n active = signal(false);\n}\n"
2380
+ },
2381
+ {
2382
+ "name": "base-toggle",
2383
+ "html": "<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" color=\"primary\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" color=\"accent\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" color=\"warn\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" color=\"error\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" color=\"success\" />\n<sh-toggle [class.active]=\"active()\" (click)=\"active.set(!active())\" disabled />\n",
2384
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { ShipToggle } from 'ship-ui';\n\n@Component({\n selector: 'app-base-toggle',\n standalone: true,\n imports: [ShipToggle],\n templateUrl: './base-toggle.html',\n styleUrl: './base-toggle.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseToggle {\n active = signal(false);\n}\n"
2385
+ }
2386
+ ]
2387
+ },
2388
+ {
2389
+ "name": "ShipToggleCard",
2390
+ "selector": "sh-toggle-card",
2391
+ "path": "projects/ship-ui/src/lib/ship-toggle-card/ship-toggle-card.ts",
2392
+ "description": "",
2393
+ "inputs": [
2394
+ {
2395
+ "name": "disallowToggle",
2396
+ "type": "any",
2397
+ "description": "",
2398
+ "defaultValue": "false"
2399
+ },
2400
+ {
2401
+ "name": "color",
2402
+ "type": "ShipColor | null",
2403
+ "description": "",
2404
+ "defaultValue": "null",
2405
+ "options": [
2406
+ "primary",
2407
+ "accent",
2408
+ "warn",
2409
+ "error",
2410
+ "success"
2411
+ ]
2412
+ },
2413
+ {
2414
+ "name": "variant",
2415
+ "type": "ShipCardVariant | null",
2416
+ "description": "",
2417
+ "defaultValue": "null",
2418
+ "options": [
2419
+ "type-a",
2420
+ "type-b",
2421
+ "type-c"
2422
+ ]
2423
+ },
2424
+ {
2425
+ "name": "isActive",
2426
+ "type": "any",
2427
+ "description": "",
2428
+ "defaultValue": "false"
2429
+ }
2430
+ ],
2431
+ "outputs": [],
2432
+ "cssVariables": [],
2433
+ "examples": []
2434
+ },
2435
+ {
2436
+ "name": "ShipCheckbox",
2437
+ "selector": "sh-checkbox",
2438
+ "path": "projects/ship-ui/src/lib/ship-checkbox/ship-checkbox.ts",
2439
+ "description": ":::info\nThis component utilizes the **Ship Sheet** utility for its visual structure. It supports standard sheet variations and is affected by global sheet variables.\n:::",
2440
+ "inputs": [
2441
+ {
2442
+ "name": "color",
2443
+ "type": "ShipColor | null",
2444
+ "description": "",
2445
+ "defaultValue": "null",
2446
+ "options": [
2447
+ "primary",
2448
+ "accent",
2449
+ "warn",
2450
+ "error",
2451
+ "success"
2452
+ ]
2453
+ },
2454
+ {
2455
+ "name": "variant",
2456
+ "type": "ShipSheetVariant | null",
2457
+ "description": "",
2458
+ "defaultValue": "null",
2459
+ "options": [
2460
+ "simple",
2461
+ "outlined",
2462
+ "flat",
2463
+ "raised"
2464
+ ]
2465
+ },
2466
+ {
2467
+ "name": "readonly",
2468
+ "type": "boolean",
2469
+ "description": "",
2470
+ "defaultValue": "false"
2471
+ }
2472
+ ],
2473
+ "outputs": [],
2474
+ "cssVariables": [
2475
+ {
2476
+ "name": "--box-bw",
2477
+ "defaultValue": "#{p2r(1)}"
2478
+ },
2479
+ {
2480
+ "name": "--box-bc",
2481
+ "defaultValue": "var(--sheet-bc)"
2482
+ },
2483
+ {
2484
+ "name": "--sheet-s",
2485
+ "defaultValue": "var(--shape-1)"
2486
+ }
2487
+ ],
2488
+ "examples": []
2489
+ },
2490
+ {
2491
+ "name": "ShipRadio",
2492
+ "selector": "sh-radio",
2493
+ "path": "projects/ship-ui/src/lib/ship-radio/ship-radio.ts",
2494
+ "description": ":::info\nThis component utilizes the **Ship Sheet** utility for its visual structure. It supports standard sheet variations and is affected by global sheet variables.\n:::",
2495
+ "inputs": [
2496
+ {
2497
+ "name": "color",
2498
+ "type": "ShipColor | null",
2499
+ "description": "",
2500
+ "defaultValue": "null",
2501
+ "options": [
2502
+ "primary",
2503
+ "accent",
2504
+ "warn",
2505
+ "error",
2506
+ "success"
2507
+ ]
2508
+ },
2509
+ {
2510
+ "name": "variant",
2511
+ "type": "ShipSheetVariant | null",
2512
+ "description": "",
2513
+ "defaultValue": "null",
2514
+ "options": [
2515
+ "simple",
2516
+ "outlined",
2517
+ "flat",
2518
+ "raised"
2519
+ ]
2520
+ },
2521
+ {
2522
+ "name": "readonly",
2523
+ "type": "boolean",
2524
+ "description": "",
2525
+ "defaultValue": "false"
2526
+ }
2527
+ ],
2528
+ "outputs": [],
2529
+ "cssVariables": [
2530
+ {
2531
+ "name": "--radiod-c",
2532
+ "defaultValue": "var(--base-8)"
2533
+ },
2534
+ {
2535
+ "name": "--radiod-o",
2536
+ "defaultValue": "0"
2537
+ },
2538
+ {
2539
+ "name": "--radio-bc",
2540
+ "defaultValue": "var(--base-4)"
2541
+ }
2542
+ ],
2543
+ "examples": []
2544
+ },
2545
+ {
2546
+ "name": "ShipIcon",
2547
+ "selector": "sh-icon",
2548
+ "path": "projects/ship-ui/src/lib/ship-icon/ship-icon.ts",
2549
+ "description": "### Sizes\n\nIcons can be set to different sizes using the\n`size`\nattribute. Valid options are:\n**small**\n,\n**large**\n, or\n**inherit**\n.\n\n### Colors\n\nIcon colors can be set using the\n`color`\nattribute. Valid options are:\n**primary**\n,\n**accent**\n,\n**warn**\n,\n**error**\n, and\n**success**\n.\n\nColor can also be overridden with CSS color variables:\n`{{ `\\<sh-icon [style.--icon-c]=\"'blue'\">cloud-warning\\</sh-icon>` }}`\n\n### Icon Packs\n\nCurrently we support Phosphor Icons. Search for icons here:\n\n<a shButton variant=\"raised\" color=\"primary\" size=\"small\" href=\"https://phosphoricons.com/#toolbar\" target=\"_blank\">\nSearch Phosphor Icons\n<sh-icon>arrow-square-out</sh-icon>\n</a>\nWe support multiple weight variations using ligatures:\n\n<li>\n`cloud-warning`\n(Regular - default)\n</li>\n- `cloud-warning-thin`\n- `cloud-warning-light`\n- `cloud-warning-fill`\n- `cloud-warning-bold`\n\n### Icon CLI\n\nUse our CLI tool to generate optimized icon fonts containing only the icons you use.\n\nGenerate once:\n`ship-fg --src='./src' --out='./src/assets' --rootPath='./'`\n\nWatch mode:\n`ship-fg --src='./src' --out='./src/assets' --rootPath='./' --watch`",
2550
+ "inputs": [
2551
+ {
2552
+ "name": "color",
2553
+ "type": "ShipColor | null",
2554
+ "description": "",
2555
+ "defaultValue": "null",
2556
+ "options": [
2557
+ "primary",
2558
+ "accent",
2559
+ "warn",
2560
+ "error",
2561
+ "success"
2562
+ ]
2563
+ },
2564
+ {
2565
+ "name": "variant",
2566
+ "type": "ShipSheetVariant | null",
2567
+ "description": "",
2568
+ "defaultValue": "null",
2569
+ "options": [
2570
+ "simple",
2571
+ "outlined",
2572
+ "flat",
2573
+ "raised"
2574
+ ]
2575
+ },
2576
+ {
2577
+ "name": "size",
2578
+ "type": "ShipIconSize | null",
2579
+ "description": "",
2580
+ "defaultValue": "null",
2581
+ "options": [
2582
+ "small",
2583
+ "large"
2584
+ ]
2585
+ }
2586
+ ],
2587
+ "outputs": [],
2588
+ "cssVariables": [
2589
+ {
2590
+ "name": "--icon-c",
2591
+ "defaultValue": "inherit"
2592
+ }
2593
+ ],
2594
+ "examples": [
2595
+ {
2596
+ "name": "sandbox-icon",
2597
+ "html": "<div class=\"controls\">\n <p>Controls</p>\n <header>\n <div class=\"row\">\n <sh-button-group class=\"small\">\n <button [class.active]=\"size() === ''\" (click)=\"size.set('')\">Default</button>\n <button [class.active]=\"size() === 'large'\" (click)=\"size.set('large')\">Large</button>\n <button [class.active]=\"size() === 'small'\" (click)=\"size.set('small')\">Small</button>\n <button [class.active]=\"size() === 'inherit'\" (click)=\"size.set('inherit')\">Inherit</button>\n </sh-button-group>\n\n <sh-button-group class=\"small\">\n <button [class.active]=\"colorClass() === ''\" (click)=\"colorClass.set('')\">Default</button>\n <button [class.active]=\"colorClass() === 'primary'\" (click)=\"colorClass.set('primary')\">Primary</button>\n <button [class.active]=\"colorClass() === 'accent'\" (click)=\"colorClass.set('accent')\">Accent</button>\n <button [class.active]=\"colorClass() === 'warn'\" (click)=\"colorClass.set('warn')\">Warn</button>\n <button [class.active]=\"colorClass() === 'error'\" (click)=\"colorClass.set('error')\">Error</button>\n <button [class.active]=\"colorClass() === 'success'\" (click)=\"colorClass.set('success')\">Success</button>\n </sh-button-group>\n </div>\n\n @if (size() === 'inherit') {\n <div class=\"row\">\n <sh-range-slider>\n <input type=\"range\" [min]=\"10\" [max]=\"64\" [step]=\"2\" [(ngModel)]=\"sizeValue\" />\n </sh-range-slider>\n </div>\n }\n </header>\n</div>\n\n<div class=\"sandbox\" [style.font-size]=\"sizeValue() + 'px'\">\n <section>\n <h4>Cloud-warning</h4>\n <sh-icon [size]=\"size()\" [color]=\"colorClass()\">cloud-warning</sh-icon>\n <sh-icon [size]=\"size()\" [color]=\"colorClass()\">cloud-warning-thin</sh-icon>\n <sh-icon [size]=\"size()\" [color]=\"colorClass()\">cloud-warning-light</sh-icon>\n <sh-icon [size]=\"size()\" [color]=\"colorClass()\">cloud-warning-fill</sh-icon>\n <sh-icon [size]=\"size()\" [color]=\"colorClass()\">cloud-warning-bold</sh-icon>\n </section>\n\n <section>\n <h4>Warning</h4>\n <sh-icon [size]=\"size()\" [color]=\"colorClass()\">warning</sh-icon>\n <sh-icon [size]=\"size()\" [color]=\"colorClass()\">warning-thin</sh-icon>\n <sh-icon [size]=\"size()\" [color]=\"colorClass()\">warning-light</sh-icon>\n <sh-icon [size]=\"size()\" [color]=\"colorClass()\">warning-fill</sh-icon>\n <sh-icon [size]=\"size()\" [color]=\"colorClass()\">warning-bold</sh-icon>\n </section>\n\n <section>\n <h4>Warning warning-octagon</h4>\n <sh-icon [size]=\"size()\" [color]=\"colorClass()\">warning-octagon</sh-icon>\n <sh-icon [size]=\"size()\" [color]=\"colorClass()\">warning-octagon-thin</sh-icon>\n <sh-icon [size]=\"size()\" [color]=\"colorClass()\">warning-octagon-light</sh-icon>\n <sh-icon [size]=\"size()\" [color]=\"colorClass()\">warning-octagon-fill</sh-icon>\n <sh-icon [size]=\"size()\" [color]=\"colorClass()\">warning-octagon-bold</sh-icon>\n </section>\n</div>\n",
2598
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipButtonGroup, ShipIcon, ShipRangeSlider } from 'ship-ui';\n\n@Component({\n selector: 'app-sandbox-icon',\n imports: [FormsModule, ShipIcon, ShipButtonGroup, ShipRangeSlider],\n templateUrl: './sandbox-icon.html',\n styleUrl: './sandbox-icon.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SandboxIcon {\n size = signal<string>('');\n sizeValue = signal<number>(10);\n colorClass = signal<string>('');\n}\n"
2599
+ }
2600
+ ]
2601
+ },
2602
+ {
2603
+ "name": "ShipBlueprint",
2604
+ "selector": "sh-blueprint",
2605
+ "path": "projects/ship-ui/src/lib/ship-blueprint/ship-blueprint.ts",
2606
+ "description": "",
2607
+ "inputs": [
2608
+ {
2609
+ "name": "forceUnique",
2610
+ "type": "boolean",
2611
+ "description": "",
2612
+ "defaultValue": "true"
2613
+ },
2614
+ {
2615
+ "name": "autoLayout",
2616
+ "type": "boolean",
2617
+ "description": "",
2618
+ "defaultValue": "false"
2619
+ },
2620
+ {
2621
+ "name": "gridSize",
2622
+ "type": "any",
2623
+ "description": "",
2624
+ "defaultValue": "20"
2625
+ },
2626
+ {
2627
+ "name": "snapToGrid",
2628
+ "type": "boolean",
2629
+ "description": "",
2630
+ "defaultValue": "true"
2631
+ },
2632
+ {
2633
+ "name": "gridColor",
2634
+ "type": "[string, string]",
2635
+ "description": "",
2636
+ "defaultValue": "['#d8d8d8'"
2637
+ },
2638
+ {
2639
+ "name": "nodes",
2640
+ "type": "BlueprintNode[]",
2641
+ "description": "",
2642
+ "defaultValue": "[]"
2643
+ }
2644
+ ],
2645
+ "outputs": [],
2646
+ "cssVariables": [
2647
+ {
2648
+ "name": "--bp-bg",
2649
+ "defaultValue": "var(--base-1)"
2650
+ },
2651
+ {
2652
+ "name": "--bp-icon-c",
2653
+ "defaultValue": "var(--base-6)"
2654
+ },
2655
+ {
2656
+ "name": "--bp-stroke-c",
2657
+ "defaultValue": "var(--base-7)"
2658
+ },
2659
+ {
2660
+ "name": "--bp-stroke-ca",
2661
+ "defaultValue": "var(--primary-8)"
2662
+ },
2663
+ {
2664
+ "name": "--card-bg",
2665
+ "defaultValue": "var(--base-1)"
2666
+ }
2667
+ ],
2668
+ "examples": []
2669
+ },
2670
+ {
2671
+ "name": "ShipSelect",
2672
+ "selector": "sh-select",
2673
+ "path": "projects/ship-ui/src/lib/ship-select/ship-select.ts",
2674
+ "description": "### Options\n\nProvide the data source using the\n`options`\nattribute. This can be an array of strings or objects.\n\n### Labels & Values\n\nIf your options are objects, specify which properties to use for display and selection:\n\n<li>\n`label`\n: Property path to the display text (e.g.,\n`\"user.name\"`\n).\n</li>\n<li>\n`value`\n: Property path to the selection value (e.g.,\n`\"user.id\"`\n).\n</li>\n\n### Selection Modes\n\nToggle selection behavior:\n\n<li>\n`selectMultiple`\n: Enables picking multiple options.\n</li>\n<li>\n`isClearable`\n: Adds a clear button to remove the selection (default: true).\n</li>\n\n### Interaction\n\n<li>\n`inlineSearch`\n: Adds a search field within the dropdown to filter options.\n</li>\n<li>\n`readonly`\n: Prevents selection changes while maintaining focusability.\n</li>\n<li>\n`disabled`\n: Standard attribute to disable the component.\n</li>\n\n### Templates\n\nCustomize rendering using\n`ng-template`\n:\n\n<li>\n`optionTemplate`\n: Custom rendering for items in the dropdown.\n</li>\n<li>\n`placeholderTemplate`\n: Custom rendering for the selected state/placeholder.\n</li>",
2675
+ "inputs": [
2676
+ {
2677
+ "name": "value",
2678
+ "type": "string",
2679
+ "description": ""
2680
+ },
2681
+ {
2682
+ "name": "label",
2683
+ "type": "string",
2684
+ "description": ""
2685
+ },
2686
+ {
2687
+ "name": "asFreeText",
2688
+ "type": "any",
2689
+ "description": "",
2690
+ "defaultValue": "false"
2691
+ },
2692
+ {
2693
+ "name": "optionTitle",
2694
+ "type": "string | null",
2695
+ "description": "",
2696
+ "defaultValue": "null"
2697
+ },
2698
+ {
2699
+ "name": "freeTextTitle",
2700
+ "type": "string | null",
2701
+ "description": "",
2702
+ "defaultValue": "null"
2703
+ },
2704
+ {
2705
+ "name": "freeTextPlaceholder",
2706
+ "type": "string | null",
2707
+ "description": "",
2708
+ "defaultValue": "'Type to create a new option'"
2709
+ },
2710
+ {
2711
+ "name": "validateFreeText",
2712
+ "type": "ValidateFreeText",
2713
+ "description": ""
2714
+ },
2715
+ {
2716
+ "name": "placeholder",
2717
+ "type": "string",
2718
+ "description": ""
2719
+ },
2720
+ {
2721
+ "name": "lazySearch",
2722
+ "type": "any",
2723
+ "description": "",
2724
+ "defaultValue": "false"
2725
+ },
2726
+ {
2727
+ "name": "inlineSearch",
2728
+ "type": "any",
2729
+ "description": "",
2730
+ "defaultValue": "false"
2731
+ },
2732
+ {
2733
+ "name": "asText",
2734
+ "type": "any",
2735
+ "description": "",
2736
+ "defaultValue": "false"
2737
+ },
2738
+ {
2739
+ "name": "isClearable",
2740
+ "type": "any",
2741
+ "description": "",
2742
+ "defaultValue": "true"
2743
+ },
2744
+ {
2745
+ "name": "selectMultiple",
2746
+ "type": "any",
2747
+ "description": "",
2748
+ "defaultValue": "false"
2749
+ },
2750
+ {
2751
+ "name": "optionTemplate",
2752
+ "type": "TemplateRef<unknown> | null",
2753
+ "description": "",
2754
+ "defaultValue": "null"
2755
+ },
2756
+ {
2757
+ "name": "selectedOptionTemplate",
2758
+ "type": "TemplateRef<unknown> | null",
2759
+ "description": "",
2760
+ "defaultValue": "null"
2761
+ },
2762
+ {
2763
+ "name": "placeholderTemplate",
2764
+ "type": "TemplateRef<unknown> | null",
2765
+ "description": "",
2766
+ "defaultValue": "null"
2767
+ },
2768
+ {
2769
+ "name": "freeTextOptionTemplate",
2770
+ "type": "TemplateRef<unknown> | null",
2771
+ "description": "",
2772
+ "defaultValue": "null"
2773
+ },
2774
+ {
2775
+ "name": "readonly",
2776
+ "type": "any",
2777
+ "description": "",
2778
+ "defaultValue": "false"
2779
+ },
2780
+ {
2781
+ "name": "disabled",
2782
+ "type": "any",
2783
+ "description": "",
2784
+ "defaultValue": "false"
2785
+ },
2786
+ {
2787
+ "name": "isOpen",
2788
+ "type": "any",
2789
+ "description": "",
2790
+ "defaultValue": "false"
2791
+ },
2792
+ {
2793
+ "name": "isLoading",
2794
+ "type": "any",
2795
+ "description": "",
2796
+ "defaultValue": "false"
2797
+ },
2798
+ {
2799
+ "name": "options",
2800
+ "type": "unknown[]",
2801
+ "description": "",
2802
+ "defaultValue": "[]"
2803
+ },
2804
+ {
2805
+ "name": "selectedOptions",
2806
+ "type": "unknown[]",
2807
+ "description": "",
2808
+ "defaultValue": "[]"
2809
+ }
2810
+ ],
2811
+ "outputs": [
2812
+ {
2813
+ "name": "cleared",
2814
+ "type": "void",
2815
+ "description": ""
2816
+ },
2817
+ {
2818
+ "name": "onAddNewFreeTextOption",
2819
+ "type": "string",
2820
+ "description": ""
2821
+ }
2822
+ ],
2823
+ "cssVariables": [
2824
+ {
2825
+ "name": "--miw",
2826
+ "defaultValue": "#{p2r(210)}"
2827
+ },
2828
+ {
2829
+ "name": "--select-option-mih",
2830
+ "defaultValue": "min-content"
2831
+ },
2832
+ {
2833
+ "name": "--select-options-mh",
2834
+ "defaultValue": "#{p2r(180)}"
2835
+ },
2836
+ {
2837
+ "name": "--ff-mw",
2838
+ "defaultValue": "var(--miw)"
2839
+ },
2840
+ {
2841
+ "name": "--ff-space",
2842
+ "defaultValue": "#{p2r(7 10)}"
2843
+ },
2844
+ {
2845
+ "name": "--chip-h",
2846
+ "defaultValue": "#{p2r(20)}"
2847
+ }
2848
+ ],
2849
+ "examples": [
2850
+ {
2851
+ "name": "inline-search-select",
2852
+ "html": "<sh-select [options]=\"options()\" label=\"label\" value=\"value\" [inlineSearch]=\"true\">\n <label>Favorite food (inline search)</label>\n <input type=\"text\" [(ngModel)]=\"selected\" />\n</sh-select>\n\n<p>Selected: {{ selected() }}</p>\n",
2853
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipSelect } from 'ship-ui';\n\n@Component({\n selector: 'app-inline-search-select',\n standalone: true,\n imports: [FormsModule, ShipSelect],\n templateUrl: './inline-search-select.html',\n styleUrl: './inline-search-select.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InlineSearchSelect {\n options = signal([\n { value: 'pizza', label: 'Pizza' },\n { value: 'burger', label: 'Burger' },\n { value: 'sushi', label: 'Sushi' },\n { value: 'pasta', label: 'Pasta' },\n { value: 'salad', label: 'Salad' },\n { value: 'sandwich', label: 'Sandwich' },\n ]);\n selected = signal('pizza');\n\n ngOnInit(): void {\n setTimeout(() => {\n this.selected.set('burger');\n }, 1000);\n }\n}\n"
2854
+ },
2855
+ {
2856
+ "name": "disabled-select",
2857
+ "html": "<sh-select [options]=\"options()\" label=\"label\" value=\"value\">\n <label>Favorite food (disabled)</label>\n <input type=\"text\" [(ngModel)]=\"selected\" [disabled]=\"true\" />\n</sh-select>\n\n<p>Selected: {{ selected() }}</p>\n",
2858
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipSelect } from 'ship-ui';\n\n@Component({\n selector: 'app-disabled-select',\n standalone: true,\n imports: [FormsModule, ShipSelect],\n templateUrl: './disabled-select.html',\n styleUrl: './disabled-select.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DisabledSelect {\n options = signal([\n { value: 'pizza', label: 'Pizza' },\n { value: 'burger', label: 'Burger' },\n { value: 'sushi', label: 'Sushi' },\n ]);\n selected = signal('pizza');\n}\n"
2859
+ },
2860
+ {
2861
+ "name": "multiple-select",
2862
+ "html": "<sh-select color=\"primary\" variant=\"raised\" [options]=\"options()\" label=\"label\" value=\"value\" [selectMultiple]=\"true\">\n <label>Favorite foods (multiple)</label>\n\n <input type=\"text\" [(ngModel)]=\"selected\" />\n</sh-select>\n\n<p>Selected: {{ selected() | json }}</p>\n",
2863
+ "ts": "import { JsonPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipSelect } from 'ship-ui';\n\n@Component({\n selector: 'app-multiple-select',\n standalone: true,\n imports: [FormsModule, ShipSelect, JsonPipe],\n templateUrl: './multiple-select.html',\n styleUrl: './multiple-select.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MultipleSelect {\n options = signal([\n { value: 'pizza', label: 'Pizza' },\n { value: 'burger', label: 'Burger' },\n { value: 'sushi', label: 'Sushi' },\n ]);\n selected = signal<string[]>(['pizza,burger']);\n}\n"
2864
+ },
2865
+ {
2866
+ "name": "option-template-select",
2867
+ "html": "<sh-select [options]=\"options()\" label=\"label\" value=\"value\">\n <label>Favorite food (custom option template)</label>\n <input type=\"text\" [(ngModel)]=\"selected\" />\n <ng-template let-option>\n <span>{{ option.emoji }} {{ option.label }}</span>\n </ng-template>\n</sh-select>\n\n<p>Selected: {{ selected() }}</p>\n",
2868
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipSelect } from 'ship-ui';\n\n@Component({\n selector: 'app-option-template-select',\n standalone: true,\n imports: [FormsModule, ShipSelect],\n templateUrl: './option-template-select.html',\n styleUrl: './option-template-select.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OptionTemplateSelect {\n options = signal([\n { value: 'pizza', label: 'Pizza', emoji: '🍕' },\n { value: 'burger', label: 'Burger', emoji: '🍔' },\n { value: 'sushi', label: 'Sushi', emoji: '🍣' },\n ]);\n selected = signal('pizza');\n}\n"
2869
+ },
2870
+ {
2871
+ "name": "placeholder-template-select",
2872
+ "html": "<sh-select\n [options]=\"options()\"\n label=\"label\"\n value=\"value\"\n [optionTemplate]=\"optionTemplate\"\n [placeholderTemplate]=\"placeholderTemplate\">\n <label>Favorite food (custom option template)</label>\n <input type=\"text\" [(ngModel)]=\"selected\" />\n</sh-select>\n\n<ng-template let-option #optionTemplate>\n <span>{{ option.emoji }} {{ option.label }}</span>\n</ng-template>\n\n<ng-template let-option #placeholderTemplate>\n <div class=\"custom-option\">Hell im a custom placeholder template 🙂‍↔️🙂‍↔️</div>\n</ng-template>\n\n<p>Selected: {{ selected() }}</p>\n",
2873
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipSelect } from 'ship-ui';\n\n@Component({\n selector: 'app-placeholder-template-select',\n standalone: true,\n imports: [FormsModule, ShipSelect],\n templateUrl: './placeholder-template-select.html',\n styleUrl: './placeholder-template-select.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PlaceholderTemplateSelect {\n options = signal([\n { value: 'pizza', label: 'Pizza', emoji: '🍕' },\n { value: 'burger', label: 'Burger', emoji: '🍔' },\n { value: 'sushi', label: 'Sushi', emoji: '🍣' },\n ]);\n selected = signal('');\n}\n"
2874
+ },
2875
+ {
2876
+ "name": "reactive-select-disabled",
2877
+ "html": "<sh-select [options]=\"options()\" label=\"label\" value=\"value\">\n <label>Favorite food (reactive form)</label>\n\n <input type=\"text\" [formControl]=\"control\" />\n</sh-select>\n\n<p>Selected: {{ control.value }}</p>\n",
2878
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ShipSelect } from 'ship-ui';\n\n@Component({\n selector: 'app-reactive-select-disabled',\n standalone: true,\n imports: [ReactiveFormsModule, ShipSelect],\n templateUrl: './reactive-select-disabled.html',\n styleUrl: './reactive-select-disabled.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ReactiveSelectDisabled {\n options = signal([\n { value: 'pizza', label: 'Pizza' },\n { value: 'burger', label: 'Burger' },\n { value: 'sushi', label: 'Sushi' },\n ]);\n control = new FormControl({\n value: 'pizza',\n disabled: true,\n });\n}\n"
2879
+ },
2880
+ {
2881
+ "name": "multiple-select-as-text",
2882
+ "html": "<sh-select\n [options]=\"options()\"\n label=\"value\"\n value=\"value\"\n [inlineSearch]=\"true\"\n [selectMultiple]=\"true\"\n [asText]=\"true\"\n [asFreeText]=\"true\"\n [freeTextTitle]=\"'Invite new user'\"\n [optionTitle]=\"'Existing users'\">\n <label>Favorite foods (multiple)</label>\n\n <input type=\"text\" [(ngModel)]=\"selected\" />\n</sh-select>\n\n<p>Selected: {{ selected() | json }}</p>\n",
2883
+ "ts": "import { JsonPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipSelect } from 'ship-ui';\n\n@Component({\n selector: 'app-multiple-select-as-text',\n standalone: true,\n imports: [FormsModule, ShipSelect, JsonPipe],\n templateUrl: './multiple-select-as-text.html',\n styleUrl: './multiple-select-as-text.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MultipleSelectAsText {\n options = signal([\n { value: 'pizza', label: 'Pizza' },\n { value: 'burger', label: 'Burger' },\n { value: 'sushi', label: 'Sushi' },\n ]);\n selected = signal<string[]>(['pizza,burger']);\n}\n"
2884
+ },
2885
+ {
2886
+ "name": "lazy-search-multiple-select",
2887
+ "html": "<sh-select\n [options]=\"options()\"\n label=\"label\"\n value=\"value\"\n [lazySearch]=\"true\"\n [selectMultiple]=\"true\"\n [isLoading]=\"resource.isLoading()\">\n <label>Favorite foods (lazy search, multiple)</label>\n <input type=\"text\" [(ngModel)]=\"lazySearchOption\" />\n</sh-select>\n\n@if (resource.isLoading()) {\n <p>Searching: {{ lazySearchOption() }}</p>\n} @else {\n <p>Selected: {{ lazySearchOption() | json }}</p>\n}\n",
2888
+ "ts": "import { JsonPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { delay, map, of } from 'rxjs';\nimport { ShipSelect } from 'ship-ui';\n\nconst DEFAULT_OPTIONS = [\n { value: 'pizza', label: 'Pizza' },\n { value: 'burger', label: 'Burger' },\n { value: 'sushi', label: 'Sushi' },\n { value: 'pasta', label: 'Pasta' },\n { value: 'salad', label: 'Salad' },\n { value: 'sandwich', label: 'Sandwich' },\n];\n@Component({\n selector: 'app-lazy-search-multiple-select',\n standalone: true,\n imports: [FormsModule, ShipSelect, JsonPipe],\n templateUrl: './lazy-search-multiple-select.html',\n styleUrl: './lazy-search-multiple-select.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LazySearchMultipleSelect {\n lazySearchOption = signal('');\n\n options = computed(() => this.resource.value() ?? DEFAULT_OPTIONS);\n resource = rxResource({\n params: () => ({\n query: this.lazySearchOption(),\n }),\n stream: ({ params }) => {\n const search = params.query.toLowerCase();\n\n return of(DEFAULT_OPTIONS).pipe(\n delay(200),\n map((res) => res.filter((opt) => opt.label.toLowerCase().includes(search)))\n );\n },\n });\n}\n"
2889
+ },
2890
+ {
2891
+ "name": "readonly-select",
2892
+ "html": "<sh-select [options]=\"options()\" label=\"label\" value=\"value\" [readonly]=\"true\">\n <label>Favorite food (readonly)</label>\n <input type=\"text\" [(ngModel)]=\"selected\" />\n</sh-select>\n\n<p>Selected: {{ selected() }}</p>\n",
2893
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipSelect } from 'ship-ui';\n\n@Component({\n selector: 'app-readonly-select',\n standalone: true,\n imports: [FormsModule, ShipSelect],\n templateUrl: './readonly-select.html',\n styleUrl: './readonly-select.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ReadonlySelect {\n options = signal([\n { value: 'pizza', label: 'Pizza' },\n { value: 'burger', label: 'Burger' },\n { value: 'sushi', label: 'Sushi' },\n ]);\n selected = signal('pizza');\n}\n"
2894
+ },
2895
+ {
2896
+ "name": "inline-search-multiple-select",
2897
+ "html": "<sh-select [options]=\"options()\" label=\"label\" value=\"value\" [inlineSearch]=\"true\" [selectMultiple]=\"true\">\n <label>Favorite foods (inline search, multiple)</label>\n <input type=\"text\" [(ngModel)]=\"selected\" />\n</sh-select>\n\n<p>Selected: {{ selected() | json }}</p>\n",
2898
+ "ts": "import { JsonPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipSelect } from 'ship-ui';\n\n@Component({\n selector: 'app-inline-search-multiple-select',\n standalone: true,\n imports: [FormsModule, ShipSelect, JsonPipe],\n templateUrl: './inline-search-multiple-select.html',\n styleUrl: './inline-search-multiple-select.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InlineSearchMultipleSelect {\n options = signal([\n { value: 'pizza', label: 'Pizza' },\n { value: 'burger', label: 'Burger' },\n { value: 'sushi', label: 'Sushi' },\n { value: 'pasta', label: 'Pasta' },\n { value: 'salad', label: 'Salad' },\n { value: 'sandwich', label: 'Sandwich' },\n ]);\n selected = signal<string[]>(['pizza']);\n}\n"
2899
+ },
2900
+ {
2901
+ "name": "reactive-select",
2902
+ "html": "<sh-select [options]=\"options()\" label=\"label\" value=\"value\">\n <label>Favorite food (reactive form)</label>\n\n <input type=\"text\" [formControl]=\"control\" />\n</sh-select>\n\n<p>Selected: {{ control.value }}</p>\n",
2903
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ShipSelect } from 'ship-ui';\n\n@Component({\n selector: 'app-reactive-select',\n standalone: true,\n imports: [ReactiveFormsModule, ShipSelect],\n templateUrl: './reactive-select-example.html',\n styleUrl: './reactive-select-example.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ReactiveSelectComponent {\n options = signal([\n { value: 'pizza', label: 'Pizza' },\n { value: 'burger', label: 'Burger' },\n { value: 'sushi', label: 'Sushi' },\n ]);\n control = new FormControl('pizza');\n}\n"
2904
+ },
2905
+ {
2906
+ "name": "base-select",
2907
+ "html": "<sh-select [options]=\"options()\" label=\"label\" value=\"value\">\n <label>Favorite food</label>\n <sh-icon prefix>desktop-tower</sh-icon>\n\n <input type=\"text\" [(ngModel)]=\"selected\" (ngModelChange)=\"hello($event)\" />\n</sh-select>\n\n<p>Selected: {{ selected() }}</p>\n",
2908
+ "ts": "import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipIcon, ShipSelect } from 'ship-ui';\n\n@Component({\n selector: 'app-base-select',\n standalone: true,\n imports: [FormsModule, ShipSelect, ShipIcon],\n templateUrl: './base-select.html',\n styleUrl: './base-select.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseSelect {\n options = signal([\n { value: 'pizza', label: 'Pizza' },\n { value: 'burger', label: 'Burger' },\n { value: 'sushi', label: 'Sushi' },\n ]);\n selected = signal('pizza');\n\n hello(val: any) {\n console.log('updated', val);\n }\n}\n"
2909
+ },
2910
+ {
2911
+ "name": "object-select",
2912
+ "html": "<sh-select\n [options]=\"options()\"\n label=\"name\"\n value=\"id\"\n [isClearable]=\"false\"\n (selectedOptionsChange)=\"newSelectedOptions($event)\">\n <label>Favorite food (object options, not clearable)</label>\n <input type=\"text\" [(ngModel)]=\"selected\" />\n</sh-select>\n\n<p>Selected: {{ selected() }}</p>\n<pre>{{ selectedObject() | json }}</pre>\n",
2913
+ "ts": "import { JsonPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ShipSelect } from 'ship-ui';\n\n@Component({\n selector: 'app-object-select',\n standalone: true,\n imports: [FormsModule, ShipSelect, JsonPipe],\n templateUrl: './object-select.html',\n styleUrl: './object-select.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ObjectSelect {\n options = signal([\n { id: '1', name: 'Pizza' },\n { id: '2', name: 'Burger' },\n { id: '3', name: 'Sushi' },\n ]);\n\n selected = signal<string>('1');\n selectedObject = computed(() => {\n return this.options().find((opt) => opt.id === this.selected());\n });\n newSelectedOptions($event?: any) {\n console.log('new selected options', $event);\n }\n}\n"
2914
+ },
2915
+ {
2916
+ "name": "lazy-search-select",
2917
+ "html": "<sh-select [options]=\"options()\" label=\"label\" value=\"value\" [lazySearch]=\"true\" [isLoading]=\"resource.isLoading()\">\n <label>Favorite food (lazy search)</label>\n <input type=\"text\" [(ngModel)]=\"lazySearchOption\" />\n</sh-select>\n\n@if (resource.isLoading()) {\n <p>Searching: {{ lazySearchOption() }}</p>\n} @else {\n <p>Selected: {{ lazySearchOption() }}</p>\n}\n",
2918
+ "ts": "import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { delay, map, of } from 'rxjs';\nimport { ShipSelect } from 'ship-ui';\n\nconst DEFAULT_OPTIONS = [\n { value: 'pizza', label: 'Pizza' },\n { value: 'burger', label: 'Burger' },\n { value: 'sushi', label: 'Sushi' },\n { value: 'pasta', label: 'Pasta' },\n { value: 'salad', label: 'Salad' },\n { value: 'sandwich', label: 'Sandwich' },\n];\n@Component({\n selector: 'app-lazy-search-select',\n standalone: true,\n imports: [FormsModule, ShipSelect],\n templateUrl: './lazy-search-select.html',\n styleUrl: './lazy-search-select.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LazySearchSelect {\n lazySearchOption = signal('pizza');\n\n options = computed(() => this.resource.value() ?? DEFAULT_OPTIONS);\n resource = rxResource({\n params: () => ({\n query: this.lazySearchOption(),\n }),\n stream: ({ params }) => {\n const search = params.query.toLowerCase();\n\n return of(DEFAULT_OPTIONS).pipe(\n delay(200),\n map((res) => res.filter((opt) => opt.label.toLowerCase().includes(search)))\n );\n },\n });\n}\n"
2919
+ }
2920
+ ]
2921
+ },
2922
+ {
2923
+ "name": "GlobalVariables",
2924
+ "selector": "global-variables",
2925
+ "path": "projects/ship-ui/styles/core/core/variables.scss",
2926
+ "description": "Global CSS variables for ShipUI including colors, typography, and spacing.",
2927
+ "inputs": [],
2928
+ "outputs": [],
2929
+ "cssVariables": [
2930
+ {
2931
+ "name": "--font-size",
2932
+ "defaultValue": "16px"
2933
+ },
2934
+ {
2935
+ "name": "--primary-1",
2936
+ "defaultValue": "light-dark(oklch(0.95 0.02 260), oklch(0.17 0.05 260))"
2937
+ },
2938
+ {
2939
+ "name": "--primary-2",
2940
+ "defaultValue": "light-dark(oklch(0.9 0.04 260), oklch(0.25 0.09 260))"
2941
+ },
2942
+ {
2943
+ "name": "--primary-3",
2944
+ "defaultValue": "light-dark(oklch(0.86 0.07 260), oklch(0.32 0.12 260))"
2945
+ },
2946
+ {
2947
+ "name": "--primary-4",
2948
+ "defaultValue": "light-dark(oklch(0.81 0.09 260), oklch(0.38 0.15 260))"
2949
+ },
2950
+ {
2951
+ "name": "--primary-5",
2952
+ "defaultValue": "light-dark(oklch(0.76 0.11 260), oklch(0.45 0.18 260))"
2953
+ },
2954
+ {
2955
+ "name": "--primary-6",
2956
+ "defaultValue": "light-dark(oklch(0.71 0.14 260), oklch(0.51 0.21 260))"
2957
+ },
2958
+ {
2959
+ "name": "--primary-7",
2960
+ "defaultValue": "light-dark(oklch(0.67 0.16 260), oklch(0.57 0.22 260))"
2961
+ },
2962
+ {
2963
+ "name": "--primary-8",
2964
+ "defaultValue": "light-dark(oklch(0.63 0.19 260), oklch(0.63 0.19 260))"
2965
+ },
2966
+ {
2967
+ "name": "--primary-9",
2968
+ "defaultValue": "light-dark(oklch(0.52 0.21 260), oklch(0.71 0.14 260))"
2969
+ },
2970
+ {
2971
+ "name": "--primary-10",
2972
+ "defaultValue": "light-dark(oklch(0.41 0.16 260), oklch(0.81 0.09 260))"
2973
+ },
2974
+ {
2975
+ "name": "--primary-11",
2976
+ "defaultValue": "light-dark(oklch(0.29 0.11 260), oklch(0.9 0.04 260))"
2977
+ },
2978
+ {
2979
+ "name": "--primary-12",
2980
+ "defaultValue": "light-dark(oklch(0.15 0.04 260), oklch(0.95 0.02 260))"
2981
+ },
2982
+ {
2983
+ "name": "--primary-g2",
2984
+ "defaultValue": "linear-gradient(180deg, oklch(0.71 0.14 260) 0%, oklch(0.63 0.19 260) 50%)"
2985
+ },
2986
+ {
2987
+ "name": "--primary-g3",
2988
+ "defaultValue": "linear-gradient(180deg, oklch(0.81 0.09 260.01) 0%, oklch(0.63 0.19 260) 50%)"
2989
+ },
2990
+ {
2991
+ "name": "--accent-1",
2992
+ "defaultValue": "light-dark(hsl(258, 90%, 95.75%), hsl(258, 90%, 9.25%))"
2993
+ },
2994
+ {
2995
+ "name": "--accent-2",
2996
+ "defaultValue": "light-dark(hsl(258, 90%, 91.5%), hsl(258, 90%, 16.5%))"
2997
+ },
2998
+ {
2999
+ "name": "--accent-3",
3000
+ "defaultValue": "light-dark(hsl(258, 90%, 87.25%), hsl(258, 90%, 24.75%))"
3001
+ },
3002
+ {
3003
+ "name": "--accent-4",
3004
+ "defaultValue": "light-dark(hsl(258, 90%, 83%), hsl(258, 90%, 33%))"
3005
+ },
3006
+ {
3007
+ "name": "--accent-5",
3008
+ "defaultValue": "light-dark(hsl(258, 89%, 78%), hsl(258, 90%, 41.25%))"
3009
+ },
3010
+ {
3011
+ "name": "--accent-6",
3012
+ "defaultValue": "light-dark(hsl(258, 90%, 74.5%), hsl(258, 90%, 49.5%))"
3013
+ },
3014
+ {
3015
+ "name": "--accent-7",
3016
+ "defaultValue": "light-dark(hsl(258, 90%, 70.25%), hsl(258, 90%, 57.75%))"
3017
+ },
3018
+ {
3019
+ "name": "--accent-8",
3020
+ "defaultValue": "light-dark(hsl(258, 90%, 66%), hsl(258, 90%, 66%))"
3021
+ },
3022
+ {
3023
+ "name": "--accent-9",
3024
+ "defaultValue": "light-dark(hsl(258, 90%, 51.15%), hsl(258, 90%, 74.5%))"
3025
+ },
3026
+ {
3027
+ "name": "--accent-10",
3028
+ "defaultValue": "light-dark(hsl(258, 90%, 36.3%), hsl(258, 90%, 83%))"
3029
+ },
3030
+ {
3031
+ "name": "--accent-11",
3032
+ "defaultValue": "light-dark(hsl(258, 90%, 21.45%), hsl(258, 90%, 91.5%))"
3033
+ },
3034
+ {
3035
+ "name": "--accent-12",
3036
+ "defaultValue": "light-dark(hsl(258, 90%, 6.6%), hsl(258, 90%, 100%))"
3037
+ },
3038
+ {
3039
+ "name": "--accent-g2",
3040
+ "defaultValue": "linear-gradient(180deg, hsl(258, 90%, 74.5%) 0%, hsl(258, 90%, 66%) 50%)"
3041
+ },
3042
+ {
3043
+ "name": "--accent-g3",
3044
+ "defaultValue": "linear-gradient(180deg, hsl(258, 90%, 83%) 0%, hsl(258, 90%, 66%) 50%)"
3045
+ },
3046
+ {
3047
+ "name": "--warn-1",
3048
+ "defaultValue": "light-dark(hsl(37, 92%, 93.75%), hsl(37, 92%, 9.25%))"
3049
+ },
3050
+ {
3051
+ "name": "--warn-2",
3052
+ "defaultValue": "light-dark(hsl(37, 92%, 87.5%), hsl(37, 92%, 12.5%))"
3053
+ },
3054
+ {
3055
+ "name": "--warn-3",
3056
+ "defaultValue": "light-dark(hsl(37, 92%, 81.25%), hsl(37, 92%, 18.75%))"
3057
+ },
3058
+ {
3059
+ "name": "--warn-4",
3060
+ "defaultValue": "light-dark(hsl(37, 92%, 75%), hsl(37, 92%, 25%))"
3061
+ },
3062
+ {
3063
+ "name": "--warn-5",
3064
+ "defaultValue": "light-dark(hsl(37, 92%, 68.75%), hsl(37, 92%, 31.25%))"
3065
+ },
3066
+ {
3067
+ "name": "--warn-6",
3068
+ "defaultValue": "light-dark(hsl(37, 92%, 62.5%), hsl(37, 92%, 37.5%))"
3069
+ },
3070
+ {
3071
+ "name": "--warn-7",
3072
+ "defaultValue": "light-dark(hsl(37, 92%, 56.25%), hsl(37, 92%, 43.75%))"
3073
+ },
3074
+ {
3075
+ "name": "--warn-8",
3076
+ "defaultValue": "light-dark(hsl(37, 92%, 50%), hsl(37, 92%, 50%))"
3077
+ },
3078
+ {
3079
+ "name": "--warn-9",
3080
+ "defaultValue": "light-dark(hsl(37, 92%, 38.75%), hsl(37, 92%, 62.5%))"
3081
+ },
3082
+ {
3083
+ "name": "--warn-10",
3084
+ "defaultValue": "light-dark(hsl(37, 92%, 27.5%), hsl(37, 92%, 75%))"
3085
+ },
3086
+ {
3087
+ "name": "--warn-11",
3088
+ "defaultValue": "light-dark(hsl(37, 92%, 16.25%), hsl(37, 92%, 87.5%))"
3089
+ },
3090
+ {
3091
+ "name": "--warn-12",
3092
+ "defaultValue": "light-dark(hsl(37, 92%, 5%), hsl(37, 92%, 100%))"
3093
+ },
3094
+ {
3095
+ "name": "--warn-g2",
3096
+ "defaultValue": "linear-gradient(180deg, hsl(37, 92%, 62.5%) 0%, hsl(37, 92%, 50%) 50%)"
3097
+ },
3098
+ {
3099
+ "name": "--warn-g3",
3100
+ "defaultValue": "linear-gradient(180deg, hsl(37, 92%, 75%) 0%, hsl(37, 92%, 50%) 50%)"
3101
+ },
3102
+ {
3103
+ "name": "--error-1",
3104
+ "defaultValue": "light-dark(hsl(0, 84%, 95%), hsl(0, 84%, 7.5%))"
3105
+ },
3106
+ {
3107
+ "name": "--error-2",
3108
+ "defaultValue": "light-dark(hsl(0, 84%, 90%), hsl(0, 84%, 15%))"
3109
+ },
3110
+ {
3111
+ "name": "--error-3",
3112
+ "defaultValue": "light-dark(hsl(0, 84%, 85%), hsl(0, 84%, 22.5%))"
3113
+ },
3114
+ {
3115
+ "name": "--error-4",
3116
+ "defaultValue": "light-dark(hsl(0, 84%, 80%), hsl(0, 84%, 30%))"
3117
+ },
3118
+ {
3119
+ "name": "--error-5",
3120
+ "defaultValue": "light-dark(hsl(0, 84%, 75%), hsl(0, 27%, 10%))"
3121
+ },
3122
+ {
3123
+ "name": "--error-6",
3124
+ "defaultValue": "light-dark(hsl(0, 84%, 70%), hsl(0, 84%, 45%))"
3125
+ },
3126
+ {
3127
+ "name": "--error-7",
3128
+ "defaultValue": "light-dark(hsl(0, 84%, 65%), hsl(0, 84%, 52.5%))"
3129
+ },
3130
+ {
3131
+ "name": "--error-8",
3132
+ "defaultValue": "light-dark(hsl(0, 84%, 60%), hsl(0, 84%, 60%))"
3133
+ },
3134
+ {
3135
+ "name": "--error-9",
3136
+ "defaultValue": "light-dark(hsl(0, 84%, 46.5%), hsl(0, 84%, 70%))"
3137
+ },
3138
+ {
3139
+ "name": "--error-10",
3140
+ "defaultValue": "light-dark(hsl(0, 84%, 33%), hsl(0, 84%, 80%))"
3141
+ },
3142
+ {
3143
+ "name": "--error-11",
3144
+ "defaultValue": "light-dark(hsl(0, 84%, 19.5%), hsl(0, 84%, 90%))"
3145
+ },
3146
+ {
3147
+ "name": "--error-12",
3148
+ "defaultValue": "light-dark(hsl(0, 84%, 6%), hsl(0, 84%, 100%))"
3149
+ },
3150
+ {
3151
+ "name": "--error-g2",
3152
+ "defaultValue": "linear-gradient(180deg, hsl(0, 84%, 70%) 0%, hsl(0, 84%, 60%) 50%)"
3153
+ },
3154
+ {
3155
+ "name": "--error-g3",
3156
+ "defaultValue": "linear-gradient(180deg, hsl(0, 84%, 80%) 0%, hsl(0, 84%, 60%) 50%)"
3157
+ },
3158
+ {
3159
+ "name": "--success-1",
3160
+ "defaultValue": "light-dark(hsl(160, 84%, 92.38%), hsl(160, 84%, 7.88%))"
3161
+ },
3162
+ {
3163
+ "name": "--success-2",
3164
+ "defaultValue": "light-dark(hsl(160, 84%, 84.75%), hsl(160, 3%, 17%))"
3165
+ },
3166
+ {
3167
+ "name": "--success-3",
3168
+ "defaultValue": "light-dark(hsl(160, 84%, 77.13%), hsl(160, 84%, 14.63%))"
3169
+ },
3170
+ {
3171
+ "name": "--success-4",
3172
+ "defaultValue": "light-dark(hsl(160, 84%, 69.5%), hsl(160, 84%, 19.5%))"
3173
+ },
3174
+ {
3175
+ "name": "--success-5",
3176
+ "defaultValue": "light-dark(hsl(160, 84%, 61.88%), hsl(160, 84%, 24.38%))"
3177
+ },
3178
+ {
3179
+ "name": "--success-6",
3180
+ "defaultValue": "light-dark(hsl(160, 84%, 54.25%), hsl(160, 84%, 29.25%))"
3181
+ },
3182
+ {
3183
+ "name": "--success-7",
3184
+ "defaultValue": "light-dark(hsl(160, 84%, 46.63%), hsl(160, 84%, 34.13%))"
3185
+ },
3186
+ {
3187
+ "name": "--success-8",
3188
+ "defaultValue": "light-dark(hsl(160, 84%, 39%), hsl(160, 84%, 39%))"
3189
+ },
3190
+ {
3191
+ "name": "--success-9",
3192
+ "defaultValue": "light-dark(hsl(160, 84%, 30.23%), hsl(160, 84%, 54.25%))"
3193
+ },
3194
+ {
3195
+ "name": "--success-10",
3196
+ "defaultValue": "light-dark(hsl(160, 84%, 21.45%), hsl(160, 84%, 69.5%))"
3197
+ },
3198
+ {
3199
+ "name": "--success-11",
3200
+ "defaultValue": "light-dark(hsl(160, 84%, 12.67%), hsl(160, 84%, 84.75%))"
3201
+ },
3202
+ {
3203
+ "name": "--success-12",
3204
+ "defaultValue": "light-dark(hsl(160, 84%, 3.9%), hsl(160, 84%, 100%))"
3205
+ },
3206
+ {
3207
+ "name": "--success-g2",
3208
+ "defaultValue": "linear-gradient(180deg, hsl(160, 84%, 54.25%) 0%, hsl(160, 84%, 39%) 50%)"
3209
+ },
3210
+ {
3211
+ "name": "--success-g3",
3212
+ "defaultValue": "linear-gradient(180deg, hsl(160, 84%, 69.5%) 0%, hsl(160, 84%, 39%) 50%)"
3213
+ },
3214
+ {
3215
+ "name": "--base-1",
3216
+ "defaultValue": "light-dark(#fff, hsl(0, 0%, 5.75%))"
3217
+ },
3218
+ {
3219
+ "name": "--base-2",
3220
+ "defaultValue": "light-dark(hsl(0, 0%, 98.05%), hsl(0, 0%, 8.75%))"
3221
+ },
3222
+ {
3223
+ "name": "--base-3",
3224
+ "defaultValue": "light-dark(hsl(0, 0%, 94.5%), hsl(0, 0%, 11.5%))"
3225
+ },
3226
+ {
3227
+ "name": "--base-4",
3228
+ "defaultValue": "light-dark(hsl(0, 0%, 84.75%), hsl(0, 0%, 17.25%))"
3229
+ },
3230
+ {
3231
+ "name": "--base-5",
3232
+ "defaultValue": "light-dark(hsl(0, 0%, 79.75%), hsl(0, 0%, 21%))"
3233
+ },
3234
+ {
3235
+ "name": "--base-6",
3236
+ "defaultValue": "light-dark(hsl(0, 0%, 66.25%), hsl(0, 0%, 28.75%))"
3237
+ },
3238
+ {
3239
+ "name": "--base-7",
3240
+ "defaultValue": "light-dark(hsl(0, 0%, 54.5%), hsl(0, 0%, 34.5%))"
3241
+ },
3242
+ {
3243
+ "name": "--base-8",
3244
+ "defaultValue": "light-dark(hsl(0, 0%, 46%), hsl(0, 0%, 54%))"
3245
+ },
3246
+ {
3247
+ "name": "--base-9",
3248
+ "defaultValue": "light-dark(hsl(0, 0%, 35.65%), hsl(0, 0%, 64.5%))"
3249
+ },
3250
+ {
3251
+ "name": "--base-10",
3252
+ "defaultValue": "light-dark(hsl(0, 0%, 25.3%), hsl(0, 0%, 73%))"
3253
+ },
3254
+ {
3255
+ "name": "--base-11",
3256
+ "defaultValue": "light-dark(hsl(0, 0%, 14.95%), hsl(0, 0%, 86.5%))"
3257
+ },
3258
+ {
3259
+ "name": "--base-12",
3260
+ "defaultValue": "light-dark(hsl(0, 0%, 4.6%), hsl(0, 0%, 100%))"
3261
+ },
3262
+ {
3263
+ "name": "--base-g2",
3264
+ "defaultValue": "linear-gradient(180deg, hsl(0, 0%, 66.25%) 0%, hsl(0, 0%, 46%) 50%)"
3265
+ },
3266
+ {
3267
+ "name": "--base-g3",
3268
+ "defaultValue": "linear-gradient(180deg, hsl(0, 0%, 73%) 0%, hsl(0, 0%, 46%) 50%)"
3269
+ },
3270
+ {
3271
+ "name": "--base-g6",
3272
+ "defaultValue": "linear-gradient(180deg, hsl(0, 0%, 25.3%) 0%, hsl(0, 0%, 14.95%) 50%)"
3273
+ },
3274
+ {
3275
+ "name": "--base-g7",
3276
+ "defaultValue": "linear-gradient(180deg, hsl(0, 0%, 35.65%) 0%, hsl(0, 0%, 14.95%) 50%)"
3277
+ },
3278
+ {
3279
+ "name": "--primary-c8",
3280
+ "defaultValue": "var(--light-text)"
3281
+ },
3282
+ {
3283
+ "name": "--accent-c8",
3284
+ "defaultValue": "var(--light-text)"
3285
+ },
3286
+ {
3287
+ "name": "--warn-c8",
3288
+ "defaultValue": "var(--light-text)"
3289
+ },
3290
+ {
3291
+ "name": "--error-c8",
3292
+ "defaultValue": "var(--light-text)"
3293
+ },
3294
+ {
3295
+ "name": "--success-c8",
3296
+ "defaultValue": "var(--light-text)"
3297
+ },
3298
+ {
3299
+ "name": "--display-10",
3300
+ "defaultValue": "600 #{p2r(80)} / normal Inter Tight, sans-serif"
3301
+ },
3302
+ {
3303
+ "name": "--display-20",
3304
+ "defaultValue": "600 #{p2r(72)} / normal Inter Tight, sans-serif"
3305
+ },
3306
+ {
3307
+ "name": "--display-30",
3308
+ "defaultValue": "600 #{p2r(64)} / normal Inter Tight, sans-serif"
3309
+ },
3310
+ {
3311
+ "name": "--display-40",
3312
+ "defaultValue": "600 #{p2r(56)} / normal Inter Tight, sans-serif"
3313
+ },
3314
+ {
3315
+ "name": "--display-50",
3316
+ "defaultValue": "600 #{p2r(48)} / normal Inter Tight, sans-serif"
3317
+ },
3318
+ {
3319
+ "name": "--title-10",
3320
+ "defaultValue": "500 #{p2r(40)} / normal Inter Tight, sans-serif"
3321
+ },
3322
+ {
3323
+ "name": "--title-20",
3324
+ "defaultValue": "500 #{p2r(32)} / normal Inter Tight, sans-serif"
3325
+ },
3326
+ {
3327
+ "name": "--title-30",
3328
+ "defaultValue": "500 #{p2r(24)} / normal Inter Tight, sans-serif"
3329
+ },
3330
+ {
3331
+ "name": "--title-10B",
3332
+ "defaultValue": "600 #{p2r(40)} / normal Inter Tight, sans-serif"
3333
+ },
3334
+ {
3335
+ "name": "--title-20B",
3336
+ "defaultValue": "600 #{p2r(32)} / normal Inter Tight, sans-serif"
3337
+ },
3338
+ {
3339
+ "name": "--title-30B",
3340
+ "defaultValue": "600 #{p2r(24)} / normal Inter Tight, sans-serif"
3341
+ },
3342
+ {
3343
+ "name": "--paragraph-10",
3344
+ "defaultValue": "500 #{p2r(18)} / normal Inter Tight, sans-serif"
3345
+ },
3346
+ {
3347
+ "name": "--paragraph-20",
3348
+ "defaultValue": "500 #{p2r(16)} / normal Inter Tight, sans-serif"
3349
+ },
3350
+ {
3351
+ "name": "--paragraph-30",
3352
+ "defaultValue": "500 #{p2r(14)} / normal Inter Tight, sans-serif"
3353
+ },
3354
+ {
3355
+ "name": "--paragraph-40",
3356
+ "defaultValue": "500 #{p2r(12)} / normal Inter Tight, sans-serif"
3357
+ },
3358
+ {
3359
+ "name": "--paragraph-10B",
3360
+ "defaultValue": "600 #{p2r(18)} / normal Inter Tight, sans-serif"
3361
+ },
3362
+ {
3363
+ "name": "--paragraph-20B",
3364
+ "defaultValue": "600 #{p2r(16)} / normal Inter Tight, sans-serif"
3365
+ },
3366
+ {
3367
+ "name": "--paragraph-30B",
3368
+ "defaultValue": "600 #{p2r(14)} / #{p2r(18)} Inter Tight, sans-serif"
3369
+ },
3370
+ {
3371
+ "name": "--paragraph-40B",
3372
+ "defaultValue": "600 #{p2r(12)} / normal Inter Tight, sans-serif"
3373
+ },
3374
+ {
3375
+ "name": "--code-10",
3376
+ "defaultValue": "500 #{p2r(16)} / normal monospace"
3377
+ },
3378
+ {
3379
+ "name": "--code-20",
3380
+ "defaultValue": "500 #{p2r(14)} / normal monospace"
3381
+ },
3382
+ {
3383
+ "name": "--code-30",
3384
+ "defaultValue": "500 #{p2r(12)} / normal monospace"
3385
+ },
3386
+ {
3387
+ "name": "--shape-1",
3388
+ "defaultValue": "#{p2r(4)}"
3389
+ },
3390
+ {
3391
+ "name": "--shape-2",
3392
+ "defaultValue": "#{p2r(8)}"
3393
+ },
3394
+ {
3395
+ "name": "--shape-3",
3396
+ "defaultValue": "#{p2r(12)}"
3397
+ },
3398
+ {
3399
+ "name": "--shape-4",
3400
+ "defaultValue": "#{p2r(16)}"
3401
+ },
3402
+ {
3403
+ "name": "--shape-5",
3404
+ "defaultValue": "#{p2r(20)}"
3405
+ },
3406
+ {
3407
+ "name": "--box-shadow-10",
3408
+ "defaultValue": "0 1px 2px 0 rgba(18, 18, 23, 0.07)"
3409
+ },
3410
+ {
3411
+ "name": "--box-shadow-20",
3412
+ "defaultValue": "0 1px 3px 0 rgba(18, 18, 23, 0.1)"
3413
+ },
3414
+ {
3415
+ "name": "--box-shadow-30",
3416
+ "defaultValue": "0 1px 4px -1px rgba(18, 18, 23, 0.08)"
3417
+ },
3418
+ {
3419
+ "name": "--box-shadow-35",
3420
+ "defaultValue": "0 4px 6px -1px rgba(18, 18, 23, 0.08)"
3421
+ },
3422
+ {
3423
+ "name": "--box-shadow-40",
3424
+ "defaultValue": "0 10px 15px -3px rgba(18, 18, 23, 0.08)"
3425
+ },
3426
+ {
3427
+ "name": "--box-shadow-50",
3428
+ "defaultValue": "0 20px 25px -5px rgba(18, 18, 23, 0.1)"
3429
+ },
3430
+ {
3431
+ "name": "--box-shadow-60",
3432
+ "defaultValue": "0 25px 50px -12px rgba(18, 18, 23, 0.25)"
3433
+ },
3434
+ {
3435
+ "name": "--dark-text",
3436
+ "defaultValue": "#000"
3437
+ },
3438
+ {
3439
+ "name": "--light-text",
3440
+ "defaultValue": "#fff"
3441
+ }
3442
+ ],
3443
+ "examples": []
3444
+ },
3445
+ {
3446
+ "name": "SheetVariables",
3447
+ "selector": "sheet-variables",
3448
+ "path": "projects/ship-ui/styles/components/ship-sheet.utility.scss",
3449
+ "description": "Common CSS variables for components using the \"sh-sheet\" class. These variables control background, border, and color scales for different variants.",
3450
+ "inputs": [],
3451
+ "outputs": [],
3452
+ "cssVariables": [
3453
+ {
3454
+ "name": "--sheet-c",
3455
+ "defaultValue": "var(--base-12)"
3456
+ },
3457
+ {
3458
+ "name": "--sheet-bg",
3459
+ "defaultValue": "var(--base-1)"
3460
+ },
3461
+ {
3462
+ "name": "--sheet-bc",
3463
+ "defaultValue": "var(--base-4)"
3464
+ },
3465
+ {
3466
+ "name": "--sheet-s",
3467
+ "defaultValue": "var(--shape-2)"
3468
+ },
3469
+ {
3470
+ "name": "--sheet-ic",
3471
+ "defaultValue": "var(--base-12)"
3472
+ },
3473
+ {
3474
+ "name": "--sheet-p-c",
3475
+ "defaultValue": "rgb(from var(--sheet-c) r g b / 0.65)"
3476
+ },
3477
+ {
3478
+ "name": "--sheet-bg-h",
3479
+ "defaultValue": "var(--base-2)"
3480
+ }
3481
+ ],
3482
+ "examples": []
3483
+ }
3484
+ ]