@pure-ds/storybook 0.7.29 → 0.7.41

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 (63) hide show
  1. package/.storybook/main.js +14 -4
  2. package/.storybook/preview.js +261 -85
  3. package/dist/pds-reference.json +107 -61
  4. package/package.json +2 -2
  5. package/public/assets/js/app.js +9 -11
  6. package/public/assets/js/lit.js +2 -2
  7. package/public/assets/js/pds-ask.js +4 -4
  8. package/public/assets/js/pds-autocomplete.js +4 -4
  9. package/public/assets/js/pds-enhancers.js +1 -1
  10. package/public/assets/js/pds-localization.js +1 -0
  11. package/public/assets/js/pds-manager.js +119 -119
  12. package/public/assets/js/pds.js +2 -2
  13. package/public/assets/locales/nl-NL.json +450 -0
  14. package/public/assets/pds/components/pds-calendar.js +4 -4
  15. package/public/assets/pds/components/pds-daterange.js +11 -8
  16. package/public/assets/pds/components/pds-form.js +22 -22
  17. package/public/assets/pds/components/pds-icon.js +9 -1
  18. package/public/assets/pds/components/pds-live-edit.js +71 -42
  19. package/public/assets/pds/components/pds-live-importer.js +66 -66
  20. package/public/assets/pds/components/pds-live-template-canvas.js +3 -3
  21. package/public/assets/pds/components/pds-locale.js +1132 -0
  22. package/public/assets/pds/components/pds-omnibox.js +92 -12
  23. package/public/assets/pds/components/pds-rating.js +5 -3
  24. package/public/assets/pds/components/pds-tags.js +5 -5
  25. package/public/assets/pds/components/pds-theme.js +4 -4
  26. package/public/assets/pds/components/pds-toaster.js +6 -6
  27. package/public/assets/pds/components/pds-treeview.js +8 -4
  28. package/public/assets/pds/components/pds-upload.js +7 -6
  29. package/public/assets/pds/core/pds-ask.js +4 -4
  30. package/public/assets/pds/core/pds-autocomplete.js +4 -4
  31. package/public/assets/pds/core/pds-enhancers.js +1 -1
  32. package/public/assets/pds/core/pds-localization.js +1 -0
  33. package/public/assets/pds/core/pds-manager.js +119 -119
  34. package/public/assets/pds/core.js +2 -2
  35. package/public/assets/pds/external/lit.js +2 -2
  36. package/public/assets/pds/vscode-custom-data.json +10 -0
  37. package/src/js/app.js +10 -10
  38. package/src/js/common/ask.js +5 -4
  39. package/src/js/common/font-loader.js +10 -8
  40. package/src/js/common/localization-resource-provider.js +319 -0
  41. package/src/js/common/localization.js +1001 -0
  42. package/src/js/common/msg.js +9 -90
  43. package/src/js/common/pds-log.js +144 -0
  44. package/src/js/lit.js +0 -15
  45. package/src/js/pds-autocomplete.js +69 -1
  46. package/src/js/pds-core/pds-config.js +51 -10
  47. package/src/js/pds-core/pds-enhancers.js +5 -3
  48. package/src/js/pds-core/pds-live.js +23 -12
  49. package/src/js/pds-core/pds-registry.js +6 -4
  50. package/src/js/pds-core/pds-runtime.js +12 -8
  51. package/src/js/pds-core/pds-start-helpers.js +21 -11
  52. package/src/js/pds-localization.js +10 -0
  53. package/src/js/pds-singleton.js +49 -0
  54. package/src/js/pds.d.ts +152 -0
  55. package/src/js/pds.js +428 -47
  56. package/stories/components/PdsForm.stories.js +9 -1
  57. package/stories/components/PdsLocale.stories.js +86 -0
  58. package/stories/components/PdsOmnibox.stories.js +206 -0
  59. package/stories/foundations/Colors.stories.js +3 -1
  60. package/stories/getting-started.md +2 -0
  61. package/stories/reference/reference-helpers.js +2 -2
  62. package/stories/utils/PdsAsk.stories.js +179 -1
  63. package/stories/utils/navigation.js +2 -2
