@getmicdrop/svelte-components 5.18.2 → 5.20.0
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.
- package/dist/base.css +18 -0
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte +10 -8
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte.d.ts.map +1 -1
- package/dist/components/Heading.svelte +8 -2
- package/dist/components/Heading.svelte.d.ts +1 -0
- package/dist/components/Heading.svelte.d.ts.map +1 -1
- package/dist/components/Text.svelte +13 -2
- package/dist/components/Text.svelte.d.ts +2 -1
- package/dist/components/Text.svelte.d.ts.map +1 -1
- package/dist/constants/formOptions.d.ts +2 -5
- package/dist/constants/formOptions.d.ts.map +1 -1
- package/dist/constants/formOptions.js +6 -6
- package/dist/constants/formOptions.spec.js +2 -7
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -2
- package/dist/patterns/forms/FormSection.svelte +2 -1
- package/dist/patterns/forms/FormSection.svelte.d.ts +2 -0
- package/dist/patterns/forms/FormSection.svelte.d.ts.map +1 -1
- package/dist/patterns/layout/SidebarTestWrapper.svelte.d.ts +1 -1
- package/dist/patterns/navigation/Header.svelte +3 -3
- package/dist/primitives/Input/Select.svelte +1 -1
- package/dist/primitives/Pagination/DotIndicator.svelte +66 -0
- package/dist/primitives/Pagination/DotIndicator.svelte.d.ts +18 -0
- package/dist/primitives/Pagination/DotIndicator.svelte.d.ts.map +1 -0
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/index.js +1 -0
- package/dist/recipes/inputs/phoneInput/CountrySelector.svelte +1 -1
- package/dist/recipes/modals/FeedbackModal.svelte +205 -0
- package/dist/recipes/modals/FeedbackModal.svelte.d.ts +24 -0
- package/dist/recipes/modals/FeedbackModal.svelte.d.ts.map +1 -0
- package/dist/recipes/modals/index.d.ts +1 -0
- package/dist/recipes/modals/index.js +1 -0
- package/dist/schemas/event.d.ts +4 -4
- package/dist/schemas/order.d.ts +2 -2
- package/dist/schemas/promo.d.ts +4 -4
- package/dist/services/event.service.d.ts +11 -0
- package/dist/services/event.service.d.ts.map +1 -0
- package/dist/services/event.service.js +64 -0
- package/dist/services/event.service.spec.d.ts +2 -0
- package/dist/services/event.service.spec.d.ts.map +1 -0
- package/dist/services/event.service.spec.js +168 -0
- package/dist/services/{ShowService.d.ts → show.service.d.ts} +1 -1
- package/dist/services/show.service.d.ts.map +1 -0
- package/dist/services/show.service.js +115 -0
- package/dist/services/show.service.spec.d.ts +2 -0
- package/dist/services/show.service.spec.d.ts.map +1 -0
- package/dist/services/show.service.spec.js +242 -0
- package/dist/tailwind/preset.cjs +5 -0
- package/dist/tailwind/preset.d.cts +2 -0
- package/dist/tailwind/preset.d.cts.map +1 -1
- package/dist/tokens/__tests__/spacing.test.js +2 -2
- package/dist/tokens/base-resets.css +124 -0
- package/dist/tokens/spacing.d.ts +2 -0
- package/dist/tokens/spacing.d.ts.map +1 -1
- package/dist/tokens/spacing.js +1 -0
- package/dist/tokens/tokens.css +1 -1
- package/dist/tokens/utilities.css +79 -2
- package/dist/utils/apiConfig.js +1 -1
- package/dist/utils/apiConfig.spec.js +34 -27
- package/dist/utils/assets.d.ts +3 -0
- package/dist/utils/assets.d.ts.map +1 -0
- package/dist/utils/assets.js +3 -0
- package/dist/utils/classNames.d.ts +10 -0
- package/dist/utils/classNames.d.ts.map +1 -0
- package/dist/utils/classNames.js +15 -0
- package/dist/utils/clickOutside.d.ts +4 -0
- package/dist/utils/clickOutside.d.ts.map +1 -0
- package/dist/utils/clickOutside.js +13 -0
- package/dist/utils/cookieHelpers.d.ts +40 -0
- package/dist/utils/cookieHelpers.d.ts.map +1 -0
- package/dist/utils/cookieHelpers.js +102 -0
- package/dist/utils/dateHelpers.d.ts +71 -0
- package/dist/utils/dateHelpers.d.ts.map +1 -0
- package/dist/utils/dateHelpers.js +253 -0
- package/dist/utils/eventFormatters.d.ts +9 -0
- package/dist/utils/eventFormatters.d.ts.map +1 -0
- package/dist/utils/eventFormatters.js +96 -0
- package/dist/utils/feedbackContext.d.ts +24 -0
- package/dist/utils/feedbackContext.d.ts.map +1 -0
- package/dist/utils/feedbackContext.js +19 -0
- package/dist/utils/fetchHelpers.d.ts +17 -0
- package/dist/utils/fetchHelpers.d.ts.map +1 -0
- package/dist/utils/fetchHelpers.js +45 -0
- package/dist/utils/focusTrap.d.ts +20 -0
- package/dist/utils/focusTrap.d.ts.map +1 -0
- package/dist/utils/focusTrap.js +130 -0
- package/dist/utils/formatters.d.ts +56 -0
- package/dist/utils/formatters.d.ts.map +1 -1
- package/dist/utils/formatters.js +121 -1
- package/dist/utils/formatters.spec.js +128 -1
- package/dist/utils/logger.d.ts +25 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +59 -1
- package/dist/utils/logger.spec.js +99 -1
- package/dist/utils/permissions.d.ts +9 -0
- package/dist/utils/permissions.d.ts.map +1 -0
- package/dist/utils/permissions.js +93 -0
- package/dist/utils/stringHelpers.d.ts +17 -0
- package/dist/utils/stringHelpers.d.ts.map +1 -0
- package/dist/utils/stringHelpers.js +38 -0
- package/dist/utils/transitions.d.ts +99 -1
- package/dist/utils/transitions.d.ts.map +1 -1
- package/dist/utils/transitions.js +144 -2
- package/dist/utils/utils/utils.d.ts +2 -73
- package/dist/utils/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils/utils.js +2 -2
- package/dist/utils/utils.d.ts +41 -98
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +58 -701
- package/package.json +16 -3
- package/dist/services/EventService.d.ts +0 -5
- package/dist/services/EventService.d.ts.map +0 -1
- package/dist/services/EventService.js +0 -79
- package/dist/services/EventService.spec.d.ts +0 -2
- package/dist/services/EventService.spec.d.ts.map +0 -1
- package/dist/services/EventService.spec.js +0 -217
- package/dist/services/ShowService.d.ts.map +0 -1
- package/dist/services/ShowService.js +0 -144
- package/dist/services/ShowService.spec.d.ts +0 -2
- package/dist/services/ShowService.spec.d.ts.map +0 -1
- package/dist/services/ShowService.spec.js +0 -345
package/dist/base.css
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
BASE CSS
|
|
3
|
+
Single entry point for all Micdrop shared CSS.
|
|
4
|
+
Import this in every consuming app's CSS file.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
@import '@getmicdrop/svelte-components/base';
|
|
8
|
+
|
|
9
|
+
Includes:
|
|
10
|
+
- Color tokens (light + dark mode variables)
|
|
11
|
+
- Typography base styles (heading/body defaults)
|
|
12
|
+
- Utility classes (layout, text, cards, badges, etc.)
|
|
13
|
+
- Base resets (form fixes, a11y, iOS, desktop scaling)
|
|
14
|
+
========================================================================== */
|
|
15
|
+
@import './tokens/tokens.css';
|
|
16
|
+
@import './tokens/typography-base.css';
|
|
17
|
+
@import './tokens/utilities.css';
|
|
18
|
+
@import './tokens/base-resets.css';
|
|
@@ -73,6 +73,8 @@
|
|
|
73
73
|
const SWIPE_THRESHOLD = 0.15;
|
|
74
74
|
const VELOCITY_THRESHOLD = 0.3;
|
|
75
75
|
const DRAG_RESISTANCE = 0.8;
|
|
76
|
+
/** Shadow color for swipe drag effect (black with dynamic opacity) */
|
|
77
|
+
const SWIPE_SHADOW_COLOR = 'rgba(0,0,0,';
|
|
76
78
|
|
|
77
79
|
let MONTH_NAMES = $derived(labels.monthNames);
|
|
78
80
|
let DAY_NAMES = $derived(labels.dayNames);
|
|
@@ -439,9 +441,9 @@
|
|
|
439
441
|
const spreadRadius = shadowIntensity * 4;
|
|
440
442
|
|
|
441
443
|
if (diffX > 0) {
|
|
442
|
-
calendarGridElement.style.boxShadow = `-${spreadRadius}px 0 ${blurRadius}px
|
|
444
|
+
calendarGridElement.style.boxShadow = `-${spreadRadius}px 0 ${blurRadius}px ${SWIPE_SHADOW_COLOR}${shadowIntensity})`;
|
|
443
445
|
} else {
|
|
444
|
-
calendarGridElement.style.boxShadow = `${spreadRadius}px 0 ${blurRadius}px
|
|
446
|
+
calendarGridElement.style.boxShadow = `${spreadRadius}px 0 ${blurRadius}px ${SWIPE_SHADOW_COLOR}${shadowIntensity})`;
|
|
445
447
|
}
|
|
446
448
|
}
|
|
447
449
|
}
|
|
@@ -544,9 +546,9 @@
|
|
|
544
546
|
const spreadRadius = shadowIntensity * 4;
|
|
545
547
|
|
|
546
548
|
if (diffX > 0) {
|
|
547
|
-
calendarGridElement.style.boxShadow = `-${spreadRadius}px 0 ${blurRadius}px
|
|
549
|
+
calendarGridElement.style.boxShadow = `-${spreadRadius}px 0 ${blurRadius}px ${SWIPE_SHADOW_COLOR}${shadowIntensity})`;
|
|
548
550
|
} else {
|
|
549
|
-
calendarGridElement.style.boxShadow = `${spreadRadius}px 0 ${blurRadius}px
|
|
551
|
+
calendarGridElement.style.boxShadow = `${spreadRadius}px 0 ${blurRadius}px ${SWIPE_SHADOW_COLOR}${shadowIntensity})`;
|
|
550
552
|
}
|
|
551
553
|
}
|
|
552
554
|
}
|
|
@@ -739,7 +741,7 @@
|
|
|
739
741
|
{/each}
|
|
740
742
|
|
|
741
743
|
{#each prevMonthPreviewDays as previewDay}
|
|
742
|
-
<div class="flex flex-col items-center justify-start px-1 py-0.5 min-h-[56px] sm:min-h-[60px] md:min-h-[70px] lg:min-h-[80px] pointer-events-none bg-transparent
|
|
744
|
+
<div class="flex flex-col items-center justify-start px-1 py-0.5 min-h-[56px] sm:min-h-[60px] md:min-h-[70px] lg:min-h-[80px] pointer-events-none bg-transparent border-b border-gray-200 dark:border-gray-700 sm:border-b-0 sm:p-2 sm:border-t sm:border-l sm:border-gray-200 sm:dark:border-gray-700 last:sm:border-r" role="gridcell" aria-disabled="true">
|
|
743
745
|
<span class="{typography.sm} text-gray-300 dark:text-gray-600 w-full text-center sm:text-lg sm:font-normal sm:text-right sm:mb-2">{previewDay.day}</span>
|
|
744
746
|
</div>
|
|
745
747
|
{/each}
|
|
@@ -748,8 +750,8 @@
|
|
|
748
750
|
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
749
751
|
<div
|
|
750
752
|
class="flex flex-col items-center justify-start px-1 py-0.5 min-h-[56px] sm:min-h-[60px] md:min-h-[70px] lg:min-h-[80px] select-none
|
|
751
|
-
|
|
752
|
-
sm:
|
|
753
|
+
border-b border-gray-200 dark:border-gray-700
|
|
754
|
+
sm:border-b-0 sm:p-2 sm:border-t sm:border-l sm:border-gray-200 sm:dark:border-gray-700
|
|
753
755
|
{day.isPast && variant === 'availability' ? 'bg-gray-100 dark:bg-gray-700 cursor-default' : ''}
|
|
754
756
|
{day.isPast && day.isSelected && variant === 'availability' ? 'bg-blue-100 dark:bg-blue-900/30 cursor-default' : ''}
|
|
755
757
|
{day.isSelected && !day.isPast && variant === 'availability' ? 'bg-blue-700 dark:bg-blue-600' : ''}
|
|
@@ -779,7 +781,7 @@
|
|
|
779
781
|
{/each}
|
|
780
782
|
|
|
781
783
|
{#each nextMonthPreviewDays as previewDay}
|
|
782
|
-
<div class="flex flex-col items-center justify-start px-1 py-0.5 min-h-[56px] sm:min-h-[60px] md:min-h-[70px] lg:min-h-[80px] pointer-events-none bg-transparent
|
|
784
|
+
<div class="flex flex-col items-center justify-start px-1 py-0.5 min-h-[56px] sm:min-h-[60px] md:min-h-[70px] lg:min-h-[80px] pointer-events-none bg-transparent border-b border-gray-200 dark:border-gray-700 sm:p-2 sm:border-t sm:border-l sm:border-gray-200 sm:dark:border-gray-700 last:sm:border-r" role="gridcell" aria-disabled="true">
|
|
783
785
|
<span class="{typography.sm} text-gray-300 dark:text-gray-600 w-full text-center sm:text-lg sm:font-normal sm:text-right sm:mb-2">{previewDay.day}</span>
|
|
784
786
|
</div>
|
|
785
787
|
{/each}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MiniMonthCalendar.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/calendar/Calendar/MiniMonthCalendar.svelte.js"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"MiniMonthCalendar.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/calendar/Calendar/MiniMonthCalendar.svelte.js"],"names":[],"mappings":";;;;;AAuuBA;cApsB+B,MAAM;oBAAkB,GAAG,EAAE;aAAW,GAAG,EAAE;iBAAe,MAAM;iBAAe,OAAO;qBAAmB,OAAO;sBAAoB,OAAO;eAAa,OAAO;yBAAuB,OAAO;4BAA0B,OAAO;kBAAgB,GAAG;gBAAc,GAAG;mBAAiB,GAAG;aAAW,MAAM;aAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;wBAosBtS;wBApsB7C;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,GAAG,CAAC;IAAC,UAAU,EAAE,GAAG,CAAC;IAAC,aAAa,EAAE,GAAG,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
level?: 1 | 2 | 3 | 4 | 5 | 6;
|
|
6
6
|
size?: 'xs' | 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';
|
|
7
7
|
weight?: 'normal' | 'medium' | 'semibold' | 'bold';
|
|
8
|
+
color?: 'default' | 'none';
|
|
8
9
|
class?: string;
|
|
9
10
|
id?: string;
|
|
10
11
|
children: Snippet;
|
|
@@ -14,6 +15,7 @@
|
|
|
14
15
|
level = 2,
|
|
15
16
|
size = 'lg',
|
|
16
17
|
weight,
|
|
18
|
+
color = 'default',
|
|
17
19
|
class: className = '',
|
|
18
20
|
id,
|
|
19
21
|
children,
|
|
@@ -39,10 +41,14 @@
|
|
|
39
41
|
bold: 'font-bold',
|
|
40
42
|
};
|
|
41
43
|
|
|
42
|
-
const
|
|
44
|
+
const colorClasses: Record<string, string> = {
|
|
45
|
+
default: 'text-gray-900 dark:text-white',
|
|
46
|
+
none: '',
|
|
47
|
+
};
|
|
43
48
|
let sizeClass = $derived(sizeClasses[size] || 'text-lg');
|
|
44
49
|
let weightClass = $derived(weight ? weightClasses[weight] : '');
|
|
45
|
-
let
|
|
50
|
+
let colorClass = $derived(colorClasses[color] || '');
|
|
51
|
+
let classes = $derived(`${colorClass} ${sizeClass} ${weightClass} ${className}`.trim());
|
|
46
52
|
</script>
|
|
47
53
|
|
|
48
54
|
{#if level === 1}
|
|
@@ -3,6 +3,7 @@ interface Props {
|
|
|
3
3
|
level?: 1 | 2 | 3 | 4 | 5 | 6;
|
|
4
4
|
size?: 'xs' | 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';
|
|
5
5
|
weight?: 'normal' | 'medium' | 'semibold' | 'bold';
|
|
6
|
+
color?: 'default' | 'none';
|
|
6
7
|
class?: string;
|
|
7
8
|
id?: string;
|
|
8
9
|
children: Snippet;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Heading.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/Heading.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGpC,UAAU,KAAK;IACb,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IACjF,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"Heading.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/Heading.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGpC,UAAU,KAAK;IACb,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IACjF,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IACnD,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;CACnB;AA6DH,QAAA,MAAM,OAAO,2CAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
|
|
@@ -2,14 +2,16 @@
|
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
|
|
4
4
|
interface Props {
|
|
5
|
+
as?: 'span' | 'p' | 'label' | 'div';
|
|
5
6
|
size?: 'xs' | 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl';
|
|
6
7
|
leading?: 'none' | 'tight' | 'snug' | 'normal' | 'relaxed' | 'loose';
|
|
7
|
-
color?: 'default' | 'muted' | 'primary' | 'secondary' | 'success' | 'warning' | 'error';
|
|
8
|
+
color?: 'default' | 'muted' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'none';
|
|
8
9
|
class?: string;
|
|
9
10
|
children: Snippet;
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
let {
|
|
14
|
+
as = 'span',
|
|
13
15
|
size = 'md',
|
|
14
16
|
leading,
|
|
15
17
|
color = 'default',
|
|
@@ -35,6 +37,7 @@
|
|
|
35
37
|
success: 'text-green-600 dark:text-green-400',
|
|
36
38
|
warning: 'text-yellow-600 dark:text-yellow-400',
|
|
37
39
|
error: 'text-red-600 dark:text-red-400',
|
|
40
|
+
none: '',
|
|
38
41
|
};
|
|
39
42
|
|
|
40
43
|
const leadingClasses: Record<string, string> = {
|
|
@@ -50,4 +53,12 @@
|
|
|
50
53
|
let classes = $derived(`${sizeClasses[size] || 'text-base'} ${leadingClass} ${colorClasses[color] || ''} ${className}`.trim());
|
|
51
54
|
</script>
|
|
52
55
|
|
|
53
|
-
|
|
56
|
+
{#if as === 'p'}
|
|
57
|
+
<p class={classes}>{@render children()}</p>
|
|
58
|
+
{:else if as === 'label'}
|
|
59
|
+
<label class={classes}>{@render children()}</label>
|
|
60
|
+
{:else if as === 'div'}
|
|
61
|
+
<div class={classes}>{@render children()}</div>
|
|
62
|
+
{:else}
|
|
63
|
+
<span class={classes}>{@render children()}</span>
|
|
64
|
+
{/if}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
2
|
interface Props {
|
|
3
|
+
as?: 'span' | 'p' | 'label' | 'div';
|
|
3
4
|
size?: 'xs' | 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl';
|
|
4
5
|
leading?: 'none' | 'tight' | 'snug' | 'normal' | 'relaxed' | 'loose';
|
|
5
|
-
color?: 'default' | 'muted' | 'primary' | 'secondary' | 'success' | 'warning' | 'error';
|
|
6
|
+
color?: 'default' | 'muted' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'none';
|
|
6
7
|
class?: string;
|
|
7
8
|
children: Snippet;
|
|
8
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Text.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/Text.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGpC,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;IACzD,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IACrE,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Text.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/Text.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGpC,UAAU,KAAK;IACb,EAAE,CAAC,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,KAAK,CAAC;IACpC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;IACzD,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IACrE,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IACjG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AA4DH,QAAA,MAAM,IAAI,2CAAwC,CAAC;AACnD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,CAAC"}
|
|
@@ -7,13 +7,10 @@
|
|
|
7
7
|
* import { GENDER_OPTIONS } from '@getmicdrop/svelte-components/constants/formOptions';
|
|
8
8
|
* <Select items={GENDER_OPTIONS} label="Gender" />
|
|
9
9
|
*/
|
|
10
|
-
export const GENDER_OPTIONS:
|
|
11
|
-
name: string;
|
|
12
|
-
value: null;
|
|
13
|
-
} | {
|
|
10
|
+
export const GENDER_OPTIONS: {
|
|
14
11
|
name: string;
|
|
15
12
|
value: number;
|
|
16
|
-
}
|
|
13
|
+
}[];
|
|
17
14
|
export const GENDER_OPTIONS_VALUE_LABEL: {
|
|
18
15
|
value: number;
|
|
19
16
|
label: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formOptions.d.ts","sourceRoot":"","sources":["../../src/lib/constants/formOptions.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"formOptions.d.ts","sourceRoot":"","sources":["../../src/lib/constants/formOptions.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;IAKE;AAIF;;;IAIE;AAGF;;;IAQE;AAGF,uCAQE"}
|
|
@@ -9,20 +9,20 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
// Primary format: { name, value } for Select/MultiSelect components
|
|
12
|
+
// Backend: 0=Unspecified, 1=Male, 2=Female, 3=Non-binary
|
|
12
13
|
export const GENDER_OPTIONS = [
|
|
13
|
-
{ name: "", value:
|
|
14
|
+
{ name: "", value: 0 },
|
|
14
15
|
{ name: "Male", value: 1 },
|
|
15
16
|
{ name: "Female", value: 2 },
|
|
16
17
|
{ name: "Non-binary", value: 3 },
|
|
17
|
-
{ name: "Rather not say", value: 4 },
|
|
18
18
|
];
|
|
19
19
|
|
|
20
20
|
// Alternative format: { value, label } for components using that convention
|
|
21
|
+
// Backend: 0=Unspecified, 1=Male, 2=Female, 3=Non-binary
|
|
21
22
|
export const GENDER_OPTIONS_VALUE_LABEL = [
|
|
22
|
-
{ value:
|
|
23
|
-
{ value:
|
|
24
|
-
{ value:
|
|
25
|
-
{ value: 3, label: 'Rather not say' },
|
|
23
|
+
{ value: 1, label: 'Male' },
|
|
24
|
+
{ value: 2, label: 'Female' },
|
|
25
|
+
{ value: 3, label: 'Non-binary' },
|
|
26
26
|
];
|
|
27
27
|
|
|
28
28
|
// Primary format: { name, value } for Select/MultiSelect components
|
|
@@ -6,8 +6,8 @@ describe('formOptions', () => {
|
|
|
6
6
|
expect(GENDER_OPTIONS).toBeDefined();
|
|
7
7
|
expect(Array.isArray(GENDER_OPTIONS)).toBe(true);
|
|
8
8
|
});
|
|
9
|
-
it('has
|
|
10
|
-
expect(GENDER_OPTIONS.length).toBe(
|
|
9
|
+
it('has four options (empty placeholder + male/female/non-binary)', () => {
|
|
10
|
+
expect(GENDER_OPTIONS.length).toBe(4);
|
|
11
11
|
});
|
|
12
12
|
it('contains Male option with value 1', () => {
|
|
13
13
|
const male = GENDER_OPTIONS.find(opt => opt.name === 'Male');
|
|
@@ -24,11 +24,6 @@ describe('formOptions', () => {
|
|
|
24
24
|
expect(nonBinary).toBeDefined();
|
|
25
25
|
expect(nonBinary.value).toBe(3);
|
|
26
26
|
});
|
|
27
|
-
it('contains Rather not say option with value 4', () => {
|
|
28
|
-
const ratherNotSay = GENDER_OPTIONS.find(opt => opt.name === 'Rather not say');
|
|
29
|
-
expect(ratherNotSay).toBeDefined();
|
|
30
|
-
expect(ratherNotSay.value).toBe(4);
|
|
31
|
-
});
|
|
32
27
|
it('each option has name and value properties', () => {
|
|
33
28
|
GENDER_OPTIONS.forEach(option => {
|
|
34
29
|
expect(option).toHaveProperty('name');
|
package/dist/index.d.ts
CHANGED
|
@@ -6,11 +6,15 @@ export * from "./calendar/index.js";
|
|
|
6
6
|
export * from "./constants/formOptions.js";
|
|
7
7
|
export * from "./constants/validation.js";
|
|
8
8
|
export * from "./presets/index.js";
|
|
9
|
+
export { clickOutside } from "./utils/clickOutside.js";
|
|
10
|
+
export { focusTrap } from "./utils/focusTrap.js";
|
|
9
11
|
export { portal } from "./utils/portal.js";
|
|
10
|
-
export { roundCurrency } from "./utils/formatters.js";
|
|
11
12
|
export { typography } from "./tokens/typography.js";
|
|
12
13
|
export type HapticStyle = import("./utils/haptic.js").HapticStyle;
|
|
13
|
-
export { safeSlide, bloom } from "./utils/transitions.js";
|
|
14
|
+
export { safeSlide, bloom, fadeScale, slideUp, slideInLeft, popIn, staggerDelay, crossFadeParams, prefersReducedMotion, getAnimationDuration, DURATION, EASING, ANIMATION_CLASSES } from "./utils/transitions.js";
|
|
14
15
|
export { optimizeImage, supportsWebP, createImage } from "./utils/imageOptimizer.js";
|
|
16
|
+
export { roundCurrency, formatCurrency, formatDate, formatDateTime, formatTime, formatNumber, formatPhoneNumber, truncateTitle } from "./utils/formatters.js";
|
|
17
|
+
export { classNames, cn } from "./utils/classNames.js";
|
|
18
|
+
export { getDays, getDaysNumberOptions } from "./utils/dateHelpers.js";
|
|
15
19
|
export { triggerHaptic, isHapticAvailable, getHapticForButtonVariant } from "./utils/haptic.js";
|
|
16
20
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.js"],"names":[],"mappings":";;;;;;;;;;;;0BAiFc,OAAO,mBAAmB,EAAE,WAAW"}
|
package/dist/index.js
CHANGED
|
@@ -43,10 +43,37 @@ export * from './constants/validation.js';
|
|
|
43
43
|
export * from './presets/index.js';
|
|
44
44
|
|
|
45
45
|
// Utils / Actions
|
|
46
|
+
export { clickOutside } from './utils/clickOutside.js';
|
|
47
|
+
export { focusTrap } from './utils/focusTrap.js';
|
|
46
48
|
export { portal } from './utils/portal.js';
|
|
47
|
-
export {
|
|
49
|
+
export {
|
|
50
|
+
safeSlide,
|
|
51
|
+
bloom,
|
|
52
|
+
fadeScale,
|
|
53
|
+
slideUp,
|
|
54
|
+
slideInLeft,
|
|
55
|
+
popIn,
|
|
56
|
+
staggerDelay,
|
|
57
|
+
crossFadeParams,
|
|
58
|
+
prefersReducedMotion,
|
|
59
|
+
getAnimationDuration,
|
|
60
|
+
DURATION,
|
|
61
|
+
EASING,
|
|
62
|
+
ANIMATION_CLASSES,
|
|
63
|
+
} from './utils/transitions.js';
|
|
48
64
|
export { optimizeImage, supportsWebP, createImage } from './utils/imageOptimizer.js';
|
|
49
|
-
export {
|
|
65
|
+
export {
|
|
66
|
+
roundCurrency,
|
|
67
|
+
formatCurrency,
|
|
68
|
+
formatDate,
|
|
69
|
+
formatDateTime,
|
|
70
|
+
formatTime,
|
|
71
|
+
formatNumber,
|
|
72
|
+
formatPhoneNumber,
|
|
73
|
+
truncateTitle,
|
|
74
|
+
} from './utils/formatters.js';
|
|
75
|
+
export { classNames, cn } from './utils/classNames.js';
|
|
76
|
+
export { getDays, getDaysNumberOptions } from './utils/dateHelpers.js';
|
|
50
77
|
export {
|
|
51
78
|
triggerHaptic,
|
|
52
79
|
isHapticAvailable,
|
|
@@ -4,13 +4,14 @@
|
|
|
4
4
|
let {
|
|
5
5
|
title = '',
|
|
6
6
|
description = '',
|
|
7
|
+
bordered = false,
|
|
7
8
|
divider = false,
|
|
8
9
|
class: className = '',
|
|
9
10
|
children,
|
|
10
11
|
} = $props();
|
|
11
12
|
</script>
|
|
12
13
|
|
|
13
|
-
<section class="space-y-4 {className}">
|
|
14
|
+
<section class="space-y-4 {bordered ? 'border border-gray-200 dark:border-gray-700 rounded-lg p-4' : ''} {className}">
|
|
14
15
|
{#if divider}
|
|
15
16
|
<hr class="border-gray-200 dark:border-gray-700" />
|
|
16
17
|
{/if}
|
|
@@ -6,6 +6,7 @@ type FormSection = {
|
|
|
6
6
|
declare const FormSection: import("svelte").Component<{
|
|
7
7
|
title?: string;
|
|
8
8
|
description?: string;
|
|
9
|
+
bordered?: boolean;
|
|
9
10
|
divider?: boolean;
|
|
10
11
|
class?: string;
|
|
11
12
|
children: any;
|
|
@@ -13,6 +14,7 @@ declare const FormSection: import("svelte").Component<{
|
|
|
13
14
|
type $$ComponentProps = {
|
|
14
15
|
title?: string;
|
|
15
16
|
description?: string;
|
|
17
|
+
bordered?: boolean;
|
|
16
18
|
divider?: boolean;
|
|
17
19
|
class?: string;
|
|
18
20
|
children: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormSection.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/patterns/forms/FormSection.svelte.js"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"FormSection.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/patterns/forms/FormSection.svelte.js"],"names":[],"mappings":";;;;;AAyCA;YAjC6B,MAAM;kBAAgB,MAAM;eAAa,OAAO;cAAY,OAAO;YAAU,MAAM;cAAY,GAAG;WAiCrE;wBAjCvC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAA;CAAE"}
|
|
@@ -2,7 +2,7 @@ export default SidebarTestWrapper;
|
|
|
2
2
|
type SidebarTestWrapper = {
|
|
3
3
|
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
4
|
$set?(props: Partial<{
|
|
5
|
-
sidebarWidth?: "
|
|
5
|
+
sidebarWidth?: "narrow" | "medium" | "wide" | undefined;
|
|
6
6
|
sidebarPosition?: "left" | "right" | undefined;
|
|
7
7
|
class?: string | undefined;
|
|
8
8
|
showSidebar?: boolean | undefined;
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
size="md"
|
|
108
108
|
onclick={() => showDesktopDropdown = !showDesktopDropdown}
|
|
109
109
|
>
|
|
110
|
-
<Avatar src={avatar}
|
|
110
|
+
<Avatar src={avatar} size="md" />
|
|
111
111
|
</AvatarButton>
|
|
112
112
|
|
|
113
113
|
{#if showDesktopDropdown}
|
|
@@ -167,7 +167,7 @@
|
|
|
167
167
|
class="block md:hidden"
|
|
168
168
|
onclick={() => showMobileSheet = true}
|
|
169
169
|
>
|
|
170
|
-
<Avatar src={avatar}
|
|
170
|
+
<Avatar src={avatar} size="md" />
|
|
171
171
|
</AvatarButton>
|
|
172
172
|
|
|
173
173
|
<AvatarButton
|
|
@@ -175,7 +175,7 @@
|
|
|
175
175
|
class="hidden md:block"
|
|
176
176
|
onclick={() => showDesktopDropdown = !showDesktopDropdown}
|
|
177
177
|
>
|
|
178
|
-
<Avatar src={avatar}
|
|
178
|
+
<Avatar src={avatar} size="md" />
|
|
179
179
|
</AvatarButton>
|
|
180
180
|
|
|
181
181
|
{#if showDesktopDropdown}
|
|
@@ -229,7 +229,7 @@
|
|
|
229
229
|
<ul
|
|
230
230
|
bind:this={dropdownElement}
|
|
231
231
|
use:portalAction
|
|
232
|
-
class="fixed z-[
|
|
232
|
+
class="fixed z-[100] bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg max-h-60 overflow-y-auto py-1"
|
|
233
233
|
style="top: {dropdownPosition.top}px; left: {dropdownPosition.left}px; width: {dropdownPosition.width}px;"
|
|
234
234
|
role="listbox"
|
|
235
235
|
tabindex="-1"
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Total number of items */
|
|
4
|
+
count: number;
|
|
5
|
+
/** Currently active index (0-based) */
|
|
6
|
+
activeIndex?: number;
|
|
7
|
+
/** Dot size */
|
|
8
|
+
size?: 'sm' | 'md' | 'lg';
|
|
9
|
+
/** Color scheme */
|
|
10
|
+
variant?: 'light' | 'dark';
|
|
11
|
+
/** Called when a dot is clicked */
|
|
12
|
+
onselect?: (index: number) => void;
|
|
13
|
+
/** Additional CSS classes on the container */
|
|
14
|
+
class?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let {
|
|
18
|
+
count,
|
|
19
|
+
activeIndex = 0,
|
|
20
|
+
size = 'md',
|
|
21
|
+
variant = 'dark',
|
|
22
|
+
onselect,
|
|
23
|
+
class: className = '',
|
|
24
|
+
}: Props = $props();
|
|
25
|
+
|
|
26
|
+
const sizeClasses: Record<string, { dot: string; active: string }> = {
|
|
27
|
+
sm: { dot: 'h-1.5 w-1.5', active: 'scale-125' },
|
|
28
|
+
md: { dot: 'h-2.5 w-2.5', active: 'scale-125' },
|
|
29
|
+
lg: { dot: 'h-3 w-3', active: 'scale-125' },
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const variantClasses: Record<string, { active: string; inactive: string; hover: string }> = {
|
|
33
|
+
light: {
|
|
34
|
+
active: 'bg-white',
|
|
35
|
+
inactive: 'bg-white/30',
|
|
36
|
+
hover: 'hover:bg-white/50',
|
|
37
|
+
},
|
|
38
|
+
dark: {
|
|
39
|
+
active: 'bg-gray-900 dark:bg-white',
|
|
40
|
+
inactive: 'bg-gray-300 dark:bg-gray-600',
|
|
41
|
+
hover: 'hover:bg-gray-400 dark:hover:bg-gray-500',
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
let sizeConfig = $derived(sizeClasses[size] || sizeClasses.md);
|
|
46
|
+
let variantConfig = $derived(variantClasses[variant] || variantClasses.dark);
|
|
47
|
+
</script>
|
|
48
|
+
|
|
49
|
+
<div
|
|
50
|
+
class="flex items-center gap-2 {className}"
|
|
51
|
+
role="tablist"
|
|
52
|
+
aria-label="Item selector"
|
|
53
|
+
>
|
|
54
|
+
{#each { length: count } as _, i}
|
|
55
|
+
<button
|
|
56
|
+
type="button"
|
|
57
|
+
class="rounded-full transition-all {sizeConfig.dot} {i === activeIndex
|
|
58
|
+
? `${sizeConfig.active} ${variantConfig.active}`
|
|
59
|
+
: `${variantConfig.inactive} ${variantConfig.hover}`}"
|
|
60
|
+
role="tab"
|
|
61
|
+
aria-selected={i === activeIndex}
|
|
62
|
+
aria-label="Item {i + 1} of {count}"
|
|
63
|
+
onclick={() => onselect?.(i)}
|
|
64
|
+
></button>
|
|
65
|
+
{/each}
|
|
66
|
+
</div>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
/** Total number of items */
|
|
3
|
+
count: number;
|
|
4
|
+
/** Currently active index (0-based) */
|
|
5
|
+
activeIndex?: number;
|
|
6
|
+
/** Dot size */
|
|
7
|
+
size?: 'sm' | 'md' | 'lg';
|
|
8
|
+
/** Color scheme */
|
|
9
|
+
variant?: 'light' | 'dark';
|
|
10
|
+
/** Called when a dot is clicked */
|
|
11
|
+
onselect?: (index: number) => void;
|
|
12
|
+
/** Additional CSS classes on the container */
|
|
13
|
+
class?: string;
|
|
14
|
+
}
|
|
15
|
+
declare const DotIndicator: import("svelte").Component<Props, {}, "">;
|
|
16
|
+
type DotIndicator = ReturnType<typeof DotIndicator>;
|
|
17
|
+
export default DotIndicator;
|
|
18
|
+
//# sourceMappingURL=DotIndicator.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DotIndicator.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Pagination/DotIndicator.svelte.ts"],"names":[],"mappings":"AAGE,UAAU,KAAK;IACb,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe;IACf,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,mBAAmB;IACnB,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,mCAAmC;IACnC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA8CH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
|
|
@@ -25,6 +25,7 @@ export { default as Label } from "./Label/Label.svelte";
|
|
|
25
25
|
export { default as NumberInput } from "./NumberInput/NumberInput.svelte";
|
|
26
26
|
export { default as Modal } from "./Modal/Modal.svelte";
|
|
27
27
|
export { default as Pagination } from "./Pagination/Pagination.svelte";
|
|
28
|
+
export { default as DotIndicator } from "./Pagination/DotIndicator.svelte";
|
|
28
29
|
export { default as Radio } from "./Radio/Radio.svelte";
|
|
29
30
|
export { default as Spinner } from "./Spinner/Spinner.svelte";
|
|
30
31
|
export { default as Tabs } from "./Tabs/Tabs.svelte";
|
package/dist/primitives/index.js
CHANGED
|
@@ -65,6 +65,7 @@ export { default as Modal } from './Modal/Modal.svelte';
|
|
|
65
65
|
|
|
66
66
|
// Pagination
|
|
67
67
|
export { default as Pagination } from './Pagination/Pagination.svelte';
|
|
68
|
+
export { default as DotIndicator } from './Pagination/DotIndicator.svelte';
|
|
68
69
|
|
|
69
70
|
// Radio
|
|
70
71
|
export { default as Radio } from './Radio/Radio.svelte';
|
|
@@ -194,7 +194,7 @@
|
|
|
194
194
|
<!-- svelte-ignore a11y_no_noninteractive_tabindex -->
|
|
195
195
|
<div
|
|
196
196
|
bind:this={dropdownElement}
|
|
197
|
-
class="fixed z-[
|
|
197
|
+
class="fixed z-[100] bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg overflow-hidden"
|
|
198
198
|
style="top: {dropdownPosition.top}px; left: {dropdownPosition.left}px; width: {dropdownPosition.width}px;"
|
|
199
199
|
role="listbox"
|
|
200
200
|
tabindex="-1"
|