@tinybigui/react 0.14.0 → 0.16.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.
package/dist/index.cjs CHANGED
@@ -5164,9 +5164,6 @@ var DrawerItem = React.forwardRef(
5164
5164
  DrawerItem.displayName = "DrawerItem";
5165
5165
  var progressContainerVariants = classVarianceAuthority.cva(["inline-flex", "flex-col", "gap-1"], {
5166
5166
  variants: {
5167
- /**
5168
- * The visual type of the indicator.
5169
- */
5170
5167
  type: {
5171
5168
  linear: "w-full",
5172
5169
  circular: "items-center justify-center w-auto"
@@ -5176,41 +5173,60 @@ var progressContainerVariants = classVarianceAuthority.cva(["inline-flex", "flex
5176
5173
  type: "linear"
5177
5174
  }
5178
5175
  });
5179
- var progressTrackVariants = classVarianceAuthority.cva([
5180
- "relative",
5181
- "w-full",
5182
- "h-1",
5183
- // MD3: 4dp track height
5184
- "rounded-full",
5185
- // MD3: full corner radius
5186
- "overflow-hidden",
5187
- "bg-surface-container-highest"
5188
- // MD3: inactive track color
5189
- ]);
5190
- var progressIndicatorVariants = classVarianceAuthority.cva([
5176
+ var progressLabelVariants = classVarianceAuthority.cva(["text-body-small", "text-on-surface", "select-none"]);
5177
+ var progressTrackVariants = classVarianceAuthority.cva(
5178
+ [
5179
+ "relative",
5180
+ "w-full",
5181
+ "overflow-visible",
5182
+ // gap segments extend beyond clipping bounds
5183
+ "rounded-full"
5184
+ ],
5185
+ {
5186
+ variants: {
5187
+ thickness: {
5188
+ default: "h-1",
5189
+ thick: "h-2"
5190
+ }
5191
+ },
5192
+ defaultVariants: {
5193
+ thickness: "default"
5194
+ }
5195
+ }
5196
+ );
5197
+ var progressActiveIndicatorVariants = classVarianceAuthority.cva([
5191
5198
  "absolute",
5192
5199
  "left-0",
5193
5200
  "top-0",
5194
5201
  "h-full",
5195
5202
  "rounded-full",
5196
5203
  "bg-primary",
5197
- // MD3: active track color
5204
+ // Spatial spring width changes are spatial (bar growing)
5198
5205
  "transition-[width]",
5199
- "duration-medium4",
5200
- // MD3: 400ms for value transitions
5201
- "ease-standard"
5202
- // MD3: cubic-bezier(0.2, 0, 0, 1)
5206
+ "duration-spring-standard-default-spatial",
5207
+ "ease-spring-standard-default-spatial"
5208
+ ]);
5209
+ var progressInactiveSegmentVariants = classVarianceAuthority.cva([
5210
+ "absolute",
5211
+ "top-0",
5212
+ "right-0",
5213
+ "h-full",
5214
+ "rounded-full",
5215
+ "bg-primary-container",
5216
+ // Spatial spring on left position (gap moves as progress moves)
5217
+ "transition-[left]",
5218
+ "duration-spring-standard-default-spatial",
5219
+ "ease-spring-standard-default-spatial"
5203
5220
  ]);
5204
5221
  var progressStopIndicatorVariants = classVarianceAuthority.cva([
5205
5222
  "absolute",
5206
5223
  "right-0",
5207
5224
  "top-1/2",
5208
5225
  "-translate-y-1/2",
5209
- "w-1",
5210
- "h-1",
5226
+ "size-1",
5227
+ // 4dp
5211
5228
  "rounded-full",
5212
5229
  "bg-primary"
5213
- // MD3: stop indicator uses primary color
5214
5230
  ]);
5215
5231
  var progressCircularSizeVariants = classVarianceAuthority.cva(
5216
5232
  ["relative", "flex", "items-center", "justify-center", "flex-shrink-0"],
@@ -5218,11 +5234,8 @@ var progressCircularSizeVariants = classVarianceAuthority.cva(
5218
5234
  variants: {
5219
5235
  size: {
5220
5236
  small: "h-6 w-6",
5221
- // MD3: 24dp
5222
5237
  medium: "h-12 w-12",
5223
- // MD3: 48dp (default)
5224
5238
  large: "h-16 w-16"
5225
- // MD3: 64dp
5226
5239
  }
5227
5240
  },
5228
5241
  defaultVariants: {
@@ -5230,33 +5243,85 @@ var progressCircularSizeVariants = classVarianceAuthority.cva(
5230
5243
  }
5231
5244
  }
5232
5245
  );
5233
- var progressLabelVariants = classVarianceAuthority.cva([
5234
- "text-body-small",
5235
- // MD3: body-small type scale (12px)
5236
- "text-on-surface",
5237
- // MD3: on-surface color role
5238
- "select-none"
5239
- ]);
5240
- var STROKE_WIDTH = 4;
5246
+ function useReducedMotion2() {
5247
+ const [reduced, setReduced] = React.useState(() => {
5248
+ if (typeof window === "undefined") return false;
5249
+ return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
5250
+ });
5251
+ React.useEffect(() => {
5252
+ if (typeof window === "undefined") return;
5253
+ const mql = window.matchMedia("(prefers-reduced-motion: reduce)");
5254
+ const handler = (e) => setReduced(e.matches);
5255
+ mql.addEventListener("change", handler);
5256
+ return () => mql.removeEventListener("change", handler);
5257
+ }, []);
5258
+ return reduced;
5259
+ }
5260
+ var STROKE_WIDTH_DEFAULT = 4;
5261
+ var STROKE_WIDTH_THICK = 8;
5262
+ var INDICATOR_TRACK_GAP = 4;
5241
5263
  var CIRCULAR_SIZE_PX = {
5242
5264
  small: 24,
5243
5265
  medium: 48,
5244
5266
  large: 64
5245
5267
  };
5246
- function getCircularGeometry(size) {
5268
+ var WAVE_AMPLITUDE_DEFAULT = 3;
5269
+ var WAVE_AMPLITUDE_THICK = 5;
5270
+ var LINEAR_WAVE_COUNT = 14;
5271
+ var VB_W = 100;
5272
+ var WAVE_WAVELENGTH_CIRCULAR = 30;
5273
+ function getStrokeWidth(thickness) {
5274
+ return thickness === "thick" ? STROKE_WIDTH_THICK : STROKE_WIDTH_DEFAULT;
5275
+ }
5276
+ function getCircularGeometry(size, thickness) {
5277
+ const strokeWidth = getStrokeWidth(thickness);
5247
5278
  const diameter = CIRCULAR_SIZE_PX[size];
5248
- const radius = (diameter - STROKE_WIDTH) / 2;
5279
+ const radius = (diameter - strokeWidth) / 2;
5249
5280
  const circumference = 2 * Math.PI * radius;
5250
5281
  const viewBox = `0 0 ${diameter} ${diameter}`;
5251
5282
  const cx = diameter / 2;
5252
5283
  const cy = diameter / 2;
5253
- return { diameter, radius, circumference, viewBox, cx, cy };
5284
+ return { diameter, radius, circumference, viewBox, cx, cy, strokeWidth };
5285
+ }
5286
+ function buildLinearWavePath(vbWidth, waveCount, amplitude, midY, padCycles = 0) {
5287
+ const wavelength = vbWidth / waveCount;
5288
+ const totalCycles = waveCount + padCycles;
5289
+ const cp = wavelength / 4;
5290
+ const segments = [`M 0 ${midY}`];
5291
+ for (let i = 0; i < totalCycles; i++) {
5292
+ const x = i * wavelength;
5293
+ segments.push(
5294
+ `C ${x + cp} ${midY - amplitude} ${x + wavelength / 2 - cp} ${midY - amplitude} ${x + wavelength / 2} ${midY}`
5295
+ );
5296
+ segments.push(
5297
+ `C ${x + wavelength / 2 + cp} ${midY + amplitude} ${x + wavelength - cp} ${midY + amplitude} ${x + wavelength} ${midY}`
5298
+ );
5299
+ }
5300
+ return segments.join(" ");
5301
+ }
5302
+ function buildCircularWavePath(cx, cy, radius, amplitude, waveCount, steps) {
5303
+ const actualSteps = waveCount * 12;
5304
+ const points = [];
5305
+ for (let i = 0; i <= actualSteps; i++) {
5306
+ const t = i / actualSteps;
5307
+ const angle = t * 2 * Math.PI;
5308
+ const radialOffset = amplitude * Math.sin(2 * Math.PI * waveCount * t);
5309
+ const r = radius + radialOffset;
5310
+ const x = cx + r * Math.cos(angle);
5311
+ const y = cy + r * Math.sin(angle);
5312
+ points.push(
5313
+ i === 0 ? `M ${x.toFixed(2)} ${y.toFixed(2)}` : `L ${x.toFixed(2)} ${y.toFixed(2)}`
5314
+ );
5315
+ }
5316
+ return points.join(" ") + " Z";
5254
5317
  }
5255
5318
  var Progress = React.forwardRef(
5256
5319
  ({
5257
5320
  type = "linear",
5258
5321
  indeterminate = false,
5259
5322
  size = "medium",
5323
+ shape = "flat",
5324
+ thickness = "default",
5260
5325
  className,
5261
5326
  label,
5262
5327
  value = 0,
@@ -5266,6 +5331,7 @@ var Progress = React.forwardRef(
5266
5331
  }, forwardedRef) => {
5267
5332
  const internalRef = React.useRef(null);
5268
5333
  const ref = forwardedRef ?? internalRef;
5334
+ const reducedMotion = useReducedMotion2();
5269
5335
  const { progressBarProps, labelProps } = reactAria.useProgressBar({
5270
5336
  label,
5271
5337
  value,
@@ -5275,6 +5341,7 @@ var Progress = React.forwardRef(
5275
5341
  ...restProps
5276
5342
  });
5277
5343
  const percentage = indeterminate ? 0 : Math.min(100, Math.max(0, (value - minValue) / (maxValue - minValue) * 100));
5344
+ const effectiveShape = reducedMotion ? "flat" : shape;
5278
5345
  if (process.env.NODE_ENV !== "production") {
5279
5346
  const ariaProps = restProps;
5280
5347
  if (!label && !ariaProps["aria-label"] && !ariaProps["aria-labelledby"]) {
@@ -5291,52 +5358,72 @@ var Progress = React.forwardRef(
5291
5358
  className: cn(progressContainerVariants({ type }), className),
5292
5359
  children: [
5293
5360
  label && /* @__PURE__ */ jsxRuntime.jsx("span", { ...labelProps, className: cn(progressLabelVariants()), children: label }),
5294
- type === "linear" ? /* @__PURE__ */ jsxRuntime.jsx(LinearProgress, { percentage, indeterminate }) : /* @__PURE__ */ jsxRuntime.jsx(CircularProgress, { percentage, indeterminate, size })
5295
- ]
5296
- }
5297
- );
5298
- }
5299
- );
5300
- Progress.displayName = "Progress";
5301
- function LinearProgress({ percentage, indeterminate }) {
5302
- if (indeterminate) {
5303
- return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-progress-track": "", className: cn(progressTrackVariants()), children: /* @__PURE__ */ jsxRuntime.jsxs(
5304
- "div",
5305
- {
5306
- "data-progress-indeterminate": "",
5307
- className: "absolute inset-0 overflow-hidden rounded-full",
5308
- children: [
5309
- /* @__PURE__ */ jsxRuntime.jsx(
5310
- "div",
5361
+ type === "linear" ? /* @__PURE__ */ jsxRuntime.jsx(
5362
+ LinearProgress,
5311
5363
  {
5312
- className: cn(
5313
- "bg-primary absolute top-0 h-full rounded-full",
5314
- "animate-progress-linear-indeterminate-1"
5315
- )
5364
+ percentage,
5365
+ indeterminate,
5366
+ shape: effectiveShape,
5367
+ thickness,
5368
+ reducedMotion
5316
5369
  }
5317
- ),
5318
- /* @__PURE__ */ jsxRuntime.jsx(
5319
- "div",
5370
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
5371
+ CircularProgress,
5320
5372
  {
5321
- className: cn(
5322
- "bg-primary absolute top-0 h-full rounded-full",
5323
- "animate-progress-linear-indeterminate-2"
5324
- )
5373
+ percentage,
5374
+ indeterminate,
5375
+ size,
5376
+ shape: effectiveShape,
5377
+ thickness,
5378
+ reducedMotion
5325
5379
  }
5326
5380
  )
5327
5381
  ]
5328
5382
  }
5329
- ) });
5383
+ );
5330
5384
  }
5331
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-progress-track": "", className: cn(progressTrackVariants()), children: [
5385
+ );
5386
+ Progress.displayName = "Progress";
5387
+ function LinearProgress({
5388
+ percentage,
5389
+ indeterminate,
5390
+ shape,
5391
+ thickness,
5392
+ reducedMotion
5393
+ }) {
5394
+ if (indeterminate) {
5395
+ return shape === "wavy" ? /* @__PURE__ */ jsxRuntime.jsx(LinearWavyIndeterminate, { thickness }) : /* @__PURE__ */ jsxRuntime.jsx(LinearFlatIndeterminate, { thickness });
5396
+ }
5397
+ return shape === "wavy" ? /* @__PURE__ */ jsxRuntime.jsx(
5398
+ LinearWavyDeterminate,
5399
+ {
5400
+ percentage,
5401
+ thickness,
5402
+ reducedMotion
5403
+ }
5404
+ ) : /* @__PURE__ */ jsxRuntime.jsx(LinearFlatDeterminate, { percentage, thickness });
5405
+ }
5406
+ function LinearFlatDeterminate({
5407
+ percentage,
5408
+ thickness
5409
+ }) {
5410
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-progress-track": "", className: cn(progressTrackVariants({ thickness })), children: [
5332
5411
  /* @__PURE__ */ jsxRuntime.jsx(
5333
5412
  "div",
5334
5413
  {
5335
5414
  "data-progress-indicator": "",
5336
- className: cn(progressIndicatorVariants()),
5415
+ className: cn(progressActiveIndicatorVariants()),
5337
5416
  style: { width: `${percentage}%` }
5338
5417
  }
5339
5418
  ),
5419
+ percentage < 100 && /* @__PURE__ */ jsxRuntime.jsx(
5420
+ "div",
5421
+ {
5422
+ "data-progress-inactive-segment": "",
5423
+ className: cn(progressInactiveSegmentVariants()),
5424
+ style: { left: `calc(${percentage}% + ${INDICATOR_TRACK_GAP}px)` }
5425
+ }
5426
+ ),
5340
5427
  /* @__PURE__ */ jsxRuntime.jsx(
5341
5428
  "div",
5342
5429
  {
@@ -5347,14 +5434,211 @@ function LinearProgress({ percentage, indeterminate }) {
5347
5434
  )
5348
5435
  ] });
5349
5436
  }
5437
+ function LinearFlatIndeterminate({
5438
+ thickness
5439
+ }) {
5440
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-progress-track": "", className: cn(progressTrackVariants({ thickness })), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-progress-indeterminate": "", className: "absolute inset-0 overflow-hidden rounded-full", children: [
5441
+ /* @__PURE__ */ jsxRuntime.jsx(
5442
+ "div",
5443
+ {
5444
+ className: cn(
5445
+ "bg-primary absolute top-0 h-full rounded-full",
5446
+ "animate-progress-linear-indeterminate-1"
5447
+ )
5448
+ }
5449
+ ),
5450
+ /* @__PURE__ */ jsxRuntime.jsx(
5451
+ "div",
5452
+ {
5453
+ className: cn(
5454
+ "bg-primary absolute top-0 h-full rounded-full",
5455
+ "animate-progress-linear-indeterminate-2"
5456
+ )
5457
+ }
5458
+ )
5459
+ ] }) });
5460
+ }
5461
+ function LinearWavyDeterminate({
5462
+ percentage,
5463
+ thickness,
5464
+ reducedMotion
5465
+ }) {
5466
+ const amplitude = thickness === "thick" ? WAVE_AMPLITUDE_THICK : WAVE_AMPLITUDE_DEFAULT;
5467
+ const containerHeight = (thickness === "thick" ? 8 : 4) + 2 * amplitude + 4;
5468
+ const midY = amplitude + 2;
5469
+ const trackHeightClass = thickness === "thick" ? "h-2" : "h-1";
5470
+ const trackPx = getStrokeWidth(thickness);
5471
+ const rampedAmplitude = reducedMotion || percentage <= 0 || percentage >= 100 ? 0 : amplitude * Math.min(
5472
+ (percentage - 10) / 10,
5473
+ // ramp up 10%→20%
5474
+ (90 - percentage) / 10,
5475
+ // ramp down 80%→90%
5476
+ 1
5477
+ );
5478
+ const wavePath = buildLinearWavePath(VB_W, LINEAR_WAVE_COUNT, rampedAmplitude, midY);
5479
+ return /* @__PURE__ */ jsxRuntime.jsxs(
5480
+ "div",
5481
+ {
5482
+ "data-progress-track": "",
5483
+ className: cn("relative w-full overflow-hidden", trackHeightClass),
5484
+ style: { height: containerHeight },
5485
+ children: [
5486
+ /* @__PURE__ */ jsxRuntime.jsx(
5487
+ "svg",
5488
+ {
5489
+ viewBox: `0 0 ${VB_W} ${containerHeight}`,
5490
+ preserveAspectRatio: "none",
5491
+ className: cn(
5492
+ "absolute inset-0 w-full",
5493
+ "transition-[clip-path]",
5494
+ "duration-spring-standard-default-spatial",
5495
+ "ease-spring-standard-default-spatial"
5496
+ ),
5497
+ style: {
5498
+ height: containerHeight,
5499
+ // clip-path applied in rendered-element space: keeps left `percentage`%
5500
+ clipPath: `inset(0 ${100 - percentage}% 0 0)`
5501
+ },
5502
+ "aria-hidden": "true",
5503
+ children: /* @__PURE__ */ jsxRuntime.jsx(
5504
+ "path",
5505
+ {
5506
+ "data-progress-indicator": "",
5507
+ d: wavePath,
5508
+ fill: "none",
5509
+ stroke: "currentColor",
5510
+ strokeWidth: getStrokeWidth(thickness),
5511
+ strokeLinecap: "round",
5512
+ vectorEffect: "non-scaling-stroke",
5513
+ className: "text-primary"
5514
+ }
5515
+ )
5516
+ }
5517
+ ),
5518
+ percentage < 100 && /* @__PURE__ */ jsxRuntime.jsx(
5519
+ "div",
5520
+ {
5521
+ "data-progress-inactive-segment": "",
5522
+ className: cn(progressInactiveSegmentVariants()),
5523
+ style: {
5524
+ left: `calc(${percentage}% + ${INDICATOR_TRACK_GAP}px)`,
5525
+ height: trackPx,
5526
+ top: midY - trackPx / 2
5527
+ }
5528
+ }
5529
+ ),
5530
+ /* @__PURE__ */ jsxRuntime.jsx(
5531
+ "div",
5532
+ {
5533
+ "data-stop-indicator": "",
5534
+ className: cn(progressStopIndicatorVariants()),
5535
+ style: { top: midY },
5536
+ "aria-hidden": "true"
5537
+ }
5538
+ )
5539
+ ]
5540
+ }
5541
+ );
5542
+ }
5543
+ function LinearWavyIndeterminate({
5544
+ thickness
5545
+ }) {
5546
+ const amplitude = thickness === "thick" ? WAVE_AMPLITUDE_THICK : WAVE_AMPLITUDE_DEFAULT;
5547
+ const containerHeight = (thickness === "thick" ? 8 : 4) + 2 * amplitude + 4;
5548
+ const midY = amplitude + 2;
5549
+ const trackHeightClass = thickness === "thick" ? "h-2" : "h-1";
5550
+ const trackPx = getStrokeWidth(thickness);
5551
+ const wavePath = buildLinearWavePath(VB_W, LINEAR_WAVE_COUNT, amplitude, midY);
5552
+ return /* @__PURE__ */ jsxRuntime.jsxs(
5553
+ "div",
5554
+ {
5555
+ "data-progress-track": "",
5556
+ className: cn("relative w-full overflow-hidden", trackHeightClass),
5557
+ style: { height: containerHeight },
5558
+ children: [
5559
+ /* @__PURE__ */ jsxRuntime.jsx(
5560
+ "div",
5561
+ {
5562
+ className: "bg-primary-container absolute right-0 left-0 rounded-full",
5563
+ style: { height: trackPx, top: midY - trackPx / 2 }
5564
+ }
5565
+ ),
5566
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-progress-indeterminate": "", className: "absolute inset-0", children: [
5567
+ /* @__PURE__ */ jsxRuntime.jsx(
5568
+ "svg",
5569
+ {
5570
+ viewBox: `0 0 ${VB_W} ${containerHeight}`,
5571
+ preserveAspectRatio: "none",
5572
+ className: "animate-progress-linear-indeterminate-1 absolute top-0 h-full",
5573
+ "aria-hidden": "true",
5574
+ children: /* @__PURE__ */ jsxRuntime.jsx(
5575
+ "path",
5576
+ {
5577
+ d: wavePath,
5578
+ fill: "none",
5579
+ stroke: "currentColor",
5580
+ strokeWidth: getStrokeWidth(thickness),
5581
+ strokeLinecap: "round",
5582
+ vectorEffect: "non-scaling-stroke",
5583
+ className: "text-primary"
5584
+ }
5585
+ )
5586
+ }
5587
+ ),
5588
+ /* @__PURE__ */ jsxRuntime.jsx(
5589
+ "svg",
5590
+ {
5591
+ viewBox: `0 0 ${VB_W} ${containerHeight}`,
5592
+ preserveAspectRatio: "none",
5593
+ className: "animate-progress-linear-indeterminate-2 absolute top-0 h-full",
5594
+ "aria-hidden": "true",
5595
+ children: /* @__PURE__ */ jsxRuntime.jsx(
5596
+ "path",
5597
+ {
5598
+ d: wavePath,
5599
+ fill: "none",
5600
+ stroke: "currentColor",
5601
+ strokeWidth: getStrokeWidth(thickness),
5602
+ strokeLinecap: "round",
5603
+ vectorEffect: "non-scaling-stroke",
5604
+ className: "text-primary"
5605
+ }
5606
+ )
5607
+ }
5608
+ )
5609
+ ] })
5610
+ ]
5611
+ }
5612
+ );
5613
+ }
5350
5614
  function CircularProgress({
5351
5615
  percentage,
5352
5616
  indeterminate,
5353
- size
5617
+ size,
5618
+ shape,
5619
+ thickness,
5620
+ reducedMotion
5354
5621
  }) {
5355
- const { radius, circumference, viewBox, cx, cy } = getCircularGeometry(size);
5356
- const strokeDashoffset = (1 - percentage / 100) * circumference;
5622
+ const { radius, circumference, viewBox, cx, cy, strokeWidth, diameter } = getCircularGeometry(
5623
+ size,
5624
+ thickness
5625
+ );
5357
5626
  if (indeterminate) {
5627
+ if (shape === "wavy") {
5628
+ return /* @__PURE__ */ jsxRuntime.jsx(
5629
+ CircularWavyIndeterminate,
5630
+ {
5631
+ size,
5632
+ cx,
5633
+ cy,
5634
+ radius,
5635
+ circumference,
5636
+ viewBox,
5637
+ strokeWidth,
5638
+ diameter
5639
+ }
5640
+ );
5641
+ }
5358
5642
  return /* @__PURE__ */ jsxRuntime.jsx(
5359
5643
  "div",
5360
5644
  {
@@ -5376,8 +5660,8 @@ function CircularProgress({
5376
5660
  r: radius,
5377
5661
  fill: "none",
5378
5662
  stroke: "currentColor",
5379
- strokeWidth: STROKE_WIDTH,
5380
- className: "text-surface-container-highest"
5663
+ strokeWidth,
5664
+ className: "text-primary-container"
5381
5665
  }
5382
5666
  ),
5383
5667
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -5388,7 +5672,7 @@ function CircularProgress({
5388
5672
  r: radius,
5389
5673
  fill: "none",
5390
5674
  stroke: "currentColor",
5391
- strokeWidth: STROKE_WIDTH,
5675
+ strokeWidth,
5392
5676
  className: "animate-progress-circular-dash text-primary",
5393
5677
  strokeLinecap: "round"
5394
5678
  }
@@ -5399,41 +5683,211 @@ function CircularProgress({
5399
5683
  }
5400
5684
  );
5401
5685
  }
5402
- return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-progress-size": size, className: cn(progressCircularSizeVariants({ size })), children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox, className: "h-full w-full -rotate-90", "aria-hidden": "true", children: [
5403
- /* @__PURE__ */ jsxRuntime.jsx(
5404
- "circle",
5405
- {
5406
- cx,
5407
- cy,
5408
- r: radius,
5409
- fill: "none",
5410
- stroke: "currentColor",
5411
- strokeWidth: STROKE_WIDTH,
5412
- className: "text-surface-container-highest"
5413
- }
5414
- ),
5415
- /* @__PURE__ */ jsxRuntime.jsx(
5416
- "circle",
5686
+ if (shape === "wavy") {
5687
+ return /* @__PURE__ */ jsxRuntime.jsx(
5688
+ CircularWavyDeterminate,
5417
5689
  {
5690
+ size,
5691
+ percentage,
5418
5692
  cx,
5419
5693
  cy,
5420
- r: radius,
5421
- fill: "none",
5422
- stroke: "currentColor",
5423
- strokeWidth: STROKE_WIDTH,
5424
- strokeLinecap: "round",
5425
- className: "text-primary duration-medium4 ease-standard transition-[stroke-dashoffset]",
5426
- strokeDasharray: circumference,
5427
- strokeDashoffset
5694
+ radius,
5695
+ circumference,
5696
+ viewBox,
5697
+ strokeWidth,
5698
+ diameter,
5699
+ reducedMotion
5428
5700
  }
5429
- )
5430
- ] }) });
5701
+ );
5702
+ }
5703
+ const activeArc = percentage / 100 * circumference;
5704
+ const activeArcGapped = Math.max(0, activeArc - INDICATOR_TRACK_GAP);
5705
+ const inactiveArcGapped = Math.max(0, circumference - activeArc - INDICATOR_TRACK_GAP);
5706
+ const activeOffset = 0;
5707
+ const inactiveOffset = -(activeArcGapped + INDICATOR_TRACK_GAP);
5708
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-progress-size": size, className: cn(progressCircularSizeVariants({ size })), children: [
5709
+ /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox, className: "h-full w-full -rotate-90", "aria-hidden": "true", children: [
5710
+ percentage < 100 && /* @__PURE__ */ jsxRuntime.jsx(
5711
+ "circle",
5712
+ {
5713
+ cx,
5714
+ cy,
5715
+ r: radius,
5716
+ fill: "none",
5717
+ stroke: "currentColor",
5718
+ strokeWidth,
5719
+ strokeLinecap: "round",
5720
+ strokeDasharray: `${inactiveArcGapped} ${circumference - inactiveArcGapped}`,
5721
+ strokeDashoffset: inactiveOffset,
5722
+ className: "text-primary-container duration-spring-standard-default-spatial ease-spring-standard-default-spatial transition-[stroke-dasharray,stroke-dashoffset]"
5723
+ }
5724
+ ),
5725
+ percentage > 0 && /* @__PURE__ */ jsxRuntime.jsx(
5726
+ "circle",
5727
+ {
5728
+ cx,
5729
+ cy,
5730
+ r: radius,
5731
+ fill: "none",
5732
+ stroke: "currentColor",
5733
+ strokeWidth,
5734
+ strokeLinecap: "round",
5735
+ strokeDasharray: `${activeArcGapped} ${circumference - activeArcGapped}`,
5736
+ strokeDashoffset: activeOffset,
5737
+ className: "text-primary duration-spring-standard-default-spatial ease-spring-standard-default-spatial transition-[stroke-dasharray,stroke-dashoffset]"
5738
+ }
5739
+ ),
5740
+ percentage === 0 && /* @__PURE__ */ jsxRuntime.jsx(
5741
+ "circle",
5742
+ {
5743
+ cx,
5744
+ cy,
5745
+ r: radius,
5746
+ fill: "none",
5747
+ stroke: "currentColor",
5748
+ strokeWidth,
5749
+ className: "text-primary-container"
5750
+ }
5751
+ )
5752
+ ] }),
5753
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", "data-progress-diameter": diameter })
5754
+ ] });
5755
+ }
5756
+ function CircularWavyIndeterminate({
5757
+ size,
5758
+ cx,
5759
+ cy,
5760
+ radius,
5761
+ circumference: _circumference,
5762
+ viewBox,
5763
+ strokeWidth
5764
+ }) {
5765
+ const circAmp = Math.min(WAVE_AMPLITUDE_DEFAULT, radius * 0.35);
5766
+ const meanRadius = radius - circAmp;
5767
+ const meanCircumference = 2 * Math.PI * meanRadius;
5768
+ const waveCount = Math.max(4, Math.round(meanCircumference / WAVE_WAVELENGTH_CIRCULAR));
5769
+ const wavePath = buildCircularWavePath(cx, cy, meanRadius, circAmp, waveCount);
5770
+ return /* @__PURE__ */ jsxRuntime.jsx(
5771
+ "div",
5772
+ {
5773
+ "data-progress-size": size,
5774
+ "data-progress-indeterminate": "",
5775
+ className: cn(progressCircularSizeVariants({ size })),
5776
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
5777
+ "svg",
5778
+ {
5779
+ viewBox,
5780
+ className: "animate-progress-circular-rotate h-full w-full",
5781
+ "aria-hidden": "true",
5782
+ children: [
5783
+ /* @__PURE__ */ jsxRuntime.jsx(
5784
+ "circle",
5785
+ {
5786
+ cx,
5787
+ cy,
5788
+ r: meanRadius,
5789
+ fill: "none",
5790
+ stroke: "currentColor",
5791
+ strokeWidth,
5792
+ className: "text-primary-container"
5793
+ }
5794
+ ),
5795
+ /* @__PURE__ */ jsxRuntime.jsx(
5796
+ "path",
5797
+ {
5798
+ d: wavePath,
5799
+ fill: "none",
5800
+ stroke: "currentColor",
5801
+ strokeWidth,
5802
+ strokeLinecap: "round",
5803
+ pathLength: 100,
5804
+ strokeDasharray: "28 72",
5805
+ className: "text-primary"
5806
+ }
5807
+ )
5808
+ ]
5809
+ }
5810
+ )
5811
+ }
5812
+ );
5813
+ }
5814
+ function CircularWavyDeterminate({
5815
+ size,
5816
+ percentage,
5817
+ cx,
5818
+ cy,
5819
+ radius,
5820
+ circumference: _circumference,
5821
+ viewBox,
5822
+ strokeWidth,
5823
+ diameter,
5824
+ reducedMotion
5825
+ }) {
5826
+ const circAmp = reducedMotion ? 0 : Math.min(WAVE_AMPLITUDE_DEFAULT, radius * 0.35);
5827
+ const meanRadius = radius - circAmp;
5828
+ const meanCircumference = 2 * Math.PI * meanRadius;
5829
+ const waveCount = Math.max(4, Math.round(meanCircumference / WAVE_WAVELENGTH_CIRCULAR));
5830
+ const wavePath = buildCircularWavePath(cx, cy, meanRadius, circAmp, waveCount);
5831
+ const gapPct = INDICATOR_TRACK_GAP / meanCircumference * 100;
5832
+ const activeLen = Math.max(0, percentage - gapPct);
5833
+ const inactiveLen = Math.max(0, 100 - percentage - gapPct);
5834
+ const inactiveOffset = -(activeLen + gapPct);
5835
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-progress-size": size, className: cn(progressCircularSizeVariants({ size })), children: [
5836
+ /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox, className: "h-full w-full -rotate-90", "aria-hidden": "true", children: [
5837
+ percentage === 0 && /* @__PURE__ */ jsxRuntime.jsx(
5838
+ "circle",
5839
+ {
5840
+ cx,
5841
+ cy,
5842
+ r: meanRadius,
5843
+ fill: "none",
5844
+ stroke: "currentColor",
5845
+ strokeWidth,
5846
+ className: "text-primary-container"
5847
+ }
5848
+ ),
5849
+ percentage > 0 && percentage < 100 && /* @__PURE__ */ jsxRuntime.jsx(
5850
+ "circle",
5851
+ {
5852
+ cx,
5853
+ cy,
5854
+ r: meanRadius,
5855
+ fill: "none",
5856
+ stroke: "currentColor",
5857
+ strokeWidth,
5858
+ strokeLinecap: "round",
5859
+ pathLength: 100,
5860
+ strokeDasharray: `${inactiveLen} ${100 - inactiveLen}`,
5861
+ strokeDashoffset: inactiveOffset,
5862
+ className: "text-primary-container duration-spring-standard-default-spatial ease-spring-standard-default-spatial transition-[stroke-dasharray,stroke-dashoffset]"
5863
+ }
5864
+ ),
5865
+ percentage > 0 && /* @__PURE__ */ jsxRuntime.jsx(
5866
+ "path",
5867
+ {
5868
+ "data-progress-indicator": "",
5869
+ d: wavePath,
5870
+ fill: "none",
5871
+ stroke: "currentColor",
5872
+ strokeWidth,
5873
+ strokeLinecap: "round",
5874
+ pathLength: 100,
5875
+ strokeDasharray: percentage < 100 ? `${activeLen} ${100 - activeLen}` : void 0,
5876
+ strokeDashoffset: 0,
5877
+ className: "text-primary duration-spring-standard-default-spatial ease-spring-standard-default-spatial transition-[stroke-dasharray]"
5878
+ }
5879
+ )
5880
+ ] }),
5881
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", "data-progress-diameter": diameter })
5882
+ ] });
5431
5883
  }
