@jsekulowicz/ds-components 0.13.3 → 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.
Files changed (41) hide show
  1. package/custom-elements.json +435 -0
  2. package/dist/atoms/button/button.d.ts +4 -0
  3. package/dist/atoms/button/button.d.ts.map +1 -1
  4. package/dist/atoms/button/button.js +15 -0
  5. package/dist/atoms/button/button.js.map +1 -1
  6. package/dist/atoms/radio/radio.d.ts +2 -0
  7. package/dist/atoms/radio/radio.d.ts.map +1 -1
  8. package/dist/atoms/radio/radio.js +11 -0
  9. package/dist/atoms/radio/radio.js.map +1 -1
  10. package/dist/atoms/radio-group/radio-group.d.ts.map +1 -1
  11. package/dist/atoms/radio-group/radio-group.js +48 -4
  12. package/dist/atoms/radio-group/radio-group.js.map +1 -1
  13. package/dist/atoms/segmented-control/define.d.ts +7 -0
  14. package/dist/atoms/segmented-control/define.d.ts.map +1 -0
  15. package/dist/atoms/segmented-control/define.js +5 -0
  16. package/dist/atoms/segmented-control/define.js.map +1 -0
  17. package/dist/atoms/segmented-control/index.d.ts +2 -0
  18. package/dist/atoms/segmented-control/index.d.ts.map +1 -0
  19. package/dist/atoms/segmented-control/index.js +2 -0
  20. package/dist/atoms/segmented-control/index.js.map +1 -0
  21. package/dist/atoms/segmented-control/segmented-control.d.ts +32 -0
  22. package/dist/atoms/segmented-control/segmented-control.d.ts.map +1 -0
  23. package/dist/atoms/segmented-control/segmented-control.js +137 -0
  24. package/dist/atoms/segmented-control/segmented-control.js.map +1 -0
  25. package/dist/atoms/segmented-control/segmented-control.styles.d.ts +2 -0
  26. package/dist/atoms/segmented-control/segmented-control.styles.d.ts.map +1 -0
  27. package/dist/atoms/segmented-control/segmented-control.styles.js +60 -0
  28. package/dist/atoms/segmented-control/segmented-control.styles.js.map +1 -0
  29. package/dist/define.d.ts +1 -0
  30. package/dist/define.d.ts.map +1 -1
  31. package/dist/define.js +1 -0
  32. package/dist/define.js.map +1 -1
  33. package/dist/index.d.ts +1 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +1 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/shared/roving-focus.d.ts +19 -0
  38. package/dist/shared/roving-focus.d.ts.map +1 -0
  39. package/dist/shared/roving-focus.js +44 -0
  40. package/dist/shared/roving-focus.js.map +1 -0
  41. package/package.json +9 -2
@@ -253,6 +253,22 @@
253
253
  "module": "./atoms/radio-group/index.js"
254
254
  }
255
255
  },
256
+ {
257
+ "kind": "js",
258
+ "name": "DsSegmentedControl",
259
+ "declaration": {
260
+ "name": "DsSegmentedControl",
261
+ "module": "./atoms/segmented-control/index.js"
262
+ }
263
+ },
264
+ {
265
+ "kind": "js",
266
+ "name": "SegmentedControlOption",
267
+ "declaration": {
268
+ "name": "SegmentedControlOption",
269
+ "module": "./atoms/segmented-control/index.js"
270
+ }
271
+ },
256
272
  {
257
273
  "kind": "js",
258
274
  "name": "DsSelect",
@@ -845,6 +861,40 @@
845
861
  }
846
862
  ]
847
863
  },
864
+ {
865
+ "kind": "javascript-module",
866
+ "path": "src/shared/roving-focus.ts",
867
+ "declarations": [
868
+ {
869
+ "kind": "function",
870
+ "name": "resolveRovingTarget",
871
+ "return": {
872
+ "type": {
873
+ "text": "number | null"
874
+ }
875
+ },
876
+ "parameters": [
877
+ {
878
+ "name": "{\n key,\n currentIndex,\n count,\n orientation = 'both',\n isDisabled = () => false,\n}",
879
+ "type": {
880
+ "text": "RovingTargetOptions"
881
+ }
882
+ }
883
+ ],
884
+ "description": "Resolve the index a roving-tabindex widget (radiogroup, segmented control,\ntablist…) should move to for a given key. Wraps around the ends and skips\ndisabled entries. Returns `null` when the key isn't a navigation key or no\nenabled target exists, so callers can leave the event untouched."
885
+ }
886
+ ],
887
+ "exports": [
888
+ {
889
+ "kind": "js",
890
+ "name": "resolveRovingTarget",
891
+ "declaration": {
892
+ "name": "resolveRovingTarget",
893
+ "module": "src/shared/roving-focus.ts"
894
+ }
895
+ }
896
+ ]
897
+ },
848
898
  {
849
899
  "kind": "javascript-module",
850
900
  "path": "src/shared/scroll-fade-controller.ts",
@@ -1878,6 +1928,47 @@
1878
1928
  },
1879
1929
  "attribute": "aria-invalid"
1880
1930
  },
1931
+ {
1932
+ "kind": "field",
1933
+ "name": "roleAttr",
1934
+ "type": {
1935
+ "text": "string | undefined"
1936
+ },
1937
+ "attribute": "role"
1938
+ },
1939
+ {
1940
+ "kind": "field",
1941
+ "name": "ariaCheckedAttr",
1942
+ "type": {
1943
+ "text": "string | undefined"
1944
+ },
1945
+ "attribute": "aria-checked"
1946
+ },
1947
+ {
1948
+ "kind": "field",
1949
+ "name": "tabIndexAttr",
1950
+ "type": {
1951
+ "text": "number | undefined"
1952
+ }
1953
+ },
1954
+ {
1955
+ "kind": "method",
1956
+ "name": "focus",
1957
+ "return": {
1958
+ "type": {
1959
+ "text": "void"
1960
+ }
1961
+ },
1962
+ "parameters": [
1963
+ {
1964
+ "name": "options",
1965
+ "optional": true,
1966
+ "type": {
1967
+ "text": "FocusOptions"
1968
+ }
1969
+ }
1970
+ ]
1971
+ },
1881
1972
  {
1882
1973
  "kind": "field",
1883
1974
  "name": "#handleClick",
@@ -2002,6 +2093,20 @@
2002
2093
  "text": "string | undefined"
2003
2094
  },
2004
2095
  "fieldName": "ariaInvalidAttr"
2096
+ },
2097
+ {
2098
+ "name": "role",
2099
+ "type": {
2100
+ "text": "string | undefined"
2101
+ },
2102
+ "fieldName": "roleAttr"
2103
+ },
2104
+ {
2105
+ "name": "aria-checked",
2106
+ "type": {
2107
+ "text": "string | undefined"
2108
+ },
2109
+ "fieldName": "ariaCheckedAttr"
2005
2110
  }
2006
2111
  ],
2007
2112
  "superclass": {
@@ -4552,6 +4657,33 @@
4552
4657
  "default": "''",
4553
4658
  "attribute": "radioValue"
4554
4659
  },
