@vectramindnpm/unified-design-system 0.2.4 → 0.2.5

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.
@@ -1,387 +1,387 @@
1
- /* Component-specific styles these components render classNames for, beyond Tailwind
2
- utilities and design tokens. Ported from the source app's src/styles/common.scss and
3
- src/styles/mainstyles.css — originally SCSS nested under an app-specific `#fpneo {}`
4
- Tailwind-important wrapper (would never match here) with Tailwind `@apply` directives.
5
- Flattened to plain CSS with `@apply` resolved to literal declarations so this file has
6
- zero build-step dependency on Sass or Tailwind. Page/business-specific styling (e.g.
7
- Table's per-page `*-cols` grid-column layouts, and page overrides in clinical.scss) is
8
- intentionally NOT included — bring your own for those. */
9
-
10
- /* ── Card (card.tsx) ─────────────────────────────────────────────────────── */
11
- .app-card {
12
- background-color: #ffffff;
13
- border-radius: 1.25rem;
14
- border: 1px solid #f3f4f6;
15
- box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
16
- transition-property: box-shadow;
17
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
18
- transition-duration: 150ms;
19
- display: flex;
20
- flex-direction: column;
21
- }
22
- .app-card:hover {
23
- box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
24
- }
25
- .app-card--editing {
26
- border-color: var(--color-brand-purple);
27
- box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
28
- }
29
-
30
- /* ── AppList (list.tsx) ──────────────────────────────────────────────────── */
31
- .app-list-wrapper {
32
- border: 1px solid #f3f4f6;
33
- border-radius: 1rem;
34
- overflow: hidden;
35
- background-color: #ffffff;
36
- }
37
- .app-list-header {
38
- position: sticky;
39
- top: 0;
40
- z-index: 10;
41
- padding: 0.75rem 1.25rem;
42
- background-color: var(--color-ext-f8f9fa);
43
- border-bottom: 1px solid #e5e7eb;
44
- }
45
- .app-list-header > div {
46
- font-size: 0.625rem;
47
- font-weight: 500;
48
- color: #9ca3af;
49
- text-transform: uppercase;
50
- letter-spacing: 0.05em;
51
- }
52
- .app-list-body {
53
- width: 100%;
54
- }
55
- .app-list-row {
56
- padding: 0.9375rem 1.25rem;
57
- border-bottom: 1px solid #f3f4f6;
58
- transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter;
59
- transition-duration: 100ms;
60
- }
61
- .app-list-row:last-child {
62
- border-bottom-width: 0;
63
- }
64
- .app-list-row:hover {
65
- background-color: var(--color-ext-fafafa);
66
- }
67
- .app-list-row--editing {
68
- background-color: rgb(238 242 255 / 0.4);
69
- border-left: 2px solid var(--color-brand-purple);
70
- }
71
- .app-list-cell {
72
- font-size: 0.8125rem;
73
- color: #374151;
74
- min-width: 0;
75
- padding-right: 0.75rem;
76
- }
77
- .app-list-cell--muted {
78
- color: #6b7280;
79
- }
80
- .app-list-cell--actions {
81
- display: flex;
82
- align-items: center;
83
- gap: 0.125rem;
84
- justify-content: flex-end;
85
- padding-right: 0.25rem;
86
- }
87
-
88
- /* ── Switch (switch.tsx) ─────────────────────────────────────────────────── */
89
- .switch-pill {
90
- position: relative;
91
- display: inline-flex;
92
- flex-shrink: 0;
93
- cursor: pointer;
94
- align-items: center;
95
- width: 2rem;
96
- height: 1.125rem;
97
- border-radius: 9999px;
98
- padding: 0.125rem;
99
- transition: background-color 0.25s ease-in-out;
100
- }
101
- .switch-pill:focus-within {
102
- outline: none;
103
- }
104
- .switch-pill--on {
105
- background-color: var(--color-ext-00c48c);
106
- }
107
- .switch-pill--off {
108
- background-color: var(--color-neutral-450);
109
- }
110
- .switch-pill--disabled {
111
- cursor: not-allowed;
112
- opacity: 0.5;
113
- }
114
- .switch-pill__input {
115
- position: absolute;
116
- width: 1px;
117
- height: 1px;
118
- padding: 0;
119
- margin: -1px;
120
- overflow: hidden;
121
- clip: rect(0, 0, 0, 0);
122
- white-space: nowrap;
123
- border-width: 0;
124
- }
125
- .switch-pill__thumb {
126
- pointer-events: none;
127
- display: block;
128
- background-color: #ffffff;
129
- width: 0.875rem;
130
- height: 0.875rem;
131
- border-radius: 9999px;
132
- box-shadow: 0 1px 3px var(--color-ext-0000001f);
133
- transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
134
- }
135
- .switch-pill__thumb--on {
136
- transform: translateX(0.875rem);
137
- }
138
- [dir="rtl"] .switch-pill__thumb--on {
139
- transform: translateX(-0.875rem);
140
- }
141
- .switch-pill__thumb--off {
142
- transform: translateX(0);
143
- }
144
-
145
- /* ── ViewToggle (view-toggle.tsx) ────────────────────────────────────────── */
146
- .view-toggle {
147
- display: flex;
148
- align-items: center;
149
- gap: 0.125rem;
150
- background-color: #f3f4f6;
151
- border-radius: 0.5rem;
152
- padding: 0.25rem;
153
- }
154
- .view-toggle__btn {
155
- display: flex;
156
- align-items: center;
157
- justify-content: center;
158
- width: 2rem;
159
- height: 2rem;
160
- border-radius: 0.375rem;
161
- transition-property: all;
162
- transition-duration: 150ms;
163
- color: var(--color-ext-888888);
164
- opacity: 1 !important;
165
- }
166
- .view-toggle__btn:hover {
167
- color: #4b5563;
168
- background-color: #f3f4f6;
169
- }
170
- .view-toggle__btn:focus,
171
- .view-toggle__btn:focus-visible {
172
- outline: none;
173
- box-shadow: none;
174
- }
175
- .view-toggle__btn--active {
176
- background-color: #ffffff;
177
- box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
178
- color: var(--color-brand-purple);
179
- }
180
- .view-toggle__btn--active:hover {
181
- color: var(--color-brand-purple);
182
- background-color: #ffffff;
183
- }
184
-
185
- /* ── DropdownMenu (dropdown-menu.tsx) ────────────────────────────────────── */
186
- .dropdownHead {
187
- position: fixed;
188
- z-index: var(--zindex-overlay);
189
- min-width: 12rem;
190
- overflow: hidden;
191
- border-radius: 0.75rem;
192
- border: 1px solid #f3f4f6;
193
- background-color: #ffffff;
194
- padding-top: 0.5rem;
195
- padding-bottom: 0.5rem;
196
- box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
197
- transition-property: opacity;
198
- transition-duration: 150ms;
199
- }
200
- .dropdownInner {
201
- position: relative;
202
- display: flex;
203
- cursor: pointer;
204
- user-select: none;
205
- align-items: center;
206
- padding: 0.375rem 0.5rem;
207
- font-size: 0.875rem;
208
- line-height: 1.25rem;
209
- outline: none;
210
- transition-property: color, background-color, border-color;
211
- transition-duration: 150ms;
212
- }
213
- .dropdownInner[data-disabled] {
214
- pointer-events: none;
215
- opacity: 0.5;
216
- }
217
-
218
- /* ── FormField / Input (form-field.tsx, expandable-search.tsx) ──────────── */
219
- .form__field {
220
- min-width: 0;
221
- }
222
- .form__field > * + * {
223
- margin-top: 0.5rem;
224
- }
225
- .formfield__label {
226
- font-size: 0.75rem;
227
- font-weight: 500;
228
- margin-bottom: 0.5rem;
229
- display: block;
230
- color: var(--color-text-primary);
231
- }
232
- .form-error {
233
- font-size: 0.75rem;
234
- line-height: 1rem;
235
- color: #ef4444;
236
- margin-top: 0.25rem;
237
- }
238
- .required-field {
239
- color: #ef4444;
240
- margin-left: 0.25rem;
241
- }
242
- .formfield__search {
243
- display: flex;
244
- height: 2.25rem;
245
- width: 100%;
246
- border-radius: 0.5rem;
247
- font-size: 0.8125rem;
248
- padding: 0.25rem 0.75rem 0.25rem 2.5rem;
249
- background-color: transparent;
250
- border: 1px solid var(--color-neutral-300);
251
- }
252
- .formfield__search::placeholder {
253
- color: var(--color-neutral-400);
254
- font-size: 0.8125rem;
255
- }
256
- .formfield__search:disabled {
257
- cursor: not-allowed;
258
- opacity: 0.5;
259
- }
260
- .formfield__search:focus-visible {
261
- outline: none;
262
- border-color: var(--focus-ring-color);
263
- box-shadow: 0 0 0 1px var(--focus-ring-color-soft);
264
- }
265
-
266
- /* ── ExpandableSearch's collapsed trigger button ─────────────────────────── */
267
- .header__round-btn {
268
- width: 2.5625rem;
269
- height: 2.5625rem;
270
- padding: 0;
271
- background-color: var(--color-ext-edeaf7);
272
- border-radius: 1.25rem;
273
- display: flex;
274
- align-items: center;
275
- justify-content: center;
276
- font-size: 0.875rem;
277
- }
278
- .header__round-btn:hover {
279
- background-color: var(--color-ext-e0daf0);
280
- }
281
-
282
- /* ── Loader (loader.tsx) — already plain CSS in the source app ──────────── */
283
- .fp-loader-overlay {
284
- position: fixed;
285
- inset: 0;
286
- z-index: 9999;
287
- display: flex;
288
- align-items: center;
289
- justify-content: center;
290
- background: rgba(255, 255, 255, 0.45);
291
- backdrop-filter: blur(2px);
292
- -webkit-backdrop-filter: blur(2px);
293
- opacity: 0;
294
- visibility: hidden;
295
- transition: opacity 0.25s ease, visibility 0.25s ease;
296
- pointer-events: none;
297
- }
298
- .fp-loader-overlay--visible {
299
- opacity: 1;
300
- visibility: visible;
301
- pointer-events: auto;
302
- }
303
- .fp-loader-content {
304
- display: flex;
305
- flex-direction: column;
306
- align-items: center;
307
- gap: 0.75rem;
308
- }
309
- .fp-loader-gif {
310
- width: 6rem;
311
- height: 6rem;
312
- object-fit: contain;
313
- mix-blend-mode: multiply;
314
- }
315
-
316
- /* ── Table structure (table.tsx) ──────────────────────────────────────────
317
- Only the classNames Table itself renders. Per-page column layouts
318
- (`.flows-cols`, `.appt-cols`, etc. — passed as the `variant` prop) are
319
- business/page-specific grid-template-columns and are NOT included here;
320
- supply your own to match your own data columns. Row/cell styling for the
321
- children you render inside Table is likewise left to you. */
322
- .item-table__wrapper {
323
- overflow-x: auto;
324
- border: 1px solid #f3f4f6;
325
- border-top: 0;
326
- border-bottom-left-radius: 1rem;
327
- border-bottom-right-radius: 1rem;
328
- background-color: #ffffff;
329
- margin-top: 0 !important;
330
- }
331
- .item-table__head {
332
- position: sticky;
333
- top: 0;
334
- z-index: 10;
335
- display: grid;
336
- align-items: center;
337
- gap: 0;
338
- min-width: 36rem;
339
- padding: 0.75rem 1.25rem;
340
- background-color: var(--color-ext-f8f9fa);
341
- border: 1px solid #f3f4f6;
342
- border-bottom: 0;
343
- border-top-left-radius: 1rem;
344
- border-top-right-radius: 1rem;
345
- }
346
- .item-table__head > div {
347
- font-size: 0.75rem;
348
- font-weight: 700;
349
- color: #9ca3af;
350
- text-transform: uppercase;
351
- letter-spacing: 0.04em;
352
- }
353
- .item-table__body {
354
- width: 100%;
355
- }
356
- .item-table__head--comfortable {
357
- border: 0;
358
- border-bottom: 1px solid;
359
- border-radius: 0;
360
- min-height: 2.375rem;
361
- background-color: var(--component-table-header-bg);
362
- border-color: var(--component-table-border);
363
- padding: 0.75rem 1.875rem;
364
- }
365
- .item-table__head--comfortable > div {
366
- font-size: 0.6875rem;
367
- color: var(--component-table-header-text);
368
- word-break: break-word;
369
- overflow-wrap: break-word;
370
- white-space: normal;
371
- line-height: normal;
372
- }
373
- .item-table__wrapper--comfortable {
374
- border: 0;
375
- border-radius: 0;
376
- background-color: transparent;
377
- }
378
- .item-table__content--comfortable {
379
- display: flex;
380
- flex-direction: column;
381
- gap: 0.5rem;
382
- padding: 0.5rem 0;
383
- }
384
- .item-table__head--scrollable {
385
- width: max-content;
386
- min-width: 100%;
387
- }
1
+ /* Component-specific styles these components render classNames for, beyond Tailwind
2
+ utilities and design tokens. Ported from the source app's src/styles/common.scss and
3
+ src/styles/mainstyles.css — originally SCSS nested under an app-specific `#fpneo {}`
4
+ Tailwind-important wrapper (would never match here) with Tailwind `@apply` directives.
5
+ Flattened to plain CSS with `@apply` resolved to literal declarations so this file has
6
+ zero build-step dependency on Sass or Tailwind. Page/business-specific styling (e.g.
7
+ Table's per-page `*-cols` grid-column layouts, and page overrides in clinical.scss) is
8
+ intentionally NOT included — bring your own for those. */
9
+
10
+ /* ── Card (card.tsx) ─────────────────────────────────────────────────────── */
11
+ .app-card {
12
+ background-color: #ffffff;
13
+ border-radius: 1.25rem;
14
+ border: 1px solid #f3f4f6;
15
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
16
+ transition-property: box-shadow;
17
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
18
+ transition-duration: 150ms;
19
+ display: flex;
20
+ flex-direction: column;
21
+ }
22
+ .app-card:hover {
23
+ box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
24
+ }
25
+ .app-card--editing {
26
+ border-color: var(--color-brand-purple);
27
+ box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
28
+ }
29
+
30
+ /* ── AppList (list.tsx) ──────────────────────────────────────────────────── */
31
+ .app-list-wrapper {
32
+ border: 1px solid #f3f4f6;
33
+ border-radius: 1rem;
34
+ overflow: hidden;
35
+ background-color: #ffffff;
36
+ }
37
+ .app-list-header {
38
+ position: sticky;
39
+ top: 0;
40
+ z-index: 10;
41
+ padding: 0.75rem 1.25rem;
42
+ background-color: var(--color-ext-f8f9fa);
43
+ border-bottom: 1px solid #e5e7eb;
44
+ }
45
+ .app-list-header > div {
46
+ font-size: 0.625rem;
47
+ font-weight: 500;
48
+ color: #9ca3af;
49
+ text-transform: uppercase;
50
+ letter-spacing: 0.05em;
51
+ }
52
+ .app-list-body {
53
+ width: 100%;
54
+ }
55
+ .app-list-row {
56
+ padding: 0.9375rem 1.25rem;
57
+ border-bottom: 1px solid #f3f4f6;
58
+ transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter;
59
+ transition-duration: 100ms;
60
+ }
61
+ .app-list-row:last-child {
62
+ border-bottom-width: 0;
63
+ }
64
+ .app-list-row:hover {
65
+ background-color: var(--color-ext-fafafa);
66
+ }
67
+ .app-list-row--editing {
68
+ background-color: rgb(238 242 255 / 0.4);
69
+ border-left: 2px solid var(--color-brand-purple);
70
+ }
71
+ .app-list-cell {
72
+ font-size: 0.8125rem;
73
+ color: #374151;
74
+ min-width: 0;
75
+ padding-right: 0.75rem;
76
+ }
77
+ .app-list-cell--muted {
78
+ color: #6b7280;
79
+ }
80
+ .app-list-cell--actions {
81
+ display: flex;
82
+ align-items: center;
83
+ gap: 0.125rem;
84
+ justify-content: flex-end;
85
+ padding-right: 0.25rem;
86
+ }
87
+
88
+ /* ── Switch (switch.tsx) ─────────────────────────────────────────────────── */
89
+ .switch-pill {
90
+ position: relative;
91
+ display: inline-flex;
92
+ flex-shrink: 0;
93
+ cursor: pointer;
94
+ align-items: center;
95
+ width: 2rem;
96
+ height: 1.125rem;
97
+ border-radius: 9999px;
98
+ padding: 0.125rem;
99
+ transition: background-color 0.25s ease-in-out;
100
+ }
101
+ .switch-pill:focus-within {
102
+ outline: none;
103
+ }
104
+ .switch-pill--on {
105
+ background-color: var(--color-ext-00c48c);
106
+ }
107
+ .switch-pill--off {
108
+ background-color: var(--color-neutral-450);
109
+ }
110
+ .switch-pill--disabled {
111
+ cursor: not-allowed;
112
+ opacity: 0.5;
113
+ }
114
+ .switch-pill__input {
115
+ position: absolute;
116
+ width: 1px;
117
+ height: 1px;
118
+ padding: 0;
119
+ margin: -1px;
120
+ overflow: hidden;
121
+ clip: rect(0, 0, 0, 0);
122
+ white-space: nowrap;
123
+ border-width: 0;
124
+ }
125
+ .switch-pill__thumb {
126
+ pointer-events: none;
127
+ display: block;
128
+ background-color: #ffffff;
129
+ width: 0.875rem;
130
+ height: 0.875rem;
131
+ border-radius: 9999px;
132
+ box-shadow: 0 1px 3px var(--color-ext-0000001f);
133
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
134
+ }
135
+ .switch-pill__thumb--on {
136
+ transform: translateX(0.875rem);
137
+ }
138
+ [dir="rtl"] .switch-pill__thumb--on {
139
+ transform: translateX(-0.875rem);
140
+ }
141
+ .switch-pill__thumb--off {
142
+ transform: translateX(0);
143
+ }
144
+
145
+ /* ── ViewToggle (view-toggle.tsx) ────────────────────────────────────────── */
146
+ .view-toggle {
147
+ display: flex;
148
+ align-items: center;
149
+ gap: 0.125rem;
150
+ background-color: #f3f4f6;
151
+ border-radius: 0.5rem;
152
+ padding: 0.25rem;
153
+ }
154
+ .view-toggle__btn {
155
+ display: flex;
156
+ align-items: center;
157
+ justify-content: center;
158
+ width: 2rem;
159
+ height: 2rem;
160
+ border-radius: 0.375rem;
161
+ transition-property: all;
162
+ transition-duration: 150ms;
163
+ color: var(--color-ext-888888);
164
+ opacity: 1 !important;
165
+ }
166
+ .view-toggle__btn:hover {
167
+ color: #4b5563;
168
+ background-color: #f3f4f6;
169
+ }
170
+ .view-toggle__btn:focus,
171
+ .view-toggle__btn:focus-visible {
172
+ outline: none;
173
+ box-shadow: none;
174
+ }
175
+ .view-toggle__btn--active {
176
+ background-color: #ffffff;
177
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
178
+ color: var(--color-brand-purple);
179
+ }
180
+ .view-toggle__btn--active:hover {
181
+ color: var(--color-brand-purple);
182
+ background-color: #ffffff;
183
+ }
184
+
185
+ /* ── DropdownMenu (dropdown-menu.tsx) ────────────────────────────────────── */
186
+ .dropdownHead {
187
+ position: fixed;
188
+ z-index: var(--zindex-overlay);
189
+ min-width: 12rem;
190
+ overflow: hidden;
191
+ border-radius: 0.75rem;
192
+ border: 1px solid #f3f4f6;
193
+ background-color: #ffffff;
194
+ padding-top: 0.5rem;
195
+ padding-bottom: 0.5rem;
196
+ box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
197
+ transition-property: opacity;
198
+ transition-duration: 150ms;
199
+ }
200
+ .dropdownInner {
201
+ position: relative;
202
+ display: flex;
203
+ cursor: pointer;
204
+ user-select: none;
205
+ align-items: center;
206
+ padding: 0.375rem 0.5rem;
207
+ font-size: 0.875rem;
208
+ line-height: 1.25rem;
209
+ outline: none;
210
+ transition-property: color, background-color, border-color;
211
+ transition-duration: 150ms;
212
+ }
213
+ .dropdownInner[data-disabled] {
214
+ pointer-events: none;
215
+ opacity: 0.5;
216
+ }
217
+
218
+ /* ── FormField / Input (form-field.tsx, expandable-search.tsx) ──────────── */
219
+ .form__field {
220
+ min-width: 0;
221
+ }
222
+ .form__field > * + * {
223
+ margin-top: 0.5rem;
224
+ }
225
+ .formfield__label {
226
+ font-size: 0.75rem;
227
+ font-weight: 500;
228
+ margin-bottom: 0.5rem;
229
+ display: block;
230
+ color: var(--color-text-primary);
231
+ }
232
+ .form-error {
233
+ font-size: 0.75rem;
234
+ line-height: 1rem;
235
+ color: #ef4444;
236
+ margin-top: 0.25rem;
237
+ }
238
+ .required-field {
239
+ color: #ef4444;
240
+ margin-left: 0.25rem;
241
+ }
242
+ .formfield__search {
243
+ display: flex;
244
+ height: 2.25rem;
245
+ width: 100%;
246
+ border-radius: 0.5rem;
247
+ font-size: 0.8125rem;
248
+ padding: 0.25rem 0.75rem 0.25rem 2.5rem;
249
+ background-color: transparent;
250
+ border: 1px solid var(--color-neutral-300);
251
+ }
252
+ .formfield__search::placeholder {
253
+ color: var(--color-neutral-400);
254
+ font-size: 0.8125rem;
255
+ }
256
+ .formfield__search:disabled {
257
+ cursor: not-allowed;
258
+ opacity: 0.5;
259
+ }
260
+ .formfield__search:focus-visible {
261
+ outline: none;
262
+ border-color: var(--focus-ring-color);
263
+ box-shadow: 0 0 0 1px var(--focus-ring-color-soft);
264
+ }
265
+
266
+ /* ── ExpandableSearch's collapsed trigger button ─────────────────────────── */
267
+ .header__round-btn {
268
+ width: 2.5625rem;
269
+ height: 2.5625rem;
270
+ padding: 0;
271
+ background-color: var(--color-ext-edeaf7);
272
+ border-radius: 1.25rem;
273
+ display: flex;
274
+ align-items: center;
275
+ justify-content: center;
276
+ font-size: 0.875rem;
277
+ }
278
+ .header__round-btn:hover {
279
+ background-color: var(--color-ext-e0daf0);
280
+ }
281
+
282
+ /* ── Loader (loader.tsx) — already plain CSS in the source app ──────────── */
283
+ .fp-loader-overlay {
284
+ position: fixed;
285
+ inset: 0;
286
+ z-index: 9999;
287
+ display: flex;
288
+ align-items: center;
289
+ justify-content: center;
290
+ background: rgba(255, 255, 255, 0.45);
291
+ backdrop-filter: blur(2px);
292
+ -webkit-backdrop-filter: blur(2px);
293
+ opacity: 0;
294
+ visibility: hidden;
295
+ transition: opacity 0.25s ease, visibility 0.25s ease;
296
+ pointer-events: none;
297
+ }
298
+ .fp-loader-overlay--visible {
299
+ opacity: 1;
300
+ visibility: visible;
301
+ pointer-events: auto;
302
+ }
303
+ .fp-loader-content {
304
+ display: flex;
305
+ flex-direction: column;
306
+ align-items: center;
307
+ gap: 0.75rem;
308
+ }
309
+ .fp-loader-gif {
310
+ width: 6rem;
311
+ height: 6rem;
312
+ object-fit: contain;
313
+ mix-blend-mode: multiply;
314
+ }
315
+
316
+ /* ── Table structure (table.tsx) ──────────────────────────────────────────
317
+ Only the classNames Table itself renders. Per-page column layouts
318
+ (`.flows-cols`, `.appt-cols`, etc. — passed as the `variant` prop) are
319
+ business/page-specific grid-template-columns and are NOT included here;
320
+ supply your own to match your own data columns. Row/cell styling for the
321
+ children you render inside Table is likewise left to you. */
322
+ .item-table__wrapper {
323
+ overflow-x: auto;
324
+ border: 1px solid #f3f4f6;
325
+ border-top: 0;
326
+ border-bottom-left-radius: 1rem;
327
+ border-bottom-right-radius: 1rem;
328
+ background-color: #ffffff;
329
+ margin-top: 0 !important;
330
+ }
331
+ .item-table__head {
332
+ position: sticky;
333
+ top: 0;
334
+ z-index: 10;
335
+ display: grid;
336
+ align-items: center;
337
+ gap: 0;
338
+ min-width: 36rem;
339
+ padding: 0.75rem 1.25rem;
340
+ background-color: var(--color-ext-f8f9fa);
341
+ border: 1px solid #f3f4f6;
342
+ border-bottom: 0;
343
+ border-top-left-radius: 1rem;
344
+ border-top-right-radius: 1rem;
345
+ }
346
+ .item-table__head > div {
347
+ font-size: 0.75rem;
348
+ font-weight: 700;
349
+ color: #9ca3af;
350
+ text-transform: uppercase;
351
+ letter-spacing: 0.04em;
352
+ }
353
+ .item-table__body {
354
+ width: 100%;
355
+ }
356
+ .item-table__head--comfortable {
357
+ border: 0;
358
+ border-bottom: 1px solid;
359
+ border-radius: 0;
360
+ min-height: 2.375rem;
361
+ background-color: var(--component-table-header-bg);
362
+ border-color: var(--component-table-border);
363
+ padding: 0.75rem 1.875rem;
364
+ }
365
+ .item-table__head--comfortable > div {
366
+ font-size: 0.6875rem;
367
+ color: var(--component-table-header-text);
368
+ word-break: break-word;
369
+ overflow-wrap: break-word;
370
+ white-space: normal;
371
+ line-height: normal;
372
+ }
373
+ .item-table__wrapper--comfortable {
374
+ border: 0;
375
+ border-radius: 0;
376
+ background-color: transparent;
377
+ }
378
+ .item-table__content--comfortable {
379
+ display: flex;
380
+ flex-direction: column;
381
+ gap: 0.5rem;
382
+ padding: 0.5rem 0;
383
+ }
384
+ .item-table__head--scrollable {
385
+ width: max-content;
386
+ min-width: 100%;
387
+ }