5432
5884
  var ProgressHeadless = React.forwardRef(
5433
5885
  ({
5434
5886
  type = "linear",
5435
5887
  indeterminate = false,
5436
5888
  size = "medium",
5889
+ shape = "flat",
5890
+ thickness = "default",
5437
5891
  className,
5438
5892
  children,
5439
5893
  renderProgress,
@@ -5460,7 +5914,9 @@ var ProgressHeadless = React.forwardRef(
5460
5914
  percentage,
5461
5915
  isIndeterminate: indeterminate,
5462
5916
  type,
5463
- size
5917
+ size,
5918
+ shape,
5919
+ thickness
5464
5920
  }),
5465
5921
  children
5466
5922
  ] });
@@ -7988,37 +8444,150 @@ InteractiveListItem.displayName = "InteractiveListItem";
7988
8444
  var listVariants = classVarianceAuthority.cva("w-full bg-surface");
7989
8445
  var listItemVariants = classVarianceAuthority.cva(
7990
8446
  [
7991
- "group relative flex items-center overflow-hidden px-4 py-2 cursor-pointer",
7992
- "transition-[background-color] duration-short4 ease-standard"
8447
+ // Layout
8448
+ "relative flex items-center overflow-hidden px-4 py-2 select-none",
8449
+ // Color transition — effects spring (no spatial overshoot on color)
8450
+ "transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects",
8451
+ // Cursor: non-interactive base; data-[interactive] overrides
8452
+ "cursor-default",
8453
+ "data-[interactive]:cursor-pointer",
8454
+ // Selected: secondary-container background
8455
+ "group-data-[selected]/list-item:bg-secondary-container",
8456
+ // Disabled: self-targeting selectors (not group, since root is the group)
8457
+ "data-[disabled]:opacity-38 data-[disabled]:pointer-events-none data-[disabled]:cursor-not-allowed"
7993
8458
  ],
7994
8459
  {
7995
8460
  variants: {
8461
+ /**
8462
+ * Visual density — derived from content, not a user prop.
8463
+ * one-line: headline only (56dp)
8464
+ * two-line: headline + supportingText (72dp)
8465
+ * three-line: overline + headline + supportingText (88dp)
8466
+ */
7996
8467
  density: {
7997
8468
  "one-line": "min-h-14",
7998
8469
  "two-line": "min-h-18",
7999
8470
  "three-line": "min-h-22 items-start"
8000
- },
8001
- isSelected: {
8002
- true: "bg-secondary-container text-on-secondary-container",
8003
- false: ""
8004
- },
8005
- isDisabled: {
8006
- true: "opacity-38 pointer-events-none",
8007
- false: ""
8008
- },
8009
- isInteractive: {
8010
- true: "",
8011
- false: "cursor-default"
8012
8471
  }
8013
8472
  },
8014
8473
  defaultVariants: {
8015
- density: "one-line",
8016
- isSelected: false,
8017
- isDisabled: false,
8018
- isInteractive: true
8474
+ density: "one-line"
8475
+ }
8476
+ }
8477
+ );
8478
+ var listItemStateLayerVariants = classVarianceAuthority.cva([
8479
+ "absolute inset-0 pointer-events-none opacity-0",
8480
+ "bg-on-surface",
8481
+ // Effects transition for opacity — no spatial overshoot
8482
+ "transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects",
8483
+ // Hover: 8%
8484
+ "group-data-[hovered]/list-item:opacity-8",
8485
+ // Focus: 10%
8486
+ "group-data-[focus-visible]/list-item:opacity-10",
8487
+ // Pressed: 10%, doubled selector beats hover
8488
+ "group-data-[pressed]/list-item:group-data-[pressed]/list-item:opacity-10",
8489
+ // No state layer when disabled
8490
+ "group-data-[disabled]/list-item:hidden"
8491
+ ]);
8492
+ var listItemFocusRingVariants = classVarianceAuthority.cva([
8493
+ "pointer-events-none absolute inset-0",
8494
+ "outline outline-2 -outline-offset-2 outline-secondary",
8495
+ // Effects transition — opacity must NOT overshoot
8496
+ "transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects",
8497
+ "opacity-0",
8498
+ "group-data-[focus-visible]/list-item:opacity-100"
8499
+ ]);
8500
+ var listItemLeadingVariants = classVarianceAuthority.cva(
8501
+ [
8502
+ "mr-4 flex shrink-0 items-center",
8503
+ // Effects transition for icon color changes
8504
+ "transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects"
8505
+ ],
8506
+ {
8507
+ variants: {
8508
+ type: {
8509
+ icon: [
8510
+ "size-6",
8511
+ "text-on-surface-variant",
8512
+ // Selected: icon color changes to on-secondary-container
8513
+ "group-data-[selected]/list-item:text-on-secondary-container",
8514
+ // Disabled: 38% (inherited from root opacity-38, but also explicit for color accuracy)
8515
+ "group-data-[disabled]/list-item:text-on-surface/38"
8516
+ ],
8517
+ avatar: [
8518
+ "size-10 overflow-hidden rounded-full"
8519
+ // Avatar color provided by content; no token overrides needed
8520
+ ],
8521
+ checkbox: [],
8522
+ radio: []
8523
+ }
8524
+ },
8525
+ defaultVariants: {
8526
+ type: "icon"
8019
8527
  }
8020
8528
  }
8021
8529
  );
