@pure-ds/core 0.3.18 → 0.4.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.
@@ -1,10 +1,20 @@
1
1
  /**
2
+ * A tab panel used as a child of `<pds-tabstrip>`. Each panel becomes a tab
3
+ * with its button label derived from the `label` attribute.
4
+ *
2
5
  * @element pds-tabpanel
3
6
  *
4
- * @attr {string} label - Label for the tab button
7
+ * @attr {string} label - Label text displayed on the tab button
5
8
  * @attr {string} id - Unique identifier for the panel (auto-generated if not provided)
6
9
  *
7
- * @slot - Content of the tab panel
10
+ * @slot - Content displayed when this tab is active
11
+ *
12
+ * @example
13
+ * ```html
14
+ * <pds-tabpanel label="Settings">
15
+ * <p>Settings content here.</p>
16
+ * </pds-tabpanel>
17
+ * ```
8
18
  */
9
19
  class TabPanel extends HTMLElement {
10
20
  connectedCallback() {
@@ -36,18 +46,39 @@ class TabPanel extends HTMLElement {
36
46
  customElements.define("pds-tabpanel", TabPanel);
37
47
 
38
48
  /**
39
- * Tab navigation component that pairs anchors with `pds-tabpanel` children.
49
+ * Tab navigation component that displays content in switchable panels.
50
+ *
51
+ * Use `<pds-tabpanel>` children with a `label` attribute to define each tab.
52
+ * The component auto-generates navigation buttons and handles URL hash synchronization.
40
53
  *
41
54
  * @element pds-tabstrip
55
+ *
42
56
  * @fires tabchange - Fired when the active tab changes. Detail: `{ oldTab: string|null, newTab: string }`
43
57
  *
44
- * @attr {string} label - Accessible label announced for the tablist
58
+ * @attr {string} label - Accessible label announced for the tablist (default: "Tabs")
45
59
  * @attr {string} selected - Identifier of the currently active panel (synced with the location hash)
46
60
  *
47
- * @slot - Collection of `pds-tabpanel` nodes representing individual tab panels
61
+ * @slot - One or more `<pds-tabpanel>` elements, each with a `label` attribute
48
62
  *
49
63
  * @csspart tabs - Navigation container comprising the clickable tab buttons
50
64
  * @cssprop --color-accent-400 - Color of the active tab indicator underline
65
+ *
66
+ * @example
67
+ * ```html
68
+ * <pds-tabstrip label="Account settings">
69
+ * <pds-tabpanel label="General">
70
+ * <p>General settings content here.</p>
71
+ * </pds-tabpanel>
72
+ *
73
+ * <pds-tabpanel label="Security">
74
+ * <p>Security settings content here.</p>
75
+ * </pds-tabpanel>
76
+ *
77
+ * <pds-tabpanel label="Notifications">
78
+ * <p>Notification preferences here.</p>
79
+ * </pds-tabpanel>
80
+ * </pds-tabstrip>
81
+ * ```
51
82
  */
52
83
  class TabStrip extends HTMLElement {
53
84
  #shadow = this.attachShadow({ mode: "open" });
@@ -1306,7 +1306,8 @@
1306
1306
  },
1307
1307
  {
1308
1308
  "kind": "method",
1309
- "name": "updateLayout"
1309
+ "name": "updateLayout",
1310
+ "description": "Updates the layout based on the current viewport width and breakpoint.\nToggles mobile mode and adjusts panel styles."
1310
1311
  },
1311
1312
  {
1312
1313
  "kind": "method",
@@ -1332,11 +1333,13 @@
1332
1333
  },
1333
1334
  {
1334
1335
  "kind": "method",
1335
- "name": "toggleMobileView"
1336
+ "name": "toggleMobileView",
1337
+ "description": "Toggles the visibility of the primary panel in mobile view."
1336
1338
  },
1337
1339
  {
1338
1340
  "kind": "method",
1339
- "name": "closeMobileView"
1341
+ "name": "closeMobileView",
1342
+ "description": "Closes the primary panel in mobile view."
1340
1343
  },
1341
1344
  {
1342
1345
  "kind": "method",
@@ -1429,11 +1432,11 @@
1429
1432
  "declarations": [
1430
1433
  {
1431
1434
  "kind": "class",
1432
- "description": "",
1435
+ "description": "A tab panel used as a child of `<pds-tabstrip>`. Each panel becomes a tab\nwith its button label derived from the `label` attribute.",
1433
1436
  "name": "TabPanel",
1434
1437
  "slots": [
1435
1438
  {
1436
- "description": "Content of the tab panel",
1439
+ "description": "Content displayed when this tab is active",
1437
1440
  "name": ""
1438
1441
  }
1439
1442
  ],
@@ -1455,7 +1458,7 @@
1455
1458
  "type": {
1456
1459
  "text": "string"
1457
1460
  },
1458
- "description": "Label for the tab button",
1461
+ "description": "Label text displayed on the tab button",
1459
1462
  "name": "label"
1460
1463
  },
1461
1464
  {
@@ -1474,7 +1477,7 @@
1474
1477
  },
1475
1478
  {
1476
1479
  "kind": "class",
1477
- "description": "Tab navigation component that pairs anchors with `pds-tabpanel` children.",
1480
+ "description": "Tab navigation component that displays content in switchable panels.\n\nUse `<pds-tabpanel>` children with a `label` attribute to define each tab.\nThe component auto-generates navigation buttons and handles URL hash synchronization.",
1478
1481
  "name": "TabStrip",
1479
1482
  "cssProperties": [
1480
1483
  {
@@ -1490,7 +1493,7 @@
1490
1493
  ],
1491
1494
  "slots": [
1492
1495
  {
1493
- "description": "Collection of `pds-tabpanel` nodes representing individual tab panels",
1496
+ "description": "One or more `<pds-tabpanel>` elements, each with a `label` attribute",
1494
1497
  "name": ""
1495
1498
  }
1496
1499
  ],
@@ -1515,7 +1518,7 @@
1515
1518
  "type": {
1516
1519
  "text": "string"
1517
1520
  },
1518
- "description": "Accessible label announced for the tablist",
1521
+ "description": "Accessible label announced for the tablist (default: \"Tabs\")",
1519
1522
  "name": "label"
1520
1523
  },
1521
1524
  {
@@ -1853,7 +1853,7 @@
1853
1853
  "dataAttributes": [],
1854
1854
  "metadata": {
1855
1855
  "generator": "PDS CSS Data Generator",
1856
- "generatedAt": "2025-12-12T11:34:39.874Z",
1856
+ "generatedAt": "2025-12-19T15:38:18.395Z",
1857
1857
  "totalProperties": 165,
1858
1858
  "totalClasses": 91,
1859
1859
  "totalAttributes": 0
@@ -749,11 +749,11 @@
749
749
  },
750
750
  {
751
751
  "name": "pds-tabpanel",
752
- "description": "TabPanel component",
752
+ "description": "A tab panel used as a child of `<pds-tabstrip>`. Each panel becomes a tab\nwith its button label derived from the `label` attribute.",
753
753
  "attributes": [
754
754
  {
755
755
  "name": "label",
756
- "description": "Label for the tab button"
756
+ "description": "Label text displayed on the tab button"
757
757
  },
758
758
  {
759
759
  "name": "id",
@@ -763,11 +763,11 @@
763
763
  },
764
764
  {
765
765
  "name": "pds-tabstrip",
766
- "description": "Tab navigation component that pairs anchors with `pds-tabpanel` children.",
766
+ "description": "Tab navigation component that displays content in switchable panels.\n\nUse `<pds-tabpanel>` children with a `label` attribute to define each tab.\nThe component auto-generates navigation buttons and handles URL hash synchronization.",
767
767
  "attributes": [
768
768
  {
769
769
  "name": "label",
770
- "description": "Accessible label announced for the tablist"
770
+ "description": "Accessible label announced for the tablist (default: \"Tabs\")"
771
771
  },
772
772
  {
773
773
  "name": "selected",
@@ -1645,6 +1645,36 @@ html[data-theme="dark"] .liquid-glass {
1645
1645
  height: 0;
1646
1646
  }
1647
1647
 
1648
+ /* Labeled horizontal rule: <hr data-content="OR"> */
1649
+ :where(hr[data-content]) {
1650
+ position: relative;
1651
+ border: none;
1652
+ text-align: center;
1653
+ height: auto;
1654
+ overflow: visible;
1655
+
1656
+ &::before {
1657
+ content: "";
1658
+ position: absolute;
1659
+ left: 0;
1660
+ top: 50%;
1661
+ width: 100%;
1662
+ height: 1px;
1663
+ background: linear-gradient(to right, transparent, var(--color-border), transparent);
1664
+ }
1665
+
1666
+ &::after {
1667
+ content: attr(data-content);
1668
+ position: relative;
1669
+ display: inline-block;
1670
+ padding: 0 var(--spacing-3);
1671
+ background-color: var(--color-surface-base);
1672
+ color: var(--color-text-muted);
1673
+ font-size: var(--font-size-sm);
1674
+ line-height: var(--font-line-height-normal);
1675
+ }
1676
+ }
1677
+
1648
1678
  :where(dl) {
1649
1679
  margin: 0 0 var(--spacing-4) 0;
1650
1680
  }
@@ -3365,40 +3395,40 @@ pds-tabstrip {
3365
3395
  ::-webkit-scrollbar {
3366
3396
  width: 12px;
3367
3397
  height: 12px;
3398
+ }
3399
+
3400
+ ::-webkit-scrollbar-track {
3401
+ background: transparent;
3402
+ }
3403
+
3404
+ ::-webkit-scrollbar-thumb {
3405
+ background: var(--color-secondary-300);
3406
+ border-radius: var(--radius-full);
3407
+ border: 3px solid transparent;
3408
+ background-clip: padding-box;
3409
+ transition: background-color var(--transition-fast);
3368
3410
 
3369
- &-track {
3370
- background: transparent;
3411
+ &:hover {
3412
+ background: var(--color-secondary-400);
3413
+ border: 2px solid transparent;
3414
+ background-clip: padding-box;
3371
3415
  }
3372
3416
 
3373
- &-thumb {
3374
- background: var(--color-secondary-300);
3375
- border-radius: var(--radius-full);
3376
- border: 3px solid transparent;
3417
+ &:active {
3418
+ background: var(--color-secondary-500);
3419
+ border: 2px solid transparent;
3377
3420
  background-clip: padding-box;
3378
- transition: background-color var(--transition-fast);
3421
+ }
3422
+
3423
+ @media (prefers-color-scheme: dark) {
3424
+ background: var(--color-secondary-600);
3379
3425
 
3380
3426
  &:hover {
3381
- background: var(--color-secondary-400);
3382
- border: 2px solid transparent;
3383
- background-clip: padding-box;
3384
- }
3385
-
3386
- &:active {
3387
3427
  background: var(--color-secondary-500);
3388
- border: 2px solid transparent;
3389
- background-clip: padding-box;
3390
3428
  }
3391
3429
 
3392
- @media (prefers-color-scheme: dark) {
3393
- background: var(--color-secondary-600);
3394
-
3395
- &:hover {
3396
- background: var(--color-secondary-500);
3397
- }
3398
-
3399
- &:active {
3400
- background: var(--color-secondary-400);
3401
- }
3430
+ &:active {
3431
+ background: var(--color-secondary-400);
3402
3432
  }
3403
3433
  }
3404
3434
  }
@@ -3843,6 +3873,11 @@ nav[data-dropdown] {
3843
3873
  flex-direction: row;
3844
3874
  }
3845
3875
 
3876
+ /* Flex grow - fill remaining space */
3877
+ .grow {
3878
+ flex: 1 1 0%;
3879
+ }
3880
+
3846
3881
  /* Flex alignment */
3847
3882
  .items-start { align-items: flex-start; }
3848
3883
  .items-center { align-items: center; }
@@ -3857,6 +3892,34 @@ nav[data-dropdown] {
3857
3892
  .justify-around { justify-content: space-around; }
3858
3893
  .justify-evenly { justify-content: space-evenly; }
3859
3894
 
3895
+ /* Text alignment utilities */
3896
+ .text-left { text-align: left; }
3897
+ .text-center { text-align: center; }
3898
+ .text-right { text-align: right; }
3899
+
3900
+ /* Text overflow utility */
3901
+ .truncate {
3902
+ overflow: hidden;
3903
+ text-overflow: ellipsis;
3904
+ white-space: nowrap;
3905
+ }
3906
+
3907
+ /* Max-width utilities (semantic breakpoints) */
3908
+ .max-w-sm { max-width: 400px; }
3909
+ .max-w-md { max-width: 600px; }
3910
+ .max-w-lg { max-width: 800px; }
3911
+ .max-w-xl { max-width: 1200px; }
3912
+
3913
+ /* Stack utilities - vertical rhythm for stacked elements */
3914
+ .stack-sm { display: flex; flex-direction: column; gap: var(--spacing-2); }
3915
+ .stack-md { display: flex; flex-direction: column; gap: var(--spacing-4); }
3916
+ .stack-lg { display: flex; flex-direction: column; gap: var(--spacing-6); }
3917
+ .stack-xl { display: flex; flex-direction: column; gap: var(--spacing-8); }
3918
+
3919
+ /* Section spacing - for major content blocks */
3920
+ .section { padding-block: var(--spacing-8); }
3921
+ .section-lg { padding-block: var(--spacing-12); }
3922
+
3860
3923
  /* Responsive helpers */
3861
3924
  @media (max-width: ${breakpoints.md - 1}px) {
3862
3925
  .mobile-stack { flex-direction: column; }
@@ -3883,29 +3946,29 @@ nav[data-dropdown] {
3883
3946
  opacity: var(--backdrop-opacity, 1);
3884
3947
  pointer-events: auto;
3885
3948
  }
3949
+ }
3886
3950
 
3887
- /* Backdrop variants */
3888
- &-light {
3889
- --backdrop-bg: linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.2));
3890
- --backdrop-brightness: 1.1;
3891
- }
3951
+ /* Backdrop variants */
3952
+ .backdrop-light {
3953
+ --backdrop-bg: linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.2));
3954
+ --backdrop-brightness: 1.1;
3955
+ }
3892
3956
 
3893
- &-dark {
3894
- --backdrop-bg: linear-gradient(135deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.5));
3895
- --backdrop-brightness: 0.6;
3896
- }
3957
+ .backdrop-dark {
3958
+ --backdrop-bg: linear-gradient(135deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.5));
3959
+ --backdrop-brightness: 0.6;
3960
+ }
3897
3961
 
3898
- &-blur-sm {
3899
- --backdrop-blur: 5px;
3900
- }
3962
+ .backdrop-blur-sm {
3963
+ --backdrop-blur: 5px;
3964
+ }
3901
3965
 
3902
- &-blur-md {
3903
- --backdrop-blur: 10px;
3904
- }
3966
+ .backdrop-blur-md {
3967
+ --backdrop-blur: 10px;
3968
+ }
3905
3969
 
3906
- &-blur-lg {
3907
- --backdrop-blur: 20px;
3908
- }
3970
+ .backdrop-blur-lg {
3971
+ --backdrop-blur: 20px;
3909
3972
  }
3910
3973
  `
3911
3974
  );
@@ -4640,23 +4703,23 @@ ${this.#generateTableStyles()}
4640
4703
  background: var(--color-surface-base);
4641
4704
  border-radius: var(--radius-md);
4642
4705
  padding: var(--spacing-4);
4706
+ }
4643
4707
 
4644
- &-elevated {
4645
- background: var(--color-surface-elevated);
4646
- box-shadow: var(--shadow-md);
4647
- }
4708
+ .card-elevated {
4709
+ background: var(--color-surface-elevated);
4710
+ box-shadow: var(--shadow-md);
4711
+ }
4648
4712
 
4649
- &-outlined,
4650
- &-basic {
4651
- background: var(--color-surface-base);
4652
- border: 1px solid var(--color-border);
4653
- }
4713
+ .card-outlined,
4714
+ .card-basic {
4715
+ background: var(--color-surface-base);
4716
+ border: 1px solid var(--color-border);
4717
+ }
4654
4718
 
4655
- &-interactive:hover {
4656
- transform: translateY(-2px);
4657
- box-shadow: var(--shadow-lg);
4658
- transition: transform var(--transition-fast), box-shadow var(--transition-fast);
4659
- }
4719
+ .card-interactive:hover {
4720
+ transform: translateY(-2px);
4721
+ box-shadow: var(--shadow-lg);
4722
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast);
4660
4723
  }
4661
4724
 
4662
4725
  ${this.#generateScrollbarStyles()}
@@ -4744,6 +4807,34 @@ ${this.#generateBorderGradientUtilities()}
4744
4807
  pds-icon {
4745
4808
  color: var(--surface-inverse-icon);
4746
4809
  }
4810
+
4811
+ /* Default and secondary buttons on inverse - semi-transparent glass effect */
4812
+ & button:not(.btn-primary):not(.btn-outline):not(.btn-danger):not(.btn-success):not(.btn-warning),
4813
+ & .btn-secondary {
4814
+ background-color: rgba(255, 255, 255, 0.12);
4815
+ color: var(--surface-inverse-text);
4816
+ border-color: rgba(255, 255, 255, 0.25);
4817
+
4818
+ &:hover {
4819
+ background-color: rgba(255, 255, 255, 0.2);
4820
+ }
4821
+
4822
+ &:active {
4823
+ background-color: rgba(255, 255, 255, 0.28);
4824
+ }
4825
+ }
4826
+
4827
+ /* Ensure btn-primary stays vibrant on inverse */
4828
+ & .btn-primary {
4829
+ background-color: var(--color-primary-500);
4830
+ border-color: var(--color-primary-500);
4831
+ color: var(--color-primary-contrast, #ffffff);
4832
+
4833
+ &:hover {
4834
+ background-color: var(--color-primary-400);
4835
+ border-color: var(--color-primary-400);
4836
+ }
4837
+ }
4747
4838
  }
4748
4839
 
4749
4840
  /* Shadow utilities */