@pure-ds/core 0.6.3 → 0.6.5

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.
@@ -686,12 +686,17 @@ export class Generator {
686
686
  baseBorderWidth = enums.BorderWidths.medium;
687
687
  }
688
688
 
689
- // Generate a scale of border widths based on the enums
689
+ const validBase = Number.isFinite(Number(baseBorderWidth))
690
+ ? Number(baseBorderWidth)
691
+ : enums.BorderWidths.medium;
692
+ const toPx = (value) => `${Math.max(0, Math.round(value * 100) / 100)}px`;
693
+
694
+ // Generate a derived border width scale based on configured base width
690
695
  return {
691
- hairline: `${enums.BorderWidths.hairline}px`,
692
- thin: `${enums.BorderWidths.thin}px`,
693
- medium: `${enums.BorderWidths.medium}px`,
694
- thick: `${enums.BorderWidths.thick}px`,
696
+ hairline: toPx(validBase * 0.25),
697
+ thin: toPx(validBase * 0.5),
698
+ medium: toPx(validBase),
699
+ thick: toPx(validBase * 1.5),
695
700
  };
696
701
  }
697
702
 
@@ -1544,7 +1549,7 @@ html[data-theme="dark"] {
1544
1549
  inset 0 -40px 80px rgba(255,255,255,0.12),
1545
1550
  0 10px 30px rgba(0,0,0,0.10);
1546
1551
  /* Glossy border with slight light and dark edges */
1547
- border: 1px solid color-mix(in oklab, var(--color-primary-500) 22%, transparent);
1552
+ border: var(--border-width-thin) solid color-mix(in oklab, var(--color-primary-500) 22%, transparent);
1548
1553
  outline: 1px solid color-mix(in oklab, #ffffff 18%, transparent);
1549
1554
  outline-offset: -1px;
1550
1555
  }
@@ -1560,7 +1565,7 @@ html[data-theme="dark"] .liquid-glass {
1560
1565
  inset 0 1px 0 rgba(255,255,255,0.12),
1561
1566
  inset 0 -40px 80px rgba(0,0,0,0.55),
1562
1567
  0 18px 38px rgba(0,0,0,0.65);
1563
- border: 1px solid color-mix(in oklab, var(--color-primary-300) 26%, transparent);
1568
+ border: var(--border-width-thin) solid color-mix(in oklab, var(--color-primary-300) 26%, transparent);
1564
1569
  outline: 1px solid color-mix(in oklab, #ffffff 16%, transparent);
1565
1570
  }
1566
1571
 
@@ -1640,7 +1645,7 @@ html[data-theme="dark"] .liquid-glass {
1640
1645
 
1641
1646
  /* Gradient border with different strengths/thickness */
1642
1647
  .border-gradient-soft {
1643
- border: 1px solid transparent;
1648
+ border: var(--border-width-thin) solid transparent;
1644
1649
  background:
1645
1650
  linear-gradient(var(--color-surface-base), var(--color-surface-base)) padding-box,
1646
1651
  linear-gradient(var(--gradient-angle, 135deg),
@@ -1650,7 +1655,7 @@ html[data-theme="dark"] .liquid-glass {
1650
1655
  }
1651
1656
 
1652
1657
  .border-gradient-medium {
1653
- border: 2px solid transparent;
1658
+ border: var(--border-width-medium) solid transparent;
1654
1659
  background:
1655
1660
  linear-gradient(var(--color-surface-base), var(--color-surface-base)) padding-box,
1656
1661
  linear-gradient(var(--gradient-angle, 135deg),
@@ -1660,7 +1665,7 @@ html[data-theme="dark"] .liquid-glass {
1660
1665
  }
1661
1666
 
1662
1667
  .border-gradient-strong {
1663
- border: 3px solid transparent;
1668
+ border: var(--border-width-thick) solid transparent;
1664
1669
  background:
1665
1670
  linear-gradient(var(--color-surface-base), var(--color-surface-base)) padding-box,
1666
1671
  linear-gradient(var(--gradient-angle, 135deg),
@@ -1748,7 +1753,7 @@ html[data-theme="dark"] .liquid-glass {
1748
1753
  :where(blockquote) {
1749
1754
  margin: 0 0 var(--spacing-4) 0;
1750
1755
  padding: var(--spacing-6) var(--spacing-8);
1751
- border-left: 4px solid var(--color-primary-500);
1756
+ border-left: calc(var(--border-width-thick) + var(--border-width-thin)) solid var(--color-primary-500);
1752
1757
  background-color: var(--color-surface-elevated);
1753
1758
  border-radius: var(--radius-none);
1754
1759
  font-size: var(--font-size-lg);
@@ -1771,7 +1776,7 @@ html[data-theme="dark"] .liquid-glass {
1771
1776
  :where(hr) {
1772
1777
  margin: var(--spacing-8) 0;
1773
1778
  border: none;
1774
- border-top: 1px solid var(--color-border);
1779
+ border-top: var(--border-width-thin) solid var(--color-border);
1775
1780
  height: 0;
1776
1781
  }
1777
1782
 
@@ -1860,7 +1865,7 @@ html[data-theme="dark"] .liquid-glass {
1860
1865
  font-size: var(--font-size-sm);
1861
1866
  color: var(--color-text-primary);
1862
1867
  background-color: var(--color-surface-elevated);
1863
- border: 1px solid var(--color-border);
1868
+ border: var(--border-width-thin) solid var(--color-border);
1864
1869
  border-radius: var(--radius-sm);
1865
1870
  box-shadow: 0 2px 0 0 var(--color-border);
1866
1871
  }
@@ -1883,12 +1888,12 @@ html[data-theme="dark"] .liquid-glass {
1883
1888
 
1884
1889
  :where(details):not(.accordion *) {
1885
1890
  margin: 0 0 var(--spacing-2) 0;
1886
- border: 1px solid var(--color-border);
1891
+ border: var(--border-width-thin) solid var(--color-border);
1887
1892
  border-radius: var(--radius-md);
1888
1893
  background-color: var(--color-surface-base);
1889
1894
 
1890
1895
  &[open] :where(summary) {
1891
- border-bottom: 1px solid var(--color-border);
1896
+ border-bottom: var(--border-width-thin) solid var(--color-border);
1892
1897
  background-color: var(--color-surface-subtle);
1893
1898
 
1894
1899
  &::after {
@@ -1939,6 +1944,7 @@ html[data-theme="dark"] .liquid-glass {
1939
1944
 
1940
1945
  #generateFormStyles() {
1941
1946
  const {
1947
+ shape = {},
1942
1948
  gap,
1943
1949
  inputPadding,
1944
1950
  buttonPadding,
@@ -1950,10 +1956,18 @@ html[data-theme="dark"] .liquid-glass {
1950
1956
  inputMinHeight,
1951
1957
  } = this.options.design;
1952
1958
 
1959
+ const shapeBorderWidth =
1960
+ typeof shape.borderWidth === "number"
1961
+ ? shape.borderWidth
1962
+ : typeof shape.borderWidth === "string"
1963
+ ? (enums.BorderWidths[shape.borderWidth] ?? null)
1964
+ : null;
1965
+
1953
1966
  const inputPaddingValue = inputPadding || 0.75;
1954
1967
  const buttonPaddingValue = buttonPadding || 1.0;
1955
1968
  const focusWidth = focusRingWidth || 3;
1956
- const borderWidth = borderWidthThin || 1;
1969
+ const borderWidth =
1970
+ borderWidthThin || shapeBorderWidth || enums.BorderWidths.thin;
1957
1971
  const gapValue = gap || 1.0;
1958
1972
  const sectionSpacingValue = sectionSpacing || 2.0;
1959
1973
  const minButtonHeight = buttonMinHeight || 44;
@@ -2089,7 +2103,7 @@ input, textarea, select {
2089
2103
  width: 100%;
2090
2104
  min-height: ${minInputHeight}px;
2091
2105
  padding: calc(var(--spacing-1) * ${inputPaddingValue}) var(--spacing-4);
2092
- border: ${borderWidth}px solid var(--color-border);
2106
+ border: var(--border-width-medium) solid var(--color-border);
2093
2107
  border-radius: var(--radius-md);
2094
2108
  font-family: var(--font-family-body);
2095
2109
  font-size: var(--font-size-base);
@@ -2159,7 +2173,7 @@ input[type="range"] {
2159
2173
  border-radius: 50%;
2160
2174
  box-shadow: var(--shadow-sm);
2161
2175
  cursor: grab;
2162
- border: 1px solid color-mix(in srgb, var(--color-primary-500) 30%, var(--color-border));
2176
+ border: var(--border-width-thin) solid color-mix(in srgb, var(--color-primary-500) 30%, var(--color-border));
2163
2177
  }
2164
2178
 
2165
2179
  /* Mozilla track */
@@ -2176,7 +2190,7 @@ input[type="range"] {
2176
2190
  background: color-mix(in srgb, var(--color-primary-500) 15%, var(--color-surface-base));
2177
2191
  border-radius: 50%;
2178
2192
  box-shadow: var(--shadow-sm);
2179
- border: 1px solid color-mix(in srgb, var(--color-primary-500) 30%, var(--color-border));
2193
+ border: var(--border-width-thin) solid color-mix(in srgb, var(--color-primary-500) 30%, var(--color-border));
2180
2194
  transform: translateY(calc((var(--range-track-height, 8px) - var(--range-thumb-size, 28px)) / 2));
2181
2195
  }
2182
2196
 
@@ -2264,7 +2278,7 @@ input[type="checkbox"] + label:not(fieldset label):not(label[data-toggle]) {
2264
2278
  padding: calc(var(--spacing-1) * ${
2265
2279
  buttonPaddingValue * 0.6
2266
2280
  }) calc(var(--spacing-4) * 0.85);
2267
- border: ${borderWidth}px solid var(--color-border);
2281
+ border: var(--border-width-medium) solid var(--color-border);
2268
2282
  border-radius: var(--radius-md);
2269
2283
  font-family: var(--font-family-body);
2270
2284
  font-size: var(--font-size-sm);
@@ -2292,7 +2306,7 @@ input[type="checkbox"]:checked + label:not(fieldset label):not(label[data-toggle
2292
2306
  background-color: color-mix(in oklab, var(--color-primary-500) 8%, transparent);
2293
2307
  color: var(--color-primary-700);
2294
2308
  border-color: var(--color-primary-500);
2295
- border-width: 2px;
2309
+ border-width: var(--border-width-medium);
2296
2310
  font-weight: var(--font-weight-semibold);
2297
2311
 
2298
2312
  &:hover {
@@ -2372,7 +2386,7 @@ fieldset[role="group"].buttons {
2372
2386
  padding: calc(var(--spacing-1) * ${
2373
2387
  buttonPaddingValue * 0.6
2374
2388
  }) calc(var(--spacing-4) * 0.85);
2375
- border: 2px solid var(--color-border);
2389
+ border: var(--border-width-medium) solid var(--color-border);
2376
2390
  border-radius: var(--radius-md);
2377
2391
  font-family: var(--font-family-body);
2378
2392
  font-size: var(--font-size-sm);
@@ -2404,7 +2418,7 @@ fieldset[role="group"].buttons {
2404
2418
  label:has(input[type="checkbox"]:checked) {
2405
2419
  background-color: color-mix(in oklab, var(--color-primary-500) 8%, transparent);
2406
2420
  border-color: var(--color-primary-500);
2407
- border-width: 2px;
2421
+ border-width: var(--border-width-medium);
2408
2422
  font-weight: var(--font-weight-semibold);
2409
2423
 
2410
2424
  &:hover {
@@ -2572,7 +2586,7 @@ button, .btn, input[type="submit"], input[type="button"], input[type="reset"] {
2572
2586
  justify-content: center;
2573
2587
  min-height: ${minButtonHeight}px;
2574
2588
  padding: calc(var(--spacing-1) * ${buttonPaddingValue}) var(--spacing-6);
2575
- border: ${borderWidth}px solid transparent;
2589
+ border: var(--border-width-medium) solid transparent;
2576
2590
  border-radius: var(--radius-md);
2577
2591
  font-family: var(--font-family-body);
2578
2592
  font-size: var(--font-size-base);
@@ -2829,7 +2843,7 @@ a.btn-working {
2829
2843
  gap: var(--spacing-3);
2830
2844
  width: 100%;
2831
2845
  background: var(--color-input-bg);
2832
- border: 1px solid var(--color-border);
2846
+ border: var(--border-width-thin) solid var(--color-border);
2833
2847
  border-radius: var(--radius-md);
2834
2848
  min-height: var(--input-min-height, 40px);
2835
2849
  position: relative;
@@ -2874,13 +2888,13 @@ a.btn-working {
2874
2888
  .array-item {
2875
2889
  position: relative;
2876
2890
  padding: var(--spacing-4);
2877
- border: ${borderWidth}px solid var(--color-border);
2891
+ border: var(--border-width-medium) solid var(--color-border);
2878
2892
  border-radius: var(--radius-md);
2879
2893
  background-color: var(--color-surface-base);
2880
2894
 
2881
2895
  .array-controls {
2882
2896
  padding-top: var(--spacing-3);
2883
- border-top: ${borderWidth}px solid var(--color-border);
2897
+ border-top: var(--border-width-medium) solid var(--color-border);
2884
2898
  margin-top: var(--spacing-4);
2885
2899
  }
2886
2900
  }
@@ -2970,13 +2984,13 @@ th {
2970
2984
  text-align: left;
2971
2985
  font-weight: var(--font-weight-semibold);
2972
2986
  color: var(--color-text-primary);
2973
- border-bottom: 2px solid var(--color-border);
2987
+ border-bottom: var(--border-width-medium) solid var(--color-border);
2974
2988
  }
2975
2989
 
2976
2990
  td {
2977
2991
  padding: var(--spacing-3) var(--spacing-4);
2978
2992
  color: var(--color-text-secondary);
2979
- border-bottom: 1px solid var(--color-border);
2993
+ border-bottom: var(--border-width-thin) solid var(--color-border);
2980
2994
  }
2981
2995
 
2982
2996
  tbody {
@@ -3000,10 +3014,10 @@ tbody {
3000
3014
  }
3001
3015
 
3002
3016
  .table-bordered {
3003
- border: 1px solid var(--color-border);
3017
+ border: var(--border-width-thin) solid var(--color-border);
3004
3018
 
3005
3019
  th, td {
3006
- border: 1px solid var(--color-border);
3020
+ border: var(--border-width-thin) solid var(--color-border);
3007
3021
  }
3008
3022
  }
3009
3023
 
@@ -3023,7 +3037,7 @@ tbody {
3023
3037
  padding: var(--spacing-4);
3024
3038
  border-radius: var(--radius-md);
3025
3039
  margin: 0 0 var(--spacing-4) 0;
3026
- border-left: 4px solid;
3040
+ border-left: calc(var(--border-width-thick) + var(--border-width-thin)) solid;
3027
3041
  display: flex;
3028
3042
  align-items: flex-start;
3029
3043
  gap: var(--spacing-3);
@@ -3105,7 +3119,7 @@ tbody {
3105
3119
  return /*css*/ `/* Accordion (details/summary) */
3106
3120
 
3107
3121
  :where(.accordion details) {
3108
- border: 1px solid var(--color-border);
3122
+ border: var(--border-width-thin) solid var(--color-border);
3109
3123
  border-radius: var(--radius-md);
3110
3124
  background: var(--color-surface-base);
3111
3125
  margin: 0 0 var(--spacing-3) 0;
@@ -3227,7 +3241,7 @@ tbody {
3227
3241
 
3228
3242
  .badge-outline {
3229
3243
  background-color: transparent;
3230
- border: 1px solid currentColor;
3244
+ border: var(--border-width-thin) solid currentColor;
3231
3245
  &.badge-primary { color: var(--color-text-primary); }
3232
3246
  &.badge-secondary { color: var(--color-secondary-600); }
3233
3247
  &.badge-success { color: var(--color-success-600); }
@@ -3275,12 +3289,10 @@ dialog {
3275
3289
 
3276
3290
  /* Smooth transitions */
3277
3291
  opacity: 0;
3278
- scale: 0.95;
3292
+ transform: scale(0.95);
3279
3293
  transition:
3280
- opacity 0.2s ease,
3281
- scale 0.2s ease,
3282
- overlay 0.2s ease allow-discrete,
3283
- display 0.2s ease allow-discrete;
3294
+ opacity var(--transition-normal) ease,
3295
+ transform var(--transition-normal) ease;
3284
3296
 
3285
3297
 
3286
3298
  }
@@ -3288,14 +3300,18 @@ dialog {
3288
3300
  /* Open state */
3289
3301
  dialog[open] {
3290
3302
  opacity: 1;
3291
- scale: 1;
3303
+ transform: scale(1);
3304
+ animation: pds-dialog-enter var(--transition-normal) ease;
3292
3305
  }
3293
3306
 
3294
- /* Starting style for smooth open animation */
3295
- @starting-style {
3296
- dialog[open] {
3307
+ @keyframes pds-dialog-enter {
3308
+ from {
3297
3309
  opacity: 0;
3298
- scale: 0.95;
3310
+ transform: scale(0.95);
3311
+ }
3312
+ to {
3313
+ opacity: 1;
3314
+ transform: scale(1);
3299
3315
  }
3300
3316
  }
3301
3317
 
@@ -3304,20 +3320,17 @@ dialog::backdrop {
3304
3320
  background: var(--backdrop-bg);
3305
3321
  backdrop-filter: var(--backdrop-filter);
3306
3322
  opacity: 0;
3307
- transition:
3308
- opacity 0.2s ease,
3309
- overlay 0.2s ease allow-discrete,
3310
- display 0.2s ease allow-discrete;
3323
+ transition: opacity var(--transition-normal) ease;
3311
3324
  }
3312
3325
 
3313
3326
  dialog[open]::backdrop {
3314
3327
  opacity: var(--backdrop-opacity, 1);
3328
+ animation: pds-dialog-backdrop-enter var(--transition-normal) ease;
3315
3329
  }
3316
3330
 
3317
- @starting-style {
3318
- dialog[open]::backdrop {
3319
- opacity: 0;
3320
- }
3331
+ @keyframes pds-dialog-backdrop-enter {
3332
+ from { opacity: 0; }
3333
+ to { opacity: var(--backdrop-opacity, 1); }
3321
3334
  }
3322
3335
 
3323
3336
  /* Dialog - constrain max height to 90vh, support custom maxHeight via CSS variable */
@@ -3351,7 +3364,7 @@ dialog {
3351
3364
  justify-content: space-between;
3352
3365
  gap: var(--spacing-4);
3353
3366
  padding: var(--spacing-6);
3354
- border-bottom: 1px solid var(--surface-overlay-border);
3367
+ border-bottom: var(--border-width-thin) solid var(--surface-overlay-border);
3355
3368
  flex-shrink: 0;
3356
3369
 
3357
3370
  h2,
@@ -3408,7 +3421,7 @@ dialog {
3408
3421
  justify-content: flex-end;
3409
3422
  align-items: center;
3410
3423
  padding: var(--spacing-6);
3411
- border-top: 1px solid var(--surface-overlay-border);
3424
+ border-top: var(--border-width-thin) solid var(--surface-overlay-border);
3412
3425
  flex-shrink: 0;
3413
3426
  }
3414
3427
  }
@@ -3460,7 +3473,7 @@ pds-tabstrip {
3460
3473
  & > nav {
3461
3474
  display: flex;
3462
3475
  gap: var(--spacing-1);
3463
- border-bottom: 2px solid var(--color-border);
3476
+ border-bottom: var(--border-width-medium) solid var(--color-border);
3464
3477
  margin-bottom: var(--spacing-6);
3465
3478
  position: relative;
3466
3479
  overflow-x: auto;
@@ -3489,8 +3502,8 @@ pds-tabstrip {
3489
3502
  background: transparent;
3490
3503
  cursor: pointer;
3491
3504
  transition: color var(--transition-fast);
3492
- border-bottom: 2px solid transparent;
3493
- margin-bottom: -2px; /* Overlap the nav border */
3505
+ border-bottom: var(--border-width-medium) solid transparent;
3506
+ margin-bottom: calc(-1 * var(--border-width-medium)); /* Overlap the nav border */
3494
3507
 
3495
3508
  &:hover {
3496
3509
  color: var(--color-text-primary);
@@ -3557,11 +3570,11 @@ pds-tabstrip {
3557
3570
  ::-webkit-scrollbar-thumb {
3558
3571
  background: var(--color-secondary-300);
3559
3572
  border-radius: var(--radius-full);
3560
- border: 3px solid transparent;
3573
+ border: var(--border-width-thick) solid transparent;
3561
3574
  background-clip: padding-box;
3562
3575
  transition: background-color var(--transition-fast);
3563
- &:hover { background: var(--color-secondary-400); border: 2px solid transparent; background-clip: padding-box; }
3564
- &:active { background: var(--color-secondary-500); border: 2px solid transparent; background-clip: padding-box; }
3576
+ &:hover { background: var(--color-secondary-400); border: var(--border-width-medium) solid transparent; background-clip: padding-box; }
3577
+ &:active { background: var(--color-secondary-500); border: var(--border-width-medium) solid transparent; background-clip: padding-box; }
3565
3578
  @media (prefers-color-scheme: dark) {
3566
3579
  background: var(--color-secondary-600);
3567
3580
  &:hover { background: var(--color-secondary-500); }
@@ -3672,7 +3685,7 @@ nav[data-dropdown] {
3672
3685
  padding: var(--spacing-2);
3673
3686
  margin: 0;
3674
3687
  background: var(--color-surface-overlay);
3675
- border: 1px solid var(--color-border);
3688
+ border: var(--border-width-thin) solid var(--color-border);
3676
3689
  border-radius: var(--radius-md);
3677
3690
  box-shadow: var(--shadow-lg);
3678
3691
  top: 100%;
@@ -3724,7 +3737,7 @@ nav[data-dropdown] {
3724
3737
  padding: var(--spacing-1) 0;
3725
3738
 
3726
3739
  & + li {
3727
- border-top: 1px solid var(--color-border);
3740
+ border-top: var(--border-width-thin) solid var(--color-border);
3728
3741
  margin-top: var(--spacing-2);
3729
3742
  }
3730
3743
 
@@ -3741,7 +3754,7 @@ nav[data-dropdown] {
3741
3754
 
3742
3755
  & > hr {
3743
3756
  border: none;
3744
- border-top: 3px solid var(--color-border);
3757
+ border-top: var(--border-width-thick) solid var(--color-border);
3745
3758
  margin: var(--spacing-2) 0;
3746
3759
  }
3747
3760
  }
@@ -4094,7 +4107,7 @@ nav[data-dropdown] {
4094
4107
  }
4095
4108
 
4096
4109
  button, input, textarea, select {
4097
- border-width: 2px;
4110
+ border-width: var(--border-width-medium);
4098
4111
  }
4099
4112
  }
4100
4113
 
@@ -4375,7 +4388,7 @@ nav[data-dropdown] {
4375
4388
  font: inherit;
4376
4389
  color: var(--color-text-primary);
4377
4390
  background: var(--color-input-bg);
4378
- border: 1px solid var(--color-border);
4391
+ border: var(--border-width-thin) solid var(--color-border);
4379
4392
  border-radius: var(--radius-md);
4380
4393
  padding: var(--spacing-2) var(--spacing-3);
4381
4394
  min-height: 40px;
@@ -4470,7 +4483,7 @@ nav[data-dropdown] {
4470
4483
  transform: translateY(-50%);
4471
4484
  width: var(--spacing-5);
4472
4485
  height: var(--spacing-5);
4473
- border: var(--border-width-md) solid var(--color-border);
4486
+ border: var(--border-width-medium) solid var(--color-border);
4474
4487
  border-radius: var(--radius-sm);
4475
4488
  background: var(--color-surface-base);
4476
4489
  transition: all var(--transition-fast);
@@ -4688,7 +4701,7 @@ ${this.#generateTableStyles()}
4688
4701
  .card-outlined,
4689
4702
  .card-basic {
4690
4703
  background: var(--color-surface-base);
4691
- border: 1px solid var(--color-border);
4704
+ border: var(--border-width-thin) solid var(--color-border);
4692
4705
  }
4693
4706
 
4694
4707
  .card-interactive:hover {