8530
+ var listItemTrailingVariants = classVarianceAuthority.cva(
8531
+ [
8532
+ "ml-auto flex shrink-0 items-center",
8533
+ // Effects transition for color changes
8534
+ "transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects"
8535
+ ],
8536
+ {
8537
+ variants: {
8538
+ type: {
8539
+ icon: [
8540
+ "size-6",
8541
+ "text-on-surface-variant",
8542
+ "group-data-[selected]/list-item:text-on-secondary-container",
8543
+ "group-data-[disabled]/list-item:text-on-surface/38"
8544
+ ],
8545
+ text: [
8546
+ "text-label-small",
8547
+ "text-on-surface-variant",
8548
+ "group-data-[selected]/list-item:text-on-secondary-container",
8549
+ "group-data-[disabled]/list-item:text-on-surface/38"
8550
+ ],
8551
+ checkbox: [],
8552
+ radio: []
8553
+ }
8554
+ },
8555
+ defaultVariants: {
8556
+ type: "icon"
8557
+ }
8558
+ }
8559
+ );
8560
+ var listItemOverlineVariants = classVarianceAuthority.cva([
8561
+ "text-label-small",
8562
+ "text-on-surface-variant",
8563
+ // Effects transition for color
8564
+ "transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects",
8565
+ // Selected: on-secondary-container
8566
+ "group-data-[selected]/list-item:text-on-secondary-container",
8567
+ // Disabled: opacity inherited from root; explicit for color
8568
+ "group-data-[disabled]/list-item:text-on-surface/38"
8569
+ ]);
8570
+ var listItemHeadlineVariants = classVarianceAuthority.cva([
8571
+ "text-body-large",
8572
+ "text-on-surface",
8573
+ // Effects transition for color
8574
+ "transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects",
8575
+ // Selected: on-secondary-container
8576
+ "group-data-[selected]/list-item:text-on-secondary-container",
8577
+ // Disabled: 38% color via CSS (opacity-38 on root handles all descendants, but
8578
+ // explicit token ensures predictable rendering when color is specified).
8579
+ "group-data-[disabled]/list-item:text-on-surface/38"
8580
+ ]);
8581
+ var listItemSupportingTextVariants = classVarianceAuthority.cva([
8582
+ "text-body-medium",
8583
+ "text-on-surface-variant",
8584
+ // Effects transition for color
8585
+ "transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects",
8586
+ // Selected: on-secondary-container
8587
+ "group-data-[selected]/list-item:text-on-secondary-container",
8588
+ // Disabled: 38% color
8589
+ "group-data-[disabled]/list-item:text-on-surface/38"
8590
+ ]);
8022
8591
  function interleaveWithDividers(children) {
8023
8592
  const items = React.Children.toArray(children);
8024
8593
  return items.reduce((acc, child, index) => {
@@ -8043,51 +8612,25 @@ var List = React.forwardRef(function List2({ className, showDividers = false, ch
8043
8612
  return /* @__PURE__ */ jsxRuntime.jsx(ListHeadless, { ref, className: cn(listVariants(), className), ...props, children: renderedChildren });
8044
8613
  });
8045
8614
  List.displayName = "List";
8046
- var typeClasses = {
8047
- icon: "size-6 text-on-surface-variant",
8048
- avatar: "size-10 overflow-hidden rounded-full",
8049
- checkbox: "",
8050
- radio: ""
8051
- };
8052
8615
  var ListItemLeading = React.forwardRef(
8053
8616
  function ListItemLeading2({ type, children, className }, ref) {
8054
8617
  const isControl = type === "checkbox" || type === "radio";
8055
- return /* @__PURE__ */ jsxRuntime.jsx(
8056
- "div",
8057
- {
8058
- ref,
8059
- className: cn("mr-4 flex shrink-0 items-center", typeClasses[type], className),
8060
- children: isControl ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", tabIndex: -1, children }) : children
8061
- }
8062
- );
8618
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn(listItemLeadingVariants({ type }), className), children: isControl ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", tabIndex: -1, children }) : children });
8063
8619
  }
8064
8620
  );
8065
8621
  ListItemLeading.displayName = "ListItemLeading";
8066
- var typeClasses2 = {
8067
- icon: "size-6 text-on-surface-variant",
8068
- text: "text-on-surface-variant text-label-small",
8069
- checkbox: "",
8070
- radio: ""
8071
- };
8072
8622
  var ListItemTrailing = React.forwardRef(
8073
8623
  function ListItemTrailing2({ type, children, className }, ref) {
8074
8624
  const isControl = type === "checkbox" || type === "radio";
8075
- return /* @__PURE__ */ jsxRuntime.jsx(
8076
- "div",
8077
- {
8078
- ref,
8079
- className: cn("ml-auto flex shrink-0 items-center", typeClasses2[type], className),
8080
- children: isControl ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", tabIndex: -1, children }) : children
8081
- }
8082
- );
8625
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn(listItemTrailingVariants({ type }), className), children: isControl ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", tabIndex: -1, children }) : children });
8083
8626
  }
8084
8627
  );
8085
8628
  ListItemTrailing.displayName = "ListItemTrailing";
8086
8629
  var ListItemText = React.forwardRef(function ListItemText2({ headline, supportingText, overline, className }, ref) {
8087
8630
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: cn("min-w-0 flex-1", className), children: [
8088
- overline && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-on-surface-variant text-label-small", children: overline }),
8089
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-on-surface text-body-large", children: headline }),
8090
- supportingText && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-on-surface-variant text-body-medium", children: supportingText })
8631
+ overline && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn(listItemOverlineVariants()), children: overline }),
8632
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn(listItemHeadlineVariants()), children: headline }),
8633
+ supportingText && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn(listItemSupportingTextVariants()), children: supportingText })
8091
8634
  ] });
