@music-vine/cadence 2.6.2 → 2.7.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 (187) hide show
  1. package/dist/components/accordion.d.ts +71 -0
  2. package/dist/components/accordion.d.ts.map +1 -0
  3. package/dist/components/accordion.js.map +1 -1
  4. package/dist/components/badge.d.ts +62 -0
  5. package/dist/components/badge.d.ts.map +1 -0
  6. package/dist/components/breadcrumb.d.ts +42 -0
  7. package/dist/components/breadcrumb.d.ts.map +1 -0
  8. package/dist/components/button.d.ts +117 -0
  9. package/dist/components/button.d.ts.map +1 -0
  10. package/dist/components/button.js.map +1 -1
  11. package/dist/components/card.d.ts +56 -0
  12. package/dist/components/card.d.ts.map +1 -0
  13. package/dist/components/card.js.map +1 -1
  14. package/dist/components/carousel-dots.d.ts +17 -0
  15. package/dist/components/carousel-dots.d.ts.map +1 -0
  16. package/dist/components/carousel-dots.js.map +1 -1
  17. package/dist/components/carousel.d.ts +99 -0
  18. package/dist/components/carousel.d.ts.map +1 -0
  19. package/dist/components/carousel.js.map +1 -1
  20. package/dist/components/checkbox.d.ts +34 -0
  21. package/dist/components/checkbox.d.ts.map +1 -0
  22. package/dist/components/checkbox.js.map +1 -1
  23. package/dist/components/context-menu.d.ts +126 -0
  24. package/dist/components/context-menu.d.ts.map +1 -0
  25. package/dist/components/dialog.d.ts +85 -0
  26. package/dist/components/dialog.d.ts.map +1 -0
  27. package/dist/components/dialog.js.map +1 -1
  28. package/dist/components/drawer.d.ts +90 -0
  29. package/dist/components/drawer.d.ts.map +1 -0
  30. package/dist/components/drawer.js.map +1 -1
  31. package/dist/components/index.d.ts +36 -0
  32. package/dist/components/index.d.ts.map +1 -0
  33. package/dist/components/input.d.ts +69 -0
  34. package/dist/components/input.d.ts.map +1 -0
  35. package/dist/components/input.js +59 -55
  36. package/dist/components/input.js.map +2 -2
  37. package/dist/components/label.d.ts +36 -0
  38. package/dist/components/label.d.ts.map +1 -0
  39. package/dist/components/popover.d.ts +61 -0
  40. package/dist/components/popover.d.ts.map +1 -0
  41. package/dist/components/price-tag.d.ts +31 -0
  42. package/dist/components/price-tag.d.ts.map +1 -0
  43. package/dist/components/price-tag.js.map +1 -1
  44. package/dist/components/radio-group.d.ts +15 -0
  45. package/dist/components/radio-group.d.ts.map +1 -0
  46. package/dist/components/scroll-area.d.ts +33 -0
  47. package/dist/components/scroll-area.d.ts.map +1 -0
  48. package/dist/components/scroll-area.js.map +1 -1
  49. package/dist/components/scroll-drum.d.ts +96 -0
  50. package/dist/components/scroll-drum.d.ts.map +1 -0
  51. package/dist/components/scroll-drum.js +62 -33
  52. package/dist/components/scroll-drum.js.map +2 -2
  53. package/dist/components/select.d.ts +49 -0
  54. package/dist/components/select.d.ts.map +1 -0
  55. package/dist/components/select.js.map +1 -1
  56. package/dist/components/separator.d.ts +35 -0
  57. package/dist/components/separator.d.ts.map +1 -0
  58. package/dist/components/skeleton.d.ts +44 -0
  59. package/dist/components/skeleton.d.ts.map +1 -0
  60. package/dist/components/slider.d.ts +21 -0
  61. package/dist/components/slider.d.ts.map +1 -0
  62. package/dist/components/slider.js.map +1 -1
  63. package/dist/components/stacking-card.d.ts +89 -0
  64. package/dist/components/stacking-card.d.ts.map +1 -0
  65. package/dist/components/stacking-card.js +2 -2
  66. package/dist/components/stacking-card.js.map +2 -2
  67. package/dist/components/tabs.d.ts +46 -0
  68. package/dist/components/tabs.d.ts.map +1 -0
  69. package/dist/components/tabs.js.map +1 -1
  70. package/dist/components/textarea.d.ts +34 -0
  71. package/dist/components/textarea.d.ts.map +1 -0
  72. package/dist/components/toast.d.ts +67 -0
  73. package/dist/components/toast.d.ts.map +1 -0
  74. package/dist/components/toast.js +1 -1
  75. package/dist/components/toast.js.map +2 -2
  76. package/dist/components/toggle-button.d.ts +54 -0
  77. package/dist/components/toggle-button.d.ts.map +1 -0
  78. package/dist/components/toggle-button.js.map +1 -1
  79. package/dist/components/typography/heading.d.ts +20 -0
  80. package/dist/components/typography/heading.d.ts.map +1 -0
  81. package/dist/components/typography/heading.js.map +1 -1
  82. package/dist/components/typography/index.d.ts +5 -0
  83. package/dist/components/typography/index.d.ts.map +1 -0
  84. package/dist/components/typography/list.d.ts +23 -0
  85. package/dist/components/typography/list.d.ts.map +1 -0
  86. package/dist/components/typography/prose.d.ts +8 -0
  87. package/dist/components/typography/prose.d.ts.map +1 -0
  88. package/dist/components/typography/text.d.ts +13 -0
  89. package/dist/components/typography/text.d.ts.map +1 -0
  90. package/dist/icons/custom/boards-indicator.d.ts +6 -0
  91. package/dist/icons/custom/boards-indicator.d.ts.map +1 -0
  92. package/dist/icons/custom/boards-indicator.js +7 -2
  93. package/dist/icons/custom/boards-indicator.js.map +2 -2
  94. package/dist/icons/custom/download-history.d.ts +5 -0
  95. package/dist/icons/custom/download-history.d.ts.map +1 -0
  96. package/dist/icons/custom/download-history.js +3 -4
  97. package/dist/icons/custom/download-history.js.map +2 -2
  98. package/dist/icons/custom/exclamation-mark-in-octagon.d.ts +5 -0
  99. package/dist/icons/custom/exclamation-mark-in-octagon.d.ts.map +1 -0
  100. package/dist/icons/custom/exclamation-mark-in-octagon.js +6 -3
  101. package/dist/icons/custom/exclamation-mark-in-octagon.js.map +2 -2
  102. package/dist/icons/custom/horizontal-orientation.d.ts +5 -0
  103. package/dist/icons/custom/horizontal-orientation.d.ts.map +1 -0
  104. package/dist/icons/custom/horizontal-orientation.js +4 -3
  105. package/dist/icons/custom/horizontal-orientation.js.map +2 -2
  106. package/dist/icons/custom/lightning-bolt.d.ts +5 -0
  107. package/dist/icons/custom/lightning-bolt.d.ts.map +1 -0
  108. package/dist/icons/custom/lightning-bolt.js +24 -27
  109. package/dist/icons/custom/lightning-bolt.js.map +2 -2
  110. package/dist/icons/custom/music-file.d.ts +5 -0
  111. package/dist/icons/custom/music-file.d.ts.map +1 -0
  112. package/dist/icons/custom/music-file.js +17 -0
  113. package/dist/icons/custom/music-file.js.map +7 -0
  114. package/dist/icons/custom/pin.d.ts +5 -0
  115. package/dist/icons/custom/pin.d.ts.map +1 -0
  116. package/dist/icons/custom/pin.js +4 -1
  117. package/dist/icons/custom/pin.js.map +2 -2
  118. package/dist/icons/custom/premium-star.d.ts +11 -0
  119. package/dist/icons/custom/premium-star.d.ts.map +1 -0
  120. package/dist/icons/custom/premium-star.js +3 -1
  121. package/dist/icons/custom/premium-star.js.map +2 -2
  122. package/dist/icons/custom/social/discord.d.ts +5 -0
  123. package/dist/icons/custom/social/discord.d.ts.map +1 -0
  124. package/dist/icons/custom/social/discord.js +3 -4
  125. package/dist/icons/custom/social/discord.js.map +2 -2
  126. package/dist/icons/custom/social/index.d.ts +4 -0
  127. package/dist/icons/custom/social/index.d.ts.map +1 -0
  128. package/dist/icons/custom/social/tiktok.d.ts +5 -0
  129. package/dist/icons/custom/social/tiktok.d.ts.map +1 -0
  130. package/dist/icons/custom/social/tiktok.js +3 -4
  131. package/dist/icons/custom/social/tiktok.js.map +2 -2
  132. package/dist/icons/custom/social/twitter-x.d.ts +5 -0
  133. package/dist/icons/custom/social/twitter-x.d.ts.map +1 -0
  134. package/dist/icons/custom/social/twitter-x.js +19 -22
  135. package/dist/icons/custom/social/twitter-x.js.map +2 -2
  136. package/dist/icons/custom/square-aspect-ratio.d.ts +5 -0
  137. package/dist/icons/custom/square-aspect-ratio.d.ts.map +1 -0
  138. package/dist/icons/custom/square-aspect-ratio.js +4 -1
  139. package/dist/icons/custom/square-aspect-ratio.js.map +2 -2
  140. package/dist/icons/custom/tick-in-circle.d.ts +8 -0
  141. package/dist/icons/custom/tick-in-circle.d.ts.map +1 -0
  142. package/dist/icons/custom/tick-in-circle.js +25 -25
  143. package/dist/icons/custom/tick-in-circle.js.map +2 -2
  144. package/dist/icons/custom/tick-small.d.ts +5 -0
  145. package/dist/icons/custom/tick-small.d.ts.map +1 -0
  146. package/dist/icons/custom/tick-small.js +8 -10
  147. package/dist/icons/custom/tick-small.js.map +2 -2
  148. package/dist/icons/custom/tick.d.ts +5 -0
  149. package/dist/icons/custom/tick.d.ts.map +1 -0
  150. package/dist/icons/custom/tick.js +2 -2
  151. package/dist/icons/custom/tick.js.map +2 -2
  152. package/dist/icons/custom/types.d.ts +3 -0
  153. package/dist/icons/custom/types.d.ts.map +1 -0
  154. package/dist/icons/custom/types.js +1 -0
  155. package/dist/icons/custom/types.js.map +7 -0
  156. package/dist/icons/custom/ultra-wide-aspect-ratio.d.ts +5 -0
  157. package/dist/icons/custom/ultra-wide-aspect-ratio.d.ts.map +1 -0
  158. package/dist/icons/custom/ultra-wide-aspect-ratio.js +4 -1
  159. package/dist/icons/custom/ultra-wide-aspect-ratio.js.map +2 -2
  160. package/dist/icons/custom/uppbeat-credit.d.ts +5 -0
  161. package/dist/icons/custom/uppbeat-credit.d.ts.map +1 -0
  162. package/dist/icons/custom/uppbeat-credit.js +2 -4
  163. package/dist/icons/custom/uppbeat-credit.js.map +2 -2
  164. package/dist/icons/custom/vertical-orientation.d.ts +5 -0
  165. package/dist/icons/custom/vertical-orientation.d.ts.map +1 -0
  166. package/dist/icons/custom/vertical-orientation.js +4 -1
  167. package/dist/icons/custom/vertical-orientation.js.map +2 -2
  168. package/dist/icons/custom/view-credit-note.d.ts +5 -0
  169. package/dist/icons/custom/view-credit-note.d.ts.map +1 -0
  170. package/dist/icons/custom/view-credit-note.js +4 -1
  171. package/dist/icons/custom/view-credit-note.js.map +2 -2
  172. package/dist/icons/index.d.ts +28 -0
  173. package/dist/icons/index.d.ts.map +1 -0
  174. package/dist/icons/index.js +4 -5
  175. package/dist/icons/index.js.map +2 -2
  176. package/dist/index.d.ts +19 -0
  177. package/dist/index.d.ts.map +1 -0
  178. package/dist/lib/utils.d.ts +12 -0
  179. package/dist/lib/utils.d.ts.map +1 -0
  180. package/dist/styles/storybook.css +2 -2
  181. package/dist/test/setup.d.ts +2 -0
  182. package/dist/test/setup.d.ts.map +1 -0
  183. package/dist/theme/index.d.ts +142 -0
  184. package/dist/theme/index.d.ts.map +1 -0
  185. package/dist/theme/index.js +1 -1
  186. package/dist/theme/index.js.map +2 -2
  187. package/package.json +2 -1