4660
+ {
4661
+ "kind": "field",
4662
+ "name": "tabStop",
4663
+ "type": {
4664
+ "text": "boolean"
4665
+ },
4666
+ "default": "true",
4667
+ "attribute": "tab-stop"
4668
+ },
4669
+ {
4670
+ "kind": "method",
4671
+ "name": "focus",
4672
+ "return": {
4673
+ "type": {
4674
+ "text": "void"
4675
+ }
4676
+ },
4677
+ "parameters": [
4678
+ {
4679
+ "name": "options",
4680
+ "optional": true,
4681
+ "type": {
4682
+ "text": "FocusOptions"
4683
+ }
4684
+ }
4685
+ ]
4686
+ },
4555
4687
  {
4556
4688
  "kind": "method",
4557
4689
  "name": "#escapeName",
@@ -4618,6 +4750,14 @@
4618
4750
  },
4619
4751
  "default": "''",
4620
4752
  "fieldName": "radioValue"
4753
+ },
4754
+ {
4755
+ "name": "tab-stop",
4756
+ "type": {
4757
+ "text": "boolean"
4758
+ },
4759
+ "default": "true",
4760
+ "fieldName": "tabStop"
4621
4761
  }
4622
4762
  ],
4623
4763
  "mixins": [
@@ -4800,11 +4940,39 @@
4800
4940
  "name": "#onSlotChange",
4801
4941
  "privacy": "private"
4802
4942
  },
4943
+ {
4944
+ "kind": "method",
4945
+ "name": "#radioValueOf",
4946
+ "privacy": "private",
4947
+ "return": {
4948
+ "type": {
4949
+ "text": "string"
4950
+ }
4951
+ },
4952
+ "parameters": [
4953
+ {
4954
+ "name": "radio",
4955
+ "type": {
4956
+ "text": "RadioEl"
4957
+ }
4958
+ }
4959
+ ]
4960
+ },
4961
+ {
4962
+ "kind": "field",
4963
+ "name": "#isRadioDisabledAt",
4964
+ "privacy": "private"
4965
+ },
4803
4966
  {
4804
4967
  "kind": "field",
4805
4968
  "name": "#wireRadios",
4806
4969
  "privacy": "private"
4807
4970
  },
4971
+ {
4972
+ "kind": "field",
4973
+ "name": "#onKeydown",
4974
+ "privacy": "private"
4975
+ },
4808
4976
  {
4809
4977
  "kind": "field",
4810
4978
  "name": "#onRadioChange",
@@ -5407,6 +5575,273 @@
5407
5575
  }
5408
5576
  ]
5409
5577
  },