8092
8635
  });
8093
8636
  ListItemText.displayName = "ListItemText";
@@ -8131,44 +8674,72 @@ var ListItem = React.forwardRef(function ListItem2({
8131
8674
  }
8132
8675
  );
8133
8676
  }
8134
- return /* @__PURE__ */ jsxRuntime.jsxs(
8135
- "li",
8677
+ return /* @__PURE__ */ jsxRuntime.jsx(
8678
+ StaticStyledListItem,
8136
8679
  {
8137
8680
  ref: forwardedRef,
8138
- role: "listitem",
8139
- className: cn(
8140
- listItemVariants({
8141
- density,
8142
- isSelected: false,
8143
- isDisabled,
8144
- isInteractive: false
8145
- }),
8146
- className
8147
- ),
8148
- children: [
8149
- leadingSlot && /* @__PURE__ */ jsxRuntime.jsx(ListItemLeading, { type: leadingType ?? "icon", children: leadingSlot }),
8150
- /* @__PURE__ */ jsxRuntime.jsx(
8151
- ListItemText,
8152
- {
8153
- headline,
8154
- ...supportingText !== void 0 ? { supportingText } : {},
8155
- ...overline !== void 0 ? { overline } : {}
8156
- }
8157
- ),
8158
- trailingSlot && /* @__PURE__ */ jsxRuntime.jsx(ListItemTrailing, { type: trailingType ?? "icon", children: trailingSlot }),
8159
- insetDivider && /* @__PURE__ */ jsxRuntime.jsx(
8160
- Divider,
8161
- {
8162
- orientation: "horizontal",
8163
- inset: "start",
8164
- className: "absolute right-0 bottom-0 left-0"
8165
- }
8166
- )
8167
- ]
8681
+ value,
8682
+ headline,
8683
+ ...supportingText !== void 0 ? { supportingText } : {},
8684
+ ...overline !== void 0 ? { overline } : {},
8685
+ ...leadingSlot !== void 0 ? { leadingSlot } : {},
8686
+ ...leadingType !== void 0 ? { leadingType } : {},
8687
+ ...trailingSlot !== void 0 ? { trailingSlot } : {},
8688
+ ...trailingType !== void 0 ? { trailingType } : {},
8689
+ density,
8690
+ isDisabled,
8691
+ insetDivider,
8692
+ ...className !== void 0 ? { className } : {}
8168
8693
  }
8169
8694
  );
8170
8695
  });
