@brightspot/ui 1.8.0 → 1.10.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 (115) hide show
  1. package/dist/LucideDynamicLoader.js +1 -1
  2. package/dist/LucideDynamicLoader.js.map +1 -1
  3. package/dist/LucideDynamicLoader.ts +1 -1
  4. package/dist/components/copy-to-clipboard/CopyToClipboard.d.ts.map +1 -1
  5. package/dist/components/copy-to-clipboard/CopyToClipboard.js +4 -0
  6. package/dist/components/copy-to-clipboard/CopyToClipboard.js.map +1 -1
  7. package/dist/components/icon/Icon.d.ts +1 -0
  8. package/dist/components/icon/Icon.d.ts.map +1 -1
  9. package/dist/components/icon/Icon.js +2 -1
  10. package/dist/components/icon/Icon.js.map +1 -1
  11. package/dist/components/switch/Switch.d.ts +92 -0
  12. package/dist/components/switch/Switch.d.ts.map +1 -0
  13. package/dist/components/switch/Switch.js +189 -0
  14. package/dist/components/switch/Switch.js.map +1 -0
  15. package/dist/custom-elements.json +510 -204
  16. package/dist/effects/celebrate.d.ts +18 -0
  17. package/dist/effects/celebrate.d.ts.map +1 -0
  18. package/dist/effects/celebrate.js +81 -0
  19. package/dist/effects/celebrate.js.map +1 -0
  20. package/dist/effects/ripple.d.ts +31 -0
  21. package/dist/effects/ripple.d.ts.map +1 -0
  22. package/dist/effects/ripple.js +131 -0
  23. package/dist/effects/ripple.js.map +1 -0
  24. package/dist/effects/sparkle-worklet.d.ts +7 -0
  25. package/dist/effects/sparkle-worklet.d.ts.map +1 -0
  26. package/dist/effects/sparkle-worklet.js +211 -0
  27. package/dist/effects/sparkle-worklet.js.map +1 -0
  28. package/dist/effects/sparkle.d.ts +6 -0
  29. package/dist/effects/sparkle.d.ts.map +1 -0
  30. package/dist/effects/sparkle.js +91 -0
  31. package/dist/effects/sparkle.js.map +1 -0
  32. package/dist/storybook/BSPLogoMark.svg +3 -0
  33. package/dist/storybook/WelcomeBG.svg +292 -0
  34. package/dist/storybook/assets/{Avatar.stories-XfJUoW42.js → Avatar.stories-B26mRkkZ.js} +1 -1
  35. package/dist/storybook/assets/{AvatarGroup.stories-CPkv0mVI.js → AvatarGroup.stories-J7lVGsMY.js} +1 -1
  36. package/dist/storybook/assets/{Badge.stories-Z42hQyzK.js → Badge.stories-BpTIV61M.js} +1 -1
  37. package/dist/storybook/assets/Button-Dg-fIrzT.js +10 -0
  38. package/dist/storybook/assets/Button.stories-gPKRVbxk.js +54 -0
  39. package/dist/storybook/assets/Celebrate.stories-DbY-sKEe.js +184 -0
  40. package/dist/storybook/assets/{CircularProgress.stories-B59nHh_k.js → CircularProgress.stories-DeH5JYX_.js} +1 -1
  41. package/dist/storybook/assets/{ClipboardMixin.stories-C6DraZ93.js → ClipboardMixin.stories-C-lZ4uuw.js} +1 -1
  42. package/dist/storybook/assets/Color-6BZIO3FS-Cu6zVIuG.js +1 -0
  43. package/dist/storybook/assets/{Colors.stories-B3Capc8F.js → Colors.stories-D6XYMrTD.js} +1 -1
  44. package/dist/storybook/assets/CombinedEffects.stories-jFekKTYg.js +355 -0
  45. package/dist/storybook/assets/{ComponentStatesMixin-DRalOmcW.js → ComponentStatesMixin-g50hRCPT.js} +1 -1
  46. package/dist/storybook/assets/{ComponentStatesMixin.stories-TKD7YrVe.js → ComponentStatesMixin.stories-D3Q5pR38.js} +1 -1
  47. package/dist/storybook/assets/{CopyToClipboard.stories-Bv8jZ7TL.js → CopyToClipboard.stories-COZZ1VC2.js} +1 -1
  48. package/dist/storybook/assets/{Debounce.stories-CLwXI3OZ.js → Debounce.stories-Dl10LAnx.js} +1 -1
  49. package/dist/storybook/assets/DocsRenderer-LL677BLK-CFLtMbUx.js +10 -0
  50. package/dist/storybook/assets/{Dropdown.stories-D7X0Dbnt.js → Dropdown.stories-Drwq-0Z2.js} +1 -1
  51. package/dist/storybook/assets/{Events.stories-Dgn1N8jT.js → Events.stories-dODeR-g-.js} +1 -1
  52. package/dist/storybook/assets/{Heading.stories-BcciQ3Ug.js → Heading.stories-CH7_-_q3.js} +1 -1
  53. package/dist/storybook/assets/HueRipple.stories-CH1Y739k.js +310 -0
  54. package/dist/storybook/assets/{Icon.stories-BWqJoZUM.js → Icon.stories-CPjM-jTU.js} +32 -13
  55. package/dist/storybook/assets/{IconButton.stories-BrMDAi9q.js → IconButton.stories-DuzqvcnN.js} +1 -1
  56. package/dist/storybook/assets/{LinearProgress.stories-INijWBr_.js → LinearProgress.stories-C7IdnJd3.js} +1 -1
  57. package/dist/storybook/assets/{Pagination.stories-CrExaWpC.js → Pagination.stories-C4cLjS_9.js} +1 -1
  58. package/dist/storybook/assets/{Popover.stories-Bh6IUPG_.js → Popover.stories-Ca1F-wrI.js} +3 -11
  59. package/dist/storybook/assets/{ReadyMixin-C1lZU7vt.js → ReadyMixin-DNZ5dCsZ.js} +1 -1
  60. package/dist/storybook/assets/{Rtc.stories-BHqFwgR7.js → Rtc.stories-BVJc1vCA.js} +1 -1
  61. package/dist/storybook/assets/{ScrollShadow.stories-DnIj5cZF.js → ScrollShadow.stories-C3W5o9ZW.js} +1 -1
  62. package/dist/storybook/assets/Switch.stories-BEEHP8mD.js +312 -0
  63. package/dist/storybook/assets/{Throttle.stories-Dilsv90H.js → Throttle.stories-C4xsYeAb.js} +1 -1
  64. package/dist/storybook/assets/{Tooltip.stories-Dnb76OXa.js → Tooltip.stories-Ccm4AnSv.js} +3 -7
  65. package/dist/storybook/assets/Welcome.stories-Degjk-M0.js +215 -0
  66. package/dist/storybook/assets/{Widget.stories-Cl-3dv15.js → Widget.stories-OKnZ9sDs.js} +1 -1
  67. package/dist/storybook/assets/WithTooltip-65CFNBJE-CXL3TyJ2.js +9 -0
  68. package/dist/storybook/assets/blocks-DLdUKG_W.js +707 -0
  69. package/dist/storybook/assets/celebrate-KwPoF1K3.js +21 -0
  70. package/dist/storybook/assets/formatter-EIJCOSYU-29NCxjfM.js +1 -0
  71. package/dist/storybook/assets/if-defined-BZFPaJjl.js +1 -0
  72. package/dist/storybook/assets/iframe-BqvwP3or.js +1104 -0
  73. package/dist/storybook/assets/{iframe-CNxIA3cQ.css → iframe-C5bIZMJ5.css} +1 -1
  74. package/dist/storybook/assets/index-BIyTv1BF.js +1 -0
  75. package/dist/storybook/assets/onFind-1l3EPW-I.js +1 -0
  76. package/dist/storybook/assets/{onFind.stories-CGeGoVR6.js → onFind.stories-D64-QZqf.js} +2 -2
  77. package/dist/storybook/assets/{onRemove.stories-DXOwfv14.js → onRemove.stories-BICsnIJL.js} +1 -1
  78. package/dist/storybook/assets/{onVisible.stories-DNzXceKW.js → onVisible.stories-DpDZP9_5.js} +2 -2
  79. package/dist/storybook/assets/position-CFNQy3J6.js +1 -0
  80. package/dist/storybook/assets/ripple-DQbyyRUw.js +251 -0
  81. package/dist/storybook/assets/{style-map-kcS06w9f.js → style-map-CBrSnxRe.js} +1 -1
  82. package/dist/storybook/assets/syntaxhighlighter-ED5Y7EFY-Bz_DuQj8.js +6 -0
  83. package/dist/storybook/brightspot-logo.svg +19 -0
  84. package/dist/storybook/iframe.html +23 -3
  85. package/dist/storybook/index.html +42 -1
  86. package/dist/storybook/index.json +1 -1
  87. package/dist/storybook/project.json +1 -1
  88. package/dist/storybook/sb-addons/storybook-3/manager-bundle.js +3 -0
  89. package/dist/tailwind-plugin-switch.d.ts +2 -0
  90. package/dist/tailwind-plugin-switch.d.ts.map +1 -0
  91. package/dist/tailwind-plugin-switch.js +223 -0
  92. package/dist/tailwind-plugin-switch.js.map +1 -0
  93. package/dist/tailwind-plugin-switch.ts +252 -0
  94. package/dist/util/EventEmitterMixin.d.ts +5 -0
  95. package/dist/util/EventEmitterMixin.d.ts.map +1 -1
  96. package/dist/util/EventEmitterMixin.js.map +1 -1
  97. package/dist/util/position.d.ts +9 -0
  98. package/dist/util/position.d.ts.map +1 -0
  99. package/dist/util/position.js +11 -0
  100. package/dist/util/position.js.map +1 -0
  101. package/docs/components/Icon.md +6 -5
  102. package/docs/components/README.md +1 -0
  103. package/docs/components/Switch.md +79 -0
  104. package/package.json +2 -1
  105. package/dist/storybook/assets/Button.stories-DTcnCrp-.js +0 -63
  106. package/dist/storybook/assets/Color-6BZIO3FS-BuNGIaf5.js +0 -1
  107. package/dist/storybook/assets/DocsRenderer-LL677BLK-DjMDalQg.js +0 -758
  108. package/dist/storybook/assets/WithTooltip-65CFNBJE-Bq21jhKM.js +0 -9
  109. package/dist/storybook/assets/_commonjsHelpers-CqkleIqs.js +0 -1
  110. package/dist/storybook/assets/formatter-EIJCOSYU-CwrejIu0.js +0 -1
  111. package/dist/storybook/assets/if-defined-D1UQmdjo.js +0 -1
  112. package/dist/storybook/assets/iframe-CsKt54V3.js +0 -1061
  113. package/dist/storybook/assets/index-DQ0xe06s.js +0 -1
  114. package/dist/storybook/assets/onFind-DqriYjEB.js +0 -1
  115. package/dist/storybook/assets/syntaxhighlighter-ED5Y7EFY-BnpaJz4a.js +0 -6
