@reliability-design/web 1.0.2 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/dist/components/rel-accordion/README.md +132 -0
  2. package/dist/components/rel-accordion/rel-accordion.ts +61 -29
  3. package/dist/components/rel-alert/README.md +141 -0
  4. package/dist/components/rel-alert/rel-alert.ts +110 -67
  5. package/dist/components/rel-avatar/README.md +119 -0
  6. package/dist/components/rel-avatar/rel-avatar.ts +8 -15
  7. package/dist/components/rel-badge/README.md +86 -0
  8. package/dist/components/rel-badge/rel-badge.ts +28 -21
  9. package/dist/components/rel-breadcrumb/README.md +102 -0
  10. package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +24 -18
  11. package/dist/components/rel-button/README.md +130 -0
  12. package/dist/components/rel-button/rel-button.ts +39 -59
  13. package/dist/components/rel-calendar/README.md +109 -0
  14. package/dist/components/rel-calendar/index.ts +1 -0
  15. package/dist/components/rel-calendar/rel-calendar.ts +467 -0
  16. package/dist/components/rel-card/README.md +94 -0
  17. package/dist/components/rel-card/rel-card.ts +21 -11
  18. package/dist/components/rel-cardmedia/README.md +127 -0
  19. package/dist/components/rel-cardmedia/rel-cardmedia.ts +22 -18
  20. package/dist/components/rel-carousel/README.md +166 -0
  21. package/dist/components/rel-carousel/index.ts +1 -0
  22. package/dist/components/rel-carousel/rel-carousel.ts +469 -0
  23. package/dist/components/rel-chart/README.md +286 -0
  24. package/dist/components/rel-chart/index.ts +1 -0
  25. package/dist/components/rel-chart/rel-chart.ts +736 -0
  26. package/dist/components/rel-checkbox/README.md +77 -0
  27. package/dist/components/rel-checkbox/rel-checkbox.ts +36 -45
  28. package/dist/components/rel-chip/README.md +114 -0
  29. package/dist/components/rel-chip/rel-chip.ts +47 -122
  30. package/dist/components/rel-container/README.md +99 -0
  31. package/dist/components/rel-container/rel-container.ts +1 -6
  32. package/dist/components/rel-date-picker/README.md +253 -0
  33. package/dist/components/rel-date-picker/index.ts +1 -0
  34. package/dist/components/rel-date-picker/rel-date-picker.ts +916 -0
  35. package/dist/components/rel-divider/README.md +100 -0
  36. package/dist/components/rel-divider/rel-divider.ts +37 -37
  37. package/dist/components/rel-drawer/README.md +200 -0
  38. package/dist/components/rel-drawer/index.ts +1 -0
  39. package/dist/components/rel-drawer/rel-drawer.ts +621 -0
  40. package/dist/components/rel-kbd/README.md +151 -0
  41. package/dist/components/rel-kbd/rel-kbd.ts +118 -0
  42. package/dist/components/rel-layout/README.md +88 -0
  43. package/dist/components/rel-layout/rel-layout.ts +12 -14
  44. package/dist/components/rel-menu/README.md +151 -0
  45. package/dist/components/rel-menu/rel-menu.ts +18 -10
  46. package/dist/components/rel-menubar/README.md +329 -0
  47. package/dist/components/rel-menubar/index.ts +2 -0
  48. package/dist/components/rel-menubar/rel-menubar-menu.ts +16 -0
  49. package/dist/components/rel-menubar/rel-menubar.ts +576 -0
  50. package/dist/components/rel-nav-menu/README.md +289 -0
  51. package/dist/components/rel-nav-menu/index.ts +3 -0
  52. package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +143 -0
  53. package/dist/components/rel-nav-menu/rel-nav-menu-panel.ts +53 -0
  54. package/dist/components/rel-nav-menu/rel-nav-menu.ts +331 -0
  55. package/dist/components/rel-navbar/README.md +126 -0
  56. package/dist/components/rel-navbar/rel-navbar.ts +91 -0
  57. package/dist/components/rel-otp/README.md +440 -0
  58. package/dist/components/rel-otp/index.ts +1 -0
  59. package/dist/components/rel-otp/rel-otp.ts +504 -0
  60. package/dist/components/rel-pagination/README.md +410 -0
  61. package/dist/components/rel-pagination/index.ts +1 -0
  62. package/dist/components/rel-pagination/rel-pagination.ts +376 -0
  63. package/dist/components/rel-popover/README.md +568 -0
  64. package/dist/components/rel-popover/index.ts +2 -0
  65. package/dist/components/rel-popover/rel-popover-content.ts +55 -0
  66. package/dist/components/rel-popover/rel-popover.ts +327 -0
  67. package/dist/components/rel-progress/README.md +110 -0
  68. package/dist/components/rel-progress/rel-progress.ts +58 -20
  69. package/dist/components/rel-quote-page/README.md +166 -0
  70. package/dist/components/rel-quote-page/rel-quote-page.ts +816 -0
  71. package/dist/components/rel-radio/README.md +120 -0
  72. package/dist/components/rel-radio/rel-radio.ts +41 -73
  73. package/dist/components/rel-resizable/README.md +140 -0
  74. package/dist/components/rel-resizable/index.ts +3 -0
  75. package/dist/components/rel-resizable/rel-resizable-group.ts +374 -0
  76. package/dist/components/rel-resizable/rel-resizable-handle.ts +149 -0
  77. package/dist/components/rel-resizable/rel-resizable-panel.ts +47 -0
  78. package/dist/components/rel-segmented-button/README.md +141 -0
  79. package/dist/components/rel-segmented-button/rel-segmented-button.ts +18 -13
  80. package/dist/components/rel-select/README.md +107 -0
  81. package/dist/components/rel-select/rel-select.ts +14 -14
  82. package/dist/components/rel-sheet/README.md +224 -0
  83. package/dist/components/rel-sheet/rel-sheet.ts +683 -0
  84. package/dist/components/rel-sidebar/README.md +209 -0
  85. package/dist/components/rel-sidebar/rel-sidebar.ts +1158 -0
  86. package/dist/components/rel-slider/README.md +135 -0
  87. package/dist/components/rel-slider/rel-slider.ts +19 -7
  88. package/dist/components/rel-snackbar/README.md +134 -0
  89. package/dist/components/rel-snackbar/rel-snackbar.ts +73 -2
  90. package/dist/components/rel-stepper/README.md +160 -0
  91. package/dist/components/rel-stepper/rel-stepper.ts +29 -8
  92. package/dist/components/rel-switch/README.md +102 -0
  93. package/dist/components/rel-switch/rel-switch.ts +22 -11
  94. package/dist/components/rel-tab/README.md +163 -0
  95. package/dist/components/rel-tab/rel-tab.ts +46 -22
  96. package/dist/components/rel-table/README.md +178 -0
  97. package/dist/components/rel-table/rel-table-body.ts +16 -0
  98. package/dist/components/rel-table/rel-table-caption.ts +22 -0
  99. package/dist/components/rel-table/rel-table-cell.ts +49 -0
  100. package/dist/components/rel-table/rel-table-footer.ts +18 -0
  101. package/dist/components/rel-table/rel-table-head.ts +33 -0
  102. package/dist/components/rel-table/rel-table-header.ts +16 -0
  103. package/dist/components/rel-table/rel-table-row.ts +32 -0
  104. package/dist/components/rel-table/rel-table.ts +47 -0
  105. package/dist/components/rel-textfield/README.md +90 -0
  106. package/dist/components/rel-textfield/rel-textfield.ts +37 -21
  107. package/dist/components/rel-toast/README.md +148 -0
  108. package/dist/components/rel-toast/rel-toast.ts +32 -14
  109. package/dist/components/rel-tooltip/README.md +103 -0
  110. package/dist/components/rel-tooltip/rel-tooltip.ts +9 -9
  111. package/dist/index.d.mts +846 -7
  112. package/dist/index.d.ts +846 -7
  113. package/dist/index.js +10860 -1803
  114. package/dist/index.js.map +1 -1
  115. package/dist/index.mjs +10820 -1809
  116. package/dist/index.mjs.map +1 -1
  117. package/dist/styles/vars.css +293 -183
  118. package/dist/vars-ITL2K3KO.css +294 -0
  119. package/package.json +2 -2
  120. package/dist/components/rel-accordion/rel-accordion.stories.ts +0 -313
  121. package/dist/components/rel-alert/rel-alert.stories.ts +0 -412
  122. package/dist/components/rel-avatar/rel-avatar.stories.ts +0 -327
  123. package/dist/components/rel-badge/rel-badge.stories.ts +0 -350
  124. package/dist/components/rel-breadcrumb/rel-breadcrumb.stories.ts +0 -306
  125. package/dist/components/rel-button/rel-button.stories.ts +0 -356
  126. package/dist/components/rel-card/rel-card.stories.ts +0 -299
  127. package/dist/components/rel-cardmedia/rel-cardmedia.stories.ts +0 -368
  128. package/dist/components/rel-checkbox/rel-checkbox.stories.ts +0 -414
  129. package/dist/components/rel-chip/rel-chip.stories.ts +0 -552
  130. package/dist/components/rel-container/rel-container.stories.ts +0 -239
  131. package/dist/components/rel-divider/rel-divider.stories.ts +0 -229
  132. package/dist/components/rel-layout/rel-layout.stories.ts +0 -713
  133. package/dist/components/rel-menu/rel-menu.stories.ts +0 -910
  134. package/dist/components/rel-progress/rel-progress.stories.ts +0 -817
  135. package/dist/components/rel-radio/rel-radio.stories.ts +0 -1048
  136. package/dist/components/rel-segmented-button/rel-segmented-button.stories.ts +0 -1079
  137. package/dist/components/rel-select/rel-select.stories.ts +0 -1201
  138. package/dist/components/rel-slider/rel-slider.stories.ts +0 -730
  139. package/dist/components/rel-snackbar/rel-snackbar.stories.ts +0 -808
  140. package/dist/components/rel-stepper/rel-stepper.stories.ts +0 -752
  141. package/dist/components/rel-switch/rel-switch.stories.ts +0 -441
  142. package/dist/components/rel-tab/rel-tab.stories.ts +0 -492
  143. package/dist/components/rel-textfield/rel-textfield.stories.ts +0 -710
  144. package/dist/components/rel-toast/rel-toast.stories.ts +0 -394
  145. package/dist/components/rel-tooltip/rel-tooltip.stories.ts +0 -364
