@warp-ds/elements 2.8.2-next.2 → 2.8.2-next.3

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 (140) hide show
  1. package/dist/custom-elements.json +166 -69
  2. package/dist/index.d.ts +63 -11
  3. package/dist/packages/affix/affix.hydration.test.d.ts +1 -0
  4. package/dist/packages/affix/affix.hydration.test.js +33 -0
  5. package/dist/packages/affix/affix.js +3 -3
  6. package/dist/packages/affix/affix.js.map +3 -3
  7. package/dist/packages/alert/alert.hydration.test.d.ts +1 -0
  8. package/dist/packages/alert/alert.hydration.test.js +47 -0
  9. package/dist/packages/alert/alert.js +5 -5
  10. package/dist/packages/alert/alert.js.map +3 -3
  11. package/dist/packages/attention/attention.hydration.test.d.ts +1 -0
  12. package/dist/packages/attention/attention.hydration.test.js +66 -0
  13. package/dist/packages/attention/attention.js +11 -11
  14. package/dist/packages/attention/attention.js.map +3 -3
  15. package/dist/packages/badge/badge.hydration.test.d.ts +1 -0
  16. package/dist/packages/badge/badge.hydration.test.js +50 -0
  17. package/dist/packages/box/box.hydration.test.d.ts +1 -0
  18. package/dist/packages/box/box.hydration.test.js +37 -0
  19. package/dist/packages/breadcrumbs/breadcrumbs.hydration.test.d.ts +1 -0
  20. package/dist/packages/breadcrumbs/breadcrumbs.hydration.test.js +141 -0
  21. package/dist/packages/breadcrumbs/breadcrumbs.js.map +2 -2
  22. package/dist/packages/button/button.hydration.test.d.ts +1 -0
  23. package/dist/packages/button/button.hydration.test.js +43 -0
  24. package/dist/packages/button/button.js +3 -3
  25. package/dist/packages/button/button.js.map +3 -3
  26. package/dist/packages/button/button.react.stories.d.ts +1 -1
  27. package/dist/packages/card/card.hydration.test.d.ts +1 -0
  28. package/dist/packages/card/card.hydration.test.js +38 -0
  29. package/dist/packages/card/card.react.stories.d.ts +1 -1
  30. package/dist/packages/checkbox/checkbox.d.ts +17 -1
  31. package/dist/packages/checkbox/checkbox.hydration.test.d.ts +1 -0
  32. package/dist/packages/checkbox/checkbox.hydration.test.js +47 -0
  33. package/dist/packages/checkbox/checkbox.js +20 -19
  34. package/dist/packages/checkbox/checkbox.js.map +3 -3
  35. package/dist/packages/checkbox/styles.js +10 -9
  36. package/dist/packages/checkbox-group/checkbox-group.d.ts +7 -0
  37. package/dist/packages/checkbox-group/checkbox-group.hydration.test.d.ts +2 -0
  38. package/dist/packages/checkbox-group/checkbox-group.hydration.test.js +40 -0
  39. package/dist/packages/checkbox-group/checkbox-group.js +14 -14
  40. package/dist/packages/checkbox-group/checkbox-group.js.map +3 -3
  41. package/dist/packages/checkbox-group/checkbox-group.test.js +10 -0
  42. package/dist/packages/combobox/combobox.hydration.test.d.ts +1 -0
  43. package/dist/packages/combobox/combobox.hydration.test.js +43 -0
  44. package/dist/packages/combobox/combobox.react.stories.d.ts +1 -1
  45. package/dist/packages/datepicker/datepicker.hydration.test.d.ts +1 -0
  46. package/dist/packages/datepicker/datepicker.hydration.test.js +40 -0
  47. package/dist/packages/datepicker/datepicker.js +1 -1
  48. package/dist/packages/datepicker/datepicker.js.map +3 -3
  49. package/dist/packages/datepicker/datepicker.react.stories.d.ts +1 -1
  50. package/dist/packages/expandable/expandable.hydration.test.d.ts +1 -0
  51. package/dist/packages/expandable/expandable.hydration.test.js +47 -0
  52. package/dist/packages/expandable/expandable.js +3 -3
  53. package/dist/packages/expandable/expandable.js.map +3 -3
  54. package/dist/packages/icon/icon.hydration.test.d.ts +1 -0
  55. package/dist/packages/icon/icon.hydration.test.js +47 -0
  56. package/dist/packages/icon/icon.js +2 -2
  57. package/dist/packages/icon/icon.js.map +3 -3
  58. package/dist/packages/link/link.hydration.test.d.ts +1 -0
  59. package/dist/packages/link/link.hydration.test.js +54 -0
  60. package/dist/packages/modal/modal.hydration.test.d.ts +1 -0
  61. package/dist/packages/modal/modal.hydration.test.js +25 -0
  62. package/dist/packages/modal-header/modal-header.js +6 -6
  63. package/dist/packages/modal-header/modal-header.js.map +3 -3
  64. package/dist/packages/page-indicator/page-indicator.hydration.test.d.ts +1 -0
  65. package/dist/packages/page-indicator/page-indicator.hydration.test.js +41 -0
  66. package/dist/packages/pagination/pagination.hydration.test.d.ts +1 -0
  67. package/dist/packages/pagination/pagination.hydration.test.js +38 -0
  68. package/dist/packages/pagination/pagination.js +11 -11
  69. package/dist/packages/pagination/pagination.js.map +3 -3
  70. package/dist/packages/pill/pill.hydration.test.d.ts +1 -0
  71. package/dist/packages/pill/pill.hydration.test.js +32 -0
  72. package/dist/packages/pill/pill.js +1 -1
  73. package/dist/packages/pill/pill.js.map +3 -3
  74. package/dist/packages/radio/radio.d.ts +33 -1
  75. package/dist/packages/radio/radio.hydration.test.d.ts +1 -0
  76. package/dist/packages/radio/radio.hydration.test.js +29 -0
  77. package/dist/packages/radio/radio.js +7 -7
  78. package/dist/packages/radio/radio.js.map +3 -3
  79. package/dist/packages/radio/radio.test.js +15 -8
  80. package/dist/packages/radio-group/radio-group.a11y.test.js +4 -0
  81. package/dist/packages/radio-group/radio-group.hydration.test.d.ts +2 -0
  82. package/dist/packages/radio-group/radio-group.hydration.test.js +32 -0
  83. package/dist/packages/radio-group/radio-group.js +17 -17
  84. package/dist/packages/radio-group/radio-group.js.map +3 -3
  85. package/dist/packages/select/select.hydration.test.d.ts +1 -0
  86. package/dist/packages/select/select.hydration.test.js +37 -0
  87. package/dist/packages/select/select.js +1 -1
  88. package/dist/packages/select/select.js.map +3 -3
  89. package/dist/packages/select/select.react.stories.d.ts +1 -1
  90. package/dist/packages/slider/slider.hydration.test.d.ts +1 -0
  91. package/dist/packages/slider/slider.hydration.test.js +33 -0
  92. package/dist/packages/slider/slider.js +9 -9
  93. package/dist/packages/slider/slider.js.map +3 -3
  94. package/dist/packages/slider/slider.test.js +13 -0
  95. package/dist/packages/slider-thumb/slider-thumb.hydration.test.d.ts +1 -0
  96. package/dist/packages/slider-thumb/slider-thumb.hydration.test.js +35 -0
  97. package/dist/packages/slider-thumb/slider-thumb.js +16 -16
  98. package/dist/packages/slider-thumb/slider-thumb.js.map +3 -3
  99. package/dist/packages/step/step.hydration.test.d.ts +1 -0
  100. package/dist/packages/step/step.hydration.test.js +25 -0
  101. package/dist/packages/step/step.js +1 -1
  102. package/dist/packages/step/step.js.map +3 -3
  103. package/dist/packages/step-indicator/step-indicator.hydration.test.d.ts +1 -0
  104. package/dist/packages/step-indicator/step-indicator.hydration.test.js +25 -0
  105. package/dist/packages/switch/switch.a11y.test.js +13 -3
  106. package/dist/packages/switch/switch.d.ts +6 -0
  107. package/dist/packages/switch/switch.hydration.test.d.ts +1 -0
  108. package/dist/packages/switch/switch.hydration.test.js +54 -0
  109. package/dist/packages/switch/switch.js +7 -13
  110. package/dist/packages/switch/switch.js.map +2 -2
  111. package/dist/packages/tab/tab.d.ts +37 -2
  112. package/dist/packages/tab/tab.hydration.test.d.ts +1 -0
  113. package/dist/packages/tab/tab.hydration.test.js +25 -0
  114. package/dist/packages/tab/tab.js +22 -12
  115. package/dist/packages/tab/tab.js.map +3 -3
  116. package/dist/packages/tab-panel/tab-panel.d.ts +21 -0
  117. package/dist/packages/tab-panel/tab-panel.hydration.test.d.ts +1 -0
  118. package/dist/packages/tab-panel/tab-panel.hydration.test.js +21 -0
  119. package/dist/packages/tab-panel/tab-panel.js +16 -5
  120. package/dist/packages/tab-panel/tab-panel.js.map +3 -3
  121. package/dist/packages/tabs/tabs.a11y.test.js +45 -3
  122. package/dist/packages/tabs/tabs.hydration.test.d.ts +1 -0
  123. package/dist/packages/tabs/tabs.hydration.test.js +20 -0
  124. package/dist/packages/tabs/tabs.js +6 -6
  125. package/dist/packages/tabs/tabs.js.map +3 -3
  126. package/dist/packages/tabs/tabs.test.js +52 -4
  127. package/dist/packages/textarea/textarea.hydration.test.d.ts +1 -0
  128. package/dist/packages/textarea/textarea.hydration.test.js +43 -0
  129. package/dist/packages/textarea/textarea.react.stories.d.ts +1 -1
  130. package/dist/packages/textfield/textfield.hydration.test.d.ts +1 -0
  131. package/dist/packages/textfield/textfield.hydration.test.js +43 -0
  132. package/dist/packages/textfield/textfield.react.stories.d.ts +1 -1
  133. package/dist/packages/toast/toast.js +4 -4
  134. package/dist/packages/toast/toast.js.map +3 -3
  135. package/dist/setup-tests.d.ts +2 -1
  136. package/dist/setup-tests.js +4 -3
  137. package/dist/tests/react-hydration.d.ts +20 -0
  138. package/dist/tests/react-hydration.js +138 -0
  139. package/dist/web-types.json +59 -21
  140. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ import './badge.js';