@@ -0,0 +1,355 @@
1
+ import{x as i}from"./iframe-BqvwP3or.js";import{b as d}from"./celebrate-KwPoF1K3.js";import{b as l}from"./ripple-DQbyyRUw.js";import{B as r}from"./Button-Dg-fIrzT.js";import"./preload-helper-PPVm8Dsz.js";import"./position-CFNQy3J6.js";const v={title:"Effects/Combined Effects",tags:["autodocs"],parameters:{docs:{subtitle:"Ripple + Sparkle via Houdini Paint API inside the View Transition",description:{component:"Triggers `btuRipple` with the `sparkle` option. When the CSS Paint API is available (Chrome/Edge), sparkle particles render directly on the View Transition pseudo-element via a paint worklet — synchronized with the ripple ring. Falls back to DOM-based `btuCelebrate` in other browsers."}},controls:{expanded:!0}},argTypes:{rippleDuration:{control:{type:"range",min:500,max:5e3,step:100},description:"Ripple animation duration (ms)"},ringWidth:{control:{type:"range",min:10,max:100,step:5},description:"Width of the hue-shifted band (px)"},feather:{control:{type:"range",min:10,max:120,step:5},description:"Feathered edge transition width (px)"},hueShift:{control:{type:"range",min:0,max:330,step:30},description:"OKLCH hue rotation (degrees)"},contrast:{control:{type:"range",min:.5,max:3,step:.1},description:"Contrast multiplier"},saturate:{control:{type:"range",min:0,max:5,step:.5},description:"Saturation multiplier"},sparkle:{control:"boolean",description:"Enable sparkle particles via CSS Paint API (Chrome/Edge). Falls back to DOM celebrate when off."},sparkleDuration:{control:{type:"range",min:500,max:5e3,step:100},description:"Sparkle animation duration (ms) — independent from ripple duration"},sparkleSize:{control:{type:"range",min:100,max:600,step:50},description:"Sparkle burst area size (px)"}},args:{rippleDuration:1200,ringWidth:40,feather:75,hueShift:0,contrast:1.8,saturate:1.5,sparkle:!0,sparkleDuration:2e3,sparkleSize:300}},s={args:{rippleDuration:1e3,ringWidth:35,hueShift:0,sparkleDuration:1300,sparkleSize:300,contrast:1.5,saturate:2.5,feather:115},render:e=>i`
2
+ <div @click=${async a=>{const{ready:t}=l({position:a,duration:e.rippleDuration,ringWidth:e.ringWidth,feather:e.feather,hueShift:e.hueShift,contrast:e.contrast,saturate:e.saturate,sparkle:e.sparkle?{size:e.sparkleSize,duration:e.sparkleDuration}:!1});e.sparkle||(await t,d({position:a,size:e.sparkleSize}))}} class="flex" style="min-height: 100vh;">
3
+ <!-- Left Nav Rail -->
4
+ <div class="flex w-16 flex-shrink-0 flex-col items-center gap-4 border-r border-gray-200 bg-white py-4">
5
+ <div class="bg-primary-500 h-8 w-8 rounded-lg"></div>
6
+ <div class="mt-2 h-5 w-5 rounded bg-gray-300"></div>
7
+ <div class="h-5 w-5 rounded bg-gray-300"></div>
8
+ <div class="h-5 w-5 rounded bg-gray-300"></div>
9
+ <div class="h-5 w-5 rounded bg-gray-300"></div>
10
+ <div class="h-5 w-5 rounded bg-gray-200"></div>
11
+ <div class="h-5 w-5 rounded bg-gray-200"></div>
12
+ </div>
13
+
14
+ <!-- Main Content -->
15
+ <div class="flex min-w-0 flex-1 flex-col bg-gray-50">
16
+ <!-- Header -->
17
+ <div class="flex h-14 items-center justify-between border-b border-gray-200 bg-white px-6">
18
+ <div class="flex items-center gap-3">
19
+ <span class="text-sm font-semibold text-gray-900">Lorem Ipsum</span>
20
+ <div class="h-5 w-5 rounded bg-gray-200"></div>
21
+ <span class="bg-primary-100 text-primary-700 rounded px-2 py-0.5 text-xs font-medium">EN</span>
22
+ </div>
23
+ <div class="flex items-center gap-3">
24
+ <div class="h-8 w-64 rounded-md bg-gray-100"></div>
25
+ ${r({color:"primary",fill:!0,contained:!0,size:"sm",label:"",icon:"plus"})}
26
+ </div>
27
+ </div>
28
+
29
+ <!-- Tabs -->
30
+ <div class="flex gap-6 border-b border-gray-200 bg-white px-6">
31
+ <span class="border-primary-500 text-primary-600 border-b-2 py-3 text-sm font-medium">Dolor</span>
32
+ <span class="py-3 text-sm text-gray-500">Amet</span>
33
+ <span class="py-3 text-sm text-gray-500">Consectetur</span>
34
+ <span class="py-3 text-sm text-gray-500">Adipiscing</span>
35
+ <span class="py-3 text-sm text-gray-500">Elit</span>
36
+ </div>
37
+
38
+ <!-- Page Content -->
39
+ <div class="flex flex-col gap-6 p-6">
40
+ <!-- Warning -->
41
+ <p class="bg-warning-50 text-warning-700 border-warning-200 rounded-md border px-3 py-2 text-xs">
42
+ ⚠ Click anywhere — the hue ripple sweeps outward while sparkles burst from the click point. The UI is
43
+ non-interactive during the view transition.
44
+ </p>
45
+
46
+ <!-- Quick Start -->
47
+ <div class="flex gap-3">
48
+ <div class="flex w-44 flex-col gap-2 rounded-lg border border-gray-200 bg-white p-4">
49
+ <div class="bg-primary-100 h-8 w-8 rounded-md"></div>
50
+ <span class="text-sm font-medium text-gray-700">Sed Do</span>
51
+ <div class="bg-primary-500 h-1 w-full rounded"></div>
52
+ </div>
53
+ <div class="flex w-44 flex-col gap-2 rounded-lg border border-gray-200 bg-white p-4">
54
+ <div class="bg-primary-100 h-8 w-8 rounded-md"></div>
55
+ <span class="text-sm font-medium text-gray-700">Eiusmod</span>
56
+ </div>
57
+ <div class="flex w-44 flex-col gap-2 rounded-lg border border-gray-200 bg-white p-4">
58
+ <div class="bg-primary-100 h-8 w-8 rounded-md"></div>
59
+ <span class="text-sm font-medium text-gray-700">Tempor</span>
60
+ </div>
61
+ </div>
62
+
63
+ <!-- Two-Column Widgets -->
64
+ <div class="grid grid-cols-2 gap-6">
65
+ <!-- Recent Activity -->
66
+ <div class="rounded-lg border border-gray-200 bg-white">
67
+ <div class="flex items-center justify-between border-b border-gray-100 px-5 py-3">
68
+ <span class="text-sm font-semibold text-gray-900">Incididunt</span>
69
+ <div class="h-5 w-5 rounded bg-gray-200"></div>
70
+ </div>
71
+ <div class="flex flex-col">
72
+ <div class="flex items-center gap-3 border-b border-gray-50 px-5 py-3">
73
+ <div class="h-8 w-8 rounded bg-gray-100"></div>
74
+ <div class="flex flex-1 flex-col gap-1">
75
+ <div class="h-3 w-3/4 rounded bg-gray-200"></div>
76
+ <div class="h-2 w-1/3 rounded bg-gray-100"></div>
77
+ </div>
78
+ <span class="bg-success-100 text-success-700 rounded-full px-2 py-0.5 text-xs">Ipsum</span>
79
+ </div>
80
+ <div class="flex items-center gap-3 border-b border-gray-50 px-5 py-3">
81
+ <div class="h-8 w-8 rounded bg-gray-100"></div>
82
+ <div class="flex flex-1 flex-col gap-1">
83
+ <div class="h-3 w-2/3 rounded bg-gray-200"></div>
84
+ <div class="h-2 w-1/4 rounded bg-gray-100"></div>
85
+ </div>
86
+ <span class="bg-warning-100 text-warning-700 rounded-full px-2 py-0.5 text-xs">Dolor</span>
87
+ </div>
88
+ <div class="flex items-center gap-3 border-b border-gray-50 px-5 py-3">
89
+ <div class="h-8 w-8 rounded bg-gray-100"></div>
90
+ <div class="flex flex-1 flex-col gap-1">
91
+ <div class="h-3 w-1/2 rounded bg-gray-200"></div>
92
+ <div class="h-2 w-1/3 rounded bg-gray-100"></div>
93
+ </div>
94
+ <span class="bg-error-100 text-error-700 rounded-full px-2 py-0.5 text-xs">Amet</span>
95
+ </div>
96
+ <div class="flex items-center gap-3 px-5 py-3">
97
+ <div class="h-8 w-8 rounded bg-gray-100"></div>
98
+ <div class="flex flex-1 flex-col gap-1">
99
+ <div class="h-3 w-3/5 rounded bg-gray-200"></div>
100
+ <div class="h-2 w-1/4 rounded bg-gray-100"></div>
101
+ </div>
102
+ <span class="bg-success-100 text-success-700 rounded-full px-2 py-0.5 text-xs">Ipsum</span>
103
+ </div>
104
+ </div>
105
+ </div>
106
+
107
+ <!-- Workstreams -->
108
+ <div class="rounded-lg border border-gray-200 bg-white">
109
+ <div class="flex items-center justify-between border-b border-gray-100 px-5 py-3">
110
+ <span class="text-sm font-semibold text-gray-900">Labore</span>
111
+ <div class="h-5 w-5 rounded bg-gray-200"></div>
112
+ </div>
113
+ <div class="flex flex-col gap-4 p-5">
114
+ <div class="rounded-lg border border-gray-100 p-4">
115
+ <div class="flex items-center gap-2">
116
+ <span class="text-xs text-gray-500">Magna Aliqua</span>
117
+ <span class="bg-success-100 text-success-700 rounded-full px-2 py-0.5 text-xs">Sit</span>
118
+ </div>
119
+ <p class="mt-1 text-sm font-medium text-gray-900">Ut enim ad minim veniam</p>
120
+ <p class="mt-0.5 text-xs text-gray-500">Quis nostrud exercitation ullamco...</p>
121
+ <div class="mt-3 flex items-center justify-between">
122
+ <span class="text-xs text-gray-500">60%</span>
123
+ ${r({color:"primary",fill:!0,contained:!0,size:"sm",label:"View"})}
124
+ </div>
125
+ <div class="bg-primary-500 mt-2 h-1.5 w-3/5 rounded-full"></div>
126
+ </div>
127
+ <div class="rounded-lg border border-gray-100 p-4">
128
+ <div class="flex items-center gap-2">
129
+ <span class="text-xs text-gray-500">Magna Aliqua</span>
130
+ <span class="bg-warning-100 text-warning-700 rounded-full px-2 py-0.5 text-xs">Sed</span>
131
+ </div>
132
+ <p class="mt-1 text-sm font-medium text-gray-900">Duis aute irure dolor</p>
133
+ <p class="mt-0.5 text-xs text-gray-500">Excepteur sint occaecat cupidatat...</p>
134
+ <div class="mt-3 flex items-center justify-between">
135
+ <span class="text-xs text-gray-500">30%</span>
136
+ ${r({color:"primary",fill:!0,contained:!0,size:"sm",label:"View"})}
137
+ </div>
138
+ <div class="bg-primary-500 mt-2 h-1.5 w-1/3 rounded-full"></div>
139
+ </div>
140
+ </div>
141
+ </div>
142
+ </div>
143
+ </div>
144
+ </div>
145
+ </div>
146
+ `,parameters:{docs:{description:{story:"Sparkle particles render inside the View Transition via the CSS Paint API, synchronized with the hue ripple ring. Toggle the `sparkle` control to compare with the DOM-based celebrate fallback."}}}};s.parameters={...s.parameters,docs:{...s.parameters?.docs,source:{originalSource:`{
147
+ args: {
148
+ rippleDuration: 1000,
149
+ ringWidth: 35,
150
+ hueShift: 0,
151
+ sparkleDuration: 1300,
152
+ sparkleSize: 300,
153
+ contrast: 1.5,
154
+ saturate: 2.5,
155
+ feather: 115
156
+ },
157
+ render: args => {
158
+ const onClick = async (e: MouseEvent) => {
159
+ const {
160
+ ready
161
+ } = btuRipple({
162
+ position: e,
163
+ duration: args.rippleDuration,
164
+ ringWidth: args.ringWidth,
165
+ feather: args.feather,
166
+ hueShift: args.hueShift,
167
+ contrast: args.contrast,
168
+ saturate: args.saturate,
169
+ sparkle: args.sparkle ? {
170
+ size: args.sparkleSize,
171
+ duration: args.sparkleDuration
172
+ } : false
173
+ });
174
+ if (!args.sparkle) {
175
+ await ready;
176
+ btuCelebrate({
177
+ position: e,
178
+ size: args.sparkleSize
179
+ });
180
+ }
181
+ };
182
+ return html\`
183
+ <div @click=\${onClick} class="flex" style="min-height: 100vh;">
184
+ <!-- Left Nav Rail -->
185
+ <div class="flex w-16 flex-shrink-0 flex-col items-center gap-4 border-r border-gray-200 bg-white py-4">
186
+ <div class="bg-primary-500 h-8 w-8 rounded-lg"></div>
187
+ <div class="mt-2 h-5 w-5 rounded bg-gray-300"></div>
188
+ <div class="h-5 w-5 rounded bg-gray-300"></div>
189
+ <div class="h-5 w-5 rounded bg-gray-300"></div>
190
+ <div class="h-5 w-5 rounded bg-gray-300"></div>
191
+ <div class="h-5 w-5 rounded bg-gray-200"></div>
192
+ <div class="h-5 w-5 rounded bg-gray-200"></div>
193
+ </div>
194
+
195
+ <!-- Main Content -->
196
+ <div class="flex min-w-0 flex-1 flex-col bg-gray-50">
197
+ <!-- Header -->
198
+ <div class="flex h-14 items-center justify-between border-b border-gray-200 bg-white px-6">
199
+ <div class="flex items-center gap-3">
200
+ <span class="text-sm font-semibold text-gray-900">Lorem Ipsum</span>
201
+ <div class="h-5 w-5 rounded bg-gray-200"></div>
202
+ <span class="bg-primary-100 text-primary-700 rounded px-2 py-0.5 text-xs font-medium">EN</span>
203
+ </div>
204
+ <div class="flex items-center gap-3">
205
+ <div class="h-8 w-64 rounded-md bg-gray-100"></div>
206
+ \${Button({
207
+ color: 'primary',
208
+ fill: true,
209
+ contained: true,
210
+ size: 'sm',
211
+ label: '',
212
+ icon: 'plus'
213
+ })}
214
+ </div>
215
+ </div>
216
+
217
+ <!-- Tabs -->
218
+ <div class="flex gap-6 border-b border-gray-200 bg-white px-6">
219
+ <span class="border-primary-500 text-primary-600 border-b-2 py-3 text-sm font-medium">Dolor</span>
220
+ <span class="py-3 text-sm text-gray-500">Amet</span>
221
+ <span class="py-3 text-sm text-gray-500">Consectetur</span>
222
+ <span class="py-3 text-sm text-gray-500">Adipiscing</span>
223
+ <span class="py-3 text-sm text-gray-500">Elit</span>
224
+ </div>
225
+
226
+ <!-- Page Content -->
227
+ <div class="flex flex-col gap-6 p-6">
228
+ <!-- Warning -->
229
+ <p class="bg-warning-50 text-warning-700 border-warning-200 rounded-md border px-3 py-2 text-xs">
230
+ ⚠ Click anywhere — the hue ripple sweeps outward while sparkles burst from the click point. The UI is
231
+ non-interactive during the view transition.
232
+ </p>
233
+
234
+ <!-- Quick Start -->
235
+ <div class="flex gap-3">
236
+ <div class="flex w-44 flex-col gap-2 rounded-lg border border-gray-200 bg-white p-4">
237
+ <div class="bg-primary-100 h-8 w-8 rounded-md"></div>
238
+ <span class="text-sm font-medium text-gray-700">Sed Do</span>
239
+ <div class="bg-primary-500 h-1 w-full rounded"></div>
240
+ </div>
241
+ <div class="flex w-44 flex-col gap-2 rounded-lg border border-gray-200 bg-white p-4">
242
+ <div class="bg-primary-100 h-8 w-8 rounded-md"></div>
243
+ <span class="text-sm font-medium text-gray-700">Eiusmod</span>
244
+ </div>
245
+ <div class="flex w-44 flex-col gap-2 rounded-lg border border-gray-200 bg-white p-4">
246
+ <div class="bg-primary-100 h-8 w-8 rounded-md"></div>
247
+ <span class="text-sm font-medium text-gray-700">Tempor</span>
248
+ </div>
249
+ </div>
250
+
251
+ <!-- Two-Column Widgets -->
252
+ <div class="grid grid-cols-2 gap-6">
253
+ <!-- Recent Activity -->
254
+ <div class="rounded-lg border border-gray-200 bg-white">
255
+ <div class="flex items-center justify-between border-b border-gray-100 px-5 py-3">
256
+ <span class="text-sm font-semibold text-gray-900">Incididunt</span>
257
+ <div class="h-5 w-5 rounded bg-gray-200"></div>
258
+ </div>
259
+ <div class="flex flex-col">
260
+ <div class="flex items-center gap-3 border-b border-gray-50 px-5 py-3">
261
+ <div class="h-8 w-8 rounded bg-gray-100"></div>
262
+ <div class="flex flex-1 flex-col gap-1">
263
+ <div class="h-3 w-3/4 rounded bg-gray-200"></div>
264
+ <div class="h-2 w-1/3 rounded bg-gray-100"></div>
265
+ </div>
266
+ <span class="bg-success-100 text-success-700 rounded-full px-2 py-0.5 text-xs">Ipsum</span>
267
+ </div>
268
+ <div class="flex items-center gap-3 border-b border-gray-50 px-5 py-3">
269
+ <div class="h-8 w-8 rounded bg-gray-100"></div>
270
+ <div class="flex flex-1 flex-col gap-1">
271
+ <div class="h-3 w-2/3 rounded bg-gray-200"></div>
272
+ <div class="h-2 w-1/4 rounded bg-gray-100"></div>
273
+ </div>
274
+ <span class="bg-warning-100 text-warning-700 rounded-full px-2 py-0.5 text-xs">Dolor</span>
275
+ </div>
276
+ <div class="flex items-center gap-3 border-b border-gray-50 px-5 py-3">
277
+ <div class="h-8 w-8 rounded bg-gray-100"></div>
278
+ <div class="flex flex-1 flex-col gap-1">
279
+ <div class="h-3 w-1/2 rounded bg-gray-200"></div>
280
+ <div class="h-2 w-1/3 rounded bg-gray-100"></div>
281
+ </div>
282
+ <span class="bg-error-100 text-error-700 rounded-full px-2 py-0.5 text-xs">Amet</span>
283
+ </div>
284
+ <div class="flex items-center gap-3 px-5 py-3">
285
+ <div class="h-8 w-8 rounded bg-gray-100"></div>
286
+ <div class="flex flex-1 flex-col gap-1">
287
+ <div class="h-3 w-3/5 rounded bg-gray-200"></div>
288
+ <div class="h-2 w-1/4 rounded bg-gray-100"></div>
289
+ </div>
290
+ <span class="bg-success-100 text-success-700 rounded-full px-2 py-0.5 text-xs">Ipsum</span>
291
+ </div>
292
+ </div>
293
+ </div>
294
+
295
+ <!-- Workstreams -->
296
+ <div class="rounded-lg border border-gray-200 bg-white">
297
+ <div class="flex items-center justify-between border-b border-gray-100 px-5 py-3">
298
+ <span class="text-sm font-semibold text-gray-900">Labore</span>
299
+ <div class="h-5 w-5 rounded bg-gray-200"></div>
300
+ </div>
301
+ <div class="flex flex-col gap-4 p-5">
302
+ <div class="rounded-lg border border-gray-100 p-4">
303
+ <div class="flex items-center gap-2">
304
+ <span class="text-xs text-gray-500">Magna Aliqua</span>
305
+ <span class="bg-success-100 text-success-700 rounded-full px-2 py-0.5 text-xs">Sit</span>
306
+ </div>
307
+ <p class="mt-1 text-sm font-medium text-gray-900">Ut enim ad minim veniam</p>
308
+ <p class="mt-0.5 text-xs text-gray-500">Quis nostrud exercitation ullamco...</p>
309
+ <div class="mt-3 flex items-center justify-between">
310
+ <span class="text-xs text-gray-500">60%</span>
311
+ \${Button({
312
+ color: 'primary',
313
+ fill: true,
314
+ contained: true,
315
+ size: 'sm',
316
+ label: 'View'
317
+ })}
318
+ </div>
319
+ <div class="bg-primary-500 mt-2 h-1.5 w-3/5 rounded-full"></div>
320
+ </div>
321
+ <div class="rounded-lg border border-gray-100 p-4">
322
+ <div class="flex items-center gap-2">
323
+ <span class="text-xs text-gray-500">Magna Aliqua</span>
324
+ <span class="bg-warning-100 text-warning-700 rounded-full px-2 py-0.5 text-xs">Sed</span>
325
+ </div>
326
+ <p class="mt-1 text-sm font-medium text-gray-900">Duis aute irure dolor</p>
327
+ <p class="mt-0.5 text-xs text-gray-500">Excepteur sint occaecat cupidatat...</p>
328
+ <div class="mt-3 flex items-center justify-between">
329
+ <span class="text-xs text-gray-500">30%</span>
330
+ \${Button({
331
+ color: 'primary',
332
+ fill: true,
333
+ contained: true,
334
+ size: 'sm',
335
+ label: 'View'
336
+ })}
337
+ </div>
338
+ <div class="bg-primary-500 mt-2 h-1.5 w-1/3 rounded-full"></div>
339
+ </div>
340
+ </div>
341
+ </div>
342
+ </div>
343
+ </div>
344
+ </div>
345
+ </div>
346
+ \`;
347
+ },
348
+ parameters: {
349
+ docs: {
350
+ description: {
351
+ story: 'Sparkle particles render inside the View Transition via the CSS Paint API, synchronized with the hue ripple ring. Toggle the \`sparkle\` control to compare with the DOM-based celebrate fallback.'
352
+ }
353
+ }
354
+ }
355
+ }`,...s.parameters?.docs?.source}}};const m=["Default"];export{s as Default,m as __namedExportsOrder,v as default};
@@ -1 +1 @@
1
- import"./iframe-CsKt54V3.js";const a=t=>{class s extends t{constructor(){super(...arguments),this.internals=this.attachInternals(),this.states=this.internals.states}}return s};export{a as C};
1
+ import"./iframe-BqvwP3or.js";const a=t=>{class s extends t{constructor(){super(...arguments),this.internals=this.attachInternals(),this.states=this.internals.states}}return s};export{a as C};
@@ -1,4 +1,4 @@
1
- import{x as c,i as g}from"./iframe-CsKt54V3.js";import{t as m}from"./custom-element-UsVr97OX.js";import{C as u}from"./ComponentStatesMixin-DRalOmcW.js";import"./preload-helper-PPVm8Dsz.js";var r=Object.freeze,b=Object.defineProperty,h=Object.getOwnPropertyDescriptor,x=(e,o,p,d)=>{for(var t=d>1?void 0:d?h(o,p):o,s=e.length-1,n;s>=0;s--)(n=e[s])&&(t=n(t)||t);return t},f=(e,o)=>r(b(e,"raw",{value:r(e.slice())})),l;const C={title:"Mixins/Component States",tags:["autodocs"],parameters:{docs:{description:{component:`
1
+ import{x as c,i as g}from"./iframe-BqvwP3or.js";import{t as m}from"./custom-element-UsVr97OX.js";import{C as u}from"./ComponentStatesMixin-g50hRCPT.js";import"./preload-helper-PPVm8Dsz.js";var r=Object.freeze,b=Object.defineProperty,h=Object.getOwnPropertyDescriptor,x=(e,o,p,d)=>{for(var t=d>1?void 0:d?h(o,p):o,s=e.length-1,n;s>=0;s--)(n=e[s])&&(t=n(t)||t);return t},f=(e,o)=>r(b(e,"raw",{value:r(e.slice())})),l;const C={title:"Mixins/Component States",tags:["autodocs"],parameters:{docs:{description:{component:`
2
2
  \`ComponentStatesMixin\` provides access to the **Custom State API** for managing component-specific states that can be styled with the \`:state()\` pseudo-class in CSS.
3
3
 
4
4
  Uses \`ElementInternals.states\` (\`CustomStateSet\`) to manage component states that are separate from attributes, providing better encapsulation and performance.
@@ -1,4 +1,4 @@
1
- import{g as s,x as i}from"./iframe-CsKt54V3.js";import"./preload-helper-PPVm8Dsz.js";var r=Object.freeze,c=Object.defineProperty,p=(e,l)=>r(c(e,"raw",{value:r(l||e.slice())})),d;const{events:b,args:u,argTypes:a}=s("btu-copy-to-clipboard"),f={title:"Components/CopyToClipboard",component:"btu-copy-to-clipboard",tags:["autodocs"],parameters:{docs:{subtitle:"btu-copy-to-clipboard",description:{component:`
1
+ import{g as s,x as i}from"./iframe-BqvwP3or.js";import"./preload-helper-PPVm8Dsz.js";var r=Object.freeze,c=Object.defineProperty,p=(e,l)=>r(c(e,"raw",{value:r(l||e.slice())})),d;const{events:b,args:u,argTypes:a}=s("btu-copy-to-clipboard"),f={title:"Components/CopyToClipboard",component:"btu-copy-to-clipboard",tags:["autodocs"],parameters:{docs:{subtitle:"btu-copy-to-clipboard",description:{component:`
2
2
  A button component for copying text to the clipboard. The button becomes disabled and displays a success state for 3 seconds after copying.
3
3
 
4
4
  <h3>When to use:</h3>
@@ -1,4 +1,4 @@
1
- import{x as c}from"./iframe-CsKt54V3.js";import"./preload-helper-PPVm8Dsz.js";function p(n,e){if(n<=0)return e;let t;return function(){clearTimeout(t),t=setTimeout(()=>{t=void 0,e.apply(this,[...arguments])},n)}}const g={title:"Utilities/Debounce",tags:["autodocs"],parameters:{docs:{subtitle:"The `debounce` utility delays function execution until a specified wait period has elapsed since the last invocation. Useful for search inputs, form validation, and window resize handlers."},controls:{expanded:!0}},argTypes:{wait:{control:{type:"number",min:0,max:2e3,step:50},description:"Debounce wait time in milliseconds"}},args:{wait:300}},o={render:n=>{const e=`debounce-${Math.random().toString(36).substring(2,9)}`;let t=0,i=0;const d=()=>{const a=document.getElementById(`${e}-normal-count`),r=document.getElementById(`${e}-debounced-count`);a&&(a.textContent=String(t)),r&&(r.textContent=String(i))},l=p(n.wait,()=>{i++,d()}),u=()=>{t++,d(),l()};return c`
1
+ import{x as c}from"./iframe-BqvwP3or.js";import"./preload-helper-PPVm8Dsz.js";function p(n,e){if(n<=0)return e;let t;return function(){clearTimeout(t),t=setTimeout(()=>{t=void 0,e.apply(this,[...arguments])},n)}}const g={title:"Utilities/Debounce",tags:["autodocs"],parameters:{docs:{subtitle:"The `debounce` utility delays function execution until a specified wait period has elapsed since the last invocation. Useful for search inputs, form validation, and window resize handlers."},controls:{expanded:!0}},argTypes:{wait:{control:{type:"number",min:0,max:2e3,step:50},description:"Debounce wait time in milliseconds"}},args:{wait:300}},o={render:n=>{const e=`debounce-${Math.random().toString(36).substring(2,9)}`;let t=0,i=0;const d=()=>{const a=document.getElementById(`${e}-normal-count`),r=document.getElementById(`${e}-debounced-count`);a&&(a.textContent=String(t)),r&&(r.textContent=String(i))},l=p(n.wait,()=>{i++,d()}),u=()=>{t++,d(),l()};return c`
2
2
  <div class="space-y-4">
3
3
  <div class="text-base">
4
4
  <p class="mb-2">