5578
+ {
5579
+ "kind": "javascript-module",
5580
+ "path": "src/atoms/segmented-control/define.ts",
5581
+ "declarations": [],
5582
+ "exports": [
5583
+ {
5584
+ "kind": "custom-element-definition",
5585
+ "name": "ds-segmented-control",
5586
+ "declaration": {
5587
+ "name": "DsSegmentedControl",
5588
+ "module": "/src/atoms/segmented-control/segmented-control.js"
5589
+ }
5590
+ }
5591
+ ]
5592
+ },
5593
+ {
5594
+ "kind": "javascript-module",
5595
+ "path": "src/atoms/segmented-control/index.ts",
5596
+ "declarations": [],
5597
+ "exports": [
5598
+ {
5599
+ "kind": "js",
5600
+ "name": "DsSegmentedControl",
5601
+ "declaration": {
5602
+ "name": "DsSegmentedControl",
5603
+ "module": "./segmented-control.js"
5604
+ }
5605
+ },
5606
+ {
5607
+ "kind": "js",
5608
+ "name": "SegmentedControlOption",
5609
+ "declaration": {
5610
+ "name": "SegmentedControlOption",
5611
+ "module": "./segmented-control.js"
5612
+ }
5613
+ }
5614
+ ]
5615
+ },
5616
+ {
5617
+ "kind": "javascript-module",
5618
+ "path": "src/atoms/segmented-control/segmented-control.styles.ts",
5619
+ "declarations": [
5620
+ {
5621
+ "kind": "variable",
5622
+ "name": "segmentedControlStyles",
5623
+ "default": "css` :host { display: inline-flex; flex-direction: column; gap: var(--ds-space-1); max-width: 100%; } :host([disabled]) { cursor: not-allowed; opacity: 0.6; } .group { /* Equal columns that all size to the widest segment: with a shrink-to-fit track, equal 1fr columns each resolve to the widest cell's content, so no segment ends up narrower than its label needs. When the host is given an explicit width they simply share it evenly. */ display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; /* The track colour shows through the 1px padding and gaps as a hairline frame and dividers between the otherwise borderless segments. */ gap: 1px; padding: 1px; background: var(--ds-color-border-subtle); border-radius: var(--ds-radius-sm); max-width: 100%; } .segment { min-width: 0; } /* Give unselected segments a surface that's distinct from the track so each option reads as its own tile; the selected one keeps the accent fill from the primary button variant. Drop the button min-width floor so the grid drives sizing. */ .segment::part(button) { min-width: 0; border-radius: calc(var(--ds-radius-sm) - 1px); } .segment[variant='ghost']::part(button) { background: var(--ds-color-bg); } .segment[variant='ghost']::part(button):hover { background: var(--ds-color-bg-subtle); } /* Square off the inner edges so the row reads as one connected control, rounding only the outer corners of the first and last segments. */ .segment:first-child:not(:last-child)::part(button) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .segment:last-child:not(:first-child)::part(button) { border-top-left-radius: 0; border-bottom-left-radius: 0; } .segment:not(:first-child):not(:last-child)::part(button) { border-radius: 0; } `"
5624
+ }
5625
+ ],
5626
+ "exports": [
5627
+ {
5628
+ "kind": "js",
5629
+ "name": "segmentedControlStyles",
5630
+ "declaration": {
5631
+ "name": "segmentedControlStyles",
5632
+ "module": "src/atoms/segmented-control/segmented-control.styles.ts"
5633
+ }
5634
+ }
5635
+ ]
5636
+ },
5637
+ {
5638
+ "kind": "javascript-module",
5639
+ "path": "src/atoms/segmented-control/segmented-control.ts",
5640
+ "declarations": [
5641
+ {
5642
+ "kind": "class",
5643
+ "description": "",
5644
+ "name": "DsSegmentedControl",
5645
+ "cssParts": [
5646
+ {
5647
+ "description": "The container that holds the segments.",
5648
+ "name": "group"
5649
+ },
5650
+ {
5651
+ "description": "Each option button.",
5652
+ "name": "segment"
5653
+ }
5654
+ ],
5655
+ "members": [
5656
+ {
5657
+ "kind": "field",
5658
+ "name": "label",
5659
+ "type": {
5660
+ "text": "string"
5661
+ },
5662
+ "default": "''",
5663
+ "attribute": "label"
5664
+ },
5665
+ {
5666
+ "kind": "field",
5667
+ "name": "description",
5668
+ "type": {
5669
+ "text": "string"
5670
+ },
5671
+ "default": "''",
5672
+ "attribute": "description"
5673
+ },
5674
+ {
5675
+ "kind": "field",
5676
+ "name": "value",
5677
+ "type": {
5678
+ "text": "string"
5679
+ },
5680
+ "default": "''",
5681
+ "attribute": "value"
5682
+ },
5683
+ {
5684
+ "kind": "field",
5685
+ "name": "options",
5686
+ "type": {
5687
+ "text": "SegmentedControlOption[]"
5688
+ },
5689
+ "default": "[]",
5690
+ "attribute": "options"
5691
+ },
5692
+ {
5693
+ "kind": "field",
5694
+ "name": "disabled",
5695
+ "type": {
5696
+ "text": "boolean"
5697
+ },
5698
+ "default": "false",
5699
+ "attribute": "disabled",
5700
+ "reflects": true
5701
+ },
5702
+ {
5703
+ "kind": "field",
5704
+ "name": "#tabStopIndex",
5705
+ "privacy": "private",
5706
+ "type": {
5707
+ "text": "number"
5708
+ },
5709
+ "readonly": true
5710
+ },
5711
+ {
5712
+ "kind": "method",
5713
+ "name": "#select",
5714
+ "privacy": "private",
5715
+ "return": {
5716
+ "type": {
5717
+ "text": "void"
5718
+ }
5719
+ },
5720
+ "parameters": [
5721
+ {
5722
+ "name": "option",
5723
+ "type": {
5724
+ "text": "SegmentedControlOption"
5725
+ }
5726
+ }
5727
+ ]
5728
+ },
5729
+ {
5730
+ "kind": "method",
5731
+ "name": "#focusSegment",
5732
+ "privacy": "private",
5733
+ "return": {
5734
+ "type": {
5735
+ "text": "void"
5736
+ }
5737
+ },
5738
+ "parameters": [
5739
+ {
5740
+ "name": "index",
5741
+ "type": {
5742
+ "text": "number"
5743
+ }
5744
+ }
5745
+ ]
5746
+ },
5747
+ {
5748
+ "kind": "field",
5749
+ "name": "#onKeydown",
5750
+ "privacy": "private"
5751
+ },
5752
+ {
5753
+ "kind": "method",
5754
+ "name": "#renderSegment",
5755
+ "privacy": "private",
5756
+ "return": {
5757
+ "type": {
5758
+ "text": "TemplateResult"
5759
+ }
5760
+ },
5761
+ "parameters": [
5762
+ {
5763
+ "name": "option",
5764
+ "type": {
5765
+ "text": "SegmentedControlOption"
5766
+ }
5767
+ },
5768
+ {
5769
+ "name": "index",
5770
+ "type": {
5771
+ "text": "number"
5772
+ }
5773
+ }
5774
+ ]
5775
+ }
5776
+ ],
5777
+ "events": [
5778
+ {
5779
+ "description": "Fires when the selection changes. Detail: `{ value: string }`.",
5780
+ "name": "ds-change"
5781
+ }
5782
+ ],
5783
+ "attributes": [
5784
+ {
5785
+ "name": "label",
5786
+ "type": {
5787
+ "text": "string"
5788
+ },
5789
+ "default": "''",
5790
+ "fieldName": "label"
5791
+ },
5792
+ {
5793
+ "name": "description",
5794
+ "type": {
5795
+ "text": "string"
5796
+ },
5797
+ "default": "''",
5798
+ "fieldName": "description"
5799
+ },
5800
+ {
5801
+ "name": "value",
5802
+ "type": {
5803
+ "text": "string"
5804
+ },
5805
+ "default": "''",
5806
+ "fieldName": "value"
5807
+ },
5808
+ {
5809
+ "name": "options",
5810
+ "type": {
5811
+ "text": "SegmentedControlOption[]"
5812
+ },
5813
+ "default": "[]",
5814
+ "fieldName": "options"
5815
+ },
5816
+ {
5817
+ "name": "disabled",
5818
+ "type": {
5819
+ "text": "boolean"
5820
+ },
5821
+ "default": "false",
5822
+ "fieldName": "disabled"
5823
+ }
5824
+ ],
5825
+ "superclass": {
5826
+ "name": "DsElement",
5827
+ "package": "@jsekulowicz/ds-core"
5828
+ },
5829
+ "tagName": "ds-segmented-control",
5830
+ "customElement": true,
5831
+ "summary": "Single-select segmented control — a connected row of mutually\nexclusive options, each with an optional leading icon. A token-styled,\ninline alternative to a dropdown when there are only a few choices."
5832
+ }
5833
+ ],
5834
+ "exports": [
5835
+ {
5836
+ "kind": "js",
5837
+ "name": "DsSegmentedControl",
5838
+ "declaration": {
5839
+ "name": "DsSegmentedControl",
5840
+ "module": "src/atoms/segmented-control/segmented-control.ts"
5841
+ }
5842
+ }
5843
+ ]
5844
+ },
5410
5845
  {
5411
5846
  "kind": "javascript-module",
5412
5847
  "path": "src/atoms/select/define.ts",
@@ -28,6 +28,10 @@ export declare class DsButton extends DsElement {
28
28
  ariaExpandedAttr?: string;
29
29
  ariaHasPopupAttr?: string;
30
30
  ariaInvalidAttr?: string;
31
+ roleAttr?: string;
32
+ ariaCheckedAttr?: string;
33
+ tabIndexAttr?: number;
34
+ focus(options?: FocusOptions): void;
31
35
  render(): TemplateResult;
32
36
  }
33
37
  //# sourceMappingURL=button.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/atoms/button/button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;AACzE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEvD;;;;;;;;;GASG;AACH,qBAAa,QAAS,SAAQ,SAAS;;IACrC,OAAgB,MAAM,4BAAuC;IAEhC,OAAO,EAAE,aAAa,CAAa;IACnC,IAAI,EAAE,UAAU,CAAQ;IACxB,IAAI,EAAE,UAAU,CAAY;IACb,QAAQ,UAAS;IACjB,OAAO,UAAS;IACS,SAAS,UAAS;IAC3C,MAAM,UAAS;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACe,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IA+BzD,MAAM,IAAI,cAAc;CAkClC"}
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/atoms/button/button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;AACzE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEvD;;;;;;;;;GASG;AACH,qBAAa,QAAS,SAAQ,SAAS;;IACrC,OAAgB,MAAM,4BAAuC;IAEhC,OAAO,EAAE,aAAa,CAAa;IACnC,IAAI,EAAE,UAAU,CAAQ;IACxB,IAAI,EAAE,UAAU,CAAY;IACb,QAAQ,UAAS;IACjB,OAAO,UAAS;IACS,SAAS,UAAS;IAC3C,MAAM,UAAS;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACe,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IAKjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IACV,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE7C,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAiCnC,MAAM,IAAI,cAAc;CAqClC"}
@@ -41,6 +41,9 @@ export class DsButton extends DsElement {
41
41
  };
42
42
  }
43
43
  static { this.styles = [...DsElement.styles, buttonStyles]; }
44
+ focus(options) {
45
+ this.renderRoot.querySelector('button')?.focus(options);
46
+ }
44
47
  #handleClick;
45
48
  #submitHostForm() {
46
49
  const form = this.closest('form') ?? this.#findShadowForm();