8171
8696
  ListItem.displayName = "ListItem";
8697
+ var StaticStyledListItem = React.forwardRef(
8698
+ function StaticStyledListItem2({
8699
+ headline,
8700
+ supportingText,
8701
+ overline,
8702
+ leadingSlot,
8703
+ leadingType,
8704
+ trailingSlot,
8705
+ trailingType,
8706
+ density,
8707
+ isDisabled,
8708
+ insetDivider,
8709
+ className
8710
+ }, ref) {
8711
+ return /* @__PURE__ */ jsxRuntime.jsxs(
8712
+ "li",
8713
+ {
8714
+ ref,
8715
+ role: "listitem",
8716
+ className: cn(listItemVariants({ density }), "group/list-item", className),
8717
+ ...getInteractionDataAttributes({ isDisabled }),
8718
+ children: [
8719
+ leadingSlot && /* @__PURE__ */ jsxRuntime.jsx(ListItemLeading, { type: leadingType ?? "icon", children: leadingSlot }),
8720
+ /* @__PURE__ */ jsxRuntime.jsx(
8721
+ ListItemText,
8722
+ {
8723
+ headline,
8724
+ ...supportingText !== void 0 ? { supportingText } : {},
8725
+ ...overline !== void 0 ? { overline } : {}
8726
+ }
8727
+ ),
8728
+ trailingSlot && /* @__PURE__ */ jsxRuntime.jsx(ListItemTrailing, { type: trailingType ?? "icon", children: trailingSlot }),
8729
+ insetDivider && /* @__PURE__ */ jsxRuntime.jsx(
8730
+ Divider,
8731
+ {
8732
+ orientation: "horizontal",
8733
+ inset: "start",
8734
+ className: "absolute right-0 bottom-0 left-0"
8735
+ }
8736
+ )
8737
+ ]
8738
+ }
8739
+ );
8740
+ }
8741
+ );
8742
+ StaticStyledListItem.displayName = "StaticStyledListItem";
8172
8743
  var InteractiveStyledListItem = React.forwardRef(
8173
8744
  function InteractiveStyledListItem2({
8174
8745
  value,
@@ -8186,36 +8757,36 @@ var InteractiveStyledListItem = React.forwardRef(
8186
8757
  }, forwardedRef) {
8187
8758
  const internalRef = React.useRef(null);
8188
8759
  const ref = forwardedRef ?? internalRef;
8189
- const { optionProps, isSelected, isDisabled } = reactAria.useOption({ key: value }, state, ref);
8190
- const { onMouseDown: handleRipple, ripples } = useRipple({
8191
- disabled: isDisabled
8192
- });
8193
- const mergedProps = utils.mergeProps(optionProps, { onMouseDown: handleRipple });
8760
+ const { optionProps, isSelected, isDisabled, isPressed, isFocusVisible } = reactAria.useOption(
8761
+ { key: value },
8762
+ state,
8763
+ ref
8764
+ );
8765
+ const { isHovered, hoverProps } = reactAria.useHover({ isDisabled });
8766
+ const { onMouseDown: handleRipple, ripples } = useRipple({ disabled: isDisabled });
8767
+ const mergedProps = utils.mergeProps(optionProps, hoverProps, { onMouseDown: handleRipple });
8768
+ const hasLeading = !!leadingSlot;
8769
+ const hasTrailing = !!trailingSlot;
8194
8770
  return /* @__PURE__ */ jsxRuntime.jsxs(
8195
8771
  "li",
8196
8772
  {
8197
8773
  ...mergedProps,
8198
8774
  ref,
8199
- className: cn(
8200
- listItemVariants({
8201
- density,
8202
- isSelected,
8203
- isDisabled,
8204
- isInteractive: true
8205
- }),
8206
- className
8207
- ),
8208
- "data-selected": isSelected || void 0,
8209
- "data-disabled": isDisabled || void 0,
8775
+ className: cn(listItemVariants({ density }), "group/list-item", className),
8776
+ ...getInteractionDataAttributes({
8777
+ isHovered,
8778
+ isFocusVisible,
8779
+ isPressed,
8780
+ isSelected,
8781
+ isDisabled
8782
+ }),
8783
+ "data-interactive": "",
8784
+ "data-with-leading": hasLeading ? "" : void 0,
8785
+ "data-with-trailing": hasTrailing ? "" : void 0,
8210
8786
  children: [
8211
- /* @__PURE__ */ jsxRuntime.jsx(
8212
- "div",
8213
- {
8214
- "aria-hidden": "true",
8215
- className: "bg-on-surface duration-short2 ease-standard pointer-events-none absolute inset-0 opacity-0 transition-opacity group-hover:opacity-8 group-active:opacity-12"
8216
- }
8217
- ),
8218
8787
  ripples,
8788
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: cn(listItemStateLayerVariants()) }),
8789
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: cn(listItemFocusRingVariants()) }),
8219
8790
  leadingSlot && /* @__PURE__ */ jsxRuntime.jsx(ListItemLeading, { type: leadingType ?? "icon", children: leadingSlot }),
8220
8791
  /* @__PURE__ */ jsxRuntime.jsx(
8221
8792
  ListItemText,