@@ -180,11 +180,21 @@ const config = {
180
180
  config.resolve.alias.push({ find: '../../../../src', replacement: pdsSrcPath });
181
181
 
182
182
  // Try to resolve user's pds.config.js
183
- const userConfigPath = resolve(process.cwd(), 'pds.config.js');
184
- if (fs.existsSync(userConfigPath)) {
185
- config.resolve.alias.push({ find: '@user/pds-config', replacement: userConfigPath });
183
+ const packageRoot = resolve(currentDirname, '..');
184
+ const monorepoRoot = resolve(currentDirname, '../../..');
185
+ const cwdUserConfigPath = resolve(process.cwd(), 'pds.config.js');
186
+ const monorepoUserConfigPath = resolve(monorepoRoot, 'pds.config.js');
187
+
188
+ const userConfigCandidates = process.cwd() === packageRoot
189
+ ? [monorepoUserConfigPath, cwdUserConfigPath]
190
+ : [cwdUserConfigPath, monorepoUserConfigPath];
191
+
192
+ const resolvedUserConfigPath = userConfigCandidates.find((candidate) => fs.existsSync(candidate));
193
+
194
+ if (resolvedUserConfigPath) {
195
+ config.resolve.alias.push({ find: '@user/pds-config', replacement: resolvedUserConfigPath });
186
196
  } else {
187
- // Fallback to a default config file if user config doesn't exist
197
+ // Fallback to a default config file if user config doesn't exist
188
198
  config.resolve.alias.push({ find: '@user/pds-config', replacement: resolve(currentDirname, '../default-pds.config.js') });
189
199
  }
190
200
 
@@ -3,10 +3,11 @@ import { SELECT_STORY, UPDATE_GLOBALS } from '@storybook/core-events';
3
3
  import React from 'react';
4
4
  import { html } from 'lit';
5
5
  import { Title, Subtitle, Description as DocsDescription, Controls } from '@storybook/blocks';
6
- import { PDS } from '@pds-src/js/pds.js';
6
+ import { PDS } from '#pds';
7
7
  import { presets } from '@pds-src/js/pds-core/pds-config.js';
8
8
  import { Generator } from '@pds-src/js/pds-core/pds-generator.js';
9
9
  import { applyStyles } from '@pds-src/js/pds-core/pds-runtime.js';
10
+ import { stripFunctions } from '@pds-src/js/pds-core/pds-start-helpers.js';
10
11
  import { config as userConfig } from '@user/pds-config';
11
12
  import { withHTMLExtractor } from './addons/html-preview/preview.js';
12
13
  import { withDescription } from './addons/description/preview.js';
@@ -75,8 +76,127 @@ const getInitialPreset = () => {
75
76
  return 'default'; // Default preset
76
77
  };
77
78
 
79
+ const STORYBOOK_LOCALE_STORAGE_KEY = 'storybook-pds-locale';
80
+
81
+ const normalizeLocale = (value) => String(value || '').trim().toLowerCase();
82
+
83
+ const getConfiguredLocales = () => {
84
+ const configuredLocales = userConfig?.localization?.locales;
85
+ const providerLocales = userConfig?.localization?.provider?.locales;
86
+ const sourceLocales = Array.isArray(configuredLocales) && configuredLocales.length
87
+ ? configuredLocales
88
+ : Array.isArray(providerLocales) && providerLocales.length
89
+ ? providerLocales
90
+ : ['en'];
91
+
92
+ const seen = new Set();
93
+ return sourceLocales.reduce((result, locale) => {
94
+ const normalized = normalizeLocale(locale);
95
+ if (!normalized || seen.has(normalized)) return result;
96
+ seen.add(normalized);
97
+ result.push(normalized);
98
+ return result;
99
+ }, []);
100
+ };
101
+
102
+ const resolveSupportedLocale = (value, supportedLocales = [], fallbackLocale = 'en') => {
103
+ const normalizedValue = normalizeLocale(value);
104
+ const normalizedFallback = normalizeLocale(fallbackLocale) || 'en';
105
+ const normalizedSupported = Array.isArray(supportedLocales)
106
+ ? supportedLocales.map((locale) => normalizeLocale(locale)).filter(Boolean)
107
+ : [];
108
+
109
+ if (!normalizedSupported.length) return normalizedFallback;
110
+
111
+ const exactMatch = normalizedSupported.find((locale) => locale === normalizedValue);
112
+ if (exactMatch) return exactMatch;
113
+
114
+ const requestedBase = normalizedValue.split('-')[0];
115
+ const baseMatch = normalizedSupported.find((locale) => locale.split('-')[0] === requestedBase);
116
+ if (baseMatch) return baseMatch;
117
+
118
+ const fallbackMatch = normalizedSupported.find((locale) => locale === normalizedFallback);
119
+ if (fallbackMatch) return fallbackMatch;
120
+
121
+ return normalizedSupported[0];
122
+ };
123
+
124
+ const getInitialLocale = (supportedLocales, fallbackLocale) => {
125
+ try {
126
+ const sessionLocale = sessionStorage.getItem(STORYBOOK_LOCALE_STORAGE_KEY);
127
+ if (sessionLocale) {
128
+ return resolveSupportedLocale(sessionLocale, supportedLocales, fallbackLocale);
129
+ }
130
+
131
+ const storedLocale = localStorage.getItem(STORYBOOK_LOCALE_STORAGE_KEY);
132
+ if (storedLocale) {
133
+ return resolveSupportedLocale(storedLocale, supportedLocales, fallbackLocale);
134
+ }
135
+
136
+ const urlParams = new URLSearchParams(window.location.search);
137
+ const urlLocale = urlParams.get('locale');
138
+ if (urlLocale) {
139
+ return resolveSupportedLocale(urlLocale, supportedLocales, fallbackLocale);
140
+ }
141
+ } catch (error) {
142
+ console.warn('Failed to read locale from storage:', error);
143
+ }
144
+
145
+ return resolveSupportedLocale(fallbackLocale, supportedLocales, fallbackLocale);
146
+ };
147
+
148
+ const formatLocaleTitle = (locale) => {
149
+ const normalized = normalizeLocale(locale);
150
+ if (!normalized) return locale;
151
+
152
+ const [languageCode, regionCode] = normalized.split('-');
153
+ let languageLabel = languageCode.toUpperCase();
154
+
155
+ try {
156
+ if (typeof Intl !== 'undefined' && typeof Intl.DisplayNames === 'function') {
157
+ const displayNames = new Intl.DisplayNames(['en'], { type: 'language' });
158
+ languageLabel = displayNames.of(languageCode) || languageLabel;
159
+ }
160
+ } catch {}
161
+
162
+ if (regionCode) {
163
+ return `${languageLabel} (${languageCode}-${regionCode.toUpperCase()})`;
164
+ }
165
+
166
+ return `${languageLabel} (${languageCode})`;
167
+ };
168
+
169
+ const storybookLocales = getConfiguredLocales();
170
+ if (!storybookLocales.length) {
171
+ storybookLocales.push('en');
172
+ }
173
+
174
+ const initialDocumentLocale = typeof document !== 'undefined'
175
+ ? document.documentElement?.getAttribute('lang')
176
+ : null;
177
+
178
+ const defaultStorybookLocale = resolveSupportedLocale(
179
+ userConfig?.localization?.locale || initialDocumentLocale || 'en',
180
+ storybookLocales,
181
+ storybookLocales[0] || 'en'
182
+ );
183
+
78
184
  const initialPreset = getInitialPreset();
185
+ const initialLocale = getInitialLocale(storybookLocales, defaultStorybookLocale);
79
186
  console.log('🎨 Starting PDS initialization with preset:', initialPreset);
187
+ console.log('🌍 Starting locale for Storybook:', initialLocale);
188
+
189
+ const clonePresetDesign = (presetConfig) => {
190
+ const cloneCandidate = stripFunctions(presetConfig);
191
+ if (typeof structuredClone === 'function') {
192
+ return structuredClone(cloneCandidate);
193
+ }
194
+ return JSON.parse(JSON.stringify(cloneCandidate));
195
+ };
196
+
197
+ if (typeof document !== 'undefined' && document.documentElement) {
198
+ document.documentElement.setAttribute('lang', initialLocale);
199
+ }
80
200
 
81
201
  // Helper to detect docs pages - used to prevent PDS from interfering
82
202
  function isDocsPage() {
@@ -155,6 +275,7 @@ PDS.addEventListener('pds:ready', (event) => {
155
275
  // Merge user config
156
276
  if (userConfig) {
157
277
  if (userConfig.mode) pdsOptions.mode = userConfig.mode;
278
+ if (userConfig.localization) pdsOptions.localization = userConfig.localization;
158
279
  if (userConfig.autoDefine) {
159
280
  // Merge autoDefine options
160
281
  pdsOptions.autoDefine = {
@@ -177,6 +298,10 @@ PDS.addEventListener('pds:ready', (event) => {
177
298
 
178
299
  // Store PDS designer globally for reuse
179
300
  PDS.currentPreset = initialPreset;
301
+
302
+ if (typeof document !== 'undefined' && document.documentElement) {
303
+ document.documentElement.setAttribute('lang', initialLocale);
304
+ }
180
305
  })();
181
306
 
182
307
  // Style protection disabled - decorator controls when PDS styles are applied
@@ -188,6 +313,42 @@ PDS.addEventListener('pds:ready', (event) => {
188
313
  // Track current view mode globally for other code to check
189
314
  let currentViewMode = 'story';
190
315
  let toolbarTheme = null;
316
+ let toolbarLocale = initialLocale;
317
+
318
+ const setToolbarLocaleValue = (value) => {
319
+ const supportedLocale = resolveSupportedLocale(value, storybookLocales, defaultStorybookLocale);
320
+ if (!supportedLocale) return;
321
+ toolbarLocale = supportedLocale;
322
+ };
323
+
324
+ const persistStorybookLocale = (locale) => {
325
+ const supportedLocale = resolveSupportedLocale(locale, storybookLocales, defaultStorybookLocale);
326
+ if (!supportedLocale) return;
327
+
328
+ try {
329
+ sessionStorage.setItem(STORYBOOK_LOCALE_STORAGE_KEY, supportedLocale);
330
+ localStorage.setItem(STORYBOOK_LOCALE_STORAGE_KEY, supportedLocale);
331
+ } catch (error) {
332
+ console.warn('Failed to store locale:', error);
333
+ }
334
+ };
335
+
336
+ const applyStorybookLocale = (locale, { persist = true } = {}) => {
337
+ const supportedLocale = resolveSupportedLocale(locale, storybookLocales, defaultStorybookLocale);
338
+ if (!supportedLocale) return null;
339
+
340
+ if (persist) {
341
+ persistStorybookLocale(supportedLocale);
342
+ }
343
+
344
+ setToolbarLocaleValue(supportedLocale);
345
+
346
+ if (typeof document !== 'undefined' && document.documentElement) {
347
+ document.documentElement.setAttribute('lang', supportedLocale);
348
+ }
349
+
350
+ return supportedLocale;
351
+ };
191
352
 
192
353
  const setToolbarThemeValue = (value) => {
193
354
  if (!value) return;
@@ -420,7 +581,7 @@ const withGlobalsHandler = (story, context) => {
420
581
  console.log(`🎨 Applying preset via decorator: ${presetConfig.name || globals.preset}`);
421
582
 
422
583
  const generatorOptions = {
423
- design: structuredClone(presetConfig),
584
+ design: clonePresetDesign(presetConfig),
424
585
  log: (...args) => console.log('🟦 [Generator]', ...args)
425
586
  };
426
587
 
@@ -447,6 +608,18 @@ const withGlobalsHandler = (story, context) => {
447
608
  if (globals?.theme) {
448
609
  setToolbarThemeValue(globals.theme);
449
610
  }
611
+
612
+ if (globals?.locale) {
613
+ const requestedLocale = resolveSupportedLocale(globals.locale, storybookLocales, defaultStorybookLocale);
614
+ const activeLocale = normalizeLocale(document.documentElement?.getAttribute('lang') || toolbarLocale);
615
+
616
+ if (requestedLocale && requestedLocale !== activeLocale) {
617
+ applyStorybookLocale(requestedLocale, { persist: true });
618
+ } else if (requestedLocale && document.documentElement?.getAttribute('lang') !== requestedLocale) {
619
+ document.documentElement.setAttribute('lang', requestedLocale);
620
+ setToolbarLocaleValue(requestedLocale);
621
+ }
622
+ }
450
623
 
451
624
  return story();
452
625
  };
@@ -1539,10 +1712,23 @@ const preview = {
1539
1712
  dynamicTitle: true
1540
1713
  }
1541
1714
  },
1715
+ locale: {
1716
+ name: 'Locale',
1717
+ description: 'PDS locale',
1718
+ defaultValue: initialLocale,
1719
+ toolbar: {
1720
+ icon: 'globe',
1721
+ items: storybookLocales.map((locale) => ({
1722
+ value: locale,
1723
+ title: formatLocaleTitle(locale)
1724
+ })),
1725
+ dynamicTitle: true
1726
+ }
1727
+ },
1542
1728
  preset: {
1543
1729
  name: 'Preset',
1544
1730
  description: 'Design preset',
1545
- defaultValue: initialPreset, // Use the preset loaded from storage
1731
+ defaultValue: initialPreset,
1546
1732
  toolbar: {
1547
1733
  icon: 'paintbrush',
1548
1734
  items: Object.keys(presets)
@@ -1551,25 +1737,20 @@ const preview = {
1551
1737
  const bPreset = presets[b];
1552
1738
  const aTags = aPreset.tags || [];
1553
1739
  const bTags = bPreset.tags || [];
1554
-
1555
- // Check if featured
1740
+
1556
1741
  const aFeatured = aTags.includes('featured');
1557
1742
  const bFeatured = bTags.includes('featured');
1558
-
1559
1743
  if (aFeatured && !bFeatured) return -1;
1560
1744
  if (!aFeatured && bFeatured) return 1;
1561
-
1562
- // Check if has any tags
1745
+
1563
1746
  const aHasTags = aTags.length > 0;
1564
1747
  const bHasTags = bTags.length > 0;
1565
-
1566
1748
  if (aHasTags && !bHasTags) return -1;
1567
1749
  if (!aHasTags && bHasTags) return 1;
1568
-
1569
- // Alphabetical by name
1750
+
1570
1751
  return (aPreset.name || a).localeCompare(bPreset.name || b);
1571
1752
  })
1572
- .map(key => ({
1753
+ .map((key) => ({
1573
1754
  value: key,
1574
1755
  title: presets[key].name || key
1575
1756
  })),
@@ -1579,102 +1760,97 @@ const preview = {
1579
1760
  }
1580
1761
  };
1581
1762
 
1582
- // Listen to theme and preset changes from toolbar
1583
1763
  if (typeof window !== 'undefined') {
1584
1764
  console.log('👂 Setting up message listener for toolbar changes...');
1585
-
1765
+
1586
1766
  window.addEventListener('message', async (event) => {
1587
- if(event.data?.type == null) return;
1767
+ if (event.data?.type == null) return;
1588
1768
 
1589
1769
  console.log('📨 Message received:', event.data?.type, event.data);
1590
-
1770
+
1591
1771
  if (event.data?.type === 'SET_GLOBALS') {
1592
1772
  console.log('✅ SET_GLOBALS detected, globals:', event.data.globals);
1593
1773
  const { globals } = event.data;
1594
-
1774
+
1595
1775
  if (globals?.theme) {
1596
1776
  console.log('🌙 Theme change requested:', globals.theme);
1597
-
1598
- // Set data-theme attribute on body for PDS theme system
1599
1777
  document.body.setAttribute('data-theme', globals.theme);
1600
-
1601
- // Also use PDS.theme property
1602
1778
  PDS.theme = globals.theme;
1603
-
1604
1779
  console.log('✅ Theme applied:', globals.theme);
1605
1780
  setToolbarThemeValue(globals.theme);
1606
1781
  }
1607
-
1782
+
1608
1783
  if (globals?.preset) {
1609
1784
  console.log('🔔 SET_GLOBALS message received with preset:', globals.preset);
1610
1785
  console.log('📦 Current stored preset:', PDS.currentPreset);
1611
-
1612
- // Skip if already on this preset
1786
+
1613
1787
  if (globals.preset === PDS.currentPreset) {
1614
1788
  console.log('⏭️ Preset unchanged, skipping');
1615
- return;
1616
- }
1617
-
1618
- try {
1619
- console.log('📦 Preset change requested:', globals.preset);
1620
-
1621
- // Store preset selection for persistence
1789
+ } else {
1622
1790
  try {
1623
- sessionStorage.setItem('storybook-pds-preset', globals.preset);
1624
- localStorage.setItem('storybook-pds-preset', globals.preset);
1625
- console.log('💾 Preset stored in storage');
1626
- } catch (e) {
1627
- console.warn('⚠️ Failed to store preset:', e);
1628
- }
1629
-
1630
- // Load preset from PDS presets and create new designer
1631
- console.log('📥 Importing pds-config...');
1632
- const configModule = await import('../../../src/js/pds-core/pds-config.js');
1633
- console.log(' Config module loaded:', configModule);
1634
-
1635
- const { presets } = configModule;
1636
- const presetId = globals.preset;
1637
- const presetConfig = presets[presetId];
1638
-
1639
- console.log('📋 Available presets:', Object.keys(presets));
1640
- console.log('🔍 Looking for preset:', presetId);
1641
- console.log(' Found preset config:', presetConfig ? 'yes' : 'no');
1642
-
1643
- if (presetConfig) {
1644
- console.log(`🎨 Applying preset: ${presetConfig.name || presetId}`);
1645
- console.log('📝 Preset config:', presetConfig);
1646
-
1647
- // Create new designer with preset config (same as pds-config-form does)
1648
- const generatorOptions = {
1649
- design: structuredClone(presetConfig),
1650
- log: (...args) => console.log('🟦 [Generator]', ...args)
1651
- };
1652
- const storedTheme = PDS.theme || null;
1653
- if (storedTheme) {
1654
- generatorOptions.theme = storedTheme;
1655
- console.log('🌙 Applying stored theme:', storedTheme);
1791
+ console.log('📦 Preset change requested:', globals.preset);
1792
+
1793
+ try {
1794
+ sessionStorage.setItem('storybook-pds-preset', globals.preset);
1795
+ localStorage.setItem('storybook-pds-preset', globals.preset);
1796
+ console.log('💾 Preset stored in storage');
1797
+ } catch (e) {
1798
+ console.warn('⚠️ Failed to store preset:', e);
1799
+ }
1800
+
1801
+ console.log('📥 Importing pds-config...');
1802
+ const configModule = await import('../../../src/js/pds-core/pds-config.js');
1803
+ console.log('✅ Config module loaded:', configModule);
1804
+
1805
+ const { presets } = configModule;
1806
+ const presetId = globals.preset;
1807
+ const presetConfig = presets[presetId];
1808
+
1809
+ console.log('📋 Available presets:', Object.keys(presets));
1810
+ console.log('🔍 Looking for preset:', presetId);
1811
+ console.log('✅ Found preset config:', presetConfig ? 'yes' : 'no');
1812
+
1813
+ if (presetConfig) {
1814
+ console.log(`🎨 Applying preset: ${presetConfig.name || presetId}`);
1815
+ console.log('📝 Preset config:', presetConfig);
1816
+
1817
+ const generatorOptions = {
1818
+ design: clonePresetDesign(presetConfig),
1819
+ log: (...args) => console.log('🟦 [Generator]', ...args)
1820
+ };
1821
+ const storedTheme = PDS.theme || null;
1822
+ if (storedTheme) {
1823
+ generatorOptions.theme = storedTheme;
1824
+ console.log('🌙 Applying stored theme:', storedTheme);
1825
+ }
1826
+
1827
+ console.log('🏗️ Creating new Generator...');
1828
+ const newDesigner = new Generator(generatorOptions);
1829
+ console.log('✅ Generator created');
1830
+
1831
+ console.log('🎨 Applying styles to document...');
1832
+ setLiveGenerator(newDesigner);
1833
+ await applyStyles(newDesigner);
1834
+ console.log('✅ Styles applied to document');
1835
+
1836
+ PDS.currentPreset = presetId;
1837
+ console.log(`✅✅✅ Preset applied successfully: ${presetConfig.name || presetId}`);
1838
+ } else {
1839
+ console.error(`❌ Preset not found: ${presetId}`);
1840
+ console.error('❌ Available presets:', Object.keys(presets));
1656
1841
  }
1657
-
1658
- console.log('🏗️ Creating new Generator...');
1659
- const newDesigner = new Generator(generatorOptions);
1660
- console.log('✅ Generator created');
1661
-
1662
- console.log('🎨 Applying styles to document...');
1663
- setLiveGenerator(newDesigner);
1664
- await applyStyles(newDesigner);
1665
- console.log('✅ Styles applied to document');
1666
-
1667
- // Update global reference
1668
- PDS.currentPreset = presetId;
1669
-
1670
- console.log(`✅✅✅ Preset applied successfully: ${presetConfig.name || presetId}`);
1671
- } else {
1672
- console.error(`❌ Preset not found: ${presetId}`);
1673
- console.error('❌ Available presets:', Object.keys(presets));
1842
+ } catch (err) {
1843
+ console.error('❌❌❌ Failed to apply preset:', err);
1844
+ console.error('❌ Stack trace:', err.stack);
1674
1845
  }
1675
- } catch (err) {
1676
- console.error('❌❌❌ Failed to apply preset:', err);
1677
- console.error('❌ Stack trace:', err.stack);
1846
+ }
1847
+ }
1848
+
1849
+ if (globals?.locale) {
1850
+ const requestedLocale = resolveSupportedLocale(globals.locale, storybookLocales, defaultStorybookLocale);
1851
+ if (requestedLocale) {
1852
+ console.log('🌍 Locale change requested:', requestedLocale);
1853
+ applyStorybookLocale(requestedLocale, { persist: true });
1678
1854
  }
1679
1855
  }
1680
1856
  }