@@ -64,8 +67,11 @@ export class DsButton extends DsElement {
64
67
  part="button"
65
68
  class="btn ds-focus-ring"
66
69
  type=${this.type}
70
+ role=${this.roleAttr ?? nothing}
71
+ tabindex=${this.tabIndexAttr ?? nothing}
67
72
  aria-disabled=${this.disabled || this.loading ? 'true' : 'false'}
68
73
  aria-busy=${this.loading ? 'true' : 'false'}
74
+ aria-checked=${this.ariaCheckedAttr ?? nothing}
69
75
  aria-controls=${this.ariaControlsAttr ?? nothing}
70
76
  aria-expanded=${this.ariaExpandedAttr ?? nothing}
71
77
  aria-haspopup=${this.ariaHasPopupAttr ?? nothing}
@@ -129,4 +135,13 @@ __decorate([
129
135
  __decorate([
130
136
  property({ attribute: 'aria-invalid' })
131
137
  ], DsButton.prototype, "ariaInvalidAttr", void 0);
138
+ __decorate([
139
+ property({ attribute: 'role' })
140
+ ], DsButton.prototype, "roleAttr", void 0);
141
+ __decorate([
142
+ property({ attribute: 'aria-checked' })
143
+ ], DsButton.prototype, "ariaCheckedAttr", void 0);
144
+ __decorate([
145
+ property({ attribute: false })
146
+ ], DsButton.prototype, "tabIndexAttr", void 0);
132
147
  //# sourceMappingURL=button.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","sourceRoot":"","sources":["../../../src/atoms/button/button.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"button.js","sourceRoot":"","sources":["../../../src/atoms/button/button.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,8 @@ export declare class DsRadio extends DsRadio_base {
12
12
  static styles: import("lit").CSSResult[];
13
13
  checked: boolean;
14
14
  radioValue: string;
15
+ tabStop: boolean;
16
+ focus(options?: FocusOptions): void;
15
17
  willUpdate(changed: PropertyValues): void;
16
18
  render(): TemplateResult;
17
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"radio.d.ts","sourceRoot":"","sources":["../../../src/atoms/radio/radio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAErE,OAAO,EAAE,SAAS,EAAoB,MAAM,sBAAsB,CAAC;;AAGnE;;;;;GAKG;AACH,qBAAa,OAAQ,SAAQ,YAA2B;;IACtD,OAAgB,MAAM,4BAAsC;IAEhB,OAAO,UAAS;IAChD,UAAU,SAAM;IAEnB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAiDzC,MAAM,IAAI,cAAc;CAclC"}
1
+ {"version":3,"file":"radio.d.ts","sourceRoot":"","sources":["../../../src/atoms/radio/radio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAErE,OAAO,EAAE,SAAS,EAAoB,MAAM,sBAAsB,CAAC;;AAGnE;;;;;GAKG;AACH,qBAAa,OAAQ,SAAQ,YAA2B;;IACtD,OAAgB,MAAM,4BAAsC;IAEhB,OAAO,UAAS;IAChD,UAAU,SAAM;IAIwB,OAAO,UAAQ;IAE1D,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAInC,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAiDzC,MAAM,IAAI,cAAc;CAelC"}
@@ -19,6 +19,10 @@ export class DsRadio extends FormControlMixin(DsElement) {
19
19
  super(...arguments);
20
20
  this.checked = false;
21
21
  this.radioValue = '';
22
+ // Roving tabindex within a ds-radio-group: only the active radio stays in the
23
+ // page tab order, the rest are reachable with arrow keys. Defaults to a
24
+ // normal tab stop so a standalone radio still works on its own.
25
+ this.tabStop = true;
22
26
  this.#onInputClick = (event) => {
23
27
  if (this.disabled) {
24
28
  event.preventDefault();
@@ -40,6 +44,9 @@ export class DsRadio extends FormControlMixin(DsElement) {
40
44
  };
41
45
  }
42
46
  static { this.styles = [...DsElement.styles, radioStyles]; }
47
+ focus(options) {
48
+ this.renderRoot.querySelector('input')?.focus(options);
49
+ }
43
50
  willUpdate(changed) {
44
51
  if (changed.has('checked')) {
45
52
  this.value = this.checked ? this.radioValue || 'on' : null;
@@ -74,6 +81,7 @@ export class DsRadio extends FormControlMixin(DsElement) {
74
81
  name=${this.name || ''}
75
82
  .checked=${this.checked}
76
83
  value=${this.radioValue}
84
+ tabindex=${this.tabStop ? '0' : '-1'}
77
85
  ?required=${this.required}
78
86
  @click=${this.#onInputClick}
79
87
  />
@@ -88,4 +96,7 @@ __decorate([
88
96
  __decorate([
89
97
  property()
90
98
  ], DsRadio.prototype, "radioValue", void 0);
99
+ __decorate([
100
+ property({ type: Boolean, attribute: 'tab-stop' })
101
+ ], DsRadio.prototype, "tabStop", void 0);
91
102
  //# sourceMappingURL=radio.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"radio.js","sourceRoot":"","sources":["../../../src/atoms/radio/radio.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"radio.js","sourceRoot":"","sources":["../../../src/atoms/radio/radio.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"radio-group.d.ts","sourceRoot":"","sources":["../../../src/atoms/radio-group/radio-group.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAMjD;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,SAAS;;IACzC,OAAgB,MAAM,4BAA4D;IAEtE,KAAK,SAAM;IACX,IAAI,SAAM;IACV,WAAW,SAAM;IACjB,KAAK,SAAM;IACX,KAAK,SAAM;IACqB,QAAQ,UAAS;IACjB,QAAQ,UAAS;IACjB,OAAO,UAAS;IAEX,OAAO,CAAC,OAAO,CAAa;IAEpE,iBAAiB,IAAI,IAAI;IAQzB,oBAAoB,IAAI,IAAI;IAK5B,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA2C5C,MAAM,IAAI,cAAc;CAclC"}
1
+ {"version":3,"file":"radio-group.d.ts","sourceRoot":"","sources":["../../../src/atoms/radio-group/radio-group.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAYjD;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,SAAS;;IACzC,OAAgB,MAAM,4BAA4D;IAEtE,KAAK,SAAM;IACX,IAAI,SAAM;IACV,WAAW,SAAM;IACjB,KAAK,SAAM;IACX,KAAK,SAAM;IACqB,QAAQ,UAAS;IACjB,QAAQ,UAAS;IACjB,OAAO,UAAS;IAEX,OAAO,CAAC,OAAO,CAAa;IAEpE,iBAAiB,IAAI,IAAI;IAQzB,oBAAoB,IAAI,IAAI;IAK5B,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAyF5C,MAAM,IAAI,cAAc;CAclC"}
@@ -8,6 +8,7 @@ import { html, nothing } from 'lit';
8
8
  import { property, queryAssignedElements } from 'lit/decorators.js';
9
9
  import { DsElement } from '@jsekulowicz/ds-core';
10
10
  import { formFieldStyles, renderSubtext } from '../../shared/form-field.js';
11
+ import { resolveRovingTarget } from '../../shared/roving-focus.js';
11
12
  import { radioGroupStyles } from './radio-group.styles.js';
12
13
  /**
13
14
  * @tag ds-radio-group
@@ -29,8 +30,18 @@ export class DsRadioGroup extends DsElement {
29
30
  this.#onSlotChange = () => {
30
31
  this.#wireRadios(this.value !== '');
31
32
  };
33
+ this.#isRadioDisabledAt = (index) => {
34
+ const radio = this._radios[index];
35
+ return radio ? radio.hasAttribute('disabled') : true;
36
+ };
32
37
  this.#wireRadios = (syncChecked) => {
33
- this._radios.forEach(radio => {
38
+ const radios = this._radios;
39
+ const selectedIndex = radios.findIndex(radio => this.#radioValueOf(radio) === this.value);
40
+ const firstEnabled = radios.findIndex(radio => !radio.hasAttribute('disabled'));
41
+ // Exactly one radio stays in the tab order: the selected one, or the first
42
+ // enabled radio when nothing is selected yet (roving tabindex).
43
+ const tabStopIndex = selectedIndex >= 0 ? selectedIndex : firstEnabled;
44
+ radios.forEach((radio, index) => {
34
45
  if (this.name)
35
46
  radio.setAttribute('name', this.name);
36
47
  if (this.required) {
@@ -45,9 +56,9 @@ export class DsRadioGroup extends DsElement {
45
56
  else {
46
57
  radio.removeAttribute('disabled');
47
58
  }
59
+ radio.tabStop = index === tabStopIndex;
48
60
  if (syncChecked) {
49
- const rv = radio.radioValue ?? radio.getAttribute('radiovalue') ?? '';
50
- if (rv === this.value) {
61
+ if (this.#radioValueOf(radio) === this.value) {
51
62
  radio.setAttribute('checked', '');
52
63
  }
53
64
  else {
@@ -56,6 +67,34 @@ export class DsRadioGroup extends DsElement {
56
67
  }
57
68
  });
58
69
  };
70
+ this.#onKeydown = (event) => {
71
+ if (this.disabled) {
72
+ return;
73
+ }
74
+ const radios = this._radios;
75
+ const target = resolveRovingTarget({
76
+ key: event.key,
77
+ currentIndex: radios.findIndex(radio => this.#radioValueOf(radio) === this.value),
78
+ count: radios.length,
79
+ isDisabled: this.#isRadioDisabledAt,
80
+ });
81
+ if (target === null) {
82
+ return;
83
+ }
84
+ const radio = radios[target];
85
+ if (!radio) {
86
+ return;
87
+ }
88
+ event.preventDefault();
89
+ // Selection follows focus, as the radiogroup pattern prescribes.
90
+ const value = this.#radioValueOf(radio);
91
+ if (value !== this.value) {
92
+ this.value = value;
93
+ this.invalid = false;
94
+ this.dispatchEvent(new CustomEvent('ds-change', { bubbles: true, composed: true, detail: { value } }));
95
+ }
96
+ void this.updateComplete.then(() => radio.focus());
97
+ };
59
98
  this.#onRadioChange = (event) => {
60
99
  if (event.target === this) {
61
100
  return;
@@ -83,11 +122,16 @@ export class DsRadioGroup extends DsElement {
83
122
  this.#wireRadios(changed.has('value'));
84
123
  }
85
124
  #onSlotChange;
125
+ #radioValueOf(radio) {
126
+ return radio.radioValue ?? radio.getAttribute('radiovalue') ?? '';
127
+ }
128
+ #isRadioDisabledAt;
86
129
  #wireRadios;
130
+ #onKeydown;
87
131
  #onRadioChange;
88
132
  render() {
89
133
  return html `
90
- <fieldset class="fieldset" part="fieldset">
134
+ <fieldset class="fieldset" part="fieldset" @keydown=${this.#onKeydown}>
91
135
  <legend class="label" part="legend">
92
136
  ${this.label}
93
137
  ${this.required ? html `<span class="required" aria-hidden="true"> *</span>` : nothing}
@@ -1 +1 @@
1
- {"version":3,"file":"radio-group.js","sourceRoot":"","sources":["../../../src/atoms/radio-group/radio-group.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"radio-group.js","sourceRoot":"","sources":["../../../src/atoms/radio-group/radio-group.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { DsSegmentedControl } from './segmented-control.js';
2
+ declare global {
3
+ interface HTMLElementTagNameMap {
4
+ 'ds-segmented-control': DsSegmentedControl;
5
+ }
6
+ }
7
+ //# sourceMappingURL=define.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../../src/atoms/segmented-control/define.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAM5D,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,sBAAsB,EAAE,kBAAkB,CAAC;KAC5C;CACF"}
@@ -0,0 +1,5 @@
1
+ import { DsSegmentedControl } from './segmented-control.js';
2
+ if (!customElements.get('ds-segmented-control')) {
3
+ customElements.define('ds-segmented-control', DsSegmentedControl);
4
+ }
5
+ //# sourceMappingURL=define.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../../../src/atoms/segmented-control/define.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC;IAChD,cAAc,CAAC,MAAM,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { DsSegmentedControl, type SegmentedControlOption } from './segmented-control.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atoms/segmented-control/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { DsSegmentedControl } from './segmented-control.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/atoms/segmented-control/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAA+B,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { type TemplateResult } from 'lit';
2
+ import { DsElement } from '@jsekulowicz/ds-core';
3
+ import '../button/define.js';
4
+ import '../icon/define.js';
5
+ export interface SegmentedControlOption {
6
+ value: string;
7
+ label: string;
8
+ /** Optional leading icon glyph name (the glyph must be imported by the host). */
9
+ icon?: string;
10
+ disabled?: boolean;
11
+ }
12
+ /**
13
+ * @tag ds-segmented-control
14
+ * @summary Single-select segmented control — a connected row of mutually
15
+ * exclusive options, each with an optional leading icon. A token-styled,
16
+ * inline alternative to a dropdown when there are only a few choices.
17
+ * @event ds-change - Fires when the selection changes. Detail: `{ value: string }`.
18
+ * @csspart group - The container that holds the segments.
19
+ * @csspart segment - Each option button.
20
+ */
21
+ export declare class DsSegmentedControl extends DsElement {
22
+ #private;
23
+ static styles: import("lit").CSSResult[];
24
+ label: string;
25
+ description: string;
26
+ value: string;
27
+ options: SegmentedControlOption[];
28
+ disabled: boolean;
29
+ connectedCallback(): void;
30
+ render(): TemplateResult;
31
+ }
32
+ //# sourceMappingURL=segmented-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmented-control.d.ts","sourceRoot":"","sources":["../../../src/atoms/segmented-control/segmented-control.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIjD,OAAO,qBAAqB,CAAC;AAC7B,OAAO,mBAAmB,CAAC;AAE3B,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;;IAC/C,OAAgB,MAAM,4BAAkE;IAE5E,KAAK,SAAM;IACX,WAAW,SAAM;IACjB,KAAK,SAAM;IACI,OAAO,EAAE,sBAAsB,EAAE,CAAM;IACtB,QAAQ,UAAS;IAEpD,iBAAiB,IAAI,IAAI;IA8EzB,MAAM,IAAI,cAAc;CAgBlC"}
@@ -0,0 +1,137 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { html, nothing } from 'lit';
8
+ import { property } from 'lit/decorators.js';
9
+ import { DsElement } from '@jsekulowicz/ds-core';
10
+ import { formFieldStyles, renderFieldLabel, renderSubtext } from '../../shared/form-field.js';
11
+ import { resolveRovingTarget } from '../../shared/roving-focus.js';
12
+ import { segmentedControlStyles } from './segmented-control.styles.js';
13
+ import '../button/define.js';
14
+ import '../icon/define.js';
15
+ /**
16
+ * @tag ds-segmented-control
17
+ * @summary Single-select segmented control — a connected row of mutually
18
+ * exclusive options, each with an optional leading icon. A token-styled,
19
+ * inline alternative to a dropdown when there are only a few choices.
20
+ * @event ds-change - Fires when the selection changes. Detail: `{ value: string }`.
21
+ * @csspart group - The container that holds the segments.
22
+ * @csspart segment - Each option button.
23
+ */
24
+ export class DsSegmentedControl extends DsElement {
25
+ constructor() {
26
+ super(...arguments);
27
+ this.label = '';
28
+ this.description = '';
29
+ this.value = '';
30
+ this.options = [];
31
+ this.disabled = false;
32
+ this.#onKeydown = (event) => {
33
+ if (this.disabled) {
34
+ return;
35
+ }
36
+ const target = resolveRovingTarget({
37
+ key: event.key,
38
+ currentIndex: this.#tabStopIndex,
39
+ count: this.options.length,
40
+ isDisabled: index => this.options[index]?.disabled === true,
41
+ });
42
+ if (target === null) {
43
+ return;
44
+ }
45
+ const option = this.options[target];
46
+ if (!option) {
47
+ return;
48
+ }
49
+ event.preventDefault();
50
+ // Selection follows focus, as the radiogroup pattern prescribes.
51
+ this.#select(option);
52
+ void this.updateComplete.then(() => this.#focusSegment(target));
53
+ };
54
+ }
55
+ static { this.styles = [...DsElement.styles, formFieldStyles, segmentedControlStyles]; }
56
+ connectedCallback() {
57
+ super.connectedCallback();
58
+ if (!this.label) {
59
+ console.warn('<ds-segmented-control>: the `label` property is required for accessibility.');
60
+ }
61
+ }
62
+ // The single tab stop: the selected option, or the first enabled one when
63
+ // nothing is selected yet. Arrow keys move focus (and selection) from here.
64
+ get #tabStopIndex() {
65
+ const selected = this.options.findIndex(option => option.value === this.value);
66
+ if (selected >= 0) {
67
+ return selected;
68
+ }
69
+ return this.options.findIndex(option => !option.disabled);
70
+ }
71
+ #select(option) {
72
+ if (this.disabled || option.disabled || option.value === this.value) {
73
+ return;
74
+ }
75
+ this.value = option.value;
76
+ this.emit('ds-change', { detail: { value: option.value } });
77
+ }
78
+ #focusSegment(index) {
79
+ const segments = this.renderRoot.querySelectorAll('.segment');
80
+ segments[index]?.focus();
81
+ }
82
+ #onKeydown;
83
+ #renderSegment(option, index) {
84
+ const selected = option.value === this.value;
85
+ return html `
86
+ <ds-button
87
+ class="segment"
88
+ part="segment"
89
+ size="sm"
90
+ variant=${selected ? 'primary' : 'ghost'}
91
+ full-width
92
+ .roleAttr=${'radio'}
93
+ .ariaCheckedAttr=${selected ? 'true' : 'false'}
94
+ .tabIndexAttr=${index === this.#tabStopIndex ? 0 : -1}
95
+ ?disabled=${this.disabled || option.disabled}
96
+ @ds-click=${() => this.#select(option)}
97
+ >
98
+ ${option.icon
99
+ ? html `<ds-icon slot="leading" name=${option.icon} size="sm"></ds-icon>`
100
+ : nothing}
101
+ ${option.label}
102
+ </ds-button>
103
+ `;
104
+ }
105
+ render() {
106
+ return html `
107
+ ${this.label ? renderFieldLabel(this.label, false, 'group') : nothing}
108
+ <div
109
+ class="group"
110
+ id="group"
111
+ role="radiogroup"
112
+ aria-label=${this.label}
113
+ part="group"
114
+ @keydown=${this.#onKeydown}
115
+ >
116
+ ${this.options.map((option, index) => this.#renderSegment(option, index))}
117
+ </div>
118
+ ${renderSubtext(this.description, '', false)}
119
+ `;
120
+ }
121
+ }
122
+ __decorate([
123
+ property()
124
+ ], DsSegmentedControl.prototype, "label", void 0);
125
+ __decorate([
126
+ property()
127
+ ], DsSegmentedControl.prototype, "description", void 0);
128
+ __decorate([
129
+ property()
130
+ ], DsSegmentedControl.prototype, "value", void 0);
131
+ __decorate([
132
+ property({ type: Array })
133
+ ], DsSegmentedControl.prototype, "options", void 0);
134
+ __decorate([
135
+ property({ type: Boolean, reflect: true })
136
+ ], DsSegmentedControl.prototype, "disabled", void 0);
137
+ //# sourceMappingURL=segmented-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmented-control.js","sourceRoot":"","sources":["../../../src/atoms/segmented-control/segmented-control.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const segmentedControlStyles: import("lit").CSSResult;
2
+ //# sourceMappingURL=segmented-control.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmented-control.styles.d.ts","sourceRoot":"","sources":["../../../src/atoms/segmented-control/segmented-control.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,yBAyDlC,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { css } from 'lit';
2
+ export const segmentedControlStyles = css `
3
+ :host {
4
+ display: inline-flex;
5
+ flex-direction: column;
6
+ gap: var(--ds-space-1);
7
+ max-width: 100%;
8
+ }
9
+ :host([disabled]) {
10
+ cursor: not-allowed;
11
+ opacity: 0.6;
12
+ }
13
+ .group {
14
+ /* Equal columns that all size to the widest segment: with a shrink-to-fit
15
+ track, equal 1fr columns each resolve to the widest cell's content, so
16
+ no segment ends up narrower than its label needs. When the host is given
17
+ an explicit width they simply share it evenly. */
18
+ display: grid;
19
+ grid-auto-flow: column;
20
+ grid-auto-columns: 1fr;
21
+ /* The track colour shows through the 1px padding and gaps as a hairline
22
+ frame and dividers between the otherwise borderless segments. */
23
+ gap: 1px;
24
+ padding: 1px;
25
+ background: var(--ds-color-border-subtle);
26
+ border-radius: var(--ds-radius-sm);
27
+ max-width: 100%;
28
+ }
29
+ .segment {
30
+ min-width: 0;
31
+ }
32
+ /* Give unselected segments a surface that's distinct from the track so each
33
+ option reads as its own tile; the selected one keeps the accent fill from
34
+ the primary button variant. Drop the button min-width floor so the grid
35
+ drives sizing. */
36
+ .segment::part(button) {
37
+ min-width: 0;
38
+ border-radius: calc(var(--ds-radius-sm) - 1px);
39
+ }
40
+ .segment[variant='ghost']::part(button) {
41
+ background: var(--ds-color-bg);
42
+ }
43
+ .segment[variant='ghost']::part(button):hover {
44
+ background: var(--ds-color-bg-subtle);
45
+ }
46
+ /* Square off the inner edges so the row reads as one connected control,
47
+ rounding only the outer corners of the first and last segments. */
48
+ .segment:first-child:not(:last-child)::part(button) {
49
+ border-top-right-radius: 0;
50
+ border-bottom-right-radius: 0;
51
+ }
52
+ .segment:last-child:not(:first-child)::part(button) {
53
+ border-top-left-radius: 0;
54
+ border-bottom-left-radius: 0;
55
+ }
56
+ .segment:not(:first-child):not(:last-child)::part(button) {
57
+ border-radius: 0;
58
+ }
59
+ `;
60
+ //# sourceMappingURL=segmented-control.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmented-control.styles.js","sourceRoot":"","sources":["../../../src/atoms/segmented-control/segmented-control.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDxC,CAAC"}
package/dist/define.d.ts CHANGED
@@ -12,6 +12,7 @@ import './atoms/checkbox/define.js';
12
12
  import './atoms/checkbox-group/define.js';
13
13
  import './atoms/radio/define.js';
14
14
  import './atoms/radio-group/define.js';
15
+ import './atoms/segmented-control/define.js';
15
16
  import './atoms/select/define.js';
16
17
  import './atoms/searchable-select/define.js';
17
18
  import './atoms/tabs/define.js';
@@ -1 +1 @@
1
- {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAC;AAClC,OAAO,2BAA2B,CAAC;AACnC,OAAO,yBAAyB,CAAC;AACjC,OAAO,4BAA4B,CAAC;AACpC,OAAO,gCAAgC,CAAC;AACxC,OAAO,2BAA2B,CAAC;AACnC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,yBAAyB,CAAC;AACjC,OAAO,+BAA+B,CAAC;AACvC,OAAO,0BAA0B,CAAC;AAClC,OAAO,qCAAqC,CAAC;AAC7C,OAAO,wBAAwB,CAAC;AAChC,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,wBAAwB,CAAC;AAChC,OAAO,4BAA4B,CAAC;AACpC,OAAO,8BAA8B,CAAC;AACtC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,oCAAoC,CAAC;AAC5C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,iCAAiC,CAAC;AACzC,OAAO,6BAA6B,CAAC;AACrC,OAAO,4BAA4B,CAAC;AACpC,OAAO,+BAA+B,CAAC;AACvC,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,iCAAiC,CAAC"}
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAC;AAClC,OAAO,2BAA2B,CAAC;AACnC,OAAO,yBAAyB,CAAC;AACjC,OAAO,4BAA4B,CAAC;AACpC,OAAO,gCAAgC,CAAC;AACxC,OAAO,2BAA2B,CAAC;AACnC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,yBAAyB,CAAC;AACjC,OAAO,+BAA+B,CAAC;AACvC,OAAO,qCAAqC,CAAC;AAC7C,OAAO,0BAA0B,CAAC;AAClC,OAAO,qCAAqC,CAAC;AAC7C,OAAO,wBAAwB,CAAC;AAChC,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,wBAAwB,CAAC;AAChC,OAAO,4BAA4B,CAAC;AACpC,OAAO,8BAA8B,CAAC;AACtC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,oCAAoC,CAAC;AAC5C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,iCAAiC,CAAC;AACzC,OAAO,6BAA6B,CAAC;AACrC,OAAO,4BAA4B,CAAC;AACpC,OAAO,+BAA+B,CAAC;AACvC,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,iCAAiC,CAAC"}
package/dist/define.js CHANGED
@@ -12,6 +12,7 @@ import './atoms/checkbox/define.js';
12
12
  import './atoms/checkbox-group/define.js';
13
13
  import './atoms/radio/define.js';
14
14
  import './atoms/radio-group/define.js';
15
+ import './atoms/segmented-control/define.js';
15
16
  import './atoms/select/define.js';
16
17
  import './atoms/searchable-select/define.js';
17
18
  import './atoms/tabs/define.js';
@@ -1 +1 @@
1
- {"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAC;AAClC,OAAO,2BAA2B,CAAC;AACnC,OAAO,yBAAyB,CAAC;AACjC,OAAO,4BAA4B,CAAC;AACpC,OAAO,gCAAgC,CAAC;AACxC,OAAO,2BAA2B,CAAC;AACnC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,yBAAyB,CAAC;AACjC,OAAO,+BAA+B,CAAC;AACvC,OAAO,0BAA0B,CAAC;AAClC,OAAO,qCAAqC,CAAC;AAC7C,OAAO,wBAAwB,CAAC;AAChC,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,wBAAwB,CAAC;AAChC,OAAO,4BAA4B,CAAC;AACpC,OAAO,8BAA8B,CAAC;AACtC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,oCAAoC,CAAC;AAC5C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,iCAAiC,CAAC;AACzC,OAAO,6BAA6B,CAAC;AACrC,OAAO,4BAA4B,CAAC;AACpC,OAAO,+BAA+B,CAAC;AACvC,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,iCAAiC,CAAC"}
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAC;AAClC,OAAO,2BAA2B,CAAC;AACnC,OAAO,yBAAyB,CAAC;AACjC,OAAO,4BAA4B,CAAC;AACpC,OAAO,gCAAgC,CAAC;AACxC,OAAO,2BAA2B,CAAC;AACnC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,yBAAyB,CAAC;AACjC,OAAO,+BAA+B,CAAC;AACvC,OAAO,qCAAqC,CAAC;AAC7C,OAAO,0BAA0B,CAAC;AAClC,OAAO,qCAAqC,CAAC;AAC7C,OAAO,wBAAwB,CAAC;AAChC,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,wBAAwB,CAAC;AAChC,OAAO,4BAA4B,CAAC;AACpC,OAAO,8BAA8B,CAAC;AACtC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,oCAAoC,CAAC;AAC5C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,iCAAiC,CAAC;AACzC,OAAO,6BAA6B,CAAC;AACrC,OAAO,4BAA4B,CAAC;AACpC,OAAO,+BAA+B,CAAC;AACvC,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,iCAAiC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ export { DsCheckbox } from './atoms/checkbox/index.js';
12
12
  export { DsCheckboxGroup } from './atoms/checkbox-group/index.js';
13
13
  export { DsRadio } from './atoms/radio/index.js';
14
14
  export { DsRadioGroup } from './atoms/radio-group/index.js';
15
+ export { DsSegmentedControl, type SegmentedControlOption, } from './atoms/segmented-control/index.js';
15
16
  export { DsSelect, type SelectOption } from './atoms/select/index.js';
16
17
  export { DsSearchableSelect } from './atoms/searchable-select/index.js';
17
18
  export { DsTabs, DsTab, DsTabPanel } from './atoms/tabs/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -12,6 +12,7 @@ export { DsCheckbox } from './atoms/checkbox/index.js';
12
12
  export { DsCheckboxGroup } from './atoms/checkbox-group/index.js';
13
13
  export { DsRadio } from './atoms/radio/index.js';
14
14
  export { DsRadioGroup } from './atoms/radio-group/index.js';
15
+ export { DsSegmentedControl, } from './atoms/segmented-control/index.js';
15
16
  export { DsSelect } from './atoms/select/index.js';
16
17
  export { DsSearchableSelect } from './atoms/searchable-select/index.js';
17
18
  export { DsTabs, DsTab, DsTabPanel } from './atoms/tabs/index.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,GAIT,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,SAAS,EAAyB,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAkB,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAwB,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAA2B,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,UAAU,EAAsC,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAiB,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,MAAM,EAAoB,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,WAAW,EAA0C,MAAM,6BAA6B,CAAC;AAClG,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAqB,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,OAAO,EACP,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,GAYrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,MAAM,EAA4C,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAmB,MAAM,6BAA6B,CAAC;AACxE,OAAO,EACL,OAAO,EACP,YAAY,EACZ,KAAK,GAMN,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,GAEzB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,YAAY,EAA4B,MAAM,kCAAkC,CAAC;AAC1F,OAAO,EACL,UAAU,GAKX,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,OAAO,EAAkB,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAwB,MAAM,gCAAgC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,GAIT,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,SAAS,EAAyB,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAkB,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAwB,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAA2B,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,UAAU,EAAsC,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAiB,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,MAAM,EAAoB,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,WAAW,EAA0C,MAAM,6BAA6B,CAAC;AAClG,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EACL,kBAAkB,GAEnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAqB,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,OAAO,EACP,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,GAYrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,MAAM,EAA4C,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAmB,MAAM,6BAA6B,CAAC;AACxE,OAAO,EACL,OAAO,EACP,YAAY,EACZ,KAAK,GAMN,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,GAEzB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,YAAY,EAA4B,MAAM,kCAAkC,CAAC;AAC1F,OAAO,EACL,UAAU,GAKX,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,OAAO,EAAkB,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAwB,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type RovingOrientation = 'horizontal' | 'vertical' | 'both';
2
+ export interface RovingTargetOptions {
3
+ key: string;
4
+ /** Index the navigation starts from; -1 when nothing is focused yet. */
5
+ currentIndex: number;
6
+ count: number;
7
+ /** Which arrow keys participate. Defaults to `both`. */
8
+ orientation?: RovingOrientation;
9
+ /** Skip indices that can't receive selection (e.g. disabled options). */
10
+ isDisabled?: (index: number) => boolean;
11
+ }
12
+ /**
13
+ * Resolve the index a roving-tabindex widget (radiogroup, segmented control,
14
+ * tablist…) should move to for a given key. Wraps around the ends and skips
15
+ * disabled entries. Returns `null` when the key isn't a navigation key or no
16
+ * enabled target exists, so callers can leave the event untouched.
17
+ */
18
+ export declare function resolveRovingTarget({ key, currentIndex, count, orientation, isDisabled, }: RovingTargetOptions): number | null;
19
+ //# sourceMappingURL=roving-focus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roving-focus.d.ts","sourceRoot":"","sources":["../../src/shared/roving-focus.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC;AAEnE,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,yEAAyE;IACzE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;CACzC;AAID;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,GAAG,EACH,YAAY,EACZ,KAAK,EACL,WAAoB,EACpB,UAAwB,GACzB,EAAE,mBAAmB,GAAG,MAAM,GAAG,IAAI,CAiCrC"}
@@ -0,0 +1,44 @@
1
+ const wrap = (value, count) => ((value % count) + count) % count;
2
+ /**
3
+ * Resolve the index a roving-tabindex widget (radiogroup, segmented control,
4
+ * tablist…) should move to for a given key. Wraps around the ends and skips
5
+ * disabled entries. Returns `null` when the key isn't a navigation key or no
6
+ * enabled target exists, so callers can leave the event untouched.
7
+ */
8
+ export function resolveRovingTarget({ key, currentIndex, count, orientation = 'both', isDisabled = () => false, }) {
9
+ if (count === 0) {
10
+ return null;
11
+ }
12
+ const horizontal = orientation === 'horizontal' || orientation === 'both';
13
+ const vertical = orientation === 'vertical' || orientation === 'both';
14
+ const forward = (horizontal && key === 'ArrowRight') || (vertical && key === 'ArrowDown');
15
+ const backward = (horizontal && key === 'ArrowLeft') || (vertical && key === 'ArrowUp');
16
+ let from = currentIndex;
17
+ let step;
18
+ if (forward) {
19
+ step = 1;
20
+ }
21
+ else if (backward) {
22
+ step = -1;
23
+ }
24
+ else if (key === 'Home') {
25
+ from = -1;
26
+ step = 1;
27
+ }
28
+ else if (key === 'End') {
29
+ from = count;
30
+ step = -1;
31
+ }
32
+ else {
33
+ return null;
34
+ }
35
+ let index = from;
36
+ for (let i = 0; i < count; i += 1) {
37
+ index = wrap(index + step, count);
38
+ if (!isDisabled(index)) {
39
+ return index;
40
+ }
41
+ }
42
+ return null;
43
+ }
44
+ //# sourceMappingURL=roving-focus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roving-focus.js","sourceRoot":"","sources":["../../src/shared/roving-focus.ts"],"names":[],"mappings":"AAaA,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,KAAa,EAAU,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;AAEzF;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAClC,GAAG,EACH,YAAY,EACZ,KAAK,EACL,WAAW,GAAG,MAAM,EACpB,UAAU,GAAG,GAAG,EAAE,CAAC,KAAK,GACJ;IACpB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAG,WAAW,KAAK,YAAY,IAAI,WAAW,KAAK,MAAM,CAAC;IAC1E,MAAM,QAAQ,GAAG,WAAW,KAAK,UAAU,IAAI,WAAW,KAAK,MAAM,CAAC;IACtE,MAAM,OAAO,GAAG,CAAC,UAAU,IAAI,GAAG,KAAK,YAAY,CAAC,IAAI,CAAC,QAAQ,IAAI,GAAG,KAAK,WAAW,CAAC,CAAC;IAC1F,MAAM,QAAQ,GAAG,CAAC,UAAU,IAAI,GAAG,KAAK,WAAW,CAAC,IAAI,CAAC,QAAQ,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC;IAExF,IAAI,IAAI,GAAG,YAAY,CAAC;IACxB,IAAI,IAAY,CAAC;IACjB,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,GAAG,CAAC,CAAC;IACX,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,IAAI,GAAG,CAAC,CAAC,CAAC;IACZ,CAAC;SAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,CAAC,CAAC;QACV,IAAI,GAAG,CAAC,CAAC;IACX,CAAC;SAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QACzB,IAAI,GAAG,KAAK,CAAC;QACb,IAAI,GAAG,CAAC,CAAC,CAAC;IACZ,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsekulowicz/ds-components",
3
- "version": "0.13.3",
3
+ "version": "0.16.0",
4
4
  "description": "Lit web components for the Design System Library (atoms, molecules, organisms, templates, pages).",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
@@ -48,6 +48,13 @@
48
48
  "./button/define": {
49
49
  "import": "./dist/atoms/button/define.js"
50
50
  },
51
+ "./segmented-control": {
52
+ "types": "./dist/atoms/segmented-control/index.d.ts",
53
+ "import": "./dist/atoms/segmented-control/index.js"
54
+ },
55
+ "./segmented-control/define": {
56
+ "import": "./dist/atoms/segmented-control/define.js"
57
+ },
51
58
  "./tooltip": {
52
59
  "types": "./dist/atoms/tooltip/index.d.ts",
53
60
  "import": "./dist/atoms/tooltip/index.js"
@@ -329,7 +336,7 @@
329
336
  "dependencies": {
330
337
  "lit": "^3.2.1",
331
338
  "@jsekulowicz/ds-core": "0.5.0",
332
- "@jsekulowicz/ds-tokens": "0.5.0"
339
+ "@jsekulowicz/ds-tokens": "0.14.0"
333
340
  },
334
341
  "devDependencies": {
335
342
  "heroicons": "2.2.0",