@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.
Files changed (122) hide show
  1. package/dist/base.css +18 -0
  2. package/dist/calendar/Calendar/MiniMonthCalendar.svelte +10 -8
  3. package/dist/calendar/Calendar/MiniMonthCalendar.svelte.d.ts.map +1 -1
  4. package/dist/components/Heading.svelte +8 -2
  5. package/dist/components/Heading.svelte.d.ts +1 -0
  6. package/dist/components/Heading.svelte.d.ts.map +1 -1
  7. package/dist/components/Text.svelte +13 -2
  8. package/dist/components/Text.svelte.d.ts +2 -1
  9. package/dist/components/Text.svelte.d.ts.map +1 -1
  10. package/dist/constants/formOptions.d.ts +2 -5
  11. package/dist/constants/formOptions.d.ts.map +1 -1
  12. package/dist/constants/formOptions.js +6 -6
  13. package/dist/constants/formOptions.spec.js +2 -7
  14. package/dist/index.d.ts +6 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +29 -2
  17. package/dist/patterns/forms/FormSection.svelte +2 -1
  18. package/dist/patterns/forms/FormSection.svelte.d.ts +2 -0
  19. package/dist/patterns/forms/FormSection.svelte.d.ts.map +1 -1
  20. package/dist/patterns/layout/SidebarTestWrapper.svelte.d.ts +1 -1
  21. package/dist/patterns/navigation/Header.svelte +3 -3
  22. package/dist/primitives/Input/Select.svelte +1 -1
  23. package/dist/primitives/Pagination/DotIndicator.svelte +66 -0
  24. package/dist/primitives/Pagination/DotIndicator.svelte.d.ts +18 -0
  25. package/dist/primitives/Pagination/DotIndicator.svelte.d.ts.map +1 -0
  26. package/dist/primitives/index.d.ts +1 -0
  27. package/dist/primitives/index.js +1 -0
  28. package/dist/recipes/inputs/phoneInput/CountrySelector.svelte +1 -1
  29. package/dist/recipes/modals/FeedbackModal.svelte +205 -0
  30. package/dist/recipes/modals/FeedbackModal.svelte.d.ts +24 -0
  31. package/dist/recipes/modals/FeedbackModal.svelte.d.ts.map +1 -0
  32. package/dist/recipes/modals/index.d.ts +1 -0
  33. package/dist/recipes/modals/index.js +1 -0
  34. package/dist/schemas/event.d.ts +4 -4
  35. package/dist/schemas/order.d.ts +2 -2
  36. package/dist/schemas/promo.d.ts +4 -4
  37. package/dist/services/event.service.d.ts +11 -0
  38. package/dist/services/event.service.d.ts.map +1 -0
  39. package/dist/services/event.service.js +64 -0
  40. package/dist/services/event.service.spec.d.ts +2 -0
  41. package/dist/services/event.service.spec.d.ts.map +1 -0
  42. package/dist/services/event.service.spec.js +168 -0
  43. package/dist/services/{ShowService.d.ts → show.service.d.ts} +1 -1
  44. package/dist/services/show.service.d.ts.map +1 -0
  45. package/dist/services/show.service.js +115 -0
  46. package/dist/services/show.service.spec.d.ts +2 -0
  47. package/dist/services/show.service.spec.d.ts.map +1 -0
  48. package/dist/services/show.service.spec.js +242 -0
  49. package/dist/tailwind/preset.cjs +5 -0
  50. package/dist/tailwind/preset.d.cts +2 -0
  51. package/dist/tailwind/preset.d.cts.map +1 -1
  52. package/dist/tokens/__tests__/spacing.test.js +2 -2
  53. package/dist/tokens/base-resets.css +124 -0
  54. package/dist/tokens/spacing.d.ts +2 -0
  55. package/dist/tokens/spacing.d.ts.map +1 -1
  56. package/dist/tokens/spacing.js +1 -0
  57. package/dist/tokens/tokens.css +1 -1
  58. package/dist/tokens/utilities.css +79 -2
  59. package/dist/utils/apiConfig.js +1 -1
  60. package/dist/utils/apiConfig.spec.js +34 -27
  61. package/dist/utils/assets.d.ts +3 -0
  62. package/dist/utils/assets.d.ts.map +1 -0
  63. package/dist/utils/assets.js +3 -0
  64. package/dist/utils/classNames.d.ts +10 -0
  65. package/dist/utils/classNames.d.ts.map +1 -0
  66. package/dist/utils/classNames.js +15 -0
  67. package/dist/utils/clickOutside.d.ts +4 -0
  68. package/dist/utils/clickOutside.d.ts.map +1 -0
  69. package/dist/utils/clickOutside.js +13 -0
  70. package/dist/utils/cookieHelpers.d.ts +40 -0
  71. package/dist/utils/cookieHelpers.d.ts.map +1 -0
  72. package/dist/utils/cookieHelpers.js +102 -0
  73. package/dist/utils/dateHelpers.d.ts +71 -0
  74. package/dist/utils/dateHelpers.d.ts.map +1 -0
  75. package/dist/utils/dateHelpers.js +253 -0
  76. package/dist/utils/eventFormatters.d.ts +9 -0
  77. package/dist/utils/eventFormatters.d.ts.map +1 -0
  78. package/dist/utils/eventFormatters.js +96 -0
  79. package/dist/utils/feedbackContext.d.ts +24 -0
  80. package/dist/utils/feedbackContext.d.ts.map +1 -0
  81. package/dist/utils/feedbackContext.js +19 -0
  82. package/dist/utils/fetchHelpers.d.ts +17 -0
  83. package/dist/utils/fetchHelpers.d.ts.map +1 -0
  84. package/dist/utils/fetchHelpers.js +45 -0
  85. package/dist/utils/focusTrap.d.ts +20 -0
  86. package/dist/utils/focusTrap.d.ts.map +1 -0
  87. package/dist/utils/focusTrap.js +130 -0
  88. package/dist/utils/formatters.d.ts +56 -0
  89. package/dist/utils/formatters.d.ts.map +1 -1
  90. package/dist/utils/formatters.js +121 -1
  91. package/dist/utils/formatters.spec.js +128 -1
  92. package/dist/utils/logger.d.ts +25 -1
  93. package/dist/utils/logger.d.ts.map +1 -1
  94. package/dist/utils/logger.js +59 -1
  95. package/dist/utils/logger.spec.js +99 -1
  96. package/dist/utils/permissions.d.ts +9 -0
  97. package/dist/utils/permissions.d.ts.map +1 -0
  98. package/dist/utils/permissions.js +93 -0
  99. package/dist/utils/stringHelpers.d.ts +17 -0
  100. package/dist/utils/stringHelpers.d.ts.map +1 -0
  101. package/dist/utils/stringHelpers.js +38 -0
  102. package/dist/utils/transitions.d.ts +99 -1
  103. package/dist/utils/transitions.d.ts.map +1 -1
  104. package/dist/utils/transitions.js +144 -2
  105. package/dist/utils/utils/utils.d.ts +2 -73
  106. package/dist/utils/utils/utils.d.ts.map +1 -1
  107. package/dist/utils/utils/utils.js +2 -2
  108. package/dist/utils/utils.d.ts +41 -98
  109. package/dist/utils/utils.d.ts.map +1 -1
  110. package/dist/utils/utils.js +58 -701
  111. package/package.json +16 -3
  112. package/dist/services/EventService.d.ts +0 -5
  113. package/dist/services/EventService.d.ts.map +0 -1
  114. package/dist/services/EventService.js +0 -79
  115. package/dist/services/EventService.spec.d.ts +0 -2
  116. package/dist/services/EventService.spec.d.ts.map +0 -1
  117. package/dist/services/EventService.spec.js +0 -217
  118. package/dist/services/ShowService.d.ts.map +0 -1
  119. package/dist/services/ShowService.js +0 -144
  120. package/dist/services/ShowService.spec.d.ts +0 -2
  121. package/dist/services/ShowService.spec.d.ts.map +0 -1
  122. 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 rgba(0,0,0,${shadowIntensity})`;
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 rgba(0,0,0,${shadowIntensity})`;
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 rgba(0,0,0,${shadowIntensity})`;
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 rgba(0,0,0,${shadowIntensity})`;
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 shadow-[inset_0_-1px_0_0_rgb(229_231_235)] dark:shadow-[inset_0_-1px_0_0_rgb(55_65_81)] sm:shadow-none 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">
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
- shadow-[inset_0_-1px_0_0_rgb(229_231_235)] dark:shadow-[inset_0_-1px_0_0_rgb(55_65_81)]
752
- sm:shadow-none sm:p-2 sm:border-t sm:border-l sm:border-gray-200 sm:dark:border-gray-700
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 shadow-[inset_0_-1px_0_0_rgb(229_231_235)] dark:shadow-[inset_0_-1px_0_0_rgb(55_65_81)] sm:shadow-none sm:p-2 sm:border-t sm:border-l sm:border-gray-200 sm:dark:border-gray-700 sm:border-b last:sm:border-r" role="gridcell" aria-disabled="true">
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":";;;;;AAquBA;cAlsB+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;wBAksBtS;wBAlsB7C;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"}
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 baseClasses = 'text-gray-900 dark:text-white';
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 classes = $derived(`${baseClasses} ${sizeClass} ${weightClass} ${className}`.trim());
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;AAwDH,QAAA,MAAM,OAAO,2CAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
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
- <span class={classes}>{@render children()}</span>
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;IACxF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAkDH,QAAA,MAAM,IAAI,2CAAwC,CAAC;AACnD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,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;AAGH;;;;;;KAME;AAGF;;;IAKE;AAGF;;;IAQE;AAGF,uCAQE"}
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: null },
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: 0, label: 'Male' },
23
- { value: 1, label: 'Female' },
24
- { value: 2, label: 'Non-binary' },
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 five options (including empty placeholder and rather not say)', () => {
10
- expect(GENDER_OPTIONS.length).toBe(5);
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.js"],"names":[],"mappings":";;;;;;;;;;;0BAsDc,OAAO,mBAAmB,EAAE,WAAW"}
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 { safeSlide, bloom } from './utils/transitions.js';
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 { roundCurrency } from './utils/formatters.js';
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":";;;;;AAwCA;YAhC6B,MAAM;kBAAgB,MAAM;cAAY,OAAO;YAAU,MAAM;cAAY,GAAG;WAgCjD;wBAhCvC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAA;CAAE"}
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?: "medium" | "narrow" | "wide" | undefined;
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} rounded size="md" />
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} rounded size="md" />
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} rounded size="md" />
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-[9999] 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"
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";
@@ -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-[9999] bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg overflow-hidden"
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"