@@ -36,7 +36,7 @@ function darkenColor(hex, percent = 20) {
36
36
  return `#${(r << 16 | g << 8 | b).toString(16).padStart(6, "0")}`;
37
37
  }
38
38
  function createTheme(config = {}) {
39
- const themeId = `cadence-theme-${Math.random().toString(36).substring(2, 11)}`;
39
+ const themeId = `cadence-theme-${Math.random().toString(36).slice(2, 11)}`;
40
40
  const cssVariables = [];
41
41
  if (config.brand?.primary) {
42
42
  cssVariables.push(`--brand-primary: ${config.brand.primary};`);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/theme/index.ts"],
4
- "sourcesContent": ["/**\n * @module Theme\n *\n * Theme customization utilities for Cadence Design System.\n *\n * @example\n * // Basic usage\n * import { createTheme } from '@music-vine/cadence/theme';\n *\n * const customTheme = createTheme({\n * brand: {\n * primary: '#FF6B6B',\n * accent: '#4ECDC4',\n * }\n * });\n *\n * // Apply to root or specific container\n * <div className={customTheme}>\n * <Button>Themed Button</Button>\n * </div>\n *\n * @example\n * // Complete customization\n * const theme = createTheme({\n * brand: {\n * primary: '#FF6B6B',\n * accent: '#4ECDC4',\n * },\n * colors: {\n * success: '#51CF66',\n * error: '#FF6B6B',\n * warning: '#FFD93D',\n * info: '#74C0FC',\n * },\n * radius: 'lg',\n * fonts: {\n * sans: 'Inter, system-ui, sans-serif',\n * heading: 'Poppins, system-ui, sans-serif',\n * },\n * });\n */\n\n/**\n * Configuration for brand colors\n */\nexport interface BrandColors {\n /** Primary brand color (used for primary buttons, links, focus rings) */\n primary?: string;\n /** Accent/hover color for primary brand interactions */\n accent?: string;\n}\n\n/**\n * Configuration for status/semantic colors\n */\nexport interface StatusColors {\n /** Success state color */\n success?: string;\n /** Error state color */\n error?: string;\n /** Warning state color */\n warning?: string;\n /** Info state color */\n info?: string;\n}\n\n/**\n * Configuration for font families\n */\nexport interface FontConfig {\n /** Sans-serif font family for body text */\n sans?: string;\n /** Font family for headings */\n heading?: string;\n}\n\n/**\n * Border radius presets\n */\nexport type RadiusPreset = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/**\n * Complete theme configuration\n */\nexport interface ThemeConfig {\n /** Brand color overrides */\n brand?: BrandColors;\n /** Status color overrides */\n colors?: StatusColors;\n /** Border radius preset */\n radius?: RadiusPreset;\n /** Font family overrides */\n fonts?: FontConfig;\n}\n\n/**\n * Border radius values mapped to CSS values\n */\nconst radiusValues: Record<RadiusPreset, string> = {\n none: \"0px\",\n sm: \"4px\",\n md: \"8px\",\n lg: \"12px\",\n xl: \"16px\",\n};\n\n/**\n * Generates a lightened version of a hex color\n * Simple implementation - for production, consider using a color manipulation library\n */\nfunction lightenColor(hex: string, percent = 20): string {\n const num = Number.parseInt(hex.replace(\"#\", \"\"), 16);\n const r = Math.min(\n 255,\n Math.floor((num >> 16) + ((255 - (num >> 16)) * percent) / 100)\n );\n const g = Math.min(\n 255,\n Math.floor(\n ((num >> 8) & 0x00_ff) + ((255 - ((num >> 8) & 0x00_ff)) * percent) / 100\n )\n );\n const b = Math.min(\n 255,\n Math.floor(\n (num & 0x00_00_ff) + ((255 - (num & 0x00_00_ff)) * percent) / 100\n )\n );\n return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, \"0\")}`;\n}\n\n/**\n * Generates a darkened version of a hex color\n */\nfunction darkenColor(hex: string, percent = 20): string {\n const num = Number.parseInt(hex.replace(\"#\", \"\"), 16);\n const r = Math.max(0, Math.floor((num >> 16) * (1 - percent / 100)));\n const g = Math.max(\n 0,\n Math.floor(((num >> 8) & 0x00_ff) * (1 - percent / 100))\n );\n const b = Math.max(0, Math.floor((num & 0x00_00_ff) * (1 - percent / 100)));\n return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, \"0\")}`;\n}\n\n/**\n * Creates a custom theme by generating CSS variables based on the provided configuration.\n * Returns a className that can be applied to any container element.\n *\n * @param config - Theme configuration object\n * @returns CSS class name to apply to container\n *\n * @example\n * const theme = createTheme({\n * brand: { primary: '#FF6B6B' }\n * });\n *\n * <div className={theme}>\n * <Button variant=\"brand\">Custom Themed Button</Button>\n * </div>\n */\nexport function createTheme(config: ThemeConfig = {}): string {\n const themeId = `cadence-theme-${Math.random().toString(36).substring(2, 11)}`;\n const cssVariables: string[] = [];\n\n // Brand colors\n if (config.brand?.primary) {\n cssVariables.push(`--brand-primary: ${config.brand.primary};`);\n cssVariables.push(\n `--brand-primary-hover: ${config.brand.accent || darkenColor(config.brand.primary, 15)};`\n );\n cssVariables.push(\n `--brand-primary-active: ${darkenColor(config.brand.primary, 25)};`\n );\n cssVariables.push(\n `--brand-secondary: ${lightenColor(config.brand.primary, 40)};`\n );\n cssVariables.push(\n `--brand-secondary-hover: ${lightenColor(config.brand.primary, 30)};`\n );\n cssVariables.push(`--text-brand: ${config.brand.primary};`);\n cssVariables.push(`--border-brand: ${config.brand.primary};`);\n cssVariables.push(`--focus-ring: ${config.brand.primary};`);\n }\n\n if (config.brand?.accent) {\n cssVariables.push(`--brand-primary-hover: ${config.brand.accent};`);\n }\n\n // Status colors\n if (config.colors?.success) {\n cssVariables.push(`--success: ${config.colors.success};`);\n cssVariables.push(\n `--success-dark: ${darkenColor(config.colors.success, 15)};`\n );\n }\n\n if (config.colors?.error) {\n cssVariables.push(`--error: ${config.colors.error};`);\n cssVariables.push(`--error-dark: ${darkenColor(config.colors.error, 15)};`);\n }\n\n if (config.colors?.warning) {\n cssVariables.push(`--warning: ${config.colors.warning};`);\n }\n\n if (config.colors?.info) {\n cssVariables.push(`--info: ${config.colors.info};`);\n }\n\n // Border radius\n if (config.radius) {\n const radiusValue = radiusValues[config.radius];\n cssVariables.push(`--radius-default: ${radiusValue};`);\n cssVariables.push(`--radius-sm: ${Number.parseInt(radiusValue) / 2}px;`);\n cssVariables.push(`--radius-lg: ${Number.parseInt(radiusValue) * 1.5}px;`);\n }\n\n // Font families\n if (config.fonts?.sans) {\n cssVariables.push(`--font-sans: ${config.fonts.sans};`);\n }\n\n if (config.fonts?.heading) {\n cssVariables.push(`--font-heading: ${config.fonts.heading};`);\n }\n\n // Inject styles into document head\n if (typeof document !== \"undefined\") {\n const styleId = `${themeId}-styles`;\n let styleElement = document.getElementById(styleId) as HTMLStyleElement;\n\n if (!styleElement) {\n styleElement = document.createElement(\"style\");\n styleElement.id = styleId;\n document.head.appendChild(styleElement);\n }\n\n styleElement.textContent = `\n .${themeId} {\n ${cssVariables.join(\"\\n \")}\n }\n `;\n }\n\n return themeId;\n}\n\n/**\n * Type guard to check if a string is a valid hex color\n */\nexport function isValidHexColor(color: string): boolean {\n return /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(color);\n}\n\n/**\n * Pre-configured theme presets for common use cases\n */\nexport const themePresets = {\n /**\n * Default Uppbeat theme (pink brand color)\n */\n uppbeat: {\n brand: {\n primary: \"#F23D75\",\n accent: \"#DF1F64\",\n },\n },\n\n /**\n * Music Vine theme (coral pink brand color)\n */\n musicVine: {\n brand: {\n primary: \"#FF5F6E\",\n accent: \"#671920\",\n },\n },\n} satisfies Record<string, ThemeConfig>;\n\n/**\n * Helper to create a theme from a preset\n *\n * @example\n * const theme = createThemeFromPreset('ocean');\n * <div className={theme}>...</div>\n */\nexport function createThemeFromPreset(\n preset: keyof typeof themePresets\n): string {\n return createTheme(themePresets[preset]);\n}\n"],
5
- "mappings": "AAkGA,MAAM,eAA6C;AAAA,EACjD,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAMA,SAAS,aAAa,KAAa,UAAU,IAAY;AACvD,QAAM,MAAM,OAAO,SAAS,IAAI,QAAQ,KAAK,EAAE,GAAG,EAAE;AACpD,QAAM,IAAI,KAAK;AAAA,IACb;AAAA,IACA,KAAK,OAAO,OAAO,OAAQ,OAAO,OAAO,OAAO,UAAW,GAAG;AAAA,EAChE;AACA,QAAM,IAAI,KAAK;AAAA,IACb;AAAA,IACA,KAAK;AAAA,OACD,OAAO,IAAK,QAAa,OAAQ,OAAO,IAAK,QAAY,UAAW;AAAA,IACxE;AAAA,EACF;AACA,QAAM,IAAI,KAAK;AAAA,IACb;AAAA,IACA,KAAK;AAAA,OACF,MAAM,QAAgB,OAAO,MAAM,QAAe,UAAW;AAAA,IAChE;AAAA,EACF;AACA,SAAO,KAAM,KAAK,KAAO,KAAK,IAAK,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AACrE;AAKA,SAAS,YAAY,KAAa,UAAU,IAAY;AACtD,QAAM,MAAM,OAAO,SAAS,IAAI,QAAQ,KAAK,EAAE,GAAG,EAAE;AACpD,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,OAAO,OAAO,OAAO,IAAI,UAAU,IAAI,CAAC;AACnE,QAAM,IAAI,KAAK;AAAA,IACb;AAAA,IACA,KAAK,OAAQ,OAAO,IAAK,QAAY,IAAI,UAAU,IAAI;AAAA,EACzD;AACA,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,OAAO,MAAM,QAAe,IAAI,UAAU,IAAI,CAAC;AAC1E,SAAO,KAAM,KAAK,KAAO,KAAK,IAAK,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AACrE;AAkBO,SAAS,YAAY,SAAsB,CAAC,GAAW;AAC5D,QAAM,UAAU,iBAAiB,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,CAAC;AAC5E,QAAM,eAAyB,CAAC;AAGhC,MAAI,OAAO,OAAO,SAAS;AACzB,iBAAa,KAAK,oBAAoB,OAAO,MAAM,OAAO,GAAG;AAC7D,iBAAa;AAAA,MACX,0BAA0B,OAAO,MAAM,UAAU,YAAY,OAAO,MAAM,SAAS,EAAE,CAAC;AAAA,IACxF;AACA,iBAAa;AAAA,MACX,2BAA2B,YAAY,OAAO,MAAM,SAAS,EAAE,CAAC;AAAA,IAClE;AACA,iBAAa;AAAA,MACX,sBAAsB,aAAa,OAAO,MAAM,SAAS,EAAE,CAAC;AAAA,IAC9D;AACA,iBAAa;AAAA,MACX,4BAA4B,aAAa,OAAO,MAAM,SAAS,EAAE,CAAC;AAAA,IACpE;AACA,iBAAa,KAAK,iBAAiB,OAAO,MAAM,OAAO,GAAG;AAC1D,iBAAa,KAAK,mBAAmB,OAAO,MAAM,OAAO,GAAG;AAC5D,iBAAa,KAAK,iBAAiB,OAAO,MAAM,OAAO,GAAG;AAAA,EAC5D;AAEA,MAAI,OAAO,OAAO,QAAQ;AACxB,iBAAa,KAAK,0BAA0B,OAAO,MAAM,MAAM,GAAG;AAAA,EACpE;AAGA,MAAI,OAAO,QAAQ,SAAS;AAC1B,iBAAa,KAAK,cAAc,OAAO,OAAO,OAAO,GAAG;AACxD,iBAAa;AAAA,MACX,mBAAmB,YAAY,OAAO,OAAO,SAAS,EAAE,CAAC;AAAA,IAC3D;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ,OAAO;AACxB,iBAAa,KAAK,YAAY,OAAO,OAAO,KAAK,GAAG;AACpD,iBAAa,KAAK,iBAAiB,YAAY,OAAO,OAAO,OAAO,EAAE,CAAC,GAAG;AAAA,EAC5E;AAEA,MAAI,OAAO,QAAQ,SAAS;AAC1B,iBAAa,KAAK,cAAc,OAAO,OAAO,OAAO,GAAG;AAAA,EAC1D;AAEA,MAAI,OAAO,QAAQ,MAAM;AACvB,iBAAa,KAAK,WAAW,OAAO,OAAO,IAAI,GAAG;AAAA,EACpD;AAGA,MAAI,OAAO,QAAQ;AACjB,UAAM,cAAc,aAAa,OAAO,MAAM;AAC9C,iBAAa,KAAK,qBAAqB,WAAW,GAAG;AACrD,iBAAa,KAAK,gBAAgB,OAAO,SAAS,WAAW,IAAI,CAAC,KAAK;AACvE,iBAAa,KAAK,gBAAgB,OAAO,SAAS,WAAW,IAAI,GAAG,KAAK;AAAA,EAC3E;AAGA,MAAI,OAAO,OAAO,MAAM;AACtB,iBAAa,KAAK,gBAAgB,OAAO,MAAM,IAAI,GAAG;AAAA,EACxD;AAEA,MAAI,OAAO,OAAO,SAAS;AACzB,iBAAa,KAAK,mBAAmB,OAAO,MAAM,OAAO,GAAG;AAAA,EAC9D;AAGA,MAAI,OAAO,aAAa,aAAa;AACnC,UAAM,UAAU,GAAG,OAAO;AAC1B,QAAI,eAAe,SAAS,eAAe,OAAO;AAElD,QAAI,CAAC,cAAc;AACjB,qBAAe,SAAS,cAAc,OAAO;AAC7C,mBAAa,KAAK;AAClB,eAAS,KAAK,YAAY,YAAY;AAAA,IACxC;AAEA,iBAAa,cAAc;AAAA,SACtB,OAAO;AAAA,UACN,aAAa,KAAK,YAAY,CAAC;AAAA;AAAA;AAAA,EAGvC;AAEA,SAAO;AACT;AAKO,SAAS,gBAAgB,OAAwB;AACtD,SAAO,qCAAqC,KAAK,KAAK;AACxD;AAKO,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA,EAI1B,SAAS;AAAA,IACP,OAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AAAA,IACT,OAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AASO,SAAS,sBACd,QACQ;AACR,SAAO,YAAY,aAAa,MAAM,CAAC;AACzC;",
4
+ "sourcesContent": ["/**\n * @module Theme\n *\n * Theme customization utilities for Cadence Design System.\n *\n * @example\n * // Basic usage\n * import { createTheme } from '@music-vine/cadence/theme';\n *\n * const customTheme = createTheme({\n * brand: {\n * primary: '#FF6B6B',\n * accent: '#4ECDC4',\n * }\n * });\n *\n * // Apply to root or specific container\n * <div className={customTheme}>\n * <Button>Themed Button</Button>\n * </div>\n *\n * @example\n * // Complete customization\n * const theme = createTheme({\n * brand: {\n * primary: '#FF6B6B',\n * accent: '#4ECDC4',\n * },\n * colors: {\n * success: '#51CF66',\n * error: '#FF6B6B',\n * warning: '#FFD93D',\n * info: '#74C0FC',\n * },\n * radius: 'lg',\n * fonts: {\n * sans: 'Inter, system-ui, sans-serif',\n * heading: 'Poppins, system-ui, sans-serif',\n * },\n * });\n */\n\n/**\n * Configuration for brand colors\n */\nexport interface BrandColors {\n /** Accent/hover color for primary brand interactions */\n accent?: string;\n /** Primary brand color (used for primary buttons, links, focus rings) */\n primary?: string;\n}\n\n/**\n * Configuration for status/semantic colors\n */\nexport interface StatusColors {\n /** Error state color */\n error?: string;\n /** Info state color */\n info?: string;\n /** Success state color */\n success?: string;\n /** Warning state color */\n warning?: string;\n}\n\n/**\n * Configuration for font families\n */\nexport interface FontConfig {\n /** Font family for headings */\n heading?: string;\n /** Sans-serif font family for body text */\n sans?: string;\n}\n\n/**\n * Border radius presets\n */\nexport type RadiusPreset = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/**\n * Complete theme configuration\n */\nexport interface ThemeConfig {\n /** Brand color overrides */\n brand?: BrandColors;\n /** Status color overrides */\n colors?: StatusColors;\n /** Font family overrides */\n fonts?: FontConfig;\n /** Border radius preset */\n radius?: RadiusPreset;\n}\n\n/**\n * Border radius values mapped to CSS values\n */\nconst radiusValues: Record<RadiusPreset, string> = {\n none: \"0px\",\n sm: \"4px\",\n md: \"8px\",\n lg: \"12px\",\n xl: \"16px\",\n};\n\n/**\n * Generates a lightened version of a hex color\n * Simple implementation - for production, consider using a color manipulation library\n */\nfunction lightenColor(hex: string, percent = 20): string {\n const num = Number.parseInt(hex.replace(\"#\", \"\"), 16);\n const r = Math.min(\n 255,\n Math.floor((num >> 16) + ((255 - (num >> 16)) * percent) / 100)\n );\n const g = Math.min(\n 255,\n Math.floor(\n ((num >> 8) & 0x00_ff) + ((255 - ((num >> 8) & 0x00_ff)) * percent) / 100\n )\n );\n const b = Math.min(\n 255,\n Math.floor(\n (num & 0x00_00_ff) + ((255 - (num & 0x00_00_ff)) * percent) / 100\n )\n );\n return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, \"0\")}`;\n}\n\n/**\n * Generates a darkened version of a hex color\n */\nfunction darkenColor(hex: string, percent = 20): string {\n const num = Number.parseInt(hex.replace(\"#\", \"\"), 16);\n const r = Math.max(0, Math.floor((num >> 16) * (1 - percent / 100)));\n const g = Math.max(\n 0,\n Math.floor(((num >> 8) & 0x00_ff) * (1 - percent / 100))\n );\n const b = Math.max(0, Math.floor((num & 0x00_00_ff) * (1 - percent / 100)));\n return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, \"0\")}`;\n}\n\n/**\n * Creates a custom theme by generating CSS variables based on the provided configuration.\n * Returns a className that can be applied to any container element.\n *\n * @param config - Theme configuration object\n * @returns CSS class name to apply to container\n *\n * @example\n * const theme = createTheme({\n * brand: { primary: '#FF6B6B' }\n * });\n *\n * <div className={theme}>\n * <Button variant=\"brand\">Custom Themed Button</Button>\n * </div>\n */\nexport function createTheme(config: ThemeConfig = {}): string {\n const themeId = `cadence-theme-${Math.random().toString(36).slice(2, 11)}`;\n const cssVariables: string[] = [];\n\n // Brand colors\n if (config.brand?.primary) {\n cssVariables.push(`--brand-primary: ${config.brand.primary};`);\n cssVariables.push(\n `--brand-primary-hover: ${config.brand.accent || darkenColor(config.brand.primary, 15)};`\n );\n cssVariables.push(\n `--brand-primary-active: ${darkenColor(config.brand.primary, 25)};`\n );\n cssVariables.push(\n `--brand-secondary: ${lightenColor(config.brand.primary, 40)};`\n );\n cssVariables.push(\n `--brand-secondary-hover: ${lightenColor(config.brand.primary, 30)};`\n );\n cssVariables.push(`--text-brand: ${config.brand.primary};`);\n cssVariables.push(`--border-brand: ${config.brand.primary};`);\n cssVariables.push(`--focus-ring: ${config.brand.primary};`);\n }\n\n if (config.brand?.accent) {\n cssVariables.push(`--brand-primary-hover: ${config.brand.accent};`);\n }\n\n // Status colors\n if (config.colors?.success) {\n cssVariables.push(`--success: ${config.colors.success};`);\n cssVariables.push(\n `--success-dark: ${darkenColor(config.colors.success, 15)};`\n );\n }\n\n if (config.colors?.error) {\n cssVariables.push(`--error: ${config.colors.error};`);\n cssVariables.push(`--error-dark: ${darkenColor(config.colors.error, 15)};`);\n }\n\n if (config.colors?.warning) {\n cssVariables.push(`--warning: ${config.colors.warning};`);\n }\n\n if (config.colors?.info) {\n cssVariables.push(`--info: ${config.colors.info};`);\n }\n\n // Border radius\n if (config.radius) {\n const radiusValue = radiusValues[config.radius];\n cssVariables.push(`--radius-default: ${radiusValue};`);\n cssVariables.push(`--radius-sm: ${Number.parseInt(radiusValue) / 2}px;`);\n cssVariables.push(`--radius-lg: ${Number.parseInt(radiusValue) * 1.5}px;`);\n }\n\n // Font families\n if (config.fonts?.sans) {\n cssVariables.push(`--font-sans: ${config.fonts.sans};`);\n }\n\n if (config.fonts?.heading) {\n cssVariables.push(`--font-heading: ${config.fonts.heading};`);\n }\n\n // Inject styles into document head\n if (typeof document !== \"undefined\") {\n const styleId = `${themeId}-styles`;\n let styleElement = document.getElementById(styleId) as HTMLStyleElement;\n\n if (!styleElement) {\n styleElement = document.createElement(\"style\");\n styleElement.id = styleId;\n document.head.appendChild(styleElement);\n }\n\n styleElement.textContent = `\n .${themeId} {\n ${cssVariables.join(\"\\n \")}\n }\n `;\n }\n\n return themeId;\n}\n\n/**\n * Type guard to check if a string is a valid hex color\n */\nexport function isValidHexColor(color: string): boolean {\n return /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(color);\n}\n\n/**\n * Pre-configured theme presets for common use cases\n */\nexport const themePresets = {\n /**\n * Default Uppbeat theme (pink brand color)\n */\n uppbeat: {\n brand: {\n primary: \"#F23D75\",\n accent: \"#DF1F64\",\n },\n },\n\n /**\n * Music Vine theme (coral pink brand color)\n */\n musicVine: {\n brand: {\n primary: \"#FF5F6E\",\n accent: \"#671920\",\n },\n },\n} satisfies Record<string, ThemeConfig>;\n\n/**\n * Helper to create a theme from a preset\n *\n * @example\n * const theme = createThemeFromPreset('ocean');\n * <div className={theme}>...</div>\n */\nexport function createThemeFromPreset(\n preset: keyof typeof themePresets\n): string {\n return createTheme(themePresets[preset]);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@music-vine/cadence",
3
- "version": "2.6.2",
3
+ "version": "2.7.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -110,6 +110,7 @@
110
110
  "vaul": "^1.1.2"
111
111
  },
112
112
  "devDependencies": {
113
+ "@biomejs/biome": "^2.3.3",
113
114
  "@playwright/test": "^1.58.2",
114
115
  "@storybook/addon-a11y": "^10.1.11",
115
116
  "@storybook/addon-docs": "^10.1.11",