@@ -0,0 +1,816 @@
1
+ import { LitElement, html, css } from "lit";
2
+ import { customElement, property, state } from "lit/decorators.js";
3
+
4
+ export interface QuoteFormData {
5
+ pickupLocation: string;
6
+ dropoffLocation: string;
7
+ serviceLevel: "standard" | "guaranteed";
8
+ originType: "commercial" | "residential";
9
+ destinationType: "commercial" | "residential";
10
+ loadingRequirements: string;
11
+ deliveryRequirements: string;
12
+ loadingLimitedAccessType: string;
13
+ deliveryLimitedAccessType: string;
14
+ pickupDate: string;
15
+ isHazmat: boolean;
16
+ commodity: string;
17
+ commodityDescription: string;
18
+ handlingUnits: number;
19
+ handlingType: string;
20
+ length: number;
21
+ width: number;
22
+ height: number;
23
+ totalWeight: number;
24
+ class: string;
25
+ insuredValue: number;
26
+ nmfcNumber: string;
27
+ }
28
+
29
+ @customElement("rel-quote-page")
30
+ export class RelQuotePage extends LitElement {
31
+ @state() private formData: QuoteFormData = {
32
+ pickupLocation: "",
33
+ dropoffLocation: "",
34
+ serviceLevel: "standard",
35
+ originType: "commercial",
36
+ destinationType: "commercial",
37
+ loadingRequirements: "",
38
+ deliveryRequirements: "",
39
+ loadingLimitedAccessType: "",
40
+ deliveryLimitedAccessType: "",
41
+ pickupDate: "",
42
+ isHazmat: false,
43
+ commodity: "",
44
+ commodityDescription: "",
45
+ handlingUnits: 0,
46
+ handlingType: "",
47
+ length: 0,
48
+ width: 0,
49
+ height: 0,
50
+ totalWeight: 0,
51
+ class: "",
52
+ insuredValue: 0,
53
+ nmfcNumber: "",
54
+ };
55
+
56
+ static styles = css`
57
+ :host {
58
+ display: block;
59
+ font-family: var(--rel-fontFamilies-primary);
60
+ background: var(--rel-colors-white);
61
+ padding: var(--rel-spacing-space-xl);
62
+ border-radius: var(--rel-borders-radius-border-radius-300);
63
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
64
+ }
65
+
66
+ .quote-page {
67
+ max-width: 900px;
68
+ margin: 0 auto;
69
+ }
70
+
71
+ .section {
72
+ margin-bottom: var(--rel-spacing-space-2xl);
73
+ }
74
+
75
+ .section-title {
76
+ font-size: var(--rel-fontSizes-xl);
77
+ font-weight: var(--rel-fontWeights-bold);
78
+ margin: 0 0 var(--rel-spacing-space-lg) 0;
79
+ color: var(--rel-colors-black);
80
+ }
81
+
82
+ .section-row {
83
+ display: grid;
84
+ grid-template-columns: 1fr 1fr;
85
+ gap: var(--rel-spacing-space-lg);
86
+ margin-bottom: var(--rel-spacing-space-lg);
87
+ }
88
+
89
+ .section-row.single {
90
+ grid-template-columns: 1fr;
91
+ }
92
+
93
+ .field-group {
94
+ display: flex;
95
+ flex-direction: column;
96
+ gap: var(--rel-spacing-space-2xs);
97
+ }
98
+
99
+ .field-label {
100
+ font-size: var(--rel-fontSizes-sm);
101
+ font-weight: var(--rel-fontWeights-medium);
102
+ color: var(--rel-colors-gray-heading);
103
+ display: flex;
104
+ align-items: center;
105
+ gap: var(--rel-spacing-space-3xs);
106
+ }
107
+
108
+ .required {
109
+ color: var(--rel-colors-red-primary);
110
+ }
111
+
112
+ .info-icon {
113
+ width: 16px;
114
+ height: 16px;
115
+ border: 1px solid var(--rel-colors-gray-border);
116
+ border-radius: 50%;
117
+ display: inline-flex;
118
+ align-items: center;
119
+ justify-content: center;
120
+ font-size: 11px;
121
+ cursor: help;
122
+ color: var(--rel-colors-gray-primary);
123
+ }
124
+
125
+ .subsection-title {
126
+ font-size: var(--rel-fontSizes-md);
127
+ font-weight: var(--rel-fontWeights-semibold);
128
+ margin: var(--rel-spacing-space-md) 0 var(--rel-spacing-space-sm) 0;
129
+ color: var(--rel-colors-gray-heading);
130
+ display: flex;
131
+ align-items: center;
132
+ gap: var(--rel-spacing-space-xs);
133
+ }
134
+
135
+ .subsection-title::before {
136
+ content: "";
137
+ width: 8px;
138
+ height: 8px;
139
+ border-radius: 50%;
140
+ background: var(--rel-colors-green-primary);
141
+ }
142
+
143
+ .service-level-tabs {
144
+ display: flex;
145
+ gap: 0;
146
+ border: 1px solid var(--rel-colors-gray-border);
147
+ border-radius: var(--rel-borders-radius-border-radius-300);
148
+ overflow: hidden;
149
+ width: fit-content;
150
+ margin-bottom: var(--rel-spacing-space-md);
151
+ }
152
+
153
+ .tab-button {
154
+ padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-lg);
155
+ background: var(--rel-colors-white);
156
+ border: none;
157
+ cursor: pointer;
158
+ font-family: var(--rel-fontFamilies-primary);
159
+ font-size: var(--rel-fontSizes-sm);
160
+ font-weight: var(--rel-fontWeights-medium);
161
+ color: var(--rel-colors-gray-primary);
162
+ transition: all 0.2s;
163
+ border-right: 1px solid var(--rel-colors-gray-border);
164
+ }
165
+
166
+ .tab-button:last-child {
167
+ border-right: none;
168
+ }
169
+
170
+ .tab-button.active {
171
+ background: var(--rel-colors-black);
172
+ color: var(--rel-colors-white);
173
+ }
174
+
175
+ .radio-group {
176
+ display: flex;
177
+ gap: var(--rel-spacing-space-lg);
178
+ }
179
+
180
+ .radio-option {
181
+ display: flex;
182
+ align-items: center;
183
+ gap: var(--rel-spacing-space-xs);
184
+ cursor: pointer;
185
+ }
186
+
187
+ .radio-input {
188
+ width: 20px;
189
+ height: 20px;
190
+ border: 2px solid var(--rel-colors-gray-border);
191
+ border-radius: 50%;
192
+ position: relative;
193
+ flex-shrink: 0;
194
+ }
195
+
196
+ .radio-input.checked {
197
+ border-color: var(--rel-colors-black);
198
+ }
199
+
200
+ .radio-input.checked::after {
201
+ content: "";
202
+ position: absolute;
203
+ inset: 4px;
204
+ background: var(--rel-colors-black);
205
+ border-radius: 50%;
206
+ }
207
+
208
+ .radio-label {
209
+ font-size: var(--rel-fontSizes-sm);
210
+ font-weight: var(--rel-fontWeights-medium);
211
+ color: var(--rel-colors-gray-heading);
212
+ }
213
+
214
+ .input-field {
215
+ padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);
216
+ border: 1px solid var(--rel-colors-gray-border);
217
+ border-radius: var(--rel-borders-radius-border-radius-300);
218
+ font-family: var(--rel-fontFamilies-primary);
219
+ font-size: var(--rel-fontSizes-sm);
220
+ outline: none;
221
+ transition: border-color 0.2s;
222
+ }
223
+
224
+ .input-field:focus-visible {
225
+ border-color: var(--rel-colors-black);
226
+ }
227
+
228
+ .input-with-icon {
229
+ position: relative;
230
+ }
231
+
232
+ .input-icon {
233
+ position: absolute;
234
+ right: var(--rel-spacing-space-sm);
235
+ top: 50%;
236
+ transform: translateY(-50%);
237
+ color: var(--rel-colors-gray-primary);
238
+ pointer-events: none;
239
+ }
240
+
241
+ .input-with-icon .input-field {
242
+ padding-right: var(--rel-spacing-space-2xl);
243
+ }
244
+
245
+ select {
246
+ padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);
247
+ border: 1px solid var(--rel-colors-gray-border);
248
+ border-radius: var(--rel-borders-radius-border-radius-300);
249
+ font-family: var(--rel-fontFamilies-primary);
250
+ font-size: var(--rel-fontSizes-sm);
251
+ outline: none;
252
+ background: var(--rel-colors-white);
253
+ cursor: pointer;
254
+ transition: border-color 0.2s;
255
+ appearance: none;
256
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 9L1 4h10z'/%3E%3C/svg%3E");
257
+ background-repeat: no-repeat;
258
+ background-position: right 12px center;
259
+ padding-right: var(--rel-spacing-space-2xl);
260
+ }
261
+
262
+ select:focus-visible {
263
+ border-color: var(--rel-colors-black);
264
+ }
265
+
266
+ .helper-text {
267
+ font-size: var(--rel-fontSizes-xs);
268
+ color: var(--rel-colors-gray-placeholder);
269
+ margin-top: var(--rel-spacing-space-2xs);
270
+ }
271
+
272
+ .dimension-inputs {
273
+ display: grid;
274
+ grid-template-columns: repeat(4, 1fr);
275
+ gap: var(--rel-spacing-space-sm);
276
+ }
277
+
278
+ .dimension-field {
279
+ display: flex;
280
+ flex-direction: column;
281
+ gap: var(--rel-spacing-space-3xs);
282
+ }
283
+
284
+ .dimension-label {
285
+ font-size: var(--rel-fontSizes-xs);
286
+ font-weight: var(--rel-fontWeights-medium);
287
+ color: var(--rel-colors-gray-heading);
288
+ }
289
+
290
+ .dimension-input-wrapper {
291
+ display: flex;
292
+ align-items: center;
293
+ gap: var(--rel-spacing-space-xs);
294
+ }
295
+
296
+ .dimension-input {
297
+ flex: 1;
298
+ padding: var(--rel-spacing-space-xs);
299
+ border: 1px solid var(--rel-colors-gray-border);
300
+ border-radius: var(--rel-borders-radius-border-radius-300);
301
+ font-family: var(--rel-fontFamilies-primary);
302
+ font-size: var(--rel-fontSizes-sm);
303
+ outline: none;
304
+ }
305
+
306
+ .dimension-unit {
307
+ font-size: var(--rel-fontSizes-xs);
308
+ color: var(--rel-colors-gray-primary);
309
+ }
310
+
311
+ .max-note {
312
+ font-size: var(--rel-fontSizes-xs);
313
+ color: var(--rel-colors-gray-placeholder);
314
+ margin-top: 2px;
315
+ }
316
+
317
+ @media (max-width: 768px) {
318
+ .section-row {
319
+ grid-template-columns: 1fr;
320
+ }
321
+
322
+ .dimension-inputs {
323
+ grid-template-columns: repeat(2, 1fr);
324
+ }
325
+ }
326
+ `;
327
+
328
+ private updateField(field: keyof QuoteFormData, value: any) {
329
+ this.formData = { ...this.formData, [field]: value };
330
+ this.dispatchEvent(
331
+ new CustomEvent("form-change", {
332
+ detail: this.formData,
333
+ bubbles: true,
334
+ composed: true,
335
+ })
336
+ );
337
+ }
338
+
339
+ render() {
340
+ return html`
341
+ <div class="quote-page">
342
+ <!-- Shipping Details Section -->
343
+ <div class="section">
344
+ <h2 class="section-title">Shipping Details</h2>
345
+
346
+ <div class="subsection-title">Origin</div>
347
+ <div class="section-row">
348
+ <div class="field-group">
349
+ <label class="field-label">
350
+ Pickup Location <span class="required">*</span>
351
+ </label>
352
+ <div class="input-with-icon">
353
+ <input
354
+ type="text"
355
+ class="input-field"
356
+ placeholder="Enter pickup location"
357
+ .value="${this.formData.pickupLocation}"
358
+ @input="${(e: Event) =>
359
+ this.updateField(
360
+ "pickupLocation",
361
+ (e.target as HTMLInputElement).value
362
+ )}"
363
+ />
364
+ <span class="input-icon">🔍</span>
365
+ </div>
366
+ </div>
367
+
368
+ <div class="field-group">
369
+ <label class="field-label">
370
+ Drop off Location <span class="required">*</span>
371
+ </label>
372
+ <div class="input-with-icon">
373
+ <input
374
+ type="text"
375
+ class="input-field"
376
+ placeholder="Enter drop off location"
377
+ .value="${this.formData.dropoffLocation}"
378
+ @input="${(e: Event) =>
379
+ this.updateField(
380
+ "dropoffLocation",
381
+ (e.target as HTMLInputElement).value
382
+ )}"
383
+ />
384
+ <span class="input-icon">🔍</span>
385
+ </div>
386
+ </div>
387
+ </div>
388
+
389
+ <div class="field-group" style="margin-bottom: var(--rel-spacing-space-md);">
390
+ <label class="field-label">Service Level</label>
391
+ <div class="service-level-tabs">
392
+ <button
393
+ class="tab-button ${this.formData.serviceLevel === "standard"
394
+ ? "active"
395
+ : ""}"
396
+ @click="${() => this.updateField("serviceLevel", "standard")}"
397
+ >
398
+ Standard
399
+ </button>
400
+ <button
401
+ class="tab-button ${this.formData.serviceLevel === "guaranteed"
402
+ ? "active"
403
+ : ""}"
404
+ @click="${() => this.updateField("serviceLevel", "guaranteed")}"
405
+ >
406
+ Guaranteed
407
+ </button>
408
+ </div>
409
+ </div>
410
+
411
+ <div class="section-row">
412
+ <div class="field-group">
413
+ <label class="field-label">Origin Type</label>
414
+ <div class="radio-group">
415
+ <div
416
+ class="radio-option"
417
+ @click="${() => this.updateField("originType", "commercial")}"
418
+ >
419
+ <div
420
+ class="radio-input ${this.formData.originType === "commercial"
421
+ ? "checked"
422
+ : ""}"
423
+ ></div>
424
+ <span class="radio-label">Commercial</span>
425
+ </div>
426
+ <div
427
+ class="radio-option"
428
+ @click="${() => this.updateField("originType", "residential")}"
429
+ >
430
+ <div
431
+ class="radio-input ${this.formData.originType === "residential"
432
+ ? "checked"
433
+ : ""}"
434
+ ></div>
435
+ <span class="radio-label">Residential</span>
436
+ </div>
437
+ </div>
438
+ </div>
439
+
440
+ <div class="field-group">
441
+ <label class="field-label">Destination Type</label>
442
+ <div class="radio-group">
443
+ <div
444
+ class="radio-option"
445
+ @click="${() =>
446
+ this.updateField("destinationType", "commercial")}"
447
+ >
448
+ <div
449
+ class="radio-input ${this.formData.destinationType ===
450
+ "commercial"
451
+ ? "checked"
452
+ : ""}"
453
+ ></div>
454
+ <span class="radio-label">Commercial</span>
455
+ </div>
456
+ <div
457
+ class="radio-option"
458
+ @click="${() =>
459
+ this.updateField("destinationType", "residential")}"
460
+ >
461
+ <div
462
+ class="radio-input ${this.formData.destinationType ===
463
+ "residential"
464
+ ? "checked"
465
+ : ""}"
466
+ ></div>
467
+ <span class="radio-label">Residential</span>
468
+ </div>
469
+ </div>
470
+ </div>
471
+ </div>
472
+
473
+ <div class="section-row">
474
+ <div class="field-group">
475
+ <label class="field-label">Loading Requirements</label>
476
+ <select
477
+ .value="${this.formData.loadingRequirements}"
478
+ @change="${(e: Event) =>
479
+ this.updateField(
480
+ "loadingRequirements",
481
+ (e.target as HTMLSelectElement).value
482
+ )}"
483
+ >
484
+ <option value="">Select</option>
485
+ <option value="dock">Dock</option>
486
+ <option value="liftgate">Liftgate</option>
487
+ <option value="inside">Inside Pickup</option>
488
+ </select>
489
+ <p class="helper-text">
490
+ If inside pickup/delivery is selected, the driver will bring a
491
+ pallet jack to move the goods from the dock to the truck (or
492
+ vice-versa). If inside pickup or delivery is at a residence or a
493
+ non-dock location, please also select the "Lift gate" as well.
494
+ </p>
495
+ </div>
496
+
497
+ <div class="field-group">
498
+ <label class="field-label">Delivery Requirements</label>
499
+ <select
500
+ .value="${this.formData.deliveryRequirements}"
501
+ @change="${(e: Event) =>
502
+ this.updateField(
503
+ "deliveryRequirements",
504
+ (e.target as HTMLSelectElement).value
505
+ )}"
506
+ >
507
+ <option value="">Select</option>
508
+ <option value="dock">Dock</option>
509
+ <option value="liftgate">Liftgate</option>
510
+ <option value="inside">Inside Delivery</option>
511
+ </select>
512
+ </div>
513
+ </div>
514
+
515
+ <div class="section-row">
516
+ <div class="field-group">
517
+ <label class="field-label">Loading Limited Access Type</label>
518
+ <select
519
+ .value="${this.formData.loadingLimitedAccessType}"
520
+ @change="${(e: Event) =>
521
+ this.updateField(
522
+ "loadingLimitedAccessType",
523
+ (e.target as HTMLSelectElement).value
524
+ )}"
525
+ >
526
+ <option value="">Select</option>
527
+ <option value="none">None</option>
528
+ <option value="residential">Residential</option>
529
+ <option value="construction">Construction Site</option>
530
+ </select>
531
+ </div>
532
+
533
+ <div class="field-group">
534
+ <label class="field-label">Delivery Limited Access Type</label>
535
+ <select
536
+ .value="${this.formData.deliveryLimitedAccessType}"
537
+ @change="${(e: Event) =>
538
+ this.updateField(
539
+ "deliveryLimitedAccessType",
540
+ (e.target as HTMLSelectElement).value
541
+ )}"
542
+ >
543
+ <option value="">Select</option>
544
+ <option value="none">None</option>
545
+ <option value="residential">Residential</option>
546
+ <option value="construction">Construction Site</option>
547
+ </select>
548
+ </div>
549
+ </div>
550
+
551
+ <div class="section-row single">
552
+ <div class="field-group">
553
+ <label class="field-label">
554
+ Pickup Date <span class="required">*</span>
555
+ </label>
556
+ <input
557
+ type="date"
558
+ class="input-field"
559
+ .value="${this.formData.pickupDate}"
560
+ @input="${(e: Event) =>
561
+ this.updateField(
562
+ "pickupDate",
563
+ (e.target as HTMLInputElement).value
564
+ )}"
565
+ />
566
+ </div>
567
+ </div>
568
+ </div>
569
+
570
+ <!-- Commodity Details Section -->
571
+ <div class="section">
572
+ <h2 class="section-title">Commodity Details</h2>
573
+
574
+ <div class="field-group" style="margin-bottom: var(--rel-spacing-space-md);">
575
+ <label class="field-label">Is this a hazmat commodity?</label>
576
+ <div class="radio-group">
577
+ <div
578
+ class="radio-option"
579
+ @click="${() => this.updateField("isHazmat", true)}"
580
+ >
581
+ <div
582
+ class="radio-input ${this.formData.isHazmat ? "checked" : ""}"
583
+ ></div>
584
+ <span class="radio-label">Yes</span>
585
+ </div>
586
+ <div
587
+ class="radio-option"
588
+ @click="${() => this.updateField("isHazmat", false)}"
589
+ >
590
+ <div
591
+ class="radio-input ${!this.formData.isHazmat ? "checked" : ""}"
592
+ ></div>
593
+ <span class="radio-label">No</span>
594
+ </div>
595
+ </div>
596
+ </div>
597
+
598
+ <div class="section-row">
599
+ <div class="field-group">
600
+ <label class="field-label">
601
+ Commodity <span class="required">*</span>
602
+ </label>
603
+ <input
604
+ type="text"
605
+ class="input-field"
606
+ .value="${this.formData.commodity}"
607
+ @input="${(e: Event) =>
608
+ this.updateField(
609
+ "commodity",
610
+ (e.target as HTMLInputElement).value
611
+ )}"
612
+ />
613
+ </div>
614
+
615
+ <div class="field-group">
616
+ <label class="field-label">
617
+ Commodity Description <span class="required">*</span>
618
+ </label>
619
+ <input
620
+ type="text"
621
+ class="input-field"
622
+ .value="${this.formData.commodityDescription}"
623
+ @input="${(e: Event) =>
624
+ this.updateField(
625
+ "commodityDescription",
626
+ (e.target as HTMLInputElement).value
627
+ )}"
628
+ />
629
+ </div>
630
+ </div>
631
+
632
+ <div class="section-row">
633
+ <div class="field-group">
634
+ <label class="field-label">
635
+ Handling Units <span class="required">*</span>
636
+ <span class="info-icon">ⓘ</span>
637
+ </label>
638
+ <input
639
+ type="number"
640
+ class="input-field"
641
+ .value="${this.formData.handlingUnits}"
642
+ @input="${(e: Event) =>
643
+ this.updateField(
644
+ "handlingUnits",
645
+ parseInt((e.target as HTMLInputElement).value) || 0
646
+ )}"
647
+ />
648
+ </div>
649
+
650
+ <div class="field-group">
651
+ <label class="field-label">
652
+ Handling Type <span class="required">*</span>
653
+ </label>
654
+ <select
655
+ .value="${this.formData.handlingType}"
656
+ @change="${(e: Event) =>
657
+ this.updateField(
658
+ "handlingType",
659
+ (e.target as HTMLSelectElement).value
660
+ )}"
661
+ >
662
+ <option value="">Select</option>
663
+ <option value="pallet">Pallet</option>
664
+ <option value="crate">Crate</option>
665
+ <option value="box">Box</option>
666
+ </select>
667
+ </div>
668
+ </div>
669
+
670
+ <div class="field-group" style="margin-bottom: var(--rel-spacing-space-md);">
671
+ <div class="dimension-inputs">
672
+ <div class="dimension-field">
673
+ <label class="dimension-label">
674
+ Length <span class="required">*</span>
675
+ </label>
676
+ <div class="dimension-input-wrapper">
677
+ <input
678
+ type="number"
679
+ class="dimension-input"
680
+ .value="${this.formData.length}"
681
+ @input="${(e: Event) =>
682
+ this.updateField(
683
+ "length",
684
+ parseFloat((e.target as HTMLInputElement).value) || 0
685
+ )}"
686
+ />
687
+ <span class="dimension-unit">inches</span>
688
+ </div>
689
+ </div>
690
+
691
+ <div class="dimension-field">
692
+ <label class="dimension-label">
693
+ Width <span class="required">*</span>
694
+ </label>
695
+ <div class="dimension-input-wrapper">
696
+ <input
697
+ type="number"
698
+ class="dimension-input"
699
+ .value="${this.formData.width}"
700
+ @input="${(e: Event) =>
701
+ this.updateField(
702
+ "width",
703
+ parseFloat((e.target as HTMLInputElement).value) || 0
704
+ )}"
705
+ />
706
+ <span class="dimension-unit">inches</span>
707
+ </div>
708
+ <div class="max-note">96" max</div>
709
+ </div>
710
+
711
+ <div class="dimension-field">
712
+ <label class="dimension-label">
713
+ Height <span class="required">*</span>
714
+ </label>
715
+ <div class="dimension-input-wrapper">
716
+ <input
717
+ type="number"
718
+ class="dimension-input"
719
+ .value="${this.formData.height}"
720
+ @input="${(e: Event) =>
721
+ this.updateField(
722
+ "height",
723
+ parseFloat((e.target as HTMLInputElement).value) || 0
724
+ )}"
725
+ />
726
+ <span class="dimension-unit">inches</span>
727
+ </div>
728
+ <div class="max-note">96" max</div>
729
+ </div>
730
+
731
+ <div class="dimension-field">
732
+ <label class="dimension-label">
733
+ Total Weight <span class="required">*</span>
734
+ </label>
735
+ <div class="dimension-input-wrapper">
736
+ <input
737
+ type="number"
738
+ class="dimension-input"
739
+ .value="${this.formData.totalWeight}"
740
+ @input="${(e: Event) =>
741
+ this.updateField(
742
+ "totalWeight",
743
+ parseFloat((e.target as HTMLInputElement).value) || 0
744
+ )}"
745
+ />
746
+ <span class="dimension-unit">lbs</span>
747
+ </div>
748
+ </div>
749
+ </div>
750
+ </div>
751
+
752
+ <div class="section-row">
753
+ <div class="field-group">
754
+ <label class="field-label">
755
+ Class <span class="required">*</span>
756
+ </label>
757
+ <select
758
+ .value="${this.formData.class}"
759
+ @change="${(e: Event) =>
760
+ this.updateField("class", (e.target as HTMLSelectElement).value)}"
761
+ >
762
+ <option value="">Select</option>
763
+ <option value="50">Class 50</option>
764
+ <option value="55">Class 55</option>
765
+ <option value="60">Class 60</option>
766
+ <option value="65">Class 65</option>
767
+ <option value="70">Class 70</option>
768
+ <option value="77.5">Class 77.5</option>
769
+ <option value="85">Class 85</option>
770
+ <option value="92.5">Class 92.5</option>
771
+ <option value="100">Class 100</option>
772
+ </select>
773
+ </div>
774
+
775
+ <div class="field-group">
776
+ <label class="field-label">
777
+ Insured Value
778
+ <span class="info-icon">ⓘ</span>
779
+ </label>
780
+ <input
781
+ type="number"
782
+ class="input-field"
783
+ .value="${this.formData.insuredValue}"
784
+ @input="${(e: Event) =>
785
+ this.updateField(
786
+ "insuredValue",
787
+ parseFloat((e.target as HTMLInputElement).value) || 0
788
+ )}"
789
+ />
790
+ </div>
791
+ </div>
792
+
793
+ <div class="section-row single">
794
+ <div class="field-group">
795
+ <label class="field-label">NMFC Number</label>
796
+ <input
797
+ type="text"
798
+ class="input-field"
799
+ .value="${this.formData.nmfcNumber}"
800
+ @input="${(e: Event) =>
801
+ this.updateField(
802
+ "nmfcNumber",
803
+ (e.target as HTMLInputElement).value
804
+ )}"
805
+ />
806
+ <p class="helper-text">
807
+ Failure to provide NMFC may result in additional variance
808
+ charges
809
+ </p>
810
+ </div>
811
+ </div>
812
+ </div>
813
+ </div>
814
+ `;
815
+ }
816
+ }