@@ -0,0 +1,50 @@
1
+ import { describe, expect, test, beforeEach, afterEach } from 'vitest';
2
+ import { setupHydrationWarningCapture, testHydration } from '../../tests/react-hydration';
3
+ import './badge.js';
4
+ describe('w-badge React SSR hydration', () => {
5
+ beforeEach(() => setupHydrationWarningCapture());
6
+ afterEach(() => {
7
+ window.__HYDRATION_WARNINGS__ = [];
8
+ });
9
+ test('default (no attributes) hydrates without warnings', async () => {
10
+ const warnings = await testHydration('w-badge', {});
11
+ expect(warnings).toEqual([]);
12
+ });
13
+ test('neutral variant hydrates without warnings', async () => {
14
+ const warnings = await testHydration('w-badge', {
15
+ variant: 'neutral',
16
+ });
17
+ expect(warnings).toEqual([]);
18
+ });
19
+ test('info variant hydrates without warnings', async () => {
20
+ const warnings = await testHydration('w-badge', {
21
+ variant: 'info',
22
+ });
23
+ expect(warnings).toEqual([]);
24
+ });
25
+ test('positive variant hydrates without warnings', async () => {
26
+ const warnings = await testHydration('w-badge', {
27
+ variant: 'positive',
28
+ });
29
+ expect(warnings).toEqual([]);
30
+ });
31
+ test('warning variant hydrates without warnings', async () => {
32
+ const warnings = await testHydration('w-badge', {
33
+ variant: 'warning',
34
+ });
35
+ expect(warnings).toEqual([]);
36
+ });
37
+ test('negative variant hydrates without warnings', async () => {
38
+ const warnings = await testHydration('w-badge', {
39
+ variant: 'negative',
40
+ });
41
+ expect(warnings).toEqual([]);
42
+ });
43
+ test('with position hydrates without warnings', async () => {
44
+ const warnings = await testHydration('w-badge', {
45
+ variant: 'info',
46
+ position: 'top-right',
47
+ });
48
+ expect(warnings).toEqual([]);
49
+ });
50
+ });
@@ -0,0 +1 @@
1
+ import './box.js';
@@ -0,0 +1,37 @@
1
+ import { describe, expect, test, beforeEach, afterEach } from 'vitest';
2
+ import { setupHydrationWarningCapture, testHydration } from '../../tests/react-hydration';
3
+ import './box.js';
4
+ describe('w-box React SSR hydration', () => {
5
+ beforeEach(() => setupHydrationWarningCapture());
6
+ afterEach(() => {
7
+ window.__HYDRATION_WARNINGS__ = [];
8
+ });
9
+ test('default (no attributes) hydrates without warnings', async () => {
10
+ const warnings = await testHydration('w-box', {});
11
+ expect(warnings).toEqual([]);
12
+ });
13
+ test('info box hydrates without warnings', async () => {
14
+ const warnings = await testHydration('w-box', {
15
+ info: true,
16
+ });
17
+ expect(warnings).toEqual([]);
18
+ });
19
+ test('neutral box hydrates without warnings', async () => {
20
+ const warnings = await testHydration('w-box', {
21
+ neutral: true,
22
+ });
23
+ expect(warnings).toEqual([]);
24
+ });
25
+ test('bordered box hydrates without warnings', async () => {
26
+ const warnings = await testHydration('w-box', {
27
+ bordered: true,
28
+ });
29
+ expect(warnings).toEqual([]);
30
+ });
31
+ test('bleed box hydrates without warnings', async () => {
32
+ const warnings = await testHydration('w-box', {
33
+ bleed: true,
34
+ });
35
+ expect(warnings).toEqual([]);
36
+ });
37
+ });
@@ -0,0 +1 @@
1
+ import './breadcrumbs.js';
@@ -0,0 +1,141 @@
1
+ import { describe, expect, test, beforeEach, afterEach } from 'vitest';
2
+ import { setupHydrationWarningCapture, testHydration, testHydrationWithChildren } from '../../tests/react-hydration';
3
+ import './breadcrumbs.js';
4
+ describe('w-breadcrumbs React SSR hydration', () => {
5
+ beforeEach(() => setupHydrationWarningCapture());
6
+ afterEach(() => {
7
+ window.__HYDRATION_WARNINGS__ = [];
8
+ });
9
+ test('default (no attributes) hydrates without warnings', async () => {
10
+ const warnings = await testHydration('w-breadcrumbs', {});
11
+ expect(warnings).toEqual([]);
12
+ });
13
+ test('with aria-label hydrates without warnings', async () => {
14
+ const warnings = await testHydration('w-breadcrumbs', { 'aria-label': 'Navigation breadcrumbs' });
15
+ expect(warnings).toEqual([]);
16
+ });
17
+ // Tests for child elements - breadcrumbs consumes children and renders them
18
+ // in shadow DOM, which causes hydration mismatches. These use test.fails
19
+ // to document the known issues until they are fixed.
20
+ test.fails('with single link child hydrates without warnings', async () => {
21
+ const childrenHtml = '<a href="#/home">Home</a>';
22
+ const warnings = await testHydrationWithChildren('w-breadcrumbs', {}, childrenHtml);
23
+ expect(warnings).toEqual([]);
24
+ });
25
+ test.fails('with multiple link children hydrates without warnings', async () => {
26
+ // This tests the interleaving behavior - "/" separators are added between children
27
+ const childrenHtml = '<a href="#/home">Home</a><a href="#/category">Category</a>';
28
+ const warnings = await testHydrationWithChildren('w-breadcrumbs', {}, childrenHtml);
29
+ expect(warnings).toEqual([]);
30
+ });
31
+ test.fails('with three link children hydrates without warnings', async () => {
32
+ // More children = more separators interleaved
33
+ const childrenHtml = '<a href="#/home">Home</a><a href="#/category">Category</a><a href="#/page">Page</a>';
34
+ const warnings = await testHydrationWithChildren('w-breadcrumbs', {}, childrenHtml);
35
+ expect(warnings).toEqual([]);
36
+ });
37
+ test.fails('with links and span (current page) hydrates without warnings', async () => {
38
+ // Common pattern: links for navigation, span for current page
39
+ const childrenHtml = '<a href="#/home">Home</a><a href="#/category">Category</a><span aria-current="page">Current page</span>';
40
+ const warnings = await testHydrationWithChildren('w-breadcrumbs', {}, childrenHtml);
41
+ expect(warnings).toEqual([]);
42
+ });
43
+ test.fails('with span children hydrates without warnings', async () => {
44
+ // Non-link children get different CSS class (s-text vs s-text-link)
45
+ const childrenHtml = '<span>First</span><span>Second</span><span aria-current="page">Current</span>';
46
+ const warnings = await testHydrationWithChildren('w-breadcrumbs', {}, childrenHtml);
47
+ expect(warnings).toEqual([]);
48
+ });
49
+ test.fails('with mixed element types hydrates without warnings', async () => {
50
+ // Mix of different element types to ensure class assignment works correctly
51
+ const childrenHtml = '<a href="#/home">Home</a><span>Category</span><a href="#/page">Page</a>';
52
+ const warnings = await testHydrationWithChildren('w-breadcrumbs', {}, childrenHtml);
53
+ expect(warnings).toEqual([]);
54
+ });
55
+ test.fails('with aria-label and children hydrates without warnings', async () => {
56
+ const childrenHtml = '<a href="#/home">Home</a><a href="#/category">Category</a>';
57
+ const warnings = await testHydrationWithChildren('w-breadcrumbs', { 'aria-label': 'Breadcrumb navigation' }, childrenHtml);
58
+ expect(warnings).toEqual([]);
59
+ });
60
+ });
61
+ // These tests verify the component's DOM manipulation behavior that can cause
62
+ // hydration mismatches. The breadcrumbs component currently:
63
+ // 1. Moves children from light DOM to shadow DOM
64
+ // 2. Adds CSS classes to child elements
65
+ // 3. Interleaves separator elements between children
66
+ //
67
+ // In SSR scenarios, children are rendered in light DOM. When the component
68
+ // hydrates client-side and moves/modifies them, React detects a mismatch.
69
+ //
70
+ // These tests use test.fails to document the known issues until they are fixed.
71
+ describe('w-breadcrumbs child element DOM stability', () => {
72
+ test.fails('should preserve children in light DOM (not move to shadow DOM)', async () => {
73
+ const container = document.createElement('div');
74
+ container.innerHTML = '<w-breadcrumbs><a href="#/home">Home</a><a href="#/category">Category</a></w-breadcrumbs>';
75
+ document.body.appendChild(container);
76
+ // Wait for custom element upgrade
77
+ await new Promise((resolve) => setTimeout(resolve, 100));
78
+ const breadcrumbs = container.querySelector('w-breadcrumbs');
79
+ // Children should remain in light DOM, not be moved to shadow DOM
80
+ // Current behavior: children.length is 0 because they're moved to shadow DOM
81
+ expect(breadcrumbs?.children.length).toBe(2);
82
+ document.body.removeChild(container);
83
+ });
84
+ test.fails('should not add classes to light DOM link children', async () => {
85
+ const container = document.createElement('div');
86
+ container.innerHTML = '<w-breadcrumbs><a href="#/home">Home</a><a href="#/category">Category</a></w-breadcrumbs>';
87
+ document.body.appendChild(container);
88
+ // Wait for custom element upgrade
89
+ await new Promise((resolve) => setTimeout(resolve, 100));
90
+ // Check light DOM children exist and don't have modified classes
91
+ const links = container.querySelectorAll('w-breadcrumbs > a');
92
+ expect(links.length).toBe(2);
93
+ for (const link of links) {
94
+ // Links should NOT have classes added by the component
95
+ expect(link.classList.contains('s-text-link')).toBe(false);
96
+ }
97
+ document.body.removeChild(container);
98
+ });
99
+ test.fails('should not add classes to light DOM span children', async () => {
100
+ const container = document.createElement('div');
101
+ container.innerHTML = '<w-breadcrumbs><span>First</span><span>Current</span></w-breadcrumbs>';
102
+ document.body.appendChild(container);
103
+ await new Promise((resolve) => setTimeout(resolve, 100));
104
+ const spans = container.querySelectorAll('w-breadcrumbs > span');
105
+ expect(spans.length).toBe(2);
106
+ for (const span of spans) {
107
+ // Spans should NOT have classes added by the component
108
+ expect(span.classList.contains('s-text')).toBe(false);
109
+ }
110
+ document.body.removeChild(container);
111
+ });
112
+ test.fails('should not insert separator elements into light DOM', async () => {
113
+ const container = document.createElement('div');
114
+ container.innerHTML = '<w-breadcrumbs><a href="#/home">Home</a><a href="#/category">Category</a></w-breadcrumbs>';
115
+ document.body.appendChild(container);
116
+ await new Promise((resolve) => setTimeout(resolve, 100));
117
+ const breadcrumbs = container.querySelector('w-breadcrumbs');
118
+ // Should only have the original 2 children, no separators added to light DOM
119
+ expect(breadcrumbs?.children.length).toBe(2);
120
+ // No separator spans should be in light DOM
121
+ const separators = container.querySelectorAll('w-breadcrumbs > span.select-none');
122
+ expect(separators.length).toBe(0);
123
+ document.body.removeChild(container);
124
+ });
125
+ test.fails('should preserve original child element attributes in light DOM', async () => {
126
+ const container = document.createElement('div');
127
+ container.innerHTML = '<w-breadcrumbs><a href="#/home" data-test="home">Home</a><span aria-current="page">Current</span></w-breadcrumbs>';
128
+ document.body.appendChild(container);
129
+ await new Promise((resolve) => setTimeout(resolve, 100));
130
+ const link = container.querySelector('w-breadcrumbs > a');
131
+ const span = container.querySelector('w-breadcrumbs > span');
132
+ // Children should exist in light DOM
133
+ expect(link).not.toBeNull();
134
+ expect(span).not.toBeNull();
135
+ // Original attributes should be preserved
136
+ expect(link?.getAttribute('href')).toBe('#/home');
137
+ expect(link?.getAttribute('data-test')).toBe('home');
138
+ expect(span?.getAttribute('aria-current')).toBe('page');
139
+ document.body.removeChild(container);
140
+